[llvm] r218203 - [x86] Fix a helper to reflect that what we actually care about is

Chandler Carruth chandlerc at gmail.com
Sun Sep 21 02:35:25 PDT 2014


Author: chandlerc
Date: Sun Sep 21 04:35:25 2014
New Revision: 218203

URL: http://llvm.org/viewvc/llvm-project?rev=218203&view=rev
Log:
[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.

Modified:
    llvm/trunk/lib/Target/X86/X86ISelLowering.cpp

Modified: llvm/trunk/lib/Target/X86/X86ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/X86ISelLowering.cpp?rev=218203&r1=218202&r2=218203&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/X86ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/X86/X86ISelLowering.cpp Sun Sep 21 04:35:25 2014
@@ -9106,13 +9106,16 @@ static SDValue lower128BitVectorShuffle(
   }
 }
 
-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(S
   // 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(S
   // 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(S
   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);
 





More information about the llvm-commits mailing list