diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-04-16 17:52:07 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2016-04-16 17:52:07 +0000 |
commit | fd4b9b02a31febf107560a4196e30c0aede2bc5d (patch) | |
tree | 955e0c6f5e5006cae97a7dc4a702298620a86f80 /llvm/lib/Target/X86/X86ISelLowering.cpp | |
parent | 04b579367dba7103e863fa976b5ac1e162d6b5f4 (diff) | |
download | bcm5719-llvm-fd4b9b02a31febf107560a4196e30c0aede2bc5d.tar.gz bcm5719-llvm-fd4b9b02a31febf107560a4196e30c0aede2bc5d.zip |
[X86][XOP] Added VPPERM constant mask decoding and target shuffle combining support
Added additional test that peeks through bitcast to v16i8 mask
llvm-svn: 266533
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 7f699762262..284925c9030 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -3871,6 +3871,7 @@ static bool isTargetShuffle(unsigned Opcode) { case X86ISD::VPERMILPV: case X86ISD::VPERM2X128: case X86ISD::VPERMI: + case X86ISD::VPPERM: case X86ISD::VPERMV: case X86ISD::VPERMV3: case X86ISD::VZEXT_MOVL: @@ -5008,6 +5009,20 @@ static bool getTargetShuffleMask(SDNode *N, MVT VT, bool AllowSentinelZero, case X86ISD::MOVLPS: // Not yet implemented return false; + case X86ISD::VPPERM: { + IsUnary = IsFakeUnary = N->getOperand(0) == N->getOperand(1); + SDValue MaskNode = N->getOperand(2); + SmallVector<uint64_t, 32> RawMask; + if (getTargetShuffleMaskIndices(MaskNode, 8, RawMask)) { + DecodeVPPERMMask(RawMask, Mask); + break; + } + if (auto *C = getTargetShuffleMaskConstant(MaskNode)) { + DecodeVPPERMMask(C, Mask); + break; + } + return false; + } case X86ISD::VPERMV: { IsUnary = true; // Unlike most shuffle nodes, VPERMV's mask operand is operand 0. @@ -29688,6 +29703,7 @@ SDValue X86TargetLowering::PerformDAGCombine(SDNode *N, case X86ISD::MOVDDUP: case X86ISD::MOVSS: case X86ISD::MOVSD: + case X86ISD::VPPERM: case X86ISD::VPERMV3: case X86ISD::VPERMILPI: case X86ISD::VPERMILPV: |