target/sparc: Perform DFPREG/QFPREG in decodetree

Form the proper register decoding from the start.

Because we're removing the translation from the inner-most
gen_load_fpr_* and gen_store_fpr_* routines, this must be
done for all insns at once.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2023-11-03 13:13:05 -07:00
parent b5c960470d
commit 0bba7572d4
2 changed files with 148 additions and 111 deletions

View File

@ -26,6 +26,14 @@ CALL 01 i:s30
## Major Opcode 10 -- integer, floating-point, vis, and system insns. ## Major Opcode 10 -- integer, floating-point, vis, and system insns.
## ##
%dfp_rd 25:5 !function=extract_dfpreg
%dfp_rs1 14:5 !function=extract_dfpreg
%dfp_rs2 0:5 !function=extract_dfpreg
%qfp_rd 25:5 !function=extract_qfpreg
%qfp_rs1 14:5 !function=extract_qfpreg
%qfp_rs2 0:5 !function=extract_qfpreg
&r_r_ri rd rs1 rs2_or_imm imm:bool &r_r_ri rd rs1 rs2_or_imm imm:bool
@n_r_ri .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13 &r_r_ri rd=0 @n_r_ri .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13 &r_r_ri rd=0
@r_r_ri .. rd:5 ...... rs1:5 imm:1 rs2_or_imm:s13 &r_r_ri @r_r_ri .. rd:5 ...... rs1:5 imm:1 rs2_or_imm:s13 &r_r_ri
@ -37,11 +45,40 @@ CALL 01 i:s30
&r_r_r rd rs1 rs2 &r_r_r rd rs1 rs2
@r_r_r .. rd:5 ...... rs1:5 . ........ rs2:5 &r_r_r @r_r_r .. rd:5 ...... rs1:5 . ........ rs2:5 &r_r_r
@d_r_r .. ..... ...... rs1:5 . ........ rs2:5 \
&r_r_r rd=%dfp_rd
@r_d_d .. rd:5 ...... ..... . ........ ..... \
&r_r_r rs1=%dfp_rs1 rs2=%dfp_rs2
@d_r_d .. ..... ...... rs1:5 . ........ ..... \
&r_r_r rd=%dfp_rd rs2=%dfp_rs2
@d_d_d .. ..... ...... ..... . ........ ..... \
&r_r_r rd=%dfp_rd rs1=%dfp_rs1 rs2=%dfp_rs2
@q_q_q .. ..... ...... ..... . ........ ..... \
&r_r_r rd=%qfp_rd rs1=%qfp_rs1 rs2=%qfp_rs2
@q_d_d .. ..... ...... ..... . ........ ..... \
&r_r_r rd=%qfp_rd rs1=%dfp_rs1 rs2=%dfp_rs2
@r_r_r_swap .. rd:5 ...... rs2:5 . ........ rs1:5 &r_r_r @r_r_r_swap .. rd:5 ...... rs2:5 . ........ rs1:5 &r_r_r
@d_d_d_swap .. ..... ...... ..... . ........ ..... \
&r_r_r rd=%dfp_rd rs1=%dfp_rs2 rs2=%dfp_rs1
&r_r rd rs &r_r rd rs
@r_r1 .. rd:5 ...... rs:5 . ........ ..... &r_r @r_r1 .. rd:5 ...... rs:5 . ........ ..... &r_r
@r_r2 .. rd:5 ...... ..... . ........ rs:5 &r_r @r_r2 .. rd:5 ...... ..... . ........ rs:5 &r_r
@r_d2 .. rd:5 ...... ..... . ........ ..... &r_r rs=%dfp_rs2
@r_q2 .. rd:5 ...... ..... . ........ ..... &r_r rs=%qfp_rs2
@d_r2 .. ..... ...... ..... . ........ rs:5 &r_r rd=%dfp_rd
@q_r2 .. ..... ...... ..... . ........ rs:5 &r_r rd=%qfp_rd
@d_d1 .. ..... ...... ..... . ........ ..... \
&r_r rd=%dfp_rd rs=%dfp_rs1
@d_d2 .. ..... ...... ..... . ........ ..... \
&r_r rd=%dfp_rd rs=%dfp_rs2
@d_q2 .. ..... ...... ..... . ........ ..... \
&r_r rd=%dfp_rd rs=%qfp_rs2
@q_q2 .. ..... ...... ..... . ........ ..... \
&r_r rd=%qfp_rd rs=%qfp_rs2
@q_d2 .. ..... ...... ..... . ........ ..... \
&r_r rd=%qfp_rd rs=%dfp_rs2
{ {
[ [
@ -241,68 +278,78 @@ DONE 10 00000 111110 00000 0 0000000000000
RETRY 10 00001 111110 00000 0 0000000000000 RETRY 10 00001 111110 00000 0 0000000000000
FMOVs 10 ..... 110100 00000 0 0000 0001 ..... @r_r2 FMOVs 10 ..... 110100 00000 0 0000 0001 ..... @r_r2
FMOVd 10 ..... 110100 00000 0 0000 0010 ..... @r_r2 FMOVd 10 ..... 110100 00000 0 0000 0010 ..... @d_d2
FMOVq 10 ..... 110100 00000 0 0000 0011 ..... @r_r2 FMOVq 10 ..... 110100 00000 0 0000 0011 ..... @q_q2
FNEGs 10 ..... 110100 00000 0 0000 0101 ..... @r_r2 FNEGs 10 ..... 110100 00000 0 0000 0101 ..... @r_r2
FNEGd 10 ..... 110100 00000 0 0000 0110 ..... @r_r2 FNEGd 10 ..... 110100 00000 0 0000 0110 ..... @d_d2
FNEGq 10 ..... 110100 00000 0 0000 0111 ..... @r_r2 FNEGq 10 ..... 110100 00000 0 0000 0111 ..... @q_q2
FABSs 10 ..... 110100 00000 0 0000 1001 ..... @r_r2 FABSs 10 ..... 110100 00000 0 0000 1001 ..... @r_r2
FABSd 10 ..... 110100 00000 0 0000 1010 ..... @r_r2 FABSd 10 ..... 110100 00000 0 0000 1010 ..... @d_d2
FABSq 10 ..... 110100 00000 0 0000 1011 ..... @r_r2 FABSq 10 ..... 110100 00000 0 0000 1011 ..... @q_q2
FSQRTs 10 ..... 110100 00000 0 0010 1001 ..... @r_r2 FSQRTs 10 ..... 110100 00000 0 0010 1001 ..... @r_r2
FSQRTd 10 ..... 110100 00000 0 0010 1010 ..... @r_r2 FSQRTd 10 ..... 110100 00000 0 0010 1010 ..... @d_d2
FSQRTq 10 ..... 110100 00000 0 0010 1011 ..... @r_r2 FSQRTq 10 ..... 110100 00000 0 0010 1011 ..... @q_q2
FADDs 10 ..... 110100 ..... 0 0100 0001 ..... @r_r_r FADDs 10 ..... 110100 ..... 0 0100 0001 ..... @r_r_r
FADDd 10 ..... 110100 ..... 0 0100 0010 ..... @r_r_r FADDd 10 ..... 110100 ..... 0 0100 0010 ..... @d_d_d
FADDq 10 ..... 110100 ..... 0 0100 0011 ..... @r_r_r FADDq 10 ..... 110100 ..... 0 0100 0011 ..... @q_q_q
FSUBs 10 ..... 110100 ..... 0 0100 0101 ..... @r_r_r FSUBs 10 ..... 110100 ..... 0 0100 0101 ..... @r_r_r
FSUBd 10 ..... 110100 ..... 0 0100 0110 ..... @r_r_r FSUBd 10 ..... 110100 ..... 0 0100 0110 ..... @d_d_d
FSUBq 10 ..... 110100 ..... 0 0100 0111 ..... @r_r_r FSUBq 10 ..... 110100 ..... 0 0100 0111 ..... @q_q_q
FMULs 10 ..... 110100 ..... 0 0100 1001 ..... @r_r_r FMULs 10 ..... 110100 ..... 0 0100 1001 ..... @r_r_r
FMULd 10 ..... 110100 ..... 0 0100 1010 ..... @r_r_r FMULd 10 ..... 110100 ..... 0 0100 1010 ..... @d_d_d
FMULq 10 ..... 110100 ..... 0 0100 1011 ..... @r_r_r FMULq 10 ..... 110100 ..... 0 0100 1011 ..... @q_q_q
FDIVs 10 ..... 110100 ..... 0 0100 1101 ..... @r_r_r FDIVs 10 ..... 110100 ..... 0 0100 1101 ..... @r_r_r
FDIVd 10 ..... 110100 ..... 0 0100 1110 ..... @r_r_r FDIVd 10 ..... 110100 ..... 0 0100 1110 ..... @d_d_d
FDIVq 10 ..... 110100 ..... 0 0100 1111 ..... @r_r_r FDIVq 10 ..... 110100 ..... 0 0100 1111 ..... @q_q_q
FsMULd 10 ..... 110100 ..... 0 0110 1001 ..... @r_r_r FsMULd 10 ..... 110100 ..... 0 0110 1001 ..... @d_r_r
FdMULq 10 ..... 110100 ..... 0 0110 1110 ..... @r_r_r FdMULq 10 ..... 110100 ..... 0 0110 1110 ..... @q_d_d
FsTOx 10 ..... 110100 00000 0 1000 0001 ..... @r_r2 FsTOx 10 ..... 110100 00000 0 1000 0001 ..... @r_r2
FdTOx 10 ..... 110100 00000 0 1000 0010 ..... @r_r2 FdTOx 10 ..... 110100 00000 0 1000 0010 ..... @r_d2
FqTOx 10 ..... 110100 00000 0 1000 0011 ..... @r_r2 FqTOx 10 ..... 110100 00000 0 1000 0011 ..... @r_q2
FxTOs 10 ..... 110100 00000 0 1000 0100 ..... @r_r2 FxTOs 10 ..... 110100 00000 0 1000 0100 ..... @r_r2
FxTOd 10 ..... 110100 00000 0 1000 1000 ..... @r_r2 FxTOd 10 ..... 110100 00000 0 1000 1000 ..... @d_r2
FxTOq 10 ..... 110100 00000 0 1000 1100 ..... @r_r2 FxTOq 10 ..... 110100 00000 0 1000 1100 ..... @q_r2
FiTOs 10 ..... 110100 00000 0 1100 0100 ..... @r_r2 FiTOs 10 ..... 110100 00000 0 1100 0100 ..... @r_r2
FdTOs 10 ..... 110100 00000 0 1100 0110 ..... @r_r2 FdTOs 10 ..... 110100 00000 0 1100 0110 ..... @r_d2
FqTOs 10 ..... 110100 00000 0 1100 0111 ..... @r_r2 FqTOs 10 ..... 110100 00000 0 1100 0111 ..... @r_q2
FiTOd 10 ..... 110100 00000 0 1100 1000 ..... @r_r2 FiTOd 10 ..... 110100 00000 0 1100 1000 ..... @d_r2
FsTOd 10 ..... 110100 00000 0 1100 1001 ..... @r_r2 FsTOd 10 ..... 110100 00000 0 1100 1001 ..... @d_r2
FqTOd 10 ..... 110100 00000 0 1100 1011 ..... @r_r2 FqTOd 10 ..... 110100 00000 0 1100 1011 ..... @d_q2
FiTOq 10 ..... 110100 00000 0 1100 1100 ..... @r_r2 FiTOq 10 ..... 110100 00000 0 1100 1100 ..... @q_r2
FsTOq 10 ..... 110100 00000 0 1100 1101 ..... @r_r2 FsTOq 10 ..... 110100 00000 0 1100 1101 ..... @q_r2
FdTOq 10 ..... 110100 00000 0 1100 1110 ..... @r_r2 FdTOq 10 ..... 110100 00000 0 1100 1110 ..... @q_d2
FsTOi 10 ..... 110100 00000 0 1101 0001 ..... @r_r2 FsTOi 10 ..... 110100 00000 0 1101 0001 ..... @r_r2
FdTOi 10 ..... 110100 00000 0 1101 0010 ..... @r_r2 FdTOi 10 ..... 110100 00000 0 1101 0010 ..... @r_d2
FqTOi 10 ..... 110100 00000 0 1101 0011 ..... @r_r2 FqTOi 10 ..... 110100 00000 0 1101 0011 ..... @r_q2
FMOVscc 10 rd:5 110101 0 cond:4 1 cc:1 0 000001 rs2:5 FMOVscc 10 rd:5 110101 0 cond:4 1 cc:1 0 000001 rs2:5
FMOVdcc 10 rd:5 110101 0 cond:4 1 cc:1 0 000010 rs2:5 FMOVdcc 10 ..... 110101 0 cond:4 1 cc:1 0 000010 ..... \
FMOVqcc 10 rd:5 110101 0 cond:4 1 cc:1 0 000011 rs2:5 rd=%dfp_rd rs2=%dfp_rs2
FMOVqcc 10 ..... 110101 0 cond:4 1 cc:1 0 000011 ..... \
rd=%qfp_rd rs2=%qfp_rs2
FMOVsfcc 10 rd:5 110101 0 cond:4 0 cc:2 000001 rs2:5 FMOVsfcc 10 rd:5 110101 0 cond:4 0 cc:2 000001 rs2:5
FMOVdfcc 10 rd:5 110101 0 cond:4 0 cc:2 000010 rs2:5 FMOVdfcc 10 ..... 110101 0 cond:4 0 cc:2 000010 ..... \
FMOVqfcc 10 rd:5 110101 0 cond:4 0 cc:2 000011 rs2:5 rd=%dfp_rd rs2=%dfp_rs2
FMOVqfcc 10 ..... 110101 0 cond:4 0 cc:2 000011 ..... \
rd=%qfp_rd rs2=%qfp_rs2
FMOVRs 10 rd:5 110101 rs1:5 0 cond:3 00101 rs2:5 FMOVRs 10 rd:5 110101 rs1:5 0 cond:3 00101 rs2:5
FMOVRd 10 rd:5 110101 rs1:5 0 cond:3 00110 rs2:5 FMOVRd 10 ..... 110101 rs1:5 0 cond:3 00110 ..... \
FMOVRq 10 rd:5 110101 rs1:5 0 cond:3 00111 rs2:5 rd=%dfp_rd rs2=%dfp_rs2
FMOVRq 10 ..... 110101 rs1:5 0 cond:3 00111 ..... \
rd=%qfp_rd rs2=%qfp_rs2
FCMPs 10 000 cc:2 110101 rs1:5 0 0101 0001 rs2:5 FCMPs 10 000 cc:2 110101 rs1:5 0 0101 0001 rs2:5
FCMPd 10 000 cc:2 110101 rs1:5 0 0101 0010 rs2:5 FCMPd 10 000 cc:2 110101 ..... 0 0101 0010 ..... \
FCMPq 10 000 cc:2 110101 rs1:5 0 0101 0011 rs2:5 rs1=%dfp_rs1 rs2=%dfp_rs2
FCMPq 10 000 cc:2 110101 ..... 0 0101 0011 ..... \
rs1=%qfp_rs1 rs2=%qfp_rs2
FCMPEs 10 000 cc:2 110101 rs1:5 0 0101 0101 rs2:5 FCMPEs 10 000 cc:2 110101 rs1:5 0 0101 0101 rs2:5
FCMPEd 10 000 cc:2 110101 rs1:5 0 0101 0110 rs2:5 FCMPEd 10 000 cc:2 110101 ..... 0 0101 0110 ..... \
FCMPEq 10 000 cc:2 110101 rs1:5 0 0101 0111 rs2:5 rs1=%dfp_rs1 rs2=%dfp_rs2
FCMPEq 10 000 cc:2 110101 ..... 0 0101 0111 ..... \
rs1=%qfp_rs1 rs2=%qfp_rs2
{ {
[ [
@ -328,74 +375,74 @@ FCMPEq 10 000 cc:2 110101 rs1:5 0 0101 0111 rs2:5
BMASK 10 ..... 110110 ..... 0 0001 1001 ..... @r_r_r BMASK 10 ..... 110110 ..... 0 0001 1001 ..... @r_r_r
FPCMPLE16 10 ..... 110110 ..... 0 0010 0000 ..... @r_r_r FPCMPLE16 10 ..... 110110 ..... 0 0010 0000 ..... @r_d_d
FPCMPNE16 10 ..... 110110 ..... 0 0010 0010 ..... @r_r_r FPCMPNE16 10 ..... 110110 ..... 0 0010 0010 ..... @r_d_d
FPCMPGT16 10 ..... 110110 ..... 0 0010 1000 ..... @r_r_r FPCMPGT16 10 ..... 110110 ..... 0 0010 1000 ..... @r_d_d
FPCMPEQ16 10 ..... 110110 ..... 0 0010 1010 ..... @r_r_r FPCMPEQ16 10 ..... 110110 ..... 0 0010 1010 ..... @r_d_d
FPCMPLE32 10 ..... 110110 ..... 0 0010 0100 ..... @r_r_r FPCMPLE32 10 ..... 110110 ..... 0 0010 0100 ..... @r_d_d
FPCMPNE32 10 ..... 110110 ..... 0 0010 0110 ..... @r_r_r FPCMPNE32 10 ..... 110110 ..... 0 0010 0110 ..... @r_d_d
FPCMPGT32 10 ..... 110110 ..... 0 0010 1100 ..... @r_r_r FPCMPGT32 10 ..... 110110 ..... 0 0010 1100 ..... @r_d_d
FPCMPEQ32 10 ..... 110110 ..... 0 0010 1110 ..... @r_r_r FPCMPEQ32 10 ..... 110110 ..... 0 0010 1110 ..... @r_d_d
FMUL8x16 10 ..... 110110 ..... 0 0011 0001 ..... @r_r_r FMUL8x16 10 ..... 110110 ..... 0 0011 0001 ..... @d_r_d
FMUL8x16AU 10 ..... 110110 ..... 0 0011 0011 ..... @r_r_r FMUL8x16AU 10 ..... 110110 ..... 0 0011 0011 ..... @d_r_r
FMUL8x16AL 10 ..... 110110 ..... 0 0011 0101 ..... @r_r_r FMUL8x16AL 10 ..... 110110 ..... 0 0011 0101 ..... @d_r_r
FMUL8SUx16 10 ..... 110110 ..... 0 0011 0110 ..... @r_r_r FMUL8SUx16 10 ..... 110110 ..... 0 0011 0110 ..... @d_d_d
FMUL8ULx16 10 ..... 110110 ..... 0 0011 0111 ..... @r_r_r FMUL8ULx16 10 ..... 110110 ..... 0 0011 0111 ..... @d_d_d
FMULD8SUx16 10 ..... 110110 ..... 0 0011 1000 ..... @r_r_r FMULD8SUx16 10 ..... 110110 ..... 0 0011 1000 ..... @d_r_r
FMULD8ULx16 10 ..... 110110 ..... 0 0011 1001 ..... @r_r_r FMULD8ULx16 10 ..... 110110 ..... 0 0011 1001 ..... @d_r_r
FPACK32 10 ..... 110110 ..... 0 0011 1010 ..... @r_r_r FPACK32 10 ..... 110110 ..... 0 0011 1010 ..... @d_d_d
FPACK16 10 ..... 110110 00000 0 0011 1011 ..... @r_r2 FPACK16 10 ..... 110110 00000 0 0011 1011 ..... @r_d2
FPACKFIX 10 ..... 110110 00000 0 0011 1101 ..... @r_r2 FPACKFIX 10 ..... 110110 00000 0 0011 1101 ..... @r_d2
PDIST 10 ..... 110110 ..... 0 0011 1110 ..... @r_r_r PDIST 10 ..... 110110 ..... 0 0011 1110 ..... @d_d_d
FALIGNDATAg 10 ..... 110110 ..... 0 0100 1000 ..... @r_r_r FALIGNDATAg 10 ..... 110110 ..... 0 0100 1000 ..... @d_d_d
FPMERGE 10 ..... 110110 ..... 0 0100 1011 ..... @r_r_r FPMERGE 10 ..... 110110 ..... 0 0100 1011 ..... @d_r_r
BSHUFFLE 10 ..... 110110 ..... 0 0100 1100 ..... @r_r_r BSHUFFLE 10 ..... 110110 ..... 0 0100 1100 ..... @d_d_d
FEXPAND 10 ..... 110110 00000 0 0100 1101 ..... @r_r2 FEXPAND 10 ..... 110110 00000 0 0100 1101 ..... @d_r2
FSRCd 10 ..... 110110 ..... 0 0111 0100 00000 @r_r1 # FSRC1d FSRCd 10 ..... 110110 ..... 0 0111 0100 00000 @d_d1 # FSRC1d
FSRCs 10 ..... 110110 ..... 0 0111 0101 00000 @r_r1 # FSRC1s FSRCs 10 ..... 110110 ..... 0 0111 0101 00000 @r_r1 # FSRC1s
FSRCd 10 ..... 110110 00000 0 0111 1000 ..... @r_r2 # FSRC2d FSRCd 10 ..... 110110 00000 0 0111 1000 ..... @d_d2 # FSRC2d
FSRCs 10 ..... 110110 00000 0 0111 1001 ..... @r_r2 # FSRC2s FSRCs 10 ..... 110110 00000 0 0111 1001 ..... @r_r2 # FSRC2s
FNOTd 10 ..... 110110 ..... 0 0110 1010 00000 @r_r1 # FNOT1d FNOTd 10 ..... 110110 ..... 0 0110 1010 00000 @d_d1 # FNOT1d
FNOTs 10 ..... 110110 ..... 0 0110 1011 00000 @r_r1 # FNOT1s FNOTs 10 ..... 110110 ..... 0 0110 1011 00000 @r_r1 # FNOT1s
FNOTd 10 ..... 110110 00000 0 0110 0110 ..... @r_r2 # FNOT2d FNOTd 10 ..... 110110 00000 0 0110 0110 ..... @d_d2 # FNOT2d
FNOTs 10 ..... 110110 00000 0 0110 0111 ..... @r_r2 # FNOT2s FNOTs 10 ..... 110110 00000 0 0110 0111 ..... @r_r2 # FNOT2s
FPADD16 10 ..... 110110 ..... 0 0101 0000 ..... @r_r_r FPADD16 10 ..... 110110 ..... 0 0101 0000 ..... @d_d_d
FPADD16s 10 ..... 110110 ..... 0 0101 0001 ..... @r_r_r FPADD16s 10 ..... 110110 ..... 0 0101 0001 ..... @r_r_r
FPADD32 10 ..... 110110 ..... 0 0101 0010 ..... @r_r_r FPADD32 10 ..... 110110 ..... 0 0101 0010 ..... @d_d_d
FPADD32s 10 ..... 110110 ..... 0 0101 0011 ..... @r_r_r FPADD32s 10 ..... 110110 ..... 0 0101 0011 ..... @r_r_r
FPSUB16 10 ..... 110110 ..... 0 0101 0100 ..... @r_r_r FPSUB16 10 ..... 110110 ..... 0 0101 0100 ..... @d_d_d
FPSUB16s 10 ..... 110110 ..... 0 0101 0101 ..... @r_r_r FPSUB16s 10 ..... 110110 ..... 0 0101 0101 ..... @r_r_r
FPSUB32 10 ..... 110110 ..... 0 0101 0110 ..... @r_r_r FPSUB32 10 ..... 110110 ..... 0 0101 0110 ..... @d_d_d
FPSUB32s 10 ..... 110110 ..... 0 0101 0111 ..... @r_r_r FPSUB32s 10 ..... 110110 ..... 0 0101 0111 ..... @r_r_r
FNORd 10 ..... 110110 ..... 0 0110 0010 ..... @r_r_r FNORd 10 ..... 110110 ..... 0 0110 0010 ..... @d_d_d
FNORs 10 ..... 110110 ..... 0 0110 0011 ..... @r_r_r FNORs 10 ..... 110110 ..... 0 0110 0011 ..... @r_r_r
FANDNOTd 10 ..... 110110 ..... 0 0110 0100 ..... @r_r_r # FANDNOT2d FANDNOTd 10 ..... 110110 ..... 0 0110 0100 ..... @d_d_d # FANDNOT2d
FANDNOTs 10 ..... 110110 ..... 0 0110 0101 ..... @r_r_r # FANDNOT2s FANDNOTs 10 ..... 110110 ..... 0 0110 0101 ..... @r_r_r # FANDNOT2s
FANDNOTd 10 ..... 110110 ..... 0 0110 1000 ..... @r_r_r_swap # ... 1d FANDNOTd 10 ..... 110110 ..... 0 0110 1000 ..... @d_d_d_swap # ... 1d
FANDNOTs 10 ..... 110110 ..... 0 0110 1001 ..... @r_r_r_swap # ... 1s FANDNOTs 10 ..... 110110 ..... 0 0110 1001 ..... @r_r_r_swap # ... 1s
FXORd 10 ..... 110110 ..... 0 0110 1100 ..... @r_r_r FXORd 10 ..... 110110 ..... 0 0110 1100 ..... @d_d_d
FXORs 10 ..... 110110 ..... 0 0110 1101 ..... @r_r_r FXORs 10 ..... 110110 ..... 0 0110 1101 ..... @r_r_r
FNANDd 10 ..... 110110 ..... 0 0110 1110 ..... @r_r_r FNANDd 10 ..... 110110 ..... 0 0110 1110 ..... @d_d_d
FNANDs 10 ..... 110110 ..... 0 0110 1111 ..... @r_r_r FNANDs 10 ..... 110110 ..... 0 0110 1111 ..... @r_r_r
FANDd 10 ..... 110110 ..... 0 0111 0000 ..... @r_r_r FANDd 10 ..... 110110 ..... 0 0111 0000 ..... @d_d_d
FANDs 10 ..... 110110 ..... 0 0111 0001 ..... @r_r_r FANDs 10 ..... 110110 ..... 0 0111 0001 ..... @r_r_r
FXNORd 10 ..... 110110 ..... 0 0111 0010 ..... @r_r_r FXNORd 10 ..... 110110 ..... 0 0111 0010 ..... @d_d_d
FXNORs 10 ..... 110110 ..... 0 0111 0011 ..... @r_r_r FXNORs 10 ..... 110110 ..... 0 0111 0011 ..... @r_r_r
FORNOTd 10 ..... 110110 ..... 0 0111 0110 ..... @r_r_r # FORNOT2d FORNOTd 10 ..... 110110 ..... 0 0111 0110 ..... @d_d_d # FORNOT2d
FORNOTs 10 ..... 110110 ..... 0 0111 0111 ..... @r_r_r # FORNOT2s FORNOTs 10 ..... 110110 ..... 0 0111 0111 ..... @r_r_r # FORNOT2s
FORNOTd 10 ..... 110110 ..... 0 0111 1010 ..... @r_r_r_swap # ... 1d FORNOTd 10 ..... 110110 ..... 0 0111 1010 ..... @d_d_d_swap # ... 1d
FORNOTs 10 ..... 110110 ..... 0 0111 1011 ..... @r_r_r_swap # ... 1s FORNOTs 10 ..... 110110 ..... 0 0111 1011 ..... @r_r_r_swap # ... 1s
FORd 10 ..... 110110 ..... 0 0111 1100 ..... @r_r_r FORd 10 ..... 110110 ..... 0 0111 1100 ..... @d_d_d
FORs 10 ..... 110110 ..... 0 0111 1101 ..... @r_r_r FORs 10 ..... 110110 ..... 0 0111 1101 ..... @r_r_r
FZEROd 10 rd:5 110110 00000 0 0110 0000 00000 FZEROd 10 ..... 110110 00000 0 0110 0000 00000 rd=%dfp_rd
FZEROs 10 rd:5 110110 00000 0 0110 0001 00000 FZEROs 10 rd:5 110110 00000 0 0110 0001 00000
FONEd 10 rd:5 110110 00000 0 0111 1110 00000 FONEd 10 ..... 110110 00000 0 0111 1110 00000 rd=%dfp_rd
FONEs 10 rd:5 110110 00000 0 0111 1111 00000 FONEs 10 rd:5 110110 00000 0 0111 1111 00000
] ]
NCP 10 ----- 110110 ----- --------- ----- # v8 CPop1 NCP 10 ----- 110110 ----- --------- ----- # v8 CPop1
@ -407,9 +454,6 @@ NCP 10 ----- 110111 ----- --------- ----- # v8 CPop2
## Major Opcode 11 -- load and store instructions ## Major Opcode 11 -- load and store instructions
## ##
%dfp_rd 25:5 !function=extract_dfpreg
%qfp_rd 25:5 !function=extract_qfpreg
&r_r_ri_asi rd rs1 rs2_or_imm asi imm:bool &r_r_ri_asi rd rs1 rs2_or_imm asi imm:bool
@r_r_ri_na .. rd:5 ...... rs1:5 imm:1 rs2_or_imm:s13 &r_r_ri_asi asi=-1 @r_r_ri_na .. rd:5 ...... rs1:5 imm:1 rs2_or_imm:s13 &r_r_ri_asi asi=-1
@d_r_ri_na .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13 \ @d_r_ri_na .. ..... ...... rs1:5 imm:1 rs2_or_imm:s13 \

View File

@ -190,14 +190,6 @@ typedef struct DisasContext {
#define GET_FIELDs(x,a,b) sign_extend (GET_FIELD(x,a,b), (b) - (a) + 1) #define GET_FIELDs(x,a,b) sign_extend (GET_FIELD(x,a,b), (b) - (a) + 1)
#define GET_FIELD_SPs(x,a,b) sign_extend (GET_FIELD_SP(x,a,b), ((b) - (a) + 1)) #define GET_FIELD_SPs(x,a,b) sign_extend (GET_FIELD_SP(x,a,b), ((b) - (a) + 1))
#ifdef TARGET_SPARC64
#define DFPREG(r) (((r & 1) << 5) | (r & 0x1e))
#define QFPREG(r) (((r & 1) << 5) | (r & 0x1c))
#else
#define DFPREG(r) (r & 0x1e)
#define QFPREG(r) (r & 0x1c)
#endif
#define UA2005_HTRAP_MASK 0xff #define UA2005_HTRAP_MASK 0xff
#define V8_TRAP_MASK 0x7f #define V8_TRAP_MASK 0x7f
@ -240,34 +232,30 @@ static void gen_store_fpr_F(DisasContext *dc, unsigned int dst, TCGv_i32 v)
static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src) static TCGv_i64 gen_load_fpr_D(DisasContext *dc, unsigned int src)
{ {
src = DFPREG(src);
return cpu_fpr[src / 2]; return cpu_fpr[src / 2];
} }
static void gen_store_fpr_D(DisasContext *dc, unsigned int dst, TCGv_i64 v) static void gen_store_fpr_D(DisasContext *dc, unsigned int dst, TCGv_i64 v)
{ {
dst = DFPREG(dst);
tcg_gen_mov_i64(cpu_fpr[dst / 2], v); tcg_gen_mov_i64(cpu_fpr[dst / 2], v);
gen_update_fprs_dirty(dc, dst); gen_update_fprs_dirty(dc, dst);
} }
static TCGv_i64 gen_dest_fpr_D(DisasContext *dc, unsigned int dst) static TCGv_i64 gen_dest_fpr_D(DisasContext *dc, unsigned int dst)
{ {
return cpu_fpr[DFPREG(dst) / 2]; return cpu_fpr[dst / 2];
} }
static TCGv_i128 gen_load_fpr_Q(DisasContext *dc, unsigned int src) static TCGv_i128 gen_load_fpr_Q(DisasContext *dc, unsigned int src)
{ {
TCGv_i128 ret = tcg_temp_new_i128(); TCGv_i128 ret = tcg_temp_new_i128();
src = QFPREG(src);
tcg_gen_concat_i64_i128(ret, cpu_fpr[src / 2 + 1], cpu_fpr[src / 2]); tcg_gen_concat_i64_i128(ret, cpu_fpr[src / 2 + 1], cpu_fpr[src / 2]);
return ret; return ret;
} }
static void gen_store_fpr_Q(DisasContext *dc, unsigned int dst, TCGv_i128 v) static void gen_store_fpr_Q(DisasContext *dc, unsigned int dst, TCGv_i128 v)
{ {
dst = DFPREG(dst);
tcg_gen_extr_i128_i64(cpu_fpr[dst / 2 + 1], cpu_fpr[dst / 2], v); tcg_gen_extr_i128_i64(cpu_fpr[dst / 2 + 1], cpu_fpr[dst / 2], v);
gen_update_fprs_dirty(dc, dst); gen_update_fprs_dirty(dc, dst);
} }
@ -2045,16 +2033,14 @@ static void gen_fmovd(DisasContext *dc, DisasCompare *cmp, int rd, int rs)
static void gen_fmovq(DisasContext *dc, DisasCompare *cmp, int rd, int rs) static void gen_fmovq(DisasContext *dc, DisasCompare *cmp, int rd, int rs)
{ {
#ifdef TARGET_SPARC64 #ifdef TARGET_SPARC64
int qd = QFPREG(rd);
int qs = QFPREG(rs);
TCGv c2 = tcg_constant_tl(cmp->c2); TCGv c2 = tcg_constant_tl(cmp->c2);
tcg_gen_movcond_i64(cmp->cond, cpu_fpr[qd / 2], cmp->c1, c2, tcg_gen_movcond_i64(cmp->cond, cpu_fpr[rd / 2], cmp->c1, c2,
cpu_fpr[qs / 2], cpu_fpr[qd / 2]); cpu_fpr[rs / 2], cpu_fpr[rd / 2]);
tcg_gen_movcond_i64(cmp->cond, cpu_fpr[qd / 2 + 1], cmp->c1, c2, tcg_gen_movcond_i64(cmp->cond, cpu_fpr[rd / 2 + 1], cmp->c1, c2,
cpu_fpr[qs / 2 + 1], cpu_fpr[qd / 2 + 1]); cpu_fpr[rs / 2 + 1], cpu_fpr[rd / 2 + 1]);
gen_update_fprs_dirty(dc, qd); gen_update_fprs_dirty(dc, rd);
#else #else
qemu_build_not_reached(); qemu_build_not_reached();
#endif #endif
@ -2086,12 +2072,20 @@ static void gen_load_trap_state_at_tl(TCGv_ptr r_tsptr)
static int extract_dfpreg(DisasContext *dc, int x) static int extract_dfpreg(DisasContext *dc, int x)
{ {
return DFPREG(x); int r = x & 0x1e;
#ifdef TARGET_SPARC64
r |= (x & 1) << 5;
#endif
return r;
} }
static int extract_qfpreg(DisasContext *dc, int x) static int extract_qfpreg(DisasContext *dc, int x)
{ {
return QFPREG(x); int r = x & 0x1c;
#ifdef TARGET_SPARC64
r |= (x & 1) << 5;
#endif
return r;
} }
/* Include the auto-generated decoder. */ /* Include the auto-generated decoder. */
@ -4253,7 +4247,6 @@ static bool do_dc(DisasContext *dc, int rd, int64_t c)
return true; return true;
} }
rd = DFPREG(rd);
tcg_gen_movi_i64(cpu_fpr[rd / 2], c); tcg_gen_movi_i64(cpu_fpr[rd / 2], c);
gen_update_fprs_dirty(dc, rd); gen_update_fprs_dirty(dc, rd);
return advance_pc(dc); return advance_pc(dc);