aboutsummaryrefslogtreecommitdiffstats
path: root/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
commit46ceaf4ba64cdd0ac37578c0132cad39c9ea21c0 (patch)
tree5801e7c77b15f467e33716b4364c2119f106192c /lib/Target/X86/X86ISelLowering.cpp
parent84e51517e25119419d53d6ed61fef15219efd733 (diff)
downloadexternal_llvm-46ceaf4ba64cdd0ac37578c0132cad39c9ea21c0.zip
external_llvm-46ceaf4ba64cdd0ac37578c0132cad39c9ea21c0.tar.gz
external_llvm-46ceaf4ba64cdd0ac37578c0132cad39c9ea21c0.tar.bz2
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188449 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/X86/X86ISelLowering.cpp')
-rw-r--r--lib/Target/X86/X86ISelLowering.cpp35
1 files changed, 9 insertions, 26 deletions
diff --git a/lib/Target/X86/X86ISelLowering.cpp b/lib/Target/X86/X86ISelLowering.cpp
index 3144038..f5cb021 100644
--- a/lib/Target/X86/X86ISelLowering.cpp
+++ b/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;
}
}