Index: lib/Target/PowerPC/PPCInstrAltivec.td =================================================================== --- lib/Target/PowerPC/PPCInstrAltivec.td +++ lib/Target/PowerPC/PPCInstrAltivec.td @@ -1213,3 +1213,33 @@ int_ppc_altivec_crypto_vncipherlast, v2i64>; def VSBOX : VXBX_Int_Ty<1480, "vsbox", int_ppc_altivec_crypto_vsbox, v2i64>; } // HasP8Crypto + +def HasP9Altivec : Predicate<"PPCSubTarget->hasP9Altivec()">; +let Predicates = [HasP9Altivec] in { + +// Vector Extract Unsigned +// Its VX-Form is [PO VRT / UIM VRB XO], and we can use VXForm_1 to implement +// it. That means we use "VRA" (5 bit) to represent "/ UIM" (1 + 4 bit) +class VEXTR xo, string opc> + : VXForm_1; + +def VEXTRACTUB : VEXTR<525, "vextractub">; +def VEXTRACTUH : VEXTR<589, "vextractuh">; +def VEXTRACTUW : VEXTR<653, "vextractuw">; +def VEXTRACTD : VEXTR<717, "vextractd">; + +// Vector Extract Unsigned Left/Right-Indexed +class VEXTR_2 xo, string opc> + : VXForm_1; + +def VEXTUBLX : VEXTR_2<1549, "vextublx">; +def VEXTUBRX : VEXTR_2<1805, "vextubrx">; +def VEXTUHLX : VEXTR_2<1613, "vextuhlx">; +def VEXTUHRX : VEXTR_2<1869, "vextuhrx">; +def VEXTUWLX : VEXTR_2<1677, "vextuwlx">; +def VEXTUWRX : VEXTR_2<1933, "vextuwrx">; +} // end HasP9Altivec Index: lib/Target/PowerPC/PPCSubtarget.h =================================================================== --- lib/Target/PowerPC/PPCSubtarget.h +++ lib/Target/PowerPC/PPCSubtarget.h @@ -92,6 +92,7 @@ bool HasP8Vector; bool HasP8Altivec; bool HasP8Crypto; + bool HasP9Altivec; bool HasFCPSGN; bool HasFSQRT; bool HasFRE, HasFRES, HasFRSQRTE, HasFRSQRTES; @@ -229,6 +230,7 @@ bool hasP8Vector() const { return HasP8Vector; } bool hasP8Altivec() const { return HasP8Altivec; } bool hasP8Crypto() const { return HasP8Crypto; } + bool hasP9Altivec() const { return HasP9Altivec; } bool hasMFOCRF() const { return HasMFOCRF; } bool hasISEL() const { return HasISEL; } bool hasPOPCNTD() const { return HasPOPCNTD; } Index: lib/Target/PowerPC/PPCSubtarget.cpp =================================================================== --- lib/Target/PowerPC/PPCSubtarget.cpp +++ lib/Target/PowerPC/PPCSubtarget.cpp @@ -70,6 +70,7 @@ HasP8Vector = false; HasP8Altivec = false; HasP8Crypto = false; + HasP9Altivec = false; HasFCPSGN = false; HasFSQRT = false; HasFRE = false; Index: test/MC/Disassembler/PowerPC/ppc64-encoding-vmx.txt =================================================================== --- test/MC/Disassembler/PowerPC/ppc64-encoding-vmx.txt +++ test/MC/Disassembler/PowerPC/ppc64-encoding-vmx.txt @@ -672,3 +672,33 @@ # CHECK: mfvscr 2 0x10 0x40 0x06 0x04 +# CHECK: vextractub 2, 3, 15 +0x10 0x4f 0x1a 0x0d + +# CHECK: vextractuh 2, 3, 14 +0x10 0x4e 0x1a 0x4d + +# CHECK: vextractuw 2, 3, 12 +0x10 0x4c 0x1a 0x8d + +# CHECK: vextractd 2, 3, 8 +0x10 0x48 0x1a 0xcd + +# CHECK: vextublx 2, 3, 4 +0x10 0x43 0x26 0x0d + +# CHECK: vextubrx 2, 3, 4 +0x10 0x43 0x27 0x0d + +# CHECK: vextuhlx 2, 3, 4 +0x10 0x43 0x26 0x4d + +# CHECK: vextuhrx 2, 3, 4 +0x10 0x43 0x27 0x4d + +# CHECK: vextuwlx 2, 3, 4 +0x10 0x43 0x26 0x8d + +# CHECK: vextuwrx 2, 3, 4 +0x10 0x43 0x27 0x8d + Index: test/MC/PowerPC/ppc64-encoding-vmx.s =================================================================== --- test/MC/PowerPC/ppc64-encoding-vmx.s +++ test/MC/PowerPC/ppc64-encoding-vmx.s @@ -742,3 +742,37 @@ # CHECK-LE: mfvscr 2 # encoding: [0x04,0x06,0x40,0x10] mfvscr 2 +# Vector Extract Unsigned +# CHECK-BE: vextractub 2, 3, 15 # encoding: [0x10,0x4f,0x1a,0x0d] +# CHECK-LE: vextractub 2, 3, 15 # encoding: [0x0d,0x1a,0x4f,0x10] + vextractub 2, 3, 15 +# CHECK-BE: vextractuh 2, 3, 14 # encoding: [0x10,0x4e,0x1a,0x4d] +# CHECK-LE: vextractuh 2, 3, 14 # encoding: [0x4d,0x1a,0x4e,0x10] + vextractuh 2, 3, 14 +# CHECK-BE: vextractuw 2, 3, 12 # encoding: [0x10,0x4c,0x1a,0x8d] +# CHECK-LE: vextractuw 2, 3, 12 # encoding: [0x8d,0x1a,0x4c,0x10] + vextractuw 2, 3, 12 +# CHECK-BE: vextractd 2, 3, 8 # encoding: [0x10,0x48,0x1a,0xcd] +# CHECK-LE: vextractd 2, 3, 8 # encoding: [0xcd,0x1a,0x48,0x10] + vextractd 2, 3, 8 + +# Vector Extract Unsigned Left/Right-Indexed +# CHECK-BE: vextublx 2, 3, 4 # encoding: [0x10,0x43,0x26,0x0d] +# CHECK-LE: vextublx 2, 3, 4 # encoding: [0x0d,0x26,0x43,0x10] + vextublx 2, 3, 4 +# CHECK-BE: vextubrx 2, 3, 4 # encoding: [0x10,0x43,0x27,0x0d] +# CHECK-LE: vextubrx 2, 3, 4 # encoding: [0x0d,0x27,0x43,0x10] + vextubrx 2, 3, 4 +# CHECK-BE: vextuhlx 2, 3, 4 # encoding: [0x10,0x43,0x26,0x4d] +# CHECK-LE: vextuhlx 2, 3, 4 # encoding: [0x4d,0x26,0x43,0x10] + vextuhlx 2, 3, 4 +# CHECK-BE: vextuhrx 2, 3, 4 # encoding: [0x10,0x43,0x27,0x4d] +# CHECK-LE: vextuhrx 2, 3, 4 # encoding: [0x4d,0x27,0x43,0x10] + vextuhrx 2, 3, 4 +# CHECK-BE: vextuwlx 2, 3, 4 # encoding: [0x10,0x43,0x26,0x8d] +# CHECK-LE: vextuwlx 2, 3, 4 # encoding: [0x8d,0x26,0x43,0x10] + vextuwlx 2, 3, 4 +# CHECK-BE: vextuwrx 2, 3, 4 # encoding: [0x10,0x43,0x27,0x8d] +# CHECK-LE: vextuwrx 2, 3, 4 # encoding: [0x8d,0x27,0x43,0x10] + vextuwrx 2, 3, 4 +