Index: lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp =================================================================== --- lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp +++ lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp @@ -1138,6 +1138,15 @@ Inst = TmpInst; break; } + case PPC::SUBPCIS: { + MCInst TmpInst; + int64_t N = Inst.getOperand(1).getImm(); + TmpInst.setOpcode(PPC::ADDPCIS); + TmpInst.addOperand(Inst.getOperand(0)); + TmpInst.addOperand(MCOperand::createImm(-N)); + Inst = TmpInst; + break; + } case PPC::SRDI: case PPC::SRDIo: { MCInst TmpInst; Index: lib/Target/PowerPC/PPCInstr64Bit.td =================================================================== --- lib/Target/PowerPC/PPCInstr64Bit.td +++ lib/Target/PowerPC/PPCInstr64Bit.td @@ -685,6 +685,15 @@ isPPC64, Requires<[HasExtDiv]>; let Predicates = [IsISA3_0] in { +def MADDHD : VAForm_1a<48, (outs g8rc :$RT), (ins g8rc:$RA, g8rc:$RB, g8rc:$RC), + "maddhd $RT, $RA, $RB, $RC", IIC_IntMulHD, []>; +def MADDHDU : VAForm_1a<49, (outs g8rc :$RT), (ins g8rc:$RA, g8rc:$RB, g8rc:$RC), + "maddhdu $RT, $RA, $RB, $RC", IIC_IntMulHD, []>; +def MADDLD : VAForm_1a<51, (outs g8rc :$RT), (ins g8rc:$RA, g8rc:$RB, g8rc:$RC), + "maddld $RT, $RA, $RB, $RC", IIC_IntMulHD, []>; +} + +let Predicates = [IsISA3_0] in { def MODSD : XForm_8<31, 777, (outs g8rc:$rT), (ins g8rc:$rA, g8rc:$rB), "modsd $rT, $rA, $rB", IIC_IntDivW, [(set i64:$rT, (srem i64:$rA, i64:$rB))]>; Index: lib/Target/PowerPC/PPCInstrFormats.td =================================================================== --- lib/Target/PowerPC/PPCInstrFormats.td +++ lib/Target/PowerPC/PPCInstrFormats.td @@ -386,6 +386,22 @@ let Inst{30-31} = xo; } +// ISA V3.0B 1.6.6 DX-Form +class DXForm opcode, bits<5> xo, dag OOL, dag IOL, string asmstr, + InstrItinClass itin, list pattern> + : I { + bits<5> RT; + bits<16> D; + + let Pattern = pattern; + + let Inst{6-10} = RT; + let Inst{11-15} = D{5-1}; // d1 + let Inst{16-25} = D{15-6}; // d0 + let Inst{26-30} = xo; + let Inst{31} = D{0}; // d2 +} + // DQ-Form: [PO T RA DQ TX XO] or [PO S RA DQ SX XO] class DQ_RD6_RS5_DQ12 opcode, bits<3> xo, dag OOL, dag IOL, string asmstr, InstrItinClass itin, list pattern> @@ -725,6 +741,34 @@ let Inst{31} = RC; } +class XForm_44 opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, + InstrItinClass itin> + : I { + bits<5> RT; + bits<3> BFA; + + let Inst{6-10} = RT; + let Inst{11-13} = BFA; + let Inst{14-15} = 0; + let Inst{16-20} = 0; + let Inst{21-30} = xo; + let Inst{31} = 0; +} + +class XForm_45 opcode, bits<10> xo, dag OOL, dag IOL, string asmstr, + InstrItinClass itin> + : I { + bits<5> RT; + bits<2> L; + + let Inst{6-10} = RT; + let Inst{11-13} = 0; + let Inst{14-15} = L; + let Inst{16-20} = 0; + let Inst{21-30} = xo; + let Inst{31} = 0; +} + class X_FRT5_XO2_XO3_XO10 opcode, bits<2> xo1, bits<3> xo2, bits<10> xo, dag OOL, dag IOL, string asmstr, InstrItinClass itin, list pattern> Index: lib/Target/PowerPC/PPCInstrInfo.td =================================================================== --- lib/Target/PowerPC/PPCInstrInfo.td +++ lib/Target/PowerPC/PPCInstrInfo.td @@ -3802,6 +3802,12 @@ def MCRFS : XLForm_3<63, 64, (outs crrc:$BF), (ins crrc:$BFA), "mcrfs $BF, $BFA", IIC_BrMCR>; +def SETB : XForm_44<31, 128, (outs g8rc:$RT), (ins crrc:$BFA), + "setb $RT, $BFA", IIC_IntGeneral>; +def DARN : XForm_45<31, 755, (outs g8rc:$RT), (ins i32imm :$L), + "darn $RT, $L", IIC_LdStLD>; +def ADDPCIS : DXForm<19, 2, (outs g8rc:$RT), (ins i32imm :$D), + "addpcis $RT, $D", IIC_BrB, []>; def MTFSFI : XLForm_4<63, 134, (outs crrc:$BF), (ins i32imm:$U, i32imm:$W), "mtfsfi $BF, $U, $W", IIC_IntMFFS>; @@ -4237,6 +4243,7 @@ (ins g8rc:$rA, g8rc:$rS, u6imm:$b, u6imm:$n)>; def CLRLSLDIo : PPCAsmPseudo<"clrlsldi. $rA, $rS, $b, $n", (ins g8rc:$rA, g8rc:$rS, u6imm:$b, u6imm:$n)>; +def SUBPCIS : PPCAsmPseudo<"subpcis $RT, $D", (ins g8rc:$RT, s16imm:$D)>; def : InstAlias<"rotldi $rA, $rS, $n", (RLDICL g8rc:$rA, g8rc:$rS, u6imm:$n, 0)>; def : InstAlias<"rotldi. $rA, $rS, $n", (RLDICLo g8rc:$rA, g8rc:$rS, u6imm:$n, 0)>; @@ -4246,6 +4253,7 @@ def : InstAlias<"clrldi $rA, $rS, $n", (RLDICL_32 gprc:$rA, gprc:$rS, 0, u6imm:$n)>; def : InstAlias<"clrldi. $rA, $rS, $n", (RLDICLo g8rc:$rA, g8rc:$rS, 0, u6imm:$n)>; +def : InstAlias<"lnia $RT", (ADDPCIS g8rc:$RT, 0)>; def RLWINMbm : PPCAsmPseudo<"rlwinm $rA, $rS, $n, $b", (ins g8rc:$rA, g8rc:$rS, u5imm:$n, i32imm:$b)>; Index: test/MC/Disassembler/PowerPC/ppc64-encoding.txt =================================================================== --- test/MC/Disassembler/PowerPC/ppc64-encoding.txt +++ test/MC/Disassembler/PowerPC/ppc64-encoding.txt @@ -328,6 +328,24 @@ # CHECK: mulhwu. 2, 3, 4 0x7c 0x43 0x20 0x17 +# CHECK: maddhd 2, 3, 4, 5 +0x10 0x43 0x21 0x70 + +# CHECK: maddhdu 2, 3, 4, 5 +0x10 0x43 0x21 0x71 + +# CHECK: maddld 2, 3, 4, 5 +0x10 0x43 0x21 0x73 + +# CHECK: setb 2, 3 +0x7c 0x4c 0x01 0x00 + +# CHECK: darn 2, 3 +0x7c 0x43 0x05 0xe6 + +# CHECK: addpcis 3, 22627 +0x4c,0x71,0x58,0x45 + # CHECK: divw 2, 3, 4 0x7c 0x43 0x23 0xd6 Index: test/MC/PowerPC/ppc64-encoding.s =================================================================== --- test/MC/PowerPC/ppc64-encoding.s +++ test/MC/PowerPC/ppc64-encoding.s @@ -460,6 +460,38 @@ # CHECK-LE: mulhwu. 2, 3, 4 # encoding: [0x17,0x20,0x43,0x7c] mulhwu. 2, 3, 4 +# CHECK-BE: maddhd 2, 3, 4, 5 # encoding: [0x10,0x43,0x21,0x70] +# CHECK-LE: maddhd 2, 3, 4, 5 # encoding: [0x70,0x21,0x43,0x10] + maddhd 2, 3, 4, 5 + +# CHECK-BE: maddhdu 2, 3, 4, 5 # encoding: [0x10,0x43,0x21,0x71] +# CHECK-LE: maddhdu 2, 3, 4, 5 # encoding: [0x71,0x21,0x43,0x10] + maddhdu 2, 3, 4, 5 + +# CHECK-BE: maddld 2, 3, 4, 5 # encoding: [0x10,0x43,0x21,0x73] +# CHECK-LE: maddld 2, 3, 4, 5 # encoding: [0x73,0x21,0x43,0x10] + maddld 2, 3, 4, 5 + +# CHECK-BE: setb 2, 3 # encoding: [0x7c,0x4c,0x01,0x00] +# CHECK-LE: setb 2, 3 # encoding: [0x00,0x01,0x4c,0x7c] + setb 2, 3 + +# CHECK-BE: darn 2, 3 # encoding: [0x7c,0x43,0x05,0xe6] +# CHECK-LE: darn 2, 3 # encoding: [0xe6,0x05,0x43,0x7c] + darn 2, 3 + +# CHECK-BE: addpcis 3, 22627 # encoding: [0x4c,0x71,0x58,0x45] +# CHECK-LE: addpcis 3, 22627 # encoding: [0x45,0x58,0x71,0x4c] + addpcis 3, 22627 + +# CHECK-BE: addpcis 3, 22627 # encoding: [0x4c,0x71,0x58,0x45] +# CHECK-LE: addpcis 3, 22627 # encoding: [0x45,0x58,0x71,0x4c] + subpcis 3, -22627 + +# CHECK-BE: lnia 3 # encoding: [0x4c,0x60,0x00,0x04] +# CHECK-LE: lnia 3 # encoding: [0x04,0x00,0x60,0x4c] + lnia 3 + # CHECK-BE: divw 2, 3, 4 # encoding: [0x7c,0x43,0x23,0xd6] # CHECK-LE: divw 2, 3, 4 # encoding: [0xd6,0x23,0x43,0x7c] divw 2, 3, 4