diff options
Diffstat (limited to 'lib/Target/PowerPC/PPCInstrAltivec.td')
| -rw-r--r-- | lib/Target/PowerPC/PPCInstrAltivec.td | 184 |
1 files changed, 184 insertions, 0 deletions
diff --git a/lib/Target/PowerPC/PPCInstrAltivec.td b/lib/Target/PowerPC/PPCInstrAltivec.td index 53674681b213..e1c4673c2d7f 100644 --- a/lib/Target/PowerPC/PPCInstrAltivec.td +++ b/lib/Target/PowerPC/PPCInstrAltivec.td @@ -1213,3 +1213,187 @@ def VNCIPHERLAST : VX1_Int_Ty<1353, "vncipherlast", int_ppc_altivec_crypto_vncipherlast, v2i64>; def VSBOX : VXBX_Int_Ty<1480, "vsbox", int_ppc_altivec_crypto_vsbox, v2i64>; } // HasP8Crypto + +// The following altivec instructions were introduced in Power ISA 3.0 +def HasP9Altivec : Predicate<"PPCSubTarget->hasP9Altivec()">; +let Predicates = [HasP9Altivec] in { + +// Vector Compare Not Equal (Zero) +class P9VCMP<bits<10> xo, string asmstr, ValueType Ty> + : VXRForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), asmstr, + IIC_VecFPCompare, []>; +class P9VCMPo<bits<10> xo, string asmstr, ValueType Ty> + : VXRForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), asmstr, + IIC_VecFPCompare, []> { + let Defs = [CR6]; + let RC = 1; +} + +// i8 element comparisons. +def VCMPNEB : P9VCMP < 7, "vcmpneb $vD, $vA, $vB" , v16i8>; +def VCMPNEBo : P9VCMPo< 7, "vcmpneb. $vD, $vA, $vB" , v16i8>; +def VCMPNEZB : P9VCMP <263, "vcmpnezb $vD, $vA, $vB" , v16i8>; +def VCMPNEZBo : P9VCMPo<263, "vcmpnezb. $vD, $vA, $vB", v16i8>; + +// i16 element comparisons. +def VCMPNEH : P9VCMP < 71, "vcmpneh $vD, $vA, $vB" , v8i16>; +def VCMPNEHo : P9VCMPo< 71, "vcmpneh. $vD, $vA, $vB" , v8i16>; +def VCMPNEZH : P9VCMP <327, "vcmpnezh $vD, $vA, $vB" , v8i16>; +def VCMPNEZHo : P9VCMPo<327, "vcmpnezh. $vD, $vA, $vB", v8i16>; + +// i32 element comparisons. +def VCMPNEW : P9VCMP <135, "vcmpnew $vD, $vA, $vB" , v4i32>; +def VCMPNEWo : P9VCMPo<135, "vcmpnew. $vD, $vA, $vB" , v4i32>; +def VCMPNEZW : P9VCMP <391, "vcmpnezw $vD, $vA, $vB" , v4i32>; +def VCMPNEZWo : P9VCMPo<391, "vcmpnezw. $vD, $vA, $vB", v4i32>; + +// VX-Form: [PO VRT / UIM VRB XO]. +// We use VXForm_1 to implement it, that is, we use "VRA" (5 bit) to represent +// "/ UIM" (1 + 4 bit) +class VX1_VT5_UIM5_VB5<bits<11> xo, string opc, list<dag> pattern> + : VXForm_1<xo, (outs vrrc:$vD), (ins u4imm:$UIMM, vrrc:$vB), + !strconcat(opc, " $vD, $vB, $UIMM"), IIC_VecGeneral, pattern>; + +class VX1_RT5_RA5_VB5<bits<11> xo, string opc, list<dag> pattern> + : VXForm_1<xo, (outs g8rc:$rD), (ins g8rc:$rA, vrrc:$vB), + !strconcat(opc, " $rD, $rA, $vB"), IIC_VecGeneral, pattern>; + +// Vector Extract Unsigned +def VEXTRACTUB : VX1_VT5_UIM5_VB5<525, "vextractub", []>; +def VEXTRACTUH : VX1_VT5_UIM5_VB5<589, "vextractuh", []>; +def VEXTRACTUW : VX1_VT5_UIM5_VB5<653, "vextractuw", []>; +def VEXTRACTD : VX1_VT5_UIM5_VB5<717, "vextractd" , []>; + +// Vector Extract Unsigned Byte/Halfword/Word Left/Right-Indexed +def VEXTUBLX : VX1_RT5_RA5_VB5<1549, "vextublx", []>; +def VEXTUBRX : VX1_RT5_RA5_VB5<1805, "vextubrx", []>; +def VEXTUHLX : VX1_RT5_RA5_VB5<1613, "vextuhlx", []>; +def VEXTUHRX : VX1_RT5_RA5_VB5<1869, "vextuhrx", []>; +def VEXTUWLX : VX1_RT5_RA5_VB5<1677, "vextuwlx", []>; +def VEXTUWRX : VX1_RT5_RA5_VB5<1933, "vextuwrx", []>; + +// Vector Insert Element Instructions +def VINSERTB : VX1_VT5_UIM5_VB5<781, "vinsertb", []>; +def VINSERTH : VX1_VT5_UIM5_VB5<845, "vinserth", []>; +def VINSERTW : VX1_VT5_UIM5_VB5<909, "vinsertw", []>; +def VINSERTD : VX1_VT5_UIM5_VB5<973, "vinsertd", []>; + +class VX_VT5_EO5_VB5<bits<11> xo, bits<5> eo, string opc, list<dag> pattern> + : VXForm_RD5_XO5_RS5<xo, eo, (outs vrrc:$vD), (ins vrrc:$vB), + !strconcat(opc, " $vD, $vB"), IIC_VecGeneral, pattern>; + +// Vector Count Leading/Trailing Zero LSB. Result is placed into GPR[rD] +def VCLZLSBB : VXForm_RD5_XO5_RS5<1538, 0, (outs g8rc:$rD), (ins vrrc:$vB), + "vclzlsbb $rD, $vB", IIC_VecGeneral, []>; +def VCTZLSBB : VXForm_RD5_XO5_RS5<1538, 1, (outs g8rc:$rD), (ins vrrc:$vB), + "vctzlsbb $rD, $vB", IIC_VecGeneral, []>; +// Vector Count Trailing Zeros +def VCTZB : VX_VT5_EO5_VB5<1538, 28, "vctzb", []>; +def VCTZH : VX_VT5_EO5_VB5<1538, 29, "vctzh", []>; +def VCTZW : VX_VT5_EO5_VB5<1538, 30, "vctzw", []>; +def VCTZD : VX_VT5_EO5_VB5<1538, 31, "vctzd", []>; + +// Vector Extend Sign +def VEXTSB2W : VX_VT5_EO5_VB5<1538, 16, "vextsb2w", []>; +def VEXTSH2W : VX_VT5_EO5_VB5<1538, 17, "vextsh2w", []>; +def VEXTSB2D : VX_VT5_EO5_VB5<1538, 24, "vextsb2d", []>; +def VEXTSH2D : VX_VT5_EO5_VB5<1538, 25, "vextsh2d", []>; +def VEXTSW2D : VX_VT5_EO5_VB5<1538, 26, "vextsw2d", []>; + +// Vector Integer Negate +def VNEGW : VX_VT5_EO5_VB5<1538, 6, "vnegw", []>; +def VNEGD : VX_VT5_EO5_VB5<1538, 7, "vnegd", []>; + +// Vector Parity Byte +def VPRTYBW : VX_VT5_EO5_VB5<1538, 8, "vprtybw", []>; +def VPRTYBD : VX_VT5_EO5_VB5<1538, 9, "vprtybd", []>; +def VPRTYBQ : VX_VT5_EO5_VB5<1538, 10, "vprtybq", []>; + +// Vector (Bit) Permute (Right-indexed) +def VBPERMD : VXForm_1<1484, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), + "vbpermd $vD, $vA, $vB", IIC_VecFP, []>; +def VPERMR : VAForm_1a<59, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, vrrc:$vC), + "vpermr $vD, $vA, $vB, $vC", IIC_VecFP, []>; + +class VX1_VT5_VA5_VB5<bits<11> xo, string opc, list<dag> pattern> + : VXForm_1<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), + !strconcat(opc, " $vD, $vA, $vB"), IIC_VecFP, pattern>; + +// Vector Rotate Left Mask/Mask-Insert +def VRLWNM : VX1_VT5_VA5_VB5<389, "vrlwnm", []>; +def VRLWMI : VX1_VT5_VA5_VB5<133, "vrlwmi", []>; +def VRLDNM : VX1_VT5_VA5_VB5<453, "vrldnm", []>; +def VRLDMI : VX1_VT5_VA5_VB5<197, "vrldmi", []>; + +// Vector Shift Left/Right +def VSLV : VX1_VT5_VA5_VB5<1860, "vslv", []>; +def VSRV : VX1_VT5_VA5_VB5<1796, "vsrv", []>; + +// Vector Multiply-by-10 (& Write Carry) Unsigned Quadword +def VMUL10UQ : VXForm_BX<513, (outs vrrc:$vD), (ins vrrc:$vA), + "vmul10uq $vD, $vA", IIC_VecFP, []>; +def VMUL10CUQ : VXForm_BX< 1, (outs vrrc:$vD), (ins vrrc:$vA), + "vmul10cuq $vD, $vA", IIC_VecFP, []>; + +// Vector Multiply-by-10 Extended (& Write Carry) Unsigned Quadword +def VMUL10EUQ : VX1_VT5_VA5_VB5<577, "vmul10euq" , []>; +def VMUL10ECUQ : VX1_VT5_VA5_VB5< 65, "vmul10ecuq", []>; + +// Decimal Integer Format Conversion Instructions + +// [PO VRT EO VRB 1 PS XO], "_o" means CR6 is set. +class VX_VT5_EO5_VB5_PS1_XO9_o<bits<5> eo, bits<9> xo, string opc, + list<dag> pattern> + : VX_RD5_EO5_RS5_PS1_XO9<eo, xo, (outs vrrc:$vD), (ins vrrc:$vB, u1imm:$PS), + !strconcat(opc, " $vD, $vB, $PS"), IIC_VecFP, pattern> { + let Defs = [CR6]; +} + +// [PO VRT EO VRB 1 / XO] +class VX_VT5_EO5_VB5_XO9_o<bits<5> eo, bits<9> xo, string opc, + list<dag> pattern> + : VX_RD5_EO5_RS5_PS1_XO9<eo, xo, (outs vrrc:$vD), (ins vrrc:$vB), + !strconcat(opc, " $vD, $vB"), IIC_VecFP, pattern> { + let Defs = [CR6]; + let PS = 0; +} + +// Decimal Convert From/to National/Zoned/Signed-QWord +def BCDCFNo : VX_VT5_EO5_VB5_PS1_XO9_o<7, 385, "bcdcfn." , []>; +def BCDCFZo : VX_VT5_EO5_VB5_PS1_XO9_o<6, 385, "bcdcfz." , []>; +def BCDCTNo : VX_VT5_EO5_VB5_XO9_o <5, 385, "bcdctn." , []>; +def BCDCTZo : VX_VT5_EO5_VB5_PS1_XO9_o<4, 385, "bcdctz." , []>; +def BCDCFSQo : VX_VT5_EO5_VB5_PS1_XO9_o<2, 385, "bcdcfsq.", []>; +def BCDCTSQo : VX_VT5_EO5_VB5_XO9_o <0, 385, "bcdctsq.", []>; + +// Decimal Copy-Sign/Set-Sign +let Defs = [CR6] in +def BCDCPSGNo : VX1_VT5_VA5_VB5<833, "bcdcpsgn.", []>; + +def BCDSETSGNo : VX_VT5_EO5_VB5_PS1_XO9_o<31, 385, "bcdsetsgn.", []>; + +// [PO VRT VRA VRB 1 PS XO], "_o" means CR6 is set. +class VX_VT5_VA5_VB5_PS1_XO9_o<bits<9> xo, string opc, list<dag> pattern> + : VX_RD5_RSp5_PS1_XO9<xo, + (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB, u1imm:$PS), + !strconcat(opc, " $vD, $vA, $vB, $PS"), IIC_VecFP, pattern> { + let Defs = [CR6]; +} + +// [PO VRT VRA VRB 1 / XO] +class VX_VT5_VA5_VB5_XO9_o<bits<9> xo, string opc, list<dag> pattern> + : VX_RD5_RSp5_PS1_XO9<xo, (outs vrrc:$vD), (ins vrrc:$vA, vrrc:$vB), + !strconcat(opc, " $vD, $vA, $vB"), IIC_VecFP, pattern> { + let Defs = [CR6]; + let PS = 0; +} + +// Decimal Shift/Unsigned-Shift/Shift-and-Round +def BCDSo : VX_VT5_VA5_VB5_PS1_XO9_o<193, "bcds." , []>; +def BCDUSo : VX_VT5_VA5_VB5_XO9_o <129, "bcdus.", []>; +def BCDSRo : VX_VT5_VA5_VB5_PS1_XO9_o<449, "bcdsr.", []>; + +// Decimal (Unsigned) Truncate +def BCDTRUNCo : VX_VT5_VA5_VB5_PS1_XO9_o<257, "bcdtrunc." , []>; +def BCDUTRUNCo : VX_VT5_VA5_VB5_XO9_o <321, "bcdutrunc.", []>; +} // end HasP9Altivec |
