diff options
author | Simon Pilgrim <llvm-dev@redking.me.uk> | 2017-01-31 14:59:44 +0000 |
---|---|---|
committer | Simon Pilgrim <llvm-dev@redking.me.uk> | 2017-01-31 14:59:44 +0000 |
commit | 1b39d5db7bc296d54b78c7dd9d1e30c6523bb883 (patch) | |
tree | 27415fec657400c62fee81366cccf6cbd1a3a1df /llvm/lib/Target | |
parent | 3f11941d8ab0bbd61bf8c05f08bdeebf46256d2d (diff) | |
download | bcm5719-llvm-1b39d5db7bc296d54b78c7dd9d1e30c6523bb883.tar.gz bcm5719-llvm-1b39d5db7bc296d54b78c7dd9d1e30c6523bb883.zip |
[X86][SSE] Add support for combining PINSRB into a target shuffle.
llvm-svn: 293637
Diffstat (limited to 'llvm/lib/Target')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelLowering.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 8bbe21c9b3a..d928d5dfb28 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -5770,13 +5770,14 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask, Ops.push_back(IsAndN ? N1 : N0); return true; } + case X86ISD::PINSRB: case X86ISD::PINSRW: { SDValue InVec = N.getOperand(0); SDValue InScl = N.getOperand(1); uint64_t InIdx = N.getConstantOperandVal(2); assert(InIdx < NumElts && "Illegal insertion index"); - // Attempt to recognise a PINSRW(VEC, 0, Idx) shuffle pattern. + // Attempt to recognise a PINSR*(VEC, 0, Idx) shuffle pattern. if (X86::isZeroNode(InScl)) { Ops.push_back(InVec); for (unsigned i = 0; i != NumElts; ++i) @@ -5784,10 +5785,12 @@ static bool getFauxShuffleMask(SDValue N, SmallVectorImpl<int> &Mask, return true; } - // Attempt to recognise a PINSRW(ASSERTZEXT(PEXTRW)) shuffle pattern. - // TODO: Expand this to support PINSRB/INSERT_VECTOR_ELT/etc. + // Attempt to recognise a PINSR*(ASSERTZEXT(PEXTR*)) shuffle pattern. + // TODO: Expand this to support INSERT_VECTOR_ELT/etc. + unsigned ExOp = + (X86ISD::PINSRB == Opcode ? X86ISD::PEXTRB : X86ISD::PEXTRW); if (InScl.getOpcode() != ISD::AssertZext || - InScl.getOperand(0).getOpcode() != X86ISD::PEXTRW) + InScl.getOperand(0).getOpcode() != ExOp) return false; SDValue ExVec = InScl.getOperand(0).getOperand(0); |