aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChandler Carruth <chandlerc@gmail.com>2014-09-21 09:35:25 +0000
committerChandler Carruth <chandlerc@gmail.com>2014-09-21 09:35:25 +0000
commita746d776eb07ebf6e2c4edc13c5ae07bf39d95ef (patch)
treeffbe8b3422f725efb2cf89e2197c6e408fa6d3aa
parent293327ddcd980433432acc1065a0cd9cf82c7b6c (diff)
downloadllvm-a746d776eb07ebf6e2c4edc13c5ae07bf39d95ef.zip
llvm-a746d776eb07ebf6e2c4edc13c5ae07bf39d95ef.tar.gz
llvm-a746d776eb07ebf6e2c4edc13c5ae07bf39d95ef.tar.bz2
[x86] Fix a helper to reflect that what we actually care about is
128-bit lane crossings, not 'half' crossings. This came up in code review ages ago, but I hadn't really addresesd it. Also added some documentation for the helper. No functionality changed. llvm-svn: 218203
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp21
1 files changed, 12 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 7e43524..b00709c 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -9106,13 +9106,16 @@ static SDValue lower128BitVectorShuffle(SDValue Op, SDValue V1, SDValue V2,
}
}
-static bool isHalfCrossingShuffleMask(ArrayRef<int> Mask) {
+/// \brief Test whether there are elements crossing 128-bit lanes in this
+/// shuffle mask.
+///
+/// X86 divides up its shuffles into in-lane and cross-lane shuffle operations
+/// and we routinely test for these.
+static bool is128BitLaneCrossingShuffleMask(MVT VT, ArrayRef<int> Mask) {
+ int LaneSize = 128 / VT.getScalarSizeInBits();
int Size = Mask.size();
- for (int M : Mask.slice(0, Size / 2))
- if (M >= 0 && (M % Size) >= Size / 2)
- return true;
- for (int M : Mask.slice(Size / 2, Size / 2))
- if (M >= 0 && (M % Size) < Size / 2)
+ for (int i = 0; i < Size; ++i)
+ if (Mask[i] >= 0 && (Mask[i] % Size) / LaneSize != i / LaneSize)
return true;
return false;
}
@@ -9200,7 +9203,7 @@ static SDValue lowerV4F64VectorShuffle(SDValue Op, SDValue V1, SDValue V2,
// shuffles aren't a problem and FP and int have the same patterns.
// FIXME: We can handle these more cleverly than splitting for v4f64.
- if (isHalfCrossingShuffleMask(Mask))
+ if (is128BitLaneCrossingShuffleMask(MVT::v4f64, Mask))
return splitAndLower256BitVectorShuffle(Op, V1, V2, Subtarget, DAG);
if (isSingleInputShuffleMask(Mask)) {
@@ -9281,7 +9284,7 @@ static SDValue lowerV4I64VectorShuffle(SDValue Op, SDValue V1, SDValue V2,
// FIXME: If we have AVX2, we should delegate to generic code as crossing
// shuffles aren't a problem and FP and int have the same patterns.
- if (isHalfCrossingShuffleMask(Mask))
+ if (is128BitLaneCrossingShuffleMask(MVT::v4i64, Mask))
return splitAndLower256BitVectorShuffle(Op, V1, V2, Subtarget, DAG);
// AVX1 doesn't provide any facilities for v4i64 shuffles, bitcast and
@@ -9306,7 +9309,7 @@ static SDValue lowerV8F32VectorShuffle(SDValue Op, SDValue V1, SDValue V2,
ArrayRef<int> Mask = SVOp->getMask();
assert(Mask.size() == 8 && "Unexpected mask size for v8 shuffle!");
- if (isHalfCrossingShuffleMask(Mask) ||
+ if (is128BitLaneCrossingShuffleMask(MVT::v8f32, Mask) ||
isSingleInputShuffleMask(Mask))
return splitAndLower256BitVectorShuffle(Op, V1, V2, Subtarget, DAG);