diff --git a/llvm/lib/Target/PowerPC/PPCInstrPrefix.td b/llvm/lib/Target/PowerPC/PPCInstrPrefix.td --- a/llvm/lib/Target/PowerPC/PPCInstrPrefix.td +++ b/llvm/lib/Target/PowerPC/PPCInstrPrefix.td @@ -59,6 +59,39 @@ string BaseName = ""; } +// VX-Form: [ PO VT R VB RC XO ] +class VXForm_VTB5_RC xo, bits<5> R, dag OOL, dag IOL, string asmstr, + InstrItinClass itin, list pattern> + : I<4, OOL, IOL, asmstr, itin> { + bits<5> VT; + bits<5> VB; + bit RC = 0; + + let Pattern = pattern; + + let Inst{6-10} = VT; + let Inst{11-15} = R; + let Inst{16-20} = VB; + let Inst{21} = RC; + let Inst{22-31} = xo; +} + +// Multiclass definition to account for record and non-record form +// instructions of VXRForm. +multiclass VXForm_VTB5_RCr xo, bits<5> R, dag OOL, dag IOL, + string asmbase, string asmstr, + InstrItinClass itin, list pattern> { + let BaseName = asmbase in { + def NAME : VXForm_VTB5_RC, RecFormRel; + let Defs = [CR6] in + def _rec : VXForm_VTB5_RC, isRecordForm, RecFormRel; + } +} + class MLS_DForm_R_SI34_RTA5_MEM opcode, dag OOL, dag IOL, string asmstr, InstrItinClass itin, list pattern> : PI<1, opcode, OOL, IOL, asmstr, itin> { @@ -821,6 +854,14 @@ (int_ppc_altivec_vsrdbi v16i8:$VRA, v16i8:$VRB, i32:$SH))]>; + defm VSTRIBR : VXForm_VTB5_RCr<13, 1, (outs vrrc:$vT), (ins vrrc:$vB), + "vstribr", "$vT, $vB", IIC_VecGeneral, []>; + defm VSTRIBL : VXForm_VTB5_RCr<13, 0, (outs vrrc:$vT), (ins vrrc:$vB), + "vstribl", "$vT, $vB", IIC_VecGeneral, []>; + defm VSTRIHR : VXForm_VTB5_RCr<13, 3, (outs vrrc:$vT), (ins vrrc:$vB), + "vstrihr", "$vT, $vB", IIC_VecGeneral, []>; + defm VSTRIHL : VXForm_VTB5_RCr<13, 2, (outs vrrc:$vT), (ins vrrc:$vB), + "vstrihl", "$vT, $vB", IIC_VecGeneral, []>; def VINSW : VXForm_1<207, (outs vrrc:$vD), (ins vrrc:$vDi, u4imm:$UIM, gprc:$rB), "vinsw $vD, $rB, $UIM", IIC_VecGeneral, diff --git a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31.txt b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31.txt --- a/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31.txt +++ b/llvm/test/MC/Disassembler/PowerPC/ppc64-encoding-ISA31.txt @@ -459,3 +459,26 @@ # CHECK: xscvsqqp 8, 28 0xfd 0xb 0xe6 0x88 +# CHECK: vstribr 2, 2 +0x10 0x41 0x10 0x0d + +# CHECK: vstribl 2, 2 +0x10 0x40 0x10 0x0d + +# CHECK: vstrihr 2, 2 +0x10 0x43 0x10 0x0d + +# CHECK: vstrihl 2, 2 +0x10 0x42 0x10 0x0d + +# CHECK: vstribr. 2, 2 +0x10 0x41 0x14 0x0d + +# CHECK: vstribl. 2, 2 +0x10 0x40 0x14 0x0d + +# CHECK: vstrihr. 2, 2 +0x10 0x43 0x14 0x0d + +# CHECK: vstrihl. 2, 2 +0x10 0x42 0x14 0x0d diff --git a/llvm/test/MC/PowerPC/ppc64-encoding-ISA31.s b/llvm/test/MC/PowerPC/ppc64-encoding-ISA31.s --- a/llvm/test/MC/PowerPC/ppc64-encoding-ISA31.s +++ b/llvm/test/MC/PowerPC/ppc64-encoding-ISA31.s @@ -585,3 +585,24 @@ # CHECK-BE: xscvsqqp 8, 28 # encoding: [0xfd,0x0b,0xe6,0x88] # CHECK-LE: xscvsqqp 8, 28 # encoding: [0x88,0xe6,0x0b,0xfd] xscvsqqp 8, 28 +# CHECK-BE: vstribr 2, 2 # encoding: [0x10,0x41,0x10,0x0d] +# CHECK-LE: vstribr 2, 2 # encoding: [0x0d,0x10,0x41,0x10] + vstribr 2, 2 +# CHECK-BE: vstribl 2, 2 # encoding: [0x10,0x40,0x10,0x0d] +# CHECK-LE: vstribl 2, 2 # encoding: [0x0d,0x10,0x40,0x10] + vstribl 2, 2 +# CHECK-BE: vstrihr 2, 2 # encoding: [0x10,0x43,0x10,0x0d] +# CHECK-LE: vstrihr 2, 2 # encoding: [0x0d,0x10,0x43,0x10] + vstrihr 2, 2 +# CHECK-BE: vstribr. 2, 2 # encoding: [0x10,0x41,0x14,0x0d] +# CHECK-LE: vstribr. 2, 2 # encoding: [0x0d,0x14,0x41,0x10] + vstribr. 2, 2 +# CHECK-BE: vstribl. 2, 2 # encoding: [0x10,0x40,0x14,0x0d] +# CHECK-LE: vstribl. 2, 2 # encoding: [0x0d,0x14,0x40,0x10] + vstribl. 2, 2 +# CHECK-BE: vstrihr. 2, 2 # encoding: [0x10,0x43,0x14,0x0d] +# CHECK-LE: vstrihr. 2, 2 # encoding: [0x0d,0x14,0x43,0x10] + vstrihr. 2, 2 +# CHECK-BE: vstrihl. 2, 2 # encoding: [0x10,0x42,0x14,0x0d] +# CHECK-LE: vstrihl. 2, 2 # encoding: [0x0d,0x14,0x42,0x10] + vstrihl. 2, 2