summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/X86/X86ISelLowering.cpp
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@gmail.com>2013-08-15 07:30:51 +0000
committerCraig Topper <craig.topper@gmail.com>2013-08-15 07:30:51 +0000
commit2ffd06528dd27ba3f41be9454c701a7aee0f7424 (patch)
treece10ca6c9ed3c908f3c47571d058ed7feb6ee83f /llvm/lib/Target/X86/X86ISelLowering.cpp
parent3186eb3efdd65c562335e46803394fc984f7ddfd (diff)
downloadbcm5719-llvm-2ffd06528dd27ba3f41be9454c701a7aee0f7424.tar.gz
bcm5719-llvm-2ffd06528dd27ba3f41be9454c701a7aee0f7424.zip
Don't let isPermImmMask handle v16i32 since VPERMI doesn't match on that type. Remove 128-bit vector handling from isPermImmMask too, it's covered by isPSHUFDMask.
llvm-svn: 188449
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp35
1 files changed, 9 insertions, 26 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 3144038d12f..f5cb021b5d9 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -4102,41 +4102,26 @@ static unsigned getShuffleVPERM2X128Immediate(ShuffleVectorSDNode *SVOp) {
return (FstHalf | (SndHalf << 4));
}
-// Symetric in-lane mask. Each lane has 4 elements (for imm8)
+// Symmetric in-lane mask. Each lane has 4 elements (for imm8)
static bool isPermImmMask(ArrayRef<int> Mask, MVT VT, unsigned& Imm8) {
- unsigned EltSize = VT.getVectorElementType().getSizeInBits();
- if (EltSize < 32)
+ unsigned NumElts = VT.getVectorNumElements();
+ if (!(VT.is256BitVector() && NumElts == 4) &&
+ !(VT.is512BitVector() && NumElts == 8))
return false;
- unsigned NumElts = VT.getVectorNumElements();
Imm8 = 0;
- if (VT.is128BitVector() || (VT.is256BitVector() && EltSize == 64)) {
- for (unsigned i = 0; i != NumElts; ++i) {
- if (Mask[i] < 0)
- continue;
- Imm8 |= Mask[i] << (i*2);
- }
- return true;
- }
-
unsigned LaneSize = 4;
- SmallVector<int, 4> MaskVal(LaneSize, -1);
-
for (unsigned l = 0; l != NumElts; l += LaneSize) {
for (unsigned i = 0; i != LaneSize; ++i) {
if (!isUndefOrInRange(Mask[i+l], l, l+LaneSize))
return false;
- if (Mask[i+l] < 0)
- continue;
- if (MaskVal[i] < 0) {
- MaskVal[i] = Mask[i+l] - l;
- Imm8 |= MaskVal[i] << (i*2);
- continue;
- }
- if (Mask[i+l] != (signed)(MaskVal[i]+l))
+ if (Mask[i] >= 0 && !isUndefOrEqual(Mask[i+l], Mask[i]+l))
return false;
+ if (Mask[i+l] >= 0)
+ Imm8 |= (Mask[i+l] - l) << (i*2);
}
}
+
return true;
}
@@ -4165,9 +4150,7 @@ static bool isVPERMILPMask(ArrayRef<int> Mask, MVT VT, bool HasFp256) {
if (NumElts != 8 || l == 0)
continue;
// VPERMILPS handling
- if (Mask[i] < 0)
- continue;
- if (!isUndefOrEqual(Mask[i+l], Mask[i]+l))
+ if (Mask[i] >= 0 && !isUndefOrEqual(Mask[i+l], Mask[i]+l))
return false;
}
}
OpenPOWER on IntegriCloud