diff --git a/llvm/lib/Target/PowerPC/PPCInstrDFP.td b/llvm/lib/Target/PowerPC/PPCInstrDFP.td --- a/llvm/lib/Target/PowerPC/PPCInstrDFP.td +++ b/llvm/lib/Target/PowerPC/PPCInstrDFP.td @@ -90,5 +90,43 @@ "drintnq", "$R, $FRT, $FRB, $RMC", []>; } // mayRaiseFPException + +// 5.6.3 DFP Test Instructions +def DTSTDC : Z22Form_BF3_FRA5_DCM6<59, 194, (outs crrc:$BF), + (ins f8rc:$FRA, u6imm:$DCM), + "dtstdc $BF, $FRA, $DCM", IIC_FPCompare, []>; + +def DTSTDCQ : Z22Form_BF3_FRA5_DCM6<63, 194, (outs crrc:$BF), + (ins fpairrc:$FRA, u6imm:$DCM), + "dtstdcq $BF, $FRA, $DCM", IIC_FPCompare, []>; + +def DTSTDG : Z22Form_BF3_FRA5_DCM6<59, 226, (outs crrc:$BF), + (ins f8rc:$FRA, u6imm:$DCM), + "dtstdg $BF, $FRA, $DCM", IIC_FPCompare, []>; + +def DTSTDGQ : Z22Form_BF3_FRA5_DCM6<63, 226, (outs crrc:$BF), + (ins fpairrc:$FRA, u6imm:$DCM), + "dtstdgq $BF, $FRA, $DCM", IIC_FPCompare, []>; + +def DTSTEX : XForm_17<59, 162, (outs crrc:$BF), (ins f8rc:$RA, f8rc:$RB), + "dtstex $BF, $RA, $RB", IIC_FPCompare>; + +def DTSTEXQ : XForm_17<63, 162, (outs crrc:$BF), (ins fpairrc:$RA, fpairrc:$RB), + "dtstexq $BF, $RA, $RB", IIC_FPCompare>; + +def DTSTSF : XForm_17<59, 674, (outs crrc:$BF), (ins f8rc:$RA, f8rc:$RB), + "dtstsf $BF, $RA, $RB", IIC_FPCompare>; + +def DTSTSFQ : XForm_17<63, 674, (outs crrc:$BF), (ins f8rc:$RA, fpairrc:$RB), + "dtstsfq $BF, $RA, $RB", IIC_FPCompare>; + +def DTSTSFI : XForm_BF3_UIM6_FRB5<59, 675, (outs crrc:$BF), + (ins u6imm:$UIM, f8rc:$FRB), + "dtstsfi $BF, $UIM, $FRB", IIC_FPCompare, []>; + +def DTSTSFIQ : XForm_BF3_UIM6_FRB5<63, 675, (outs crrc:$BF), + (ins u6imm:$UIM, fpairrc:$FRB), + "dtstsfiq $BF, $UIM, $FRB", IIC_FPCompare, []>; + } // hasNoSchedulingInfo diff --git a/llvm/lib/Target/PowerPC/PPCInstrFormats.td b/llvm/lib/Target/PowerPC/PPCInstrFormats.td --- a/llvm/lib/Target/PowerPC/PPCInstrFormats.td +++ b/llvm/lib/Target/PowerPC/PPCInstrFormats.td @@ -1221,6 +1221,23 @@ let Inst{31} = D{5}; // DX } +class XForm_BF3_UIM6_FRB5 opcode, bits<10> xo, dag OOL, dag IOL, + string asmstr, InstrItinClass itin, list pattern> + : I { + bits<3> BF; + bits<6> UIM; + bits<5> FRB; + + let Pattern = pattern; + + let Inst{6-8} = BF; + let Inst{9} = 0; + let Inst{10-15} = UIM; + let Inst{16-20} = FRB; + let Inst{21-30} = xo; + let Inst{31} = 0; +} + class XX3Form opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, InstrItinClass itin, list pattern> : I { @@ -2132,6 +2149,23 @@ let Inst{23-31} = xo; } +class Z22Form_BF3_FRA5_DCM6 opcode, bits<9> xo, dag OOL, dag IOL, + string asmstr, InstrItinClass itin, list pattern> + : I { + bits<3> BF; + bits<5> FRA; + bits<6> DCM; + + let Pattern = pattern; + + let Inst{6-8} = BF; + let Inst{9-10} = 0; + let Inst{11-15} = FRA; + let Inst{16-21} = DCM; + let Inst{22-30} = xo; + let Inst{31} = 0; +} + class Z23Form_8 opcode, bits<8> xo, dag OOL, dag IOL, string asmstr, InstrItinClass itin, list pattern> : I { diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-dfp.txt b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-dfp.txt --- a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-dfp.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-dfp.txt @@ -119,3 +119,33 @@ # CHECK: drintnq. 0, 10, 6, 2 0xfd 0x40 0x35 0xc7 + +# CHECK: dtstdc 2, 6, 4 +0xed,0x06,0x11,0x84 + +# CHECK: dtstdcq 2, 6, 4 +0xfd,0x06,0x11,0x84 + +# CHECK: dtstdg 2, 6, 4 +0xed,0x06,0x11,0xc4 + +# CHECK: dtstdgq 2, 6, 4 +0xfd,0x06,0x11,0xc4 + +# CHECK: dtstex 2, 6, 4 +0xed,0x06,0x21,0x44 + +# CHECK: dtstexq 2, 6, 4 +0xfd,0x06,0x21,0x44 + +# CHECK: dtstsf 2, 6, 4 +0xed,0x06,0x25,0x44 + +# CHECK: dtstsfq 2, 6, 4 +0xfd,0x06,0x25,0x44 + +# CHECK: dtstsfi 2, 6, 4 +0xed,0x06,0x25,0x46 + +# CHECK: dtstsfiq 2, 6, 4 +0xfd,0x06,0x25,0x46 diff --git a/llvm/test/MC/PowerPC/ppc64-encoding-dfp.s b/llvm/test/MC/PowerPC/ppc64-encoding-dfp.s --- a/llvm/test/MC/PowerPC/ppc64-encoding-dfp.s +++ b/llvm/test/MC/PowerPC/ppc64-encoding-dfp.s @@ -122,3 +122,33 @@ # CHECK-LE: drintnq. 1, 10, 6, 2 # encoding: [0xc7,0x35,0x41,0xfd] # CHECK-BE: drintnq. 1, 10, 6, 2 # encoding: [0xfd,0x41,0x35,0xc7] drintnq. 1, 10, 6, 2 +# CHECK-BE: dtstdc 2, 6, 4 # encoding: [0xed,0x06,0x11,0x84] +# CHECK-LE: dtstdc 2, 6, 4 # encoding: [0x84,0x11,0x06,0xed] + dtstdc 2, 6, 4 +# CHECK-BE: dtstdcq 2, 6, 4 # encoding: [0xfd,0x06,0x11,0x84] +# CHECK-LE: dtstdcq 2, 6, 4 # encoding: [0x84,0x11,0x06,0xfd] + dtstdcq 2, 6, 4 +# CHECK-BE: dtstdg 2, 6, 4 # encoding: [0xed,0x06,0x11,0xc4] +# CHECK-LE: dtstdg 2, 6, 4 # encoding: [0xc4,0x11,0x06,0xed] + dtstdg 2, 6, 4 +# CHECK-BE: dtstdgq 2, 6, 4 # encoding: [0xfd,0x06,0x11,0xc4] +# CHECK-LE: dtstdgq 2, 6, 4 # encoding: [0xc4,0x11,0x06,0xfd] + dtstdgq 2, 6, 4 +# CHECK-BE: dtstex 2, 6, 4 # encoding: [0xed,0x06,0x21,0x44] +# CHECK-LE: dtstex 2, 6, 4 # encoding: [0x44,0x21,0x06,0xed] + dtstex 2, 6, 4 +# CHECK-BE: dtstexq 2, 6, 4 # encoding: [0xfd,0x06,0x21,0x44] +# CHECK-LE: dtstexq 2, 6, 4 # encoding: [0x44,0x21,0x06,0xfd] + dtstexq 2, 6, 4 +# CHECK-BE: dtstsf 2, 6, 4 # encoding: [0xed,0x06,0x25,0x44] +# CHECK-LE: dtstsf 2, 6, 4 # encoding: [0x44,0x25,0x06,0xed] + dtstsf 2, 6, 4 +# CHECK-BE: dtstsfq 2, 6, 4 # encoding: [0xfd,0x06,0x25,0x44] +# CHECK-LE: dtstsfq 2, 6, 4 # encoding: [0x44,0x25,0x06,0xfd] + dtstsfq 2, 6, 4 +# CHECK-BE: dtstsfi 2, 6, 4 # encoding: [0xed,0x06,0x25,0x46] +# CHECK-LE: dtstsfi 2, 6, 4 # encoding: [0x46,0x25,0x06,0xed] + dtstsfi 2, 6, 4 +# CHECK-BE: dtstsfiq 2, 6, 4 # encoding: [0xfd,0x06,0x25,0x46] +# CHECK-LE: dtstsfiq 2, 6, 4 # encoding: [0x46,0x25,0x06,0xfd] + dtstsfiq 2, 6, 4