[llvm] [X86] Improve llvm.get.active.lane.mask codegen (PR #225832)

via llvm-commits llvm-commits at lists.llvm.org
Wed Sep 30 08:56:48 PDT 2026


https://github.com/houngkoungting updated https://github.com/llvm/llvm-project/pull/225832

>From ee9343085718f3be84634632716b7306d3988c03 Mon Sep 17 00:00:00 2001
From: william <we3223 at gmail.com>
Date: Thu, 24 Sep 2026 00:07:36 +0800
Subject: [PATCH 1/2] [CodeGen] Clean up scalar bitmask type calculation in
 TargetLowering

---
 llvm/include/llvm/CodeGen/TargetLowering.h    |   18 +
 .../SelectionDAG/SelectionDAGBuilder.cpp      |    8 +
 .../CodeGen/SelectionDAG/TargetLowering.cpp   |   45 +
 llvm/lib/Target/X86/X86ISelLowering.cpp       |   19 +
 llvm/lib/Target/X86/X86ISelLowering.h         |    3 +
 llvm/test/CodeGen/X86/active_lane_mask.ll     | 3241 +++--------------
 llvm/test/CodeGen/X86/pr47299.ll              |   70 +-
 7 files changed, 635 insertions(+), 2769 deletions(-)

diff --git a/llvm/include/llvm/CodeGen/TargetLowering.h b/llvm/include/llvm/CodeGen/TargetLowering.h
index 46521fa8c544a..1dfd2b63ca2fb 100644
--- a/llvm/include/llvm/CodeGen/TargetLowering.h
+++ b/llvm/include/llvm/CodeGen/TargetLowering.h
@@ -5759,6 +5759,24 @@ class LLVM_ABI TargetLowering : public TargetLoweringBase {
   /// \returns The expansion if successful, SDValue() otherwise
   SDValue expandROT(SDNode *N, bool AllowVectorOps, SelectionDAG &DAG) const;
 
+  /// Expand get_active_lane_mask into a scalar bitmask sequence.
+  /// \param DAG The SelectionDAG.
+  /// \param VT The target vector boolean type.
+  /// \param Index The loop iteration index.
+  /// \param TripCount The loop trip count.
+  /// \param DL The source location.
+  /// \returns The expanded SDValue, or an empty SDValue if expansion is not
+  /// supported.
+  SDValue expandGetActiveLaneMask(SelectionDAG &DAG, EVT VT, SDValue Index,
+                                  SDValue TripCount, const SDLoc &DL) const;
+
+  /// Return true if the target prefers to expand get_active_lane_mask
+  /// into a scalar bitmask sequence.
+  /// \param VT The vector mask type.
+  virtual bool shouldExpandGetActiveLaneMaskUsingScalar(EVT VT) const {
+    return false;
+  }
+
   /// Expand shift-by-parts.
   /// \param N Node to expand
   /// \param Lo lower-output-part after conversion
diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
index f7eec8c5088d4..b19dff3a87f42 100644
--- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp
@@ -8541,6 +8541,14 @@ void SelectionDAGBuilder::visitIntrinsicCall(const CallInst &I,
     SDValue Index = getValue(I.getOperand(0));
     SDValue TripCount = getValue(I.getOperand(1));
     EVT ElementVT = Index.getValueType();
+    // Attempt to expand into a scalar bitmask if preferred by target.
+    if (TLI.shouldExpandGetActiveLaneMaskUsingScalar(CCVT)) {
+      if (SDValue Res =
+              TLI.expandGetActiveLaneMask(DAG, CCVT, Index, TripCount, sdl)) {
+        setValue(&I, Res);
+        return;
+      }
+    }
 
     if (!TLI.shouldExpandGetActiveLaneMask(CCVT, ElementVT)) {
       setValue(&I, DAG.getNode(ISD::GET_ACTIVE_LANE_MASK, sdl, CCVT, Index,
diff --git a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
index 1eeab43bd480e..f00c371af1009 100644
--- a/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
@@ -8768,6 +8768,51 @@ static bool isNonZeroModBitWidthOrUndef(SDValue Z, unsigned BW) {
       /*AllowUndefs=*/true, /*AllowTruncation=*/true);
 }
 
+SDValue TargetLowering::expandGetActiveLaneMask(SelectionDAG &DAG, EVT VT,
+                                                SDValue Index,
+                                                SDValue TripCount,
+                                                const SDLoc &DL) const {
+  if (!VT.isFixedLengthVector())
+    return SDValue();
+
+  unsigned NumElts = VT.getVectorNumElements();
+
+  if (NumElts > 64)
+    return SDValue();
+
+  EVT IndexVT = Index.getValueType();
+  // Scalar integer type wide enough to hold all lane bits (at least i8).
+  unsigned MaskBits = llvm::PowerOf2Ceil(std::max(8u, NumElts));
+  EVT MaskVT = EVT::getIntegerVT(*DAG.getContext(), MaskBits);
+
+  // Clamp remaining lanes: Diff = (TripCount <= Index) ? 0 : (TripCount -
+  // Index).
+  SDValue Sub = DAG.getNode(ISD::SUB, DL, IndexVT, TripCount, Index);
+  SDValue IsLe = DAG.getSetCC(
+      DL, getSetCCResultType(DAG.getDataLayout(), *DAG.getContext(), IndexVT),
+      TripCount, Index, ISD::SETULE);
+  SDValue Zero = DAG.getConstant(0, DL, IndexVT);
+  SDValue Diff = DAG.getSelect(DL, IndexVT, IsLe, Zero, Sub);
+  // Clamp to vector length: k = umin(Diff, NumElts).
+  SDValue MaxLanes = DAG.getConstant(NumElts, DL, IndexVT);
+  SDValue Clamped = DAG.getNode(ISD::UMIN, DL, IndexVT, Diff, MaxLanes);
+  // Build the scalar bitmask: (1 << k) - 1.
+  SDValue ShiftAmt = DAG.getZExtOrTrunc(Clamped, DL, MaskVT);
+  SDValue One = DAG.getConstant(1, DL, MaskVT);
+  SDValue Shl = DAG.getNode(ISD::SHL, DL, MaskVT, One, ShiftAmt);
+  SDValue ScalarMask = DAG.getNode(ISD::SUB, DL, MaskVT, Shl, One);
+  // Bitcast to a boolean vector matching the integer bit width.
+  EVT BoolVecVT =
+      EVT::getVectorVT(*DAG.getContext(), MVT::i1, MaskVT.getSizeInBits());
+  SDValue Bitcast = DAG.getNode(ISD::BITCAST, DL, BoolVecVT, ScalarMask);
+
+  if (BoolVecVT == VT)
+    return Bitcast;
+  // Extract the original subvector if padded (e.g. v4i1 from i8 -> v8i1).
+  return DAG.getNode(ISD::EXTRACT_SUBVECTOR, DL, VT, Bitcast,
+                     DAG.getVectorIdxConstant(0, DL));
+}
+
 SDValue TargetLowering::expandFunnelShift(SDNode *Node,
                                           SelectionDAG &DAG) const {
   EVT VT = Node->getValueType(0);
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 7817c86155e5b..30ff5844739bc 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -32768,6 +32768,25 @@ X86TargetLowering::shouldExpandAtomicLoadInIR(LoadInst *LI) const {
                                  : AtomicExpansionKind::None;
 }
 
+bool X86TargetLowering::shouldExpandGetActiveLaneMaskUsingScalar(EVT VT) const {
+  if (!VT.isFixedLengthVector())
+    return false;
+
+  unsigned NumElts = VT.getVectorNumElements();
+
+  // Only consider power-of-2 vector lengths up to 64.
+  if (NumElts > 64 || !isPowerOf2_32(NumElts))
+    return false;
+
+  // AVX-512 natively supports mask registers (kmov/bzhi) for >=16.
+  if (Subtarget.hasAVX512())
+    return NumElts >= 16;
+
+  // Without AVX-512, bitcasting to vXi1 requires costly unpacking (e.g. pinsrb)
+  // on smaller vectors. Only expand v64i1 to avoid its 80+ vector instructions.
+  return NumElts == 64;
+}
+
 enum BitTestKind : unsigned {
   UndefBit,
   ConstantBit,
diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h
index ba04080573c42..caedf954ff068 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.h
+++ b/llvm/lib/Target/X86/X86ISelLowering.h
@@ -110,6 +110,9 @@ namespace llvm {
 
     unsigned getJumpTableEncoding() const override;
     bool useSoftFloat() const override;
+    /// Return true if X86 prefers to expand get_active_lane_mask into a scalar
+    /// bitmask sequence.
+    bool shouldExpandGetActiveLaneMaskUsingScalar(EVT VT) const override;
 
     void markLibCallAttributes(MachineFunction *MF, unsigned CC,
                                ArgListTy &Args) const override;
diff --git a/llvm/test/CodeGen/X86/active_lane_mask.ll b/llvm/test/CodeGen/X86/active_lane_mask.ll
index be4264daffef0..74a37c8ba6b4a 100644
--- a/llvm/test/CodeGen/X86/active_lane_mask.ll
+++ b/llvm/test/CodeGen/X86/active_lane_mask.ll
@@ -1,6 +1,6 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64    | FileCheck %s --check-prefixes=SSE2
-; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE42
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64    | FileCheck %s --check-prefixes=SSE,SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=SSE,SSE42
 ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=AVX2
 ; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX512
 
@@ -272,34 +272,34 @@ define <16 x i1> @lane_mask_v16i1_i32(i32 %index, i32 %TC) {
 ; SSE42-LABEL: lane_mask_v16i1_i32:
 ; SSE42:       # %bb.0:
 ; SSE42-NEXT:    movd %edi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,0,0]
+; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [4294967295,4294967294,4294967293,4294967292]
-; SSE42-NEXT:    pminud %xmm2, %xmm0
+; SSE42-NEXT:    pminud %xmm1, %xmm0
 ; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,1,2,3]
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [4294967291,4294967290,4294967289,4294967288]
-; SSE42-NEXT:    pminud %xmm2, %xmm1
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4,5,6,7]
+; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967291,4294967290,4294967289,4294967288]
+; SSE42-NEXT:    pminud %xmm1, %xmm2
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,5,6,7]
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967287,4294967286,4294967285,4294967284]
-; SSE42-NEXT:    pminud %xmm2, %xmm3
+; SSE42-NEXT:    pminud %xmm1, %xmm3
 ; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [8,9,10,11]
 ; SSE42-NEXT:    movd %esi, %xmm4
-; SSE42-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE42-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [12,13,14,15]
-; SSE42-NEXT:    movdqa %xmm2, %xmm5
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [12,13,14,15]
+; SSE42-NEXT:    movdqa %xmm1, %xmm5
 ; SSE42-NEXT:    pmaxud %xmm4, %xmm5
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm3, %xmm2
-; SSE42-NEXT:    pmaxud %xmm4, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm3, %xmm2
-; SSE42-NEXT:    packssdw %xmm5, %xmm2
-; SSE42-NEXT:    movdqa %xmm1, %xmm3
+; SSE42-NEXT:    pcmpeqd %xmm1, %xmm5
+; SSE42-NEXT:    movdqa %xmm3, %xmm1
+; SSE42-NEXT:    pmaxud %xmm4, %xmm1
+; SSE42-NEXT:    pcmpeqd %xmm3, %xmm1
+; SSE42-NEXT:    packssdw %xmm5, %xmm1
+; SSE42-NEXT:    movdqa %xmm2, %xmm3
 ; SSE42-NEXT:    pmaxud %xmm4, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm3
+; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
 ; SSE42-NEXT:    pmaxud %xmm0, %xmm4
 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm4
 ; SSE42-NEXT:    packssdw %xmm3, %xmm4
-; SSE42-NEXT:    packsswb %xmm2, %xmm4
+; SSE42-NEXT:    packsswb %xmm1, %xmm4
 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm0
 ; SSE42-NEXT:    pxor %xmm4, %xmm0
 ; SSE42-NEXT:    retq
@@ -329,13 +329,16 @@ define <16 x i1> @lane_mask_v16i1_i32(i32 %index, i32 %TC) {
 ;
 ; AVX512-LABEL: lane_mask_v16i1_i32:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastd %esi, %zmm0
-; AVX512-NEXT:    vpbroadcastd %edi, %zmm1
-; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
-; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
-; AVX512-NEXT:    vpcmpltud %zmm0, %zmm1, %k0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    subl %edi, %esi
+; AVX512-NEXT:    cmovbel %eax, %esi
+; AVX512-NEXT:    cmpl $16, %esi
+; AVX512-NEXT:    movl $16, %eax
+; AVX512-NEXT:    cmovbl %esi, %eax
+; AVX512-NEXT:    movl $-1, %ecx
+; AVX512-NEXT:    bzhil %eax, %ecx, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
-; AVX512-NEXT:    vzeroupper
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 %index, i32 %TC)
   ret <16 x i1> %active.lane.mask
@@ -405,20 +408,9 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
 ; SSE2-NEXT:    por %xmm4, %xmm6
 ; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [24,25,26,27]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [20,21,22,23]
+; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
+; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [24,25,26,27]
 ; SSE2-NEXT:    paddd %xmm2, %xmm5
 ; SSE2-NEXT:    movdqa %xmm5, %xmm6
 ; SSE2-NEXT:    pxor %xmm1, %xmm6
@@ -428,6 +420,17 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE2-NEXT:    pxor %xmm1, %xmm7
 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
+; SSE2-NEXT:    packssdw %xmm4, %xmm5
+; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [20,21,22,23]
+; SSE2-NEXT:    paddd %xmm2, %xmm4
+; SSE2-NEXT:    movdqa %xmm4, %xmm6
+; SSE2-NEXT:    pxor %xmm1, %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
+; SSE2-NEXT:    por %xmm4, %xmm7
+; SSE2-NEXT:    pxor %xmm1, %xmm7
+; SSE2-NEXT:    movdqa %xmm3, %xmm4
+; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
 ; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [16,17,18,19]
 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
 ; SSE2-NEXT:    pxor %xmm1, %xmm6
@@ -435,8 +438,8 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE2-NEXT:    por %xmm2, %xmm0
 ; SSE2-NEXT:    pxor %xmm1, %xmm0
 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
-; SSE2-NEXT:    packssdw %xmm5, %xmm3
-; SSE2-NEXT:    packsswb %xmm4, %xmm3
+; SSE2-NEXT:    packssdw %xmm4, %xmm3
+; SSE2-NEXT:    packsswb %xmm5, %xmm3
 ; SSE2-NEXT:    pmovmskb %xmm3, %edx
 ; SSE2-NEXT:    shll $16, %edx
 ; SSE2-NEXT:    orl %ecx, %edx
@@ -456,28 +459,28 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE42-NEXT:    movdqa %xmm2, %xmm3
 ; SSE42-NEXT:    pmaxud %xmm0, %xmm3
 ; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967287,4294967286,4294967285,4294967284]
-; SSE42-NEXT:    pminud %xmm1, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [8,9,10,11]
-; SSE42-NEXT:    movdqa %xmm4, %xmm2
-; SSE42-NEXT:    pmaxud %xmm0, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm2
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967291,4294967290,4294967289,4294967288]
-; SSE42-NEXT:    pminud %xmm1, %xmm3
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [4,5,6,7]
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
+; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967287,4294967286,4294967285,4294967284]
+; SSE42-NEXT:    pminud %xmm1, %xmm2
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [8,9,10,11]
+; SSE42-NEXT:    movdqa %xmm2, %xmm4
 ; SSE42-NEXT:    pmaxud %xmm0, %xmm4
+; SSE42-NEXT:    pcmpeqd %xmm2, %xmm4
+; SSE42-NEXT:    packssdw %xmm3, %xmm4
+; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967291,4294967290,4294967289,4294967288]
+; SSE42-NEXT:    pminud %xmm1, %xmm2
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,5,6,7]
+; SSE42-NEXT:    movdqa %xmm2, %xmm3
+; SSE42-NEXT:    pmaxud %xmm0, %xmm3
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967294,4294967293,4294967292]
 ; SSE42-NEXT:    pminud %xmm1, %xmm5
 ; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [0,1,2,3]
-; SSE42-NEXT:    pcmpeqd %xmm3, %xmm4
-; SSE42-NEXT:    movdqa %xmm5, %xmm3
-; SSE42-NEXT:    pmaxud %xmm0, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm5, %xmm3
-; SSE42-NEXT:    packssdw %xmm4, %xmm3
-; SSE42-NEXT:    packsswb %xmm2, %xmm3
-; SSE42-NEXT:    pmovmskb %xmm3, %ecx
+; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
+; SSE42-NEXT:    movdqa %xmm5, %xmm2
+; SSE42-NEXT:    pmaxud %xmm0, %xmm2
+; SSE42-NEXT:    pcmpeqd %xmm5, %xmm2
+; SSE42-NEXT:    packssdw %xmm3, %xmm2
+; SSE42-NEXT:    packsswb %xmm4, %xmm2
+; SSE42-NEXT:    pmovmskb %xmm2, %ecx
 ; SSE42-NEXT:    xorl $65535, %ecx # imm = 0xFFFF
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967267,4294967266,4294967265,4294967264]
 ; SSE42-NEXT:    pminud %xmm1, %xmm2
@@ -546,15 +549,15 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ;
 ; AVX512-LABEL: lane_mask_v32i1_i32:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastd %esi, %zmm0
-; AVX512-NEXT:    vpbroadcastd %edi, %zmm1
-; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
-; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
-; AVX512-NEXT:    vpcmpltud %zmm0, %zmm2, %k0
-; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
-; AVX512-NEXT:    vpcmpltud %zmm0, %zmm1, %k1
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    subl %edi, %esi
+; AVX512-NEXT:    cmovbel %eax, %esi
+; AVX512-NEXT:    cmpl $32, %esi
+; AVX512-NEXT:    movl $32, %eax
+; AVX512-NEXT:    cmovbl %esi, %eax
+; AVX512-NEXT:    movl $-1, %ecx
+; AVX512-NEXT:    bzhil %eax, %ecx, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %ymm0
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <32 x i1> @llvm.get.active.lane.mask.v32i1.i32(i32 %index, i32 %TC)
@@ -562,434 +565,69 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 }
 
 define <64 x i1> @lane_mask_v64i1_i32(i32 %index, i32 %TC) {
-; SSE2-LABEL: lane_mask_v64i1_i32:
+; SSE-LABEL: lane_mask_v64i1_i32:
+; SSE:       # %bb.0:
+; SSE-NEXT:    xorl %eax, %eax
+; SSE-NEXT:    subl %esi, %edx
+; SSE-NEXT:    cmoval %edx, %eax
+; SSE-NEXT:    cmpl $64, %eax
+; SSE-NEXT:    movl $64, %ecx
+; SSE-NEXT:    cmovbl %eax, %ecx
+; SSE-NEXT:    movl $1, %edx
+; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx
+; SSE-NEXT:    shlq %cl, %rdx
+; SSE-NEXT:    movq %rdi, %rax
+; SSE-NEXT:    decq %rdx
+; SSE-NEXT:    movq %rdx, (%rdi)
+; SSE-NEXT:    retq
+;
+; AVX2-LABEL: lane_mask_v64i1_i32:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    xorl %eax, %eax
+; AVX2-NEXT:    subl %esi, %edx
+; AVX2-NEXT:    cmovbel %eax, %edx
+; AVX2-NEXT:    cmpl $64, %edx
+; AVX2-NEXT:    movl $64, %ecx
+; AVX2-NEXT:    cmovbl %edx, %ecx
+; AVX2-NEXT:    movq %rdi, %rax
+; AVX2-NEXT:    movq $-1, %rdx
+; AVX2-NEXT:    bzhiq %rcx, %rdx, %rcx
+; AVX2-NEXT:    movq %rcx, (%rdi)
+; AVX2-NEXT:    retq
+;
+; AVX512-LABEL: lane_mask_v64i1_i32:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    subl %edi, %esi
+; AVX512-NEXT:    cmovbel %eax, %esi
+; AVX512-NEXT:    cmpl $64, %esi
+; AVX512-NEXT:    movl $64, %eax
+; AVX512-NEXT:    cmovbl %esi, %eax
+; AVX512-NEXT:    movq $-1, %rcx
+; AVX512-NEXT:    bzhiq %rax, %rcx, %rax
+; AVX512-NEXT:    kmovq %rax, %k0
+; AVX512-NEXT:    vpmovm2b %k0, %zmm0
+; AVX512-NEXT:    retq
+  %active.lane.mask = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i32(i32 %index, i32 %TC)
+  ret <64 x i1> %active.lane.mask
+}
+
+;
+; i32 (zero index)
+;
+
+define <2 x i1> @lane_mask_v2i1_i32_zero(i32 %TC) {
+; SSE2-LABEL: lane_mask_v2i1_i32_zero:
 ; SSE2:       # %bb.0:
-; SSE2-NEXT:    movq %rdi, %rax
-; SSE2-NEXT:    movd %esi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,0,0]
-; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NEXT:    movdqa %xmm2, %xmm0
-; SSE2-NEXT:    pxor %xmm1, %xmm0
-; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [12,13,14,15]
-; SSE2-NEXT:    paddd %xmm2, %xmm3
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pxor %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm0, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
-; SSE2-NEXT:    por %xmm3, %xmm5
-; SSE2-NEXT:    pxor %xmm1, %xmm5
-; SSE2-NEXT:    movd %edx, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,0,0,0]
-; SSE2-NEXT:    pxor %xmm1, %xmm3
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [8,9,10,11]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    packssdw %xmm6, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4,5,6,7]
-; SSE2-NEXT:    paddd %xmm2, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [0,1,2,3]
-; SSE2-NEXT:    paddd %xmm2, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm0, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    por %xmm6, %xmm8
-; SSE2-NEXT:    pxor %xmm1, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    packssdw %xmm5, %xmm6
-; SSE2-NEXT:    packsswb %xmm4, %xmm6
-; SSE2-NEXT:    pmovmskb %xmm6, %edx
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [28,29,30,31]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm0, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; SSE2-NEXT:    por %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [24,25,26,27]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [20,21,22,23]
-; SSE2-NEXT:    paddd %xmm2, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [16,17,18,19]
-; SSE2-NEXT:    paddd %xmm2, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm0, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    por %xmm6, %xmm8
-; SSE2-NEXT:    pxor %xmm1, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    packssdw %xmm5, %xmm6
-; SSE2-NEXT:    packsswb %xmm4, %xmm6
-; SSE2-NEXT:    pmovmskb %xmm6, %ecx
-; SSE2-NEXT:    shll $16, %ecx
-; SSE2-NEXT:    orl %edx, %ecx
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [44,45,46,47]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm0, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; SSE2-NEXT:    por %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [40,41,42,43]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [36,37,38,39]
-; SSE2-NEXT:    paddd %xmm2, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [32,33,34,35]
-; SSE2-NEXT:    paddd %xmm2, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm0, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    por %xmm6, %xmm8
-; SSE2-NEXT:    pxor %xmm1, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    packssdw %xmm5, %xmm6
-; SSE2-NEXT:    packsswb %xmm4, %xmm6
-; SSE2-NEXT:    pmovmskb %xmm6, %edx
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [60,61,62,63]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm0, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; SSE2-NEXT:    por %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [56,57,58,59]
-; SSE2-NEXT:    paddd %xmm2, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [52,53,54,55]
-; SSE2-NEXT:    paddd %xmm2, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [48,49,50,51]
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    movdqa %xmm2, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm0
-; SSE2-NEXT:    por %xmm2, %xmm0
-; SSE2-NEXT:    pxor %xmm1, %xmm0
-; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
-; SSE2-NEXT:    packssdw %xmm5, %xmm3
-; SSE2-NEXT:    packsswb %xmm4, %xmm3
-; SSE2-NEXT:    pmovmskb %xmm3, %esi
-; SSE2-NEXT:    shll $16, %esi
-; SSE2-NEXT:    orl %edx, %esi
-; SSE2-NEXT:    shlq $32, %rsi
-; SSE2-NEXT:    orq %rcx, %rsi
-; SSE2-NEXT:    movq %rsi, (%rdi)
+; SSE2-NEXT:    movd %edi, %xmm0
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
+; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; SSE2-NEXT:    retq
 ;
-; SSE42-LABEL: lane_mask_v64i1_i32:
+; SSE42-LABEL: lane_mask_v2i1_i32_zero:
 ; SSE42:       # %bb.0:
-; SSE42-NEXT:    movq %rdi, %rax
-; SSE42-NEXT:    movd %edx, %xmm1
-; SSE42-NEXT:    movd %esi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
-; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967283,4294967282,4294967281,4294967280]
-; SSE42-NEXT:    pminud %xmm0, %xmm2
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [12,13,14,15]
-; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
-; SSE42-NEXT:    movdqa %xmm2, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967287,4294967286,4294967285,4294967284]
-; SSE42-NEXT:    pminud %xmm0, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [8,9,10,11]
-; SSE42-NEXT:    movdqa %xmm4, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm2
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967291,4294967290,4294967289,4294967288]
-; SSE42-NEXT:    pminud %xmm0, %xmm3
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [4,5,6,7]
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pmaxud %xmm1, %xmm4
-; SSE42-NEXT:    pcmpeqd %xmm3, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967295,4294967294,4294967293,4294967292]
-; SSE42-NEXT:    pminud %xmm0, %xmm3
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [0,1,2,3]
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pmaxud %xmm1, %xmm5
-; SSE42-NEXT:    pcmpeqd %xmm3, %xmm5
-; SSE42-NEXT:    packssdw %xmm4, %xmm5
-; SSE42-NEXT:    packsswb %xmm2, %xmm5
-; SSE42-NEXT:    pmovmskb %xmm5, %edx
-; SSE42-NEXT:    xorl $65535, %edx # imm = 0xFFFF
-; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967267,4294967266,4294967265,4294967264]
-; SSE42-NEXT:    pminud %xmm0, %xmm2
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [28,29,30,31]
-; SSE42-NEXT:    movdqa %xmm2, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967271,4294967270,4294967269,4294967268]
-; SSE42-NEXT:    pminud %xmm0, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [24,25,26,27]
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
-; SSE42-NEXT:    movdqa %xmm4, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967275,4294967274,4294967273,4294967272]
-; SSE42-NEXT:    pminud %xmm0, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [20,21,22,23]
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    movdqa %xmm4, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967279,4294967278,4294967277,4294967276]
-; SSE42-NEXT:    pminud %xmm0, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [16,17,18,19]
-; SSE42-NEXT:    movdqa %xmm4, %xmm5
-; SSE42-NEXT:    pmaxud %xmm1, %xmm5
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm5
-; SSE42-NEXT:    packssdw %xmm3, %xmm5
-; SSE42-NEXT:    packsswb %xmm2, %xmm5
-; SSE42-NEXT:    pmovmskb %xmm5, %ecx
-; SSE42-NEXT:    notl %ecx
-; SSE42-NEXT:    shll $16, %ecx
-; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967251,4294967250,4294967249,4294967248]
-; SSE42-NEXT:    pminud %xmm0, %xmm2
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [44,45,46,47]
-; SSE42-NEXT:    orl %edx, %ecx
-; SSE42-NEXT:    movdqa %xmm2, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967255,4294967254,4294967253,4294967252]
-; SSE42-NEXT:    pminud %xmm0, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [40,41,42,43]
-; SSE42-NEXT:    movdqa %xmm4, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm2
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967259,4294967258,4294967257,4294967256]
-; SSE42-NEXT:    pminud %xmm0, %xmm3
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [36,37,38,39]
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pmaxud %xmm1, %xmm4
-; SSE42-NEXT:    pcmpeqd %xmm3, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967263,4294967262,4294967261,4294967260]
-; SSE42-NEXT:    pminud %xmm0, %xmm3
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [32,33,34,35]
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pmaxud %xmm1, %xmm5
-; SSE42-NEXT:    pcmpeqd %xmm3, %xmm5
-; SSE42-NEXT:    packssdw %xmm4, %xmm5
-; SSE42-NEXT:    packsswb %xmm2, %xmm5
-; SSE42-NEXT:    pmovmskb %xmm5, %edx
-; SSE42-NEXT:    xorl $65535, %edx # imm = 0xFFFF
-; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967235,4294967234,4294967233,4294967232]
-; SSE42-NEXT:    pminud %xmm0, %xmm2
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [60,61,62,63]
-; SSE42-NEXT:    movdqa %xmm2, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967239,4294967238,4294967237,4294967236]
-; SSE42-NEXT:    pminud %xmm0, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [56,57,58,59]
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
-; SSE42-NEXT:    movdqa %xmm4, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967243,4294967242,4294967241,4294967240]
-; SSE42-NEXT:    pminud %xmm0, %xmm4
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [52,53,54,55]
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    movdqa %xmm4, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm4, %xmm3
-; SSE42-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [48,49,50,51]
-; SSE42-NEXT:    pmaxud %xmm0, %xmm1
-; SSE42-NEXT:    pcmpeqd %xmm0, %xmm1
-; SSE42-NEXT:    packssdw %xmm3, %xmm1
-; SSE42-NEXT:    packsswb %xmm2, %xmm1
-; SSE42-NEXT:    pmovmskb %xmm1, %esi
-; SSE42-NEXT:    notl %esi
-; SSE42-NEXT:    shll $16, %esi
-; SSE42-NEXT:    orl %edx, %esi
-; SSE42-NEXT:    shlq $32, %rsi
-; SSE42-NEXT:    orq %rcx, %rsi
-; SSE42-NEXT:    movq %rsi, (%rdi)
-; SSE42-NEXT:    retq
-;
-; AVX2-LABEL: lane_mask_v64i1_i32:
-; AVX2:       # %bb.0:
-; AVX2-NEXT:    movq %rdi, %rax
-; AVX2-NEXT:    vmovd %edx, %xmm0
-; AVX2-NEXT:    vpbroadcastd %xmm0, %ymm0
-; AVX2-NEXT:    vmovd %esi, %xmm1
-; AVX2-NEXT:    vpbroadcastd %xmm1, %ymm1
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm2
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm2, %ymm2 # [24,25,26,27,28,29,30,31]
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm2, %ymm3
-; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm2, %ymm2
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm3
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [16,17,18,19,20,21,22,23]
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm3, %ymm4
-; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm3, %ymm3
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
-; AVX2-NEXT:    vpermq {{.*#+}} ymm3 = ymm2[0,2,1,3]
-; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
-; AVX2-NEXT:    vpxor %ymm2, %ymm3, %ymm3
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm4
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [8,9,10,11,12,13,14,15]
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm4, %ymm5
-; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm4, %ymm4
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm5
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm5, %ymm5 # [0,1,2,3,4,5,6,7]
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm5, %ymm6
-; AVX2-NEXT:    vpcmpeqd %ymm6, %ymm5, %ymm5
-; AVX2-NEXT:    vpackssdw %ymm4, %ymm5, %ymm4
-; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm2, %ymm4, %ymm4
-; AVX2-NEXT:    vpacksswb %ymm3, %ymm4, %ymm3
-; AVX2-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[0,2,1,3]
-; AVX2-NEXT:    vpmovmskb %ymm3, %ecx
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm3
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm3, %ymm3 # [56,57,58,59,60,61,62,63]
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm3, %ymm4
-; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm3, %ymm3
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm4
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [48,49,50,51,52,53,54,55]
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm4, %ymm5
-; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm4, %ymm4
-; AVX2-NEXT:    vpackssdw %ymm3, %ymm4, %ymm3
-; AVX2-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[0,2,1,3]
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm4
-; AVX2-NEXT:    vpxor %ymm2, %ymm3, %ymm3
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm4, %ymm4 # [40,41,42,43,44,45,46,47]
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm4, %ymm5
-; AVX2-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1
-; AVX2-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [32,33,34,35,36,37,38,39]
-; AVX2-NEXT:    vpcmpeqd %ymm5, %ymm4, %ymm4
-; AVX2-NEXT:    vpmaxud %ymm0, %ymm1, %ymm0
-; AVX2-NEXT:    vpcmpeqd %ymm0, %ymm1, %ymm0
-; AVX2-NEXT:    vpackssdw %ymm4, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT:    vpacksswb %ymm3, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpmovmskb %ymm0, %edx
-; AVX2-NEXT:    shlq $32, %rdx
-; AVX2-NEXT:    orq %rcx, %rdx
-; AVX2-NEXT:    movq %rdx, (%rdi)
-; AVX2-NEXT:    vzeroupper
-; AVX2-NEXT:    retq
-;
-; AVX512-LABEL: lane_mask_v64i1_i32:
-; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastd %esi, %zmm0
-; AVX512-NEXT:    vpbroadcastd %edi, %zmm1
-; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
-; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm3
-; AVX512-NEXT:    vpcmpltud %zmm0, %zmm2, %k0
-; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm2 # [16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31]
-; AVX512-NEXT:    vpcmpltud %zmm0, %zmm2, %k1
-; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
-; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47]
-; AVX512-NEXT:    vpcmpltud %zmm0, %zmm2, %k1
-; AVX512-NEXT:    vpminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
-; AVX512-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63]
-; AVX512-NEXT:    vpcmpltud %zmm0, %zmm1, %k2
-; AVX512-NEXT:    kunpckwd %k1, %k2, %k1
-; AVX512-NEXT:    kunpckdq %k0, %k1, %k0
-; AVX512-NEXT:    vpmovm2b %k0, %zmm0
-; AVX512-NEXT:    retq
-  %active.lane.mask = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i32(i32 %index, i32 %TC)
-  ret <64 x i1> %active.lane.mask
-}
-
-;
-; i32 (zero index)
-;
-
-define <2 x i1> @lane_mask_v2i1_i32_zero(i32 %TC) {
-; SSE2-LABEL: lane_mask_v2i1_i32_zero:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movd %edi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
-; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT:    retq
-;
-; SSE42-LABEL: lane_mask_v2i1_i32_zero:
-; SSE42:       # %bb.0:
-; SSE42-NEXT:    movd %edi, %xmm0
+; SSE42-NEXT:    movd %edi, %xmm0
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
 ; SSE42-NEXT:    movq {{.*#+}} xmm1 = [0,1,0,0]
 ; SSE42-NEXT:    pmaxud %xmm1, %xmm0
@@ -1180,10 +818,13 @@ define <16 x i1> @lane_mask_v16i1_i32_zero(i32 %TC) {
 ;
 ; AVX512-LABEL: lane_mask_v16i1_i32_zero:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastd %edi, %zmm0
-; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k0
+; AVX512-NEXT:    cmpl $16, %edi
+; AVX512-NEXT:    movl $16, %eax
+; AVX512-NEXT:    cmovbl %edi, %eax
+; AVX512-NEXT:    movl $-1, %ecx
+; AVX512-NEXT:    bzhil %eax, %ecx, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
-; AVX512-NEXT:    vzeroupper
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 %TC)
   ret <16 x i1> %active.lane.mask
@@ -1304,10 +945,12 @@ define <32 x i1> @lane_mask_v32i1_i32_zero(i32 %TC) {
 ;
 ; AVX512-LABEL: lane_mask_v32i1_i32_zero:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastd %edi, %zmm0
-; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k0
-; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
+; AVX512-NEXT:    cmpl $32, %edi
+; AVX512-NEXT:    movl $32, %eax
+; AVX512-NEXT:    cmovbl %edi, %eax
+; AVX512-NEXT:    movl $-1, %ecx
+; AVX512-NEXT:    bzhil %eax, %ecx, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %ymm0
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <32 x i1> @llvm.get.active.lane.mask.v32i1.i32(i32 0, i32 %TC)
@@ -1315,229 +958,38 @@ define <32 x i1> @lane_mask_v32i1_i32_zero(i32 %TC) {
 }
 
 define <64 x i1> @lane_mask_v64i1_i32_zero(i32 %TC) {
-; SSE2-LABEL: lane_mask_v64i1_i32_zero:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movd %esi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
-; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT:    movq %rdi, %rax
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    packssdw %xmm1, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packssdw %xmm1, %xmm3
-; SSE2-NEXT:    packsswb %xmm2, %xmm3
-; SSE2-NEXT:    pmovmskb %xmm3, %edx
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    packssdw %xmm1, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packssdw %xmm1, %xmm3
-; SSE2-NEXT:    packsswb %xmm2, %xmm3
-; SSE2-NEXT:    pmovmskb %xmm3, %ecx
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    shll $16, %ecx
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    orl %edx, %ecx
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packssdw %xmm1, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    packssdw %xmm3, %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packsswb %xmm2, %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pmovmskb %xmm1, %edx
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    packssdw %xmm3, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT:    packssdw %xmm1, %xmm0
-; SSE2-NEXT:    packsswb %xmm2, %xmm0
-; SSE2-NEXT:    pmovmskb %xmm0, %esi
-; SSE2-NEXT:    shll $16, %esi
-; SSE2-NEXT:    orl %edx, %esi
-; SSE2-NEXT:    shlq $32, %rsi
-; SSE2-NEXT:    orq %rcx, %rsi
-; SSE2-NEXT:    movq %rsi, (%rdi)
-; SSE2-NEXT:    retq
-;
-; SSE42-LABEL: lane_mask_v64i1_i32_zero:
-; SSE42:       # %bb.0:
-; SSE42-NEXT:    movq %rdi, %rax
-; SSE42-NEXT:    movd %esi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [12,13,14,15]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [8,9,10,11]
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [4,5,6,7]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [0,1,2,3]
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pmaxud %xmm1, %xmm4
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm4
-; SSE42-NEXT:    packssdw %xmm2, %xmm4
-; SSE42-NEXT:    packsswb %xmm3, %xmm4
-; SSE42-NEXT:    pmovmskb %xmm4, %edx
-; SSE42-NEXT:    xorl $65535, %edx # imm = 0xFFFF
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [28,29,30,31]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [24,25,26,27]
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [20,21,22,23]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [16,17,18,19]
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pmaxud %xmm1, %xmm4
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm4
-; SSE42-NEXT:    packssdw %xmm2, %xmm4
-; SSE42-NEXT:    packsswb %xmm3, %xmm4
-; SSE42-NEXT:    pmovmskb %xmm4, %ecx
-; SSE42-NEXT:    notl %ecx
-; SSE42-NEXT:    shll $16, %ecx
-; SSE42-NEXT:    orl %edx, %ecx
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [44,45,46,47]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [40,41,42,43]
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [36,37,38,39]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [32,33,34,35]
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pmaxud %xmm1, %xmm4
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm4
-; SSE42-NEXT:    packssdw %xmm2, %xmm4
-; SSE42-NEXT:    packsswb %xmm3, %xmm4
-; SSE42-NEXT:    pmovmskb %xmm4, %edx
-; SSE42-NEXT:    xorl $65535, %edx # imm = 0xFFFF
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [60,61,62,63]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [56,57,58,59]
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pmaxud %xmm1, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [52,53,54,55]
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pmaxud %xmm1, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [48,49,50,51]
-; SSE42-NEXT:    pmaxud %xmm1, %xmm0
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm0
-; SSE42-NEXT:    packssdw %xmm2, %xmm0
-; SSE42-NEXT:    packsswb %xmm3, %xmm0
-; SSE42-NEXT:    pmovmskb %xmm0, %esi
-; SSE42-NEXT:    notl %esi
-; SSE42-NEXT:    shll $16, %esi
-; SSE42-NEXT:    orl %edx, %esi
-; SSE42-NEXT:    shlq $32, %rsi
-; SSE42-NEXT:    orq %rcx, %rsi
-; SSE42-NEXT:    movq %rsi, (%rdi)
-; SSE42-NEXT:    retq
+; SSE-LABEL: lane_mask_v64i1_i32_zero:
+; SSE:       # %bb.0:
+; SSE-NEXT:    cmpl $64, %esi
+; SSE-NEXT:    movl $64, %ecx
+; SSE-NEXT:    cmovbl %esi, %ecx
+; SSE-NEXT:    movl $1, %edx
+; SSE-NEXT:    # kill: def $cl killed $cl killed $ecx
+; SSE-NEXT:    shlq %cl, %rdx
+; SSE-NEXT:    movq %rdi, %rax
+; SSE-NEXT:    decq %rdx
+; SSE-NEXT:    movq %rdx, (%rdi)
+; SSE-NEXT:    retq
 ;
 ; AVX2-LABEL: lane_mask_v64i1_i32_zero:
 ; AVX2:       # %bb.0:
+; AVX2-NEXT:    cmpl $64, %esi
+; AVX2-NEXT:    movl $64, %ecx
+; AVX2-NEXT:    cmovbl %esi, %ecx
 ; AVX2-NEXT:    movq %rdi, %rax
-; AVX2-NEXT:    vmovd %esi, %xmm0
-; AVX2-NEXT:    vpbroadcastd %xmm0, %ymm0
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [24,25,26,27,28,29,30,31]
-; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm2
-; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm2, %ymm1
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm2 = [16,17,18,19,20,21,22,23]
-; AVX2-NEXT:    vpmaxud %ymm2, %ymm0, %ymm3
-; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm3, %ymm2
-; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
-; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [8,9,10,11,12,13,14,15]
-; AVX2-NEXT:    vpmaxud %ymm3, %ymm0, %ymm4
-; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm4, %ymm3
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [0,1,2,3,4,5,6,7]
-; AVX2-NEXT:    vpmaxud %ymm4, %ymm0, %ymm5
-; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm5, %ymm4
-; AVX2-NEXT:    vpackssdw %ymm3, %ymm4, %ymm3
-; AVX2-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm2, %ymm3, %ymm3
-; AVX2-NEXT:    vpacksswb %ymm1, %ymm3, %ymm1
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpmovmskb %ymm1, %ecx
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm1 = [56,57,58,59,60,61,62,63]
-; AVX2-NEXT:    vpmaxud %ymm1, %ymm0, %ymm3
-; AVX2-NEXT:    vpcmpeqd %ymm1, %ymm3, %ymm1
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [48,49,50,51,52,53,54,55]
-; AVX2-NEXT:    vpmaxud %ymm3, %ymm0, %ymm4
-; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm4, %ymm3
-; AVX2-NEXT:    vpackssdw %ymm1, %ymm3, %ymm1
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm3 = [40,41,42,43,44,45,46,47]
-; AVX2-NEXT:    vpmaxud %ymm3, %ymm0, %ymm4
-; AVX2-NEXT:    vpcmpeqd %ymm3, %ymm4, %ymm3
-; AVX2-NEXT:    vmovdqa {{.*#+}} ymm4 = [32,33,34,35,36,37,38,39]
-; AVX2-NEXT:    vpmaxud %ymm4, %ymm0, %ymm0
-; AVX2-NEXT:    vpcmpeqd %ymm4, %ymm0, %ymm0
-; AVX2-NEXT:    vpackssdw %ymm3, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpmovmskb %ymm0, %edx
-; AVX2-NEXT:    shlq $32, %rdx
-; AVX2-NEXT:    orq %rcx, %rdx
-; AVX2-NEXT:    movq %rdx, (%rdi)
-; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    movq $-1, %rdx
+; AVX2-NEXT:    bzhiq %rcx, %rdx, %rcx
+; AVX2-NEXT:    movq %rcx, (%rdi)
 ; AVX2-NEXT:    retq
 ;
 ; AVX512-LABEL: lane_mask_v64i1_i32_zero:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastd %edi, %zmm0
-; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k0
-; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k2
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
-; AVX512-NEXT:    vpcmpnleud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    kunpckwd %k2, %k1, %k1
-; AVX512-NEXT:    kunpckdq %k0, %k1, %k0
+; AVX512-NEXT:    cmpl $64, %edi
+; AVX512-NEXT:    movl $64, %eax
+; AVX512-NEXT:    cmovbl %edi, %eax
+; AVX512-NEXT:    movq $-1, %rcx
+; AVX512-NEXT:    bzhiq %rax, %rcx, %rax
+; AVX512-NEXT:    kmovq %rax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %zmm0
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i32(i32 0, i32 %TC)
@@ -1948,195 +1400,195 @@ define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
 ; SSE2-LABEL: lane_mask_v16i1_i64:
 ; SSE2:       # %bb.0:
 ; SSE2-NEXT:    movq %rdi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm0, %xmm5
+; SSE2-NEXT:    movdqa %xmm5, %xmm6
+; SSE2-NEXT:    pxor %xmm0, %xmm6
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
-; SSE2-NEXT:    paddq %xmm4, %xmm2
+; SSE2-NEXT:    paddq %xmm5, %xmm2
 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
 ; SSE2-NEXT:    pxor %xmm0, %xmm1
-; SSE2-NEXT:    movdqa %xmm5, %xmm3
+; SSE2-NEXT:    movdqa %xmm6, %xmm3
 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
+; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
+; SSE2-NEXT:    pand %xmm4, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
 ; SSE2-NEXT:    por %xmm2, %xmm1
 ; SSE2-NEXT:    por %xmm7, %xmm1
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2,3]
-; SSE2-NEXT:    paddq %xmm4, %xmm3
+; SSE2-NEXT:    paddq %xmm5, %xmm3
 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
 ; SSE2-NEXT:    pxor %xmm0, %xmm2
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
+; SSE2-NEXT:    movdqa %xmm6, %xmm4
+; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
 ; SSE2-NEXT:    por %xmm3, %xmm2
 ; SSE2-NEXT:    por %xmm8, %xmm2
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [4,5]
-; SSE2-NEXT:    paddq %xmm4, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm3
+; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4,5]
+; SSE2-NEXT:    paddq %xmm5, %xmm4
+; SSE2-NEXT:    movdqa %xmm4, %xmm3
 ; SSE2-NEXT:    pxor %xmm0, %xmm3
-; SSE2-NEXT:    movdqa %xmm5, %xmm7
+; SSE2-NEXT:    movdqa %xmm6, %xmm7
 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm3
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm8, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm3
+; SSE2-NEXT:    por %xmm4, %xmm3
 ; SSE2-NEXT:    por %xmm9, %xmm3
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [6,7]
-; SSE2-NEXT:    paddq %xmm4, %xmm7
-; SSE2-NEXT:    movdqa %xmm7, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm5, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm8
+; SSE2-NEXT:    paddq %xmm5, %xmm7
+; SSE2-NEXT:    movdqa %xmm7, %xmm4
+; SSE2-NEXT:    pxor %xmm0, %xmm4
+; SSE2-NEXT:    movdqa %xmm6, %xmm8
+; SSE2-NEXT:    pcmpgtd %xmm4, %xmm8
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3]
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm9, %xmm10
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    por %xmm10, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
+; SSE2-NEXT:    por %xmm7, %xmm4
+; SSE2-NEXT:    por %xmm10, %xmm4
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [8,9]
-; SSE2-NEXT:    paddq %xmm4, %xmm8
+; SSE2-NEXT:    paddq %xmm5, %xmm8
 ; SSE2-NEXT:    movdqa %xmm8, %xmm7
 ; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm5, %xmm9
+; SSE2-NEXT:    movdqa %xmm6, %xmm9
 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm7
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm7[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm10, %xmm11
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm9[1,1,3,3]
 ; SSE2-NEXT:    por %xmm8, %xmm7
 ; SSE2-NEXT:    por %xmm11, %xmm7
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [10,11]
-; SSE2-NEXT:    paddq %xmm4, %xmm9
+; SSE2-NEXT:    paddq %xmm5, %xmm9
 ; SSE2-NEXT:    movdqa %xmm9, %xmm8
 ; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm5, %xmm10
+; SSE2-NEXT:    movdqa %xmm6, %xmm10
 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm10
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm8
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm8
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm8[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm11, %xmm12
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
 ; SSE2-NEXT:    por %xmm9, %xmm8
 ; SSE2-NEXT:    por %xmm12, %xmm8
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [12,13]
-; SSE2-NEXT:    paddq %xmm4, %xmm10
+; SSE2-NEXT:    paddq %xmm5, %xmm10
 ; SSE2-NEXT:    movdqa %xmm10, %xmm9
 ; SSE2-NEXT:    pxor %xmm0, %xmm9
-; SSE2-NEXT:    movdqa %xmm5, %xmm11
+; SSE2-NEXT:    movdqa %xmm6, %xmm11
 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm9
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm9[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm12, %xmm13
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
 ; SSE2-NEXT:    por %xmm10, %xmm9
 ; SSE2-NEXT:    por %xmm13, %xmm9
-; SSE2-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [14,15]
-; SSE2-NEXT:    movdqa %xmm4, %xmm10
+; SSE2-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [14,15]
+; SSE2-NEXT:    movdqa %xmm5, %xmm10
 ; SSE2-NEXT:    pxor %xmm0, %xmm10
-; SSE2-NEXT:    movdqa %xmm5, %xmm11
+; SSE2-NEXT:    movdqa %xmm6, %xmm11
 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm11
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm10
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]
-; SSE2-NEXT:    pand %xmm12, %xmm5
+; SSE2-NEXT:    pcmpeqd %xmm6, %xmm10
+; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm10[1,1,3,3]
+; SSE2-NEXT:    pand %xmm12, %xmm6
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm10
 ; SSE2-NEXT:    por %xmm5, %xmm10
-; SSE2-NEXT:    movq %rsi, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
+; SSE2-NEXT:    por %xmm6, %xmm10
+; SSE2-NEXT:    movq %rsi, %xmm5
+; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,1,0,1]
 ; SSE2-NEXT:    pxor %xmm0, %xmm10
-; SSE2-NEXT:    pxor %xmm0, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm10, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm10
+; SSE2-NEXT:    pxor %xmm0, %xmm5
+; SSE2-NEXT:    movdqa %xmm5, %xmm6
+; SSE2-NEXT:    pcmpgtd %xmm10, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm6[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm10
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm11, %xmm10
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm10, %xmm5
+; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
+; SSE2-NEXT:    por %xmm10, %xmm6
 ; SSE2-NEXT:    pxor %xmm0, %xmm9
-; SSE2-NEXT:    movdqa %xmm4, %xmm10
+; SSE2-NEXT:    movdqa %xmm5, %xmm10
 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm10
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm9
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm9[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm11, %xmm12
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
 ; SSE2-NEXT:    por %xmm12, %xmm9
-; SSE2-NEXT:    packssdw %xmm5, %xmm9
+; SSE2-NEXT:    packssdw %xmm6, %xmm9
 ; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm8
+; SSE2-NEXT:    movdqa %xmm5, %xmm6
+; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm8
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm10, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[1,1,3,3]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3]
 ; SSE2-NEXT:    por %xmm8, %xmm10
 ; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm7
+; SSE2-NEXT:    movdqa %xmm5, %xmm6
+; SSE2-NEXT:    pcmpgtd %xmm7, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm8, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm5
-; SSE2-NEXT:    packssdw %xmm10, %xmm5
-; SSE2-NEXT:    packssdw %xmm9, %xmm5
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm4, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
+; SSE2-NEXT:    por %xmm7, %xmm6
+; SSE2-NEXT:    packssdw %xmm10, %xmm6
+; SSE2-NEXT:    packssdw %xmm9, %xmm6
+; SSE2-NEXT:    pxor %xmm0, %xmm4
+; SSE2-NEXT:    movdqa %xmm5, %xmm7
+; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
+; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
+; SSE2-NEXT:    pand %xmm8, %xmm4
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm7
+; SSE2-NEXT:    por %xmm4, %xmm7
 ; SSE2-NEXT:    pxor %xmm0, %xmm3
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
+; SSE2-NEXT:    movdqa %xmm5, %xmm4
+; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
 ; SSE2-NEXT:    por %xmm9, %xmm3
 ; SSE2-NEXT:    packssdw %xmm7, %xmm3
 ; SSE2-NEXT:    pxor %xmm0, %xmm2
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
+; SSE2-NEXT:    movdqa %xmm5, %xmm4
+; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm7, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm2, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
+; SSE2-NEXT:    por %xmm2, %xmm4
 ; SSE2-NEXT:    pxor %xmm0, %xmm1
-; SSE2-NEXT:    movdqa %xmm4, %xmm0
+; SSE2-NEXT:    movdqa %xmm5, %xmm0
 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm2, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
 ; SSE2-NEXT:    por %xmm1, %xmm0
-; SSE2-NEXT:    packssdw %xmm6, %xmm0
+; SSE2-NEXT:    packssdw %xmm4, %xmm0
 ; SSE2-NEXT:    packssdw %xmm3, %xmm0
-; SSE2-NEXT:    packsswb %xmm5, %xmm0
+; SSE2-NEXT:    packsswb %xmm6, %xmm0
 ; SSE2-NEXT:    retq
 ;
 ; SSE42-LABEL: lane_mask_v16i1_i64:
@@ -2144,72 +1596,72 @@ define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    movq %rdi, %xmm0
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    movdqa %xmm0, %xmm5
+; SSE42-NEXT:    pxor %xmm1, %xmm5
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
 ; SSE42-NEXT:    paddq %xmm0, %xmm3
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pxor %xmm1, %xmm5
-; SSE42-NEXT:    movdqa %xmm4, %xmm2
-; SSE42-NEXT:    pcmpgtq %xmm5, %xmm2
+; SSE42-NEXT:    movdqa %xmm3, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    movdqa %xmm5, %xmm2
+; SSE42-NEXT:    pcmpgtq %xmm4, %xmm2
 ; SSE42-NEXT:    por %xmm3, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [2,3]
-; SSE42-NEXT:    paddq %xmm0, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
+; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [2,3]
+; SSE42-NEXT:    paddq %xmm0, %xmm4
+; SSE42-NEXT:    movdqa %xmm4, %xmm6
 ; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm4, %xmm3
+; SSE42-NEXT:    movdqa %xmm5, %xmm3
 ; SSE42-NEXT:    pcmpgtq %xmm6, %xmm3
-; SSE42-NEXT:    por %xmm5, %xmm3
+; SSE42-NEXT:    por %xmm4, %xmm3
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [4,5]
 ; SSE42-NEXT:    paddq %xmm0, %xmm6
 ; SSE42-NEXT:    movdqa %xmm6, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm4, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
-; SSE42-NEXT:    por %xmm6, %xmm5
+; SSE42-NEXT:    movdqa %xmm5, %xmm4
+; SSE42-NEXT:    pcmpgtq %xmm7, %xmm4
+; SSE42-NEXT:    por %xmm6, %xmm4
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm7 = [6,7]
 ; SSE42-NEXT:    paddq %xmm0, %xmm7
 ; SSE42-NEXT:    movdqa %xmm7, %xmm8
 ; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm4, %xmm6
+; SSE42-NEXT:    movdqa %xmm5, %xmm6
 ; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
 ; SSE42-NEXT:    por %xmm7, %xmm6
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm8 = [8,9]
 ; SSE42-NEXT:    paddq %xmm0, %xmm8
 ; SSE42-NEXT:    movdqa %xmm8, %xmm9
 ; SSE42-NEXT:    pxor %xmm1, %xmm9
-; SSE42-NEXT:    movdqa %xmm4, %xmm7
+; SSE42-NEXT:    movdqa %xmm5, %xmm7
 ; SSE42-NEXT:    pcmpgtq %xmm9, %xmm7
 ; SSE42-NEXT:    por %xmm8, %xmm7
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [10,11]
 ; SSE42-NEXT:    paddq %xmm0, %xmm9
 ; SSE42-NEXT:    movdqa %xmm9, %xmm10
 ; SSE42-NEXT:    pxor %xmm1, %xmm10
-; SSE42-NEXT:    movdqa %xmm4, %xmm8
+; SSE42-NEXT:    movdqa %xmm5, %xmm8
 ; SSE42-NEXT:    pcmpgtq %xmm10, %xmm8
 ; SSE42-NEXT:    por %xmm9, %xmm8
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [12,13]
 ; SSE42-NEXT:    paddq %xmm0, %xmm9
 ; SSE42-NEXT:    movdqa %xmm9, %xmm10
 ; SSE42-NEXT:    pxor %xmm1, %xmm10
-; SSE42-NEXT:    movdqa %xmm4, %xmm11
+; SSE42-NEXT:    movdqa %xmm5, %xmm11
 ; SSE42-NEXT:    pcmpgtq %xmm10, %xmm11
 ; SSE42-NEXT:    por %xmm9, %xmm11
 ; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [14,15]
 ; SSE42-NEXT:    movdqa %xmm0, %xmm9
 ; SSE42-NEXT:    pxor %xmm1, %xmm9
-; SSE42-NEXT:    pcmpgtq %xmm9, %xmm4
-; SSE42-NEXT:    por %xmm0, %xmm4
+; SSE42-NEXT:    pcmpgtq %xmm9, %xmm5
+; SSE42-NEXT:    por %xmm0, %xmm5
 ; SSE42-NEXT:    movq %rsi, %xmm0
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm5
 ; SSE42-NEXT:    pxor %xmm1, %xmm0
 ; SSE42-NEXT:    movdqa %xmm0, %xmm9
-; SSE42-NEXT:    pcmpgtq %xmm4, %xmm9
+; SSE42-NEXT:    pcmpgtq %xmm5, %xmm9
 ; SSE42-NEXT:    pxor %xmm1, %xmm11
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm11, %xmm4
-; SSE42-NEXT:    packssdw %xmm9, %xmm4
+; SSE42-NEXT:    movdqa %xmm0, %xmm5
+; SSE42-NEXT:    pcmpgtq %xmm11, %xmm5
+; SSE42-NEXT:    packssdw %xmm9, %xmm5
 ; SSE42-NEXT:    pxor %xmm1, %xmm8
 ; SSE42-NEXT:    movdqa %xmm0, %xmm9
 ; SSE42-NEXT:    pcmpgtq %xmm8, %xmm9
@@ -2217,14 +1669,14 @@ define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    movdqa %xmm0, %xmm8
 ; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
 ; SSE42-NEXT:    packssdw %xmm9, %xmm8
-; SSE42-NEXT:    packssdw %xmm4, %xmm8
+; SSE42-NEXT:    packssdw %xmm5, %xmm8
 ; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm4
-; SSE42-NEXT:    pxor %xmm1, %xmm5
+; SSE42-NEXT:    movdqa %xmm0, %xmm5
+; SSE42-NEXT:    pcmpgtq %xmm6, %xmm5
+; SSE42-NEXT:    pxor %xmm1, %xmm4
 ; SSE42-NEXT:    movdqa %xmm0, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm5, %xmm6
-; SSE42-NEXT:    packssdw %xmm4, %xmm6
+; SSE42-NEXT:    pcmpgtq %xmm4, %xmm6
+; SSE42-NEXT:    packssdw %xmm5, %xmm6
 ; SSE42-NEXT:    pxor %xmm1, %xmm3
 ; SSE42-NEXT:    movdqa %xmm0, %xmm4
 ; SSE42-NEXT:    pcmpgtq %xmm3, %xmm4
@@ -2281,17 +1733,16 @@ define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
 ;
 ; AVX512-LABEL: lane_mask_v16i1_i64:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastq %rsi, %zmm0
-; AVX512-NEXT:    vpbroadcastq %rdi, %zmm1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [0,1,2,3,4,5,6,7]
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k0
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [8,9,10,11,12,13,14,15]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm1, %k1
-; AVX512-NEXT:    kunpckbw %k0, %k1, %k0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    subq %rdi, %rsi
+; AVX512-NEXT:    cmovaq %rsi, %rax
+; AVX512-NEXT:    cmpq $16, %rax
+; AVX512-NEXT:    movl $16, %ecx
+; AVX512-NEXT:    cmovbq %rax, %rcx
+; AVX512-NEXT:    movl $-1, %eax
+; AVX512-NEXT:    bzhil %ecx, %eax, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %xmm0
-; AVX512-NEXT:    vzeroupper
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i64(i64 %index, i64 %TC)
   ret <16 x i1> %active.lane.mask
@@ -2831,20 +2282,9 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
 ; SSE42-NEXT:    por %xmm5, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [20,21]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm5, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
 ; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm5
-; SSE42-NEXT:    packssdw %xmm6, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [18,19]
+; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
+; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [20,21]
 ; SSE42-NEXT:    paddq %xmm2, %xmm6
 ; SSE42-NEXT:    movdqa %xmm6, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
@@ -2854,6 +2294,17 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    pxor %xmm1, %xmm8
 ; SSE42-NEXT:    movdqa %xmm3, %xmm6
 ; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
+; SSE42-NEXT:    packssdw %xmm5, %xmm6
+; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [18,19]
+; SSE42-NEXT:    paddq %xmm2, %xmm5
+; SSE42-NEXT:    movdqa %xmm5, %xmm7
+; SSE42-NEXT:    pxor %xmm1, %xmm7
+; SSE42-NEXT:    movdqa %xmm0, %xmm8
+; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
+; SSE42-NEXT:    por %xmm5, %xmm8
+; SSE42-NEXT:    pxor %xmm1, %xmm8
+; SSE42-NEXT:    movdqa %xmm3, %xmm5
+; SSE42-NEXT:    pcmpgtq %xmm8, %xmm5
 ; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [16,17]
 ; SSE42-NEXT:    movdqa %xmm2, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
@@ -2861,8 +2312,8 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    por %xmm2, %xmm0
 ; SSE42-NEXT:    pxor %xmm1, %xmm0
 ; SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
-; SSE42-NEXT:    packssdw %xmm6, %xmm3
 ; SSE42-NEXT:    packssdw %xmm5, %xmm3
+; SSE42-NEXT:    packssdw %xmm6, %xmm3
 ; SSE42-NEXT:    packsswb %xmm4, %xmm3
 ; SSE42-NEXT:    pmovmskb %xmm3, %edx
 ; SSE42-NEXT:    shll $16, %edx
@@ -2945,23 +2396,15 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 ;
 ; AVX512-LABEL: lane_mask_v32i1_i64:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastq %rsi, %zmm0
-; AVX512-NEXT:    vpbroadcastq %rdi, %zmm1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [0,1,2,3,4,5,6,7]
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm3
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k0
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm2 # [8,9,10,11,12,13,14,15]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    kunpckbw %k0, %k1, %k0
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [16,17,18,19,20,21,22,23]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [24,25,26,27,28,29,30,31]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm1, %k2
-; AVX512-NEXT:    kunpckbw %k1, %k2, %k1
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    subq %rdi, %rsi
+; AVX512-NEXT:    cmovaq %rsi, %rax
+; AVX512-NEXT:    cmpq $32, %rax
+; AVX512-NEXT:    movl $32, %ecx
+; AVX512-NEXT:    cmovbq %rax, %rcx
+; AVX512-NEXT:    movl $-1, %eax
+; AVX512-NEXT:    bzhil %ecx, %eax, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %ymm0
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <32 x i1> @llvm.get.active.lane.mask.v32i1.i64(i64 %index, i64 %TC)
@@ -2969,1367 +2412,105 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 }
 
 define <64 x i1> @lane_mask_v64i1_i64(i64 %index, i64 %TC) {
-; SSE2-LABEL: lane_mask_v64i1_i64:
+; SSE-LABEL: lane_mask_v64i1_i64:
+; SSE:       # %bb.0:
+; SSE-NEXT:    xorl %eax, %eax
+; SSE-NEXT:    subq %rsi, %rdx
+; SSE-NEXT:    cmovaq %rdx, %rax
+; SSE-NEXT:    cmpq $64, %rax
+; SSE-NEXT:    movl $64, %ecx
+; SSE-NEXT:    cmovbq %rax, %rcx
+; SSE-NEXT:    movl $1, %edx
+; SSE-NEXT:    # kill: def $cl killed $cl killed $rcx
+; SSE-NEXT:    shlq %cl, %rdx
+; SSE-NEXT:    movq %rdi, %rax
+; SSE-NEXT:    decq %rdx
+; SSE-NEXT:    movq %rdx, (%rdi)
+; SSE-NEXT:    retq
+;
+; AVX2-LABEL: lane_mask_v64i1_i64:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    xorl %eax, %eax
+; AVX2-NEXT:    subq %rsi, %rdx
+; AVX2-NEXT:    cmovaq %rdx, %rax
+; AVX2-NEXT:    cmpq $64, %rax
+; AVX2-NEXT:    movl $64, %ecx
+; AVX2-NEXT:    cmovbq %rax, %rcx
+; AVX2-NEXT:    movq %rdi, %rax
+; AVX2-NEXT:    movq $-1, %rdx
+; AVX2-NEXT:    bzhiq %rcx, %rdx, %rcx
+; AVX2-NEXT:    movq %rcx, (%rdi)
+; AVX2-NEXT:    retq
+;
+; AVX512-LABEL: lane_mask_v64i1_i64:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    subq %rdi, %rsi
+; AVX512-NEXT:    cmovaq %rsi, %rax
+; AVX512-NEXT:    cmpq $64, %rax
+; AVX512-NEXT:    movl $64, %ecx
+; AVX512-NEXT:    cmovbq %rax, %rcx
+; AVX512-NEXT:    movq $-1, %rax
+; AVX512-NEXT:    bzhiq %rcx, %rax, %rax
+; AVX512-NEXT:    kmovq %rax, %k0
+; AVX512-NEXT:    vpmovm2b %k0, %zmm0
+; AVX512-NEXT:    retq
+  %active.lane.mask = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i64(i64 %index, i64 %TC)
+  ret <64 x i1> %active.lane.mask
+}
+
+;
+; i64 (zero index)
+;
+
+define <2 x i1> @lane_mask_v2i1_i64_zero(i64 %TC) {
+; SSE2-LABEL: lane_mask_v2i1_i64_zero:
 ; SSE2:       # %bb.0:
-; SSE2-NEXT:    movq %rdi, %rax
-; SSE2-NEXT:    movq %rsi, %xmm0
+; SSE2-NEXT:    movq %rdi, %xmm0
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
+; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; SSE2-NEXT:    pand %xmm0, %xmm2
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
+; SSE2-NEXT:    por %xmm2, %xmm0
+; SSE2-NEXT:    retq
+;
+; SSE42-LABEL: lane_mask_v2i1_i64_zero:
+; SSE42:       # %bb.0:
+; SSE42-NEXT:    movq %rdi, %xmm0
+; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
+; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE42-NEXT:    retq
+;
+; AVX2-LABEL: lane_mask_v2i1_i64_zero:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    vmovq %rdi, %xmm0
+; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
+; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX2-NEXT:    retq
+;
+; AVX512-LABEL: lane_mask_v2i1_i64_zero:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpbroadcastq %rdi, %xmm0
+; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k0
+; AVX512-NEXT:    vpmovm2q %k0, %xmm0
+; AVX512-NEXT:    retq
+  %active.lane.mask = call <2 x i1> @llvm.get.active.lane.mask.v2i1.i64(i64 0, i64 %TC)
+  ret <2 x i1> %active.lane.mask
+}
+
+define <4 x i1> @lane_mask_v4i1_i64_zero(i64 %TC) {
+; SSE2-LABEL: lane_mask_v4i1_i64_zero:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    movq %rdi, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
-; SSE2-NEXT:    movdqa %xmm1, %xmm2
-; SSE2-NEXT:    pxor %xmm0, %xmm2
-; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [14,15]
-; SSE2-NEXT:    paddq %xmm1, %xmm3
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pxor %xmm0, %xmm4
-; SSE2-NEXT:    movdqa %xmm2, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm4, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm3, %xmm5
-; SSE2-NEXT:    por %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm0, %xmm5
-; SSE2-NEXT:    movq %rdx, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]
-; SSE2-NEXT:    pxor %xmm0, %xmm3
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [12,13]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm5
-; SSE2-NEXT:    packssdw %xmm4, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [10,11]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [8,9]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm4
-; SSE2-NEXT:    packssdw %xmm6, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [6,7]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [4,5]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm5
-; SSE2-NEXT:    packssdw %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [2,3]
-; SSE2-NEXT:    paddq %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
-; SSE2-NEXT:    paddq %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm2, %xmm9
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm10, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm9
-; SSE2-NEXT:    por %xmm8, %xmm9
-; SSE2-NEXT:    pxor %xmm0, %xmm9
-; SSE2-NEXT:    movdqa %xmm3, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm9, %xmm7
-; SSE2-NEXT:    packssdw %xmm6, %xmm7
-; SSE2-NEXT:    packssdw %xmm5, %xmm7
-; SSE2-NEXT:    packsswb %xmm4, %xmm7
-; SSE2-NEXT:    pmovmskb %xmm7, %edx
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [30,31]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm0, %xmm5
-; SSE2-NEXT:    movdqa %xmm2, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm6
-; SSE2-NEXT:    por %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm5, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [28,29]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm5
-; SSE2-NEXT:    packssdw %xmm4, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [26,27]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [24,25]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm4
-; SSE2-NEXT:    packssdw %xmm6, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [22,23]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [20,21]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm5
-; SSE2-NEXT:    packssdw %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [18,19]
-; SSE2-NEXT:    paddq %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [16,17]
-; SSE2-NEXT:    paddq %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm2, %xmm9
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm10, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm9
-; SSE2-NEXT:    por %xmm8, %xmm9
-; SSE2-NEXT:    pxor %xmm0, %xmm9
-; SSE2-NEXT:    movdqa %xmm3, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm9, %xmm7
-; SSE2-NEXT:    packssdw %xmm6, %xmm7
-; SSE2-NEXT:    packssdw %xmm5, %xmm7
-; SSE2-NEXT:    packsswb %xmm4, %xmm7
-; SSE2-NEXT:    pmovmskb %xmm7, %ecx
-; SSE2-NEXT:    shll $16, %ecx
-; SSE2-NEXT:    orl %edx, %ecx
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [46,47]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm0, %xmm5
-; SSE2-NEXT:    movdqa %xmm2, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm6
-; SSE2-NEXT:    por %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm5, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [44,45]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm5
-; SSE2-NEXT:    packssdw %xmm4, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [42,43]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [40,41]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm4
-; SSE2-NEXT:    packssdw %xmm6, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [38,39]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [36,37]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm5
-; SSE2-NEXT:    packssdw %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [34,35]
-; SSE2-NEXT:    paddq %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [32,33]
-; SSE2-NEXT:    paddq %xmm1, %xmm7
-; SSE2-NEXT:    movdqa %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm2, %xmm9
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm10, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm9
-; SSE2-NEXT:    por %xmm8, %xmm9
-; SSE2-NEXT:    pxor %xmm0, %xmm9
-; SSE2-NEXT:    movdqa %xmm3, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm9[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm9, %xmm7
-; SSE2-NEXT:    packssdw %xmm6, %xmm7
-; SSE2-NEXT:    packssdw %xmm5, %xmm7
-; SSE2-NEXT:    packsswb %xmm4, %xmm7
-; SSE2-NEXT:    pmovmskb %xmm7, %edx
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [62,63]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm5
-; SSE2-NEXT:    pxor %xmm0, %xmm5
-; SSE2-NEXT:    movdqa %xmm2, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm6
-; SSE2-NEXT:    por %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm5, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [60,61]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm5
-; SSE2-NEXT:    packssdw %xmm4, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [58,59]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [56,57]
-; SSE2-NEXT:    paddq %xmm1, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm4
-; SSE2-NEXT:    packssdw %xmm6, %xmm4
-; SSE2-NEXT:    packssdw %xmm5, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [54,55]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
-; SSE2-NEXT:    movdqa %xmm2, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    por %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm6, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [52,53]
-; SSE2-NEXT:    paddq %xmm1, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm5
-; SSE2-NEXT:    packssdw %xmm6, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [50,51]
-; SSE2-NEXT:    paddq %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm8
-; SSE2-NEXT:    por %xmm7, %xmm8
-; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm3, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
-; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm8, %xmm6
-; SSE2-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [48,49]
-; SSE2-NEXT:    movdqa %xmm1, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm2, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm2, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm9, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm1, %xmm7
-; SSE2-NEXT:    por %xmm2, %xmm7
-; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm3, %xmm0
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm3, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
-; SSE2-NEXT:    pand %xmm1, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; SSE2-NEXT:    por %xmm2, %xmm0
-; SSE2-NEXT:    packssdw %xmm6, %xmm0
-; SSE2-NEXT:    packssdw %xmm5, %xmm0
-; SSE2-NEXT:    packsswb %xmm4, %xmm0
-; SSE2-NEXT:    pmovmskb %xmm0, %esi
-; SSE2-NEXT:    shll $16, %esi
-; SSE2-NEXT:    orl %edx, %esi
-; SSE2-NEXT:    shlq $32, %rsi
-; SSE2-NEXT:    orq %rcx, %rsi
-; SSE2-NEXT:    movq %rsi, (%rdi)
-; SSE2-NEXT:    retq
-;
-; SSE42-LABEL: lane_mask_v64i1_i64:
-; SSE42:       # %bb.0:
-; SSE42-NEXT:    movq %rdi, %rax
-; SSE42-NEXT:    movq %rsi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,1,0,1]
-; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; SSE42-NEXT:    movdqa %xmm2, %xmm0
-; SSE42-NEXT:    pxor %xmm1, %xmm0
-; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [14,15]
-; SSE42-NEXT:    paddq %xmm2, %xmm3
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pxor %xmm1, %xmm4
-; SSE42-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm4, %xmm5
-; SSE42-NEXT:    por %xmm3, %xmm5
-; SSE42-NEXT:    pxor %xmm1, %xmm5
-; SSE42-NEXT:    movq %rdx, %xmm3
-; SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1]
-; SSE42-NEXT:    pxor %xmm1, %xmm3
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm5, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [12,13]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
-; SSE42-NEXT:    packssdw %xmm4, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [10,11]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [8,9]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm4, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm4
-; SSE42-NEXT:    packssdw %xmm6, %xmm4
-; SSE42-NEXT:    packssdw %xmm5, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [6,7]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [4,5]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm5, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm5
-; SSE42-NEXT:    packssdw %xmm6, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [2,3]
-; SSE42-NEXT:    paddq %xmm2, %xmm6
-; SSE42-NEXT:    movdqa %xmm6, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm6, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm7 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
-; SSE42-NEXT:    paddq %xmm2, %xmm7
-; SSE42-NEXT:    movdqa %xmm7, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm0, %xmm9
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm9
-; SSE42-NEXT:    por %xmm7, %xmm9
-; SSE42-NEXT:    pxor %xmm1, %xmm9
-; SSE42-NEXT:    movdqa %xmm3, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm9, %xmm7
-; SSE42-NEXT:    packssdw %xmm6, %xmm7
-; SSE42-NEXT:    packssdw %xmm5, %xmm7
-; SSE42-NEXT:    packsswb %xmm4, %xmm7
-; SSE42-NEXT:    pmovmskb %xmm7, %edx
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [30,31]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm5
-; SSE42-NEXT:    pxor %xmm1, %xmm5
-; SSE42-NEXT:    movdqa %xmm0, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm5, %xmm6
-; SSE42-NEXT:    por %xmm4, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [28,29]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
-; SSE42-NEXT:    packssdw %xmm4, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [26,27]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [24,25]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm4, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm4
-; SSE42-NEXT:    packssdw %xmm6, %xmm4
-; SSE42-NEXT:    packssdw %xmm5, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [22,23]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [20,21]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm5, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm5
-; SSE42-NEXT:    packssdw %xmm6, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [18,19]
-; SSE42-NEXT:    paddq %xmm2, %xmm6
-; SSE42-NEXT:    movdqa %xmm6, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm6, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm7 = [16,17]
-; SSE42-NEXT:    paddq %xmm2, %xmm7
-; SSE42-NEXT:    movdqa %xmm7, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm0, %xmm9
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm9
-; SSE42-NEXT:    por %xmm7, %xmm9
-; SSE42-NEXT:    pxor %xmm1, %xmm9
-; SSE42-NEXT:    movdqa %xmm3, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm9, %xmm7
-; SSE42-NEXT:    packssdw %xmm6, %xmm7
-; SSE42-NEXT:    packssdw %xmm5, %xmm7
-; SSE42-NEXT:    packsswb %xmm4, %xmm7
-; SSE42-NEXT:    pmovmskb %xmm7, %ecx
-; SSE42-NEXT:    shll $16, %ecx
-; SSE42-NEXT:    orl %edx, %ecx
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [46,47]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm5
-; SSE42-NEXT:    pxor %xmm1, %xmm5
-; SSE42-NEXT:    movdqa %xmm0, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm5, %xmm6
-; SSE42-NEXT:    por %xmm4, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [44,45]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
-; SSE42-NEXT:    packssdw %xmm4, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [42,43]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [40,41]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm4, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm4
-; SSE42-NEXT:    packssdw %xmm6, %xmm4
-; SSE42-NEXT:    packssdw %xmm5, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [38,39]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [36,37]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm5, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm5
-; SSE42-NEXT:    packssdw %xmm6, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [34,35]
-; SSE42-NEXT:    paddq %xmm2, %xmm6
-; SSE42-NEXT:    movdqa %xmm6, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm6, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm7 = [32,33]
-; SSE42-NEXT:    paddq %xmm2, %xmm7
-; SSE42-NEXT:    movdqa %xmm7, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm0, %xmm9
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm9
-; SSE42-NEXT:    por %xmm7, %xmm9
-; SSE42-NEXT:    pxor %xmm1, %xmm9
-; SSE42-NEXT:    movdqa %xmm3, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm9, %xmm7
-; SSE42-NEXT:    packssdw %xmm6, %xmm7
-; SSE42-NEXT:    packssdw %xmm5, %xmm7
-; SSE42-NEXT:    packsswb %xmm4, %xmm7
-; SSE42-NEXT:    pmovmskb %xmm7, %edx
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [62,63]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm5
-; SSE42-NEXT:    pxor %xmm1, %xmm5
-; SSE42-NEXT:    movdqa %xmm0, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm5, %xmm6
-; SSE42-NEXT:    por %xmm4, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [60,61]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
-; SSE42-NEXT:    packssdw %xmm4, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [58,59]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [56,57]
-; SSE42-NEXT:    paddq %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm4, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm4
-; SSE42-NEXT:    packssdw %xmm6, %xmm4
-; SSE42-NEXT:    packssdw %xmm5, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [54,55]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
-; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
-; SSE42-NEXT:    por %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [52,53]
-; SSE42-NEXT:    paddq %xmm2, %xmm5
-; SSE42-NEXT:    movdqa %xmm5, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm5, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm5
-; SSE42-NEXT:    packssdw %xmm6, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [50,51]
-; SSE42-NEXT:    paddq %xmm2, %xmm6
-; SSE42-NEXT:    movdqa %xmm6, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm6, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
-; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [48,49]
-; SSE42-NEXT:    movdqa %xmm2, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm0
-; SSE42-NEXT:    por %xmm2, %xmm0
-; SSE42-NEXT:    pxor %xmm1, %xmm0
-; SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
-; SSE42-NEXT:    packssdw %xmm6, %xmm3
-; SSE42-NEXT:    packssdw %xmm5, %xmm3
-; SSE42-NEXT:    packsswb %xmm4, %xmm3
-; SSE42-NEXT:    pmovmskb %xmm3, %esi
-; SSE42-NEXT:    shll $16, %esi
-; SSE42-NEXT:    orl %edx, %esi
-; SSE42-NEXT:    shlq $32, %rsi
-; SSE42-NEXT:    orq %rcx, %rsi
-; SSE42-NEXT:    movq %rsi, (%rdi)
-; SSE42-NEXT:    retq
-;
-; AVX2-LABEL: lane_mask_v64i1_i64:
-; AVX2:       # %bb.0:
-; AVX2-NEXT:    movq %rdi, %rax
-; AVX2-NEXT:    vmovq %rsi, %xmm0
-; AVX2-NEXT:    vpbroadcastq %xmm0, %ymm1
-; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm0 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm2
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm3 # [28,29,30,31]
-; AVX2-NEXT:    vpxor %ymm0, %ymm3, %ymm4
-; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm2, %ymm4
-; AVX2-NEXT:    vpor %ymm4, %ymm3, %ymm3
-; AVX2-NEXT:    vpxor %ymm0, %ymm3, %ymm4
-; AVX2-NEXT:    vmovq %rdx, %xmm3
-; AVX2-NEXT:    vpbroadcastq %xmm3, %ymm3
-; AVX2-NEXT:    vpxor %ymm0, %ymm3, %ymm3
-; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm4
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm5 # [24,25,26,27]
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm2, %ymm6
-; AVX2-NEXT:    vpor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm5
-; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm3, %ymm5
-; AVX2-NEXT:    vpackssdw %ymm4, %ymm5, %ymm4
-; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3]
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm5 # [20,21,22,23]
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm2, %ymm6
-; AVX2-NEXT:    vpor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm5
-; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm3, %ymm5
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm6 # [16,17,18,19]
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm2, %ymm7
-; AVX2-NEXT:    vpor %ymm7, %ymm6, %ymm6
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm3, %ymm6
-; AVX2-NEXT:    vpackssdw %ymm5, %ymm6, %ymm5
-; AVX2-NEXT:    vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm4, %ymm5, %ymm4
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm5 # [12,13,14,15]
-; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm2, %ymm6
-; AVX2-NEXT:    vpor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm5
-; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm3, %ymm5
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm6 # [8,9,10,11]
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm2, %ymm7
-; AVX2-NEXT:    vpor %ymm7, %ymm6, %ymm6
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm3, %ymm6
-; AVX2-NEXT:    vpackssdw %ymm5, %ymm6, %ymm5
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm6 # [4,5,6,7]
-; AVX2-NEXT:    vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm2, %ymm7
-; AVX2-NEXT:    vpor %ymm7, %ymm6, %ymm6
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm3, %ymm6
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm7 # [0,1,2,3]
-; AVX2-NEXT:    vpxor %ymm0, %ymm7, %ymm8
-; AVX2-NEXT:    vpcmpgtq %ymm8, %ymm2, %ymm8
-; AVX2-NEXT:    vpor %ymm7, %ymm8, %ymm7
-; AVX2-NEXT:    vpxor %ymm0, %ymm7, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm3, %ymm7
-; AVX2-NEXT:    vpackssdw %ymm6, %ymm7, %ymm6
-; AVX2-NEXT:    vpermq {{.*#+}} ymm6 = ymm6[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm5, %ymm6, %ymm5
-; AVX2-NEXT:    vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3]
-; AVX2-NEXT:    vpacksswb %ymm4, %ymm5, %ymm4
-; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3]
-; AVX2-NEXT:    vpsllw $7, %ymm4, %ymm4
-; AVX2-NEXT:    vpmovmskb %ymm4, %ecx
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm4 # [60,61,62,63]
-; AVX2-NEXT:    vpxor %ymm0, %ymm4, %ymm5
-; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm2, %ymm5
-; AVX2-NEXT:    vpor %ymm5, %ymm4, %ymm4
-; AVX2-NEXT:    vpxor %ymm0, %ymm4, %ymm4
-; AVX2-NEXT:    vpcmpgtq %ymm4, %ymm3, %ymm4
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm5 # [56,57,58,59]
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm2, %ymm6
-; AVX2-NEXT:    vpor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm5
-; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm3, %ymm5
-; AVX2-NEXT:    vpackssdw %ymm4, %ymm5, %ymm4
-; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3]
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm5 # [52,53,54,55]
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm2, %ymm6
-; AVX2-NEXT:    vpor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm5
-; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm3, %ymm5
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm6 # [48,49,50,51]
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm2, %ymm7
-; AVX2-NEXT:    vpor %ymm7, %ymm6, %ymm6
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm3, %ymm6
-; AVX2-NEXT:    vpackssdw %ymm5, %ymm6, %ymm5
-; AVX2-NEXT:    vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm4, %ymm5, %ymm4
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm5 # [44,45,46,47]
-; AVX2-NEXT:    vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm2, %ymm6
-; AVX2-NEXT:    vpor %ymm6, %ymm5, %ymm5
-; AVX2-NEXT:    vpxor %ymm0, %ymm5, %ymm5
-; AVX2-NEXT:    vpcmpgtq %ymm5, %ymm3, %ymm5
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm6 # [40,41,42,43]
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm2, %ymm7
-; AVX2-NEXT:    vpor %ymm7, %ymm6, %ymm6
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm3, %ymm6
-; AVX2-NEXT:    vpackssdw %ymm5, %ymm6, %ymm5
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm6 # [36,37,38,39]
-; AVX2-NEXT:    vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3]
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm2, %ymm7
-; AVX2-NEXT:    vpor %ymm7, %ymm6, %ymm6
-; AVX2-NEXT:    vpxor %ymm0, %ymm6, %ymm6
-; AVX2-NEXT:    vpcmpgtq %ymm6, %ymm3, %ymm6
-; AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm1, %ymm1 # [32,33,34,35]
-; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm7
-; AVX2-NEXT:    vpcmpgtq %ymm7, %ymm2, %ymm2
-; AVX2-NEXT:    vpor %ymm2, %ymm1, %ymm1
-; AVX2-NEXT:    vpxor %ymm0, %ymm1, %ymm0
-; AVX2-NEXT:    vpcmpgtq %ymm0, %ymm3, %ymm0
-; AVX2-NEXT:    vpackssdw %ymm6, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm5, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpacksswb %ymm4, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
-; AVX2-NEXT:    vpmovmskb %ymm0, %edx
-; AVX2-NEXT:    shlq $32, %rdx
-; AVX2-NEXT:    orq %rcx, %rdx
-; AVX2-NEXT:    movq %rdx, (%rdi)
-; AVX2-NEXT:    vzeroupper
-; AVX2-NEXT:    retq
-;
-; AVX512-LABEL: lane_mask_v64i1_i64:
-; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastq %rsi, %zmm0
-; AVX512-NEXT:    vpbroadcastq %rdi, %zmm1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [0,1,2,3,4,5,6,7]
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm3
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k0
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm3, %zmm2 # [8,9,10,11,12,13,14,15]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    kunpckbw %k0, %k1, %k0
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [16,17,18,19,20,21,22,23]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [24,25,26,27,28,29,30,31]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k2
-; AVX512-NEXT:    kunpckbw %k1, %k2, %k1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [32,33,34,35,36,37,38,39]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [40,41,42,43,44,45,46,47]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k2
-; AVX512-NEXT:    kunpckbw %k1, %k2, %k1
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm2
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm2, %zmm2 # [48,49,50,51,52,53,54,55]
-; AVX512-NEXT:    vpminuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1
-; AVX512-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm1, %zmm1 # [56,57,58,59,60,61,62,63]
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm2, %k2
-; AVX512-NEXT:    vpcmpltuq %zmm0, %zmm1, %k3
-; AVX512-NEXT:    kunpckbw %k2, %k3, %k2
-; AVX512-NEXT:    kunpckwd %k1, %k2, %k1
-; AVX512-NEXT:    kunpckdq %k0, %k1, %k0
-; AVX512-NEXT:    vpmovm2b %k0, %zmm0
-; AVX512-NEXT:    retq
-  %active.lane.mask = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i64(i64 %index, i64 %TC)
-  ret <64 x i1> %active.lane.mask
-}
-
-;
-; i64 (zero index)
-;
-
-define <2 x i1> @lane_mask_v2i1_i64_zero(i64 %TC) {
-; SSE2-LABEL: lane_mask_v2i1_i64_zero:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movq %rdi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3]
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pand %xmm0, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
-; SSE2-NEXT:    por %xmm2, %xmm0
-; SSE2-NEXT:    retq
-;
-; SSE42-LABEL: lane_mask_v2i1_i64_zero:
-; SSE42:       # %bb.0:
-; SSE42-NEXT:    movq %rdi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT:    retq
-;
-; AVX2-LABEL: lane_mask_v2i1_i64_zero:
-; AVX2:       # %bb.0:
-; AVX2-NEXT:    vmovq %rdi, %xmm0
-; AVX2-NEXT:    vpbroadcastq %xmm0, %xmm0
-; AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; AVX2-NEXT:    retq
-;
-; AVX512-LABEL: lane_mask_v2i1_i64_zero:
-; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastq %rdi, %xmm0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %k0
-; AVX512-NEXT:    vpmovm2q %k0, %xmm0
-; AVX512-NEXT:    retq
-  %active.lane.mask = call <2 x i1> @llvm.get.active.lane.mask.v2i1.i64(i64 0, i64 %TC)
-  ret <2 x i1> %active.lane.mask
-}
-
-define <4 x i1> @lane_mask_v4i1_i64_zero(i64 %TC) {
-; SSE2-LABEL: lane_mask_v4i1_i64_zero:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movq %rdi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,1,0,1]
-; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
 ; SSE2-NEXT:    movdqa %xmm1, %xmm2
 ; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,3,1,3]
@@ -4520,223 +2701,10 @@ define <16 x i1> @lane_mask_v16i1_i64_zero(i64 %TC) {
 ; SSE2-NEXT:    retq
 ;
 ; SSE42-LABEL: lane_mask_v16i1_i64_zero:
-; SSE42:       # %bb.0:
-; SSE42-NEXT:    movq %rdi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT:    movdqa %xmm0, %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packssdw %xmm1, %xmm2
-; SSE42-NEXT:    movdqa %xmm0, %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    packssdw %xmm1, %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm3
-; SSE42-NEXT:    movdqa %xmm0, %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packssdw %xmm1, %xmm2
-; SSE42-NEXT:    movdqa %xmm0, %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT:    packssdw %xmm1, %xmm0
-; SSE42-NEXT:    packssdw %xmm2, %xmm0
-; SSE42-NEXT:    packsswb %xmm3, %xmm0
-; SSE42-NEXT:    retq
-;
-; AVX2-LABEL: lane_mask_v16i1_i64_zero:
-; AVX2:       # %bb.0:
-; AVX2-NEXT:    vmovq %rdi, %xmm0
-; AVX2-NEXT:    vpbroadcastq %xmm0, %ymm0
-; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
-; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
-; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
-; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
-; AVX2-NEXT:    vzeroupper
-; AVX2-NEXT:    retq
-;
-; AVX512-LABEL: lane_mask_v16i1_i64_zero:
-; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastq %rdi, %zmm0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    kunpckbw %k0, %k1, %k0
-; AVX512-NEXT:    vpmovm2b %k0, %xmm0
-; AVX512-NEXT:    vzeroupper
-; AVX512-NEXT:    retq
-  %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i64(i64 0, i64 %TC)
-  ret <16 x i1> %active.lane.mask
-}
-
-define <32 x i1> @lane_mask_v32i1_i64_zero(i64 %TC) {
-; SSE2-LABEL: lane_mask_v32i1_i64_zero:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movq %rsi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    movq %rdi, %rax
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]
-; SSE2-NEXT:    pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm3, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm3
-; SSE2-NEXT:    packssdw %xmm2, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm5
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm2
-; SSE2-NEXT:    packssdw %xmm5, %xmm2
-; SSE2-NEXT:    packssdw %xmm3, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm4
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm4
-; SSE2-NEXT:    packssdw %xmm3, %xmm4
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    movdqa %xmm0, %xmm6
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
-; SSE2-NEXT:    por %xmm5, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm6
-; SSE2-NEXT:    packssdw %xmm3, %xmm6
-; SSE2-NEXT:    packssdw %xmm4, %xmm6
-; SSE2-NEXT:    packsswb %xmm2, %xmm6
-; SSE2-NEXT:    pmovmskb %xmm6, %ecx
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm3, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm3
-; SSE2-NEXT:    packssdw %xmm2, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm5
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm2
-; SSE2-NEXT:    packssdw %xmm5, %xmm2
-; SSE2-NEXT:    packssdw %xmm3, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm4
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm4
-; SSE2-NEXT:    packssdw %xmm3, %xmm4
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm0
-; SSE2-NEXT:    packssdw %xmm3, %xmm0
-; SSE2-NEXT:    packssdw %xmm4, %xmm0
-; SSE2-NEXT:    packsswb %xmm2, %xmm0
-; SSE2-NEXT:    pmovmskb %xmm0, %edx
-; SSE2-NEXT:    shll $16, %edx
-; SSE2-NEXT:    orl %ecx, %edx
-; SSE2-NEXT:    movl %edx, (%rdi)
-; SSE2-NEXT:    retq
-;
-; SSE42-LABEL: lane_mask_v32i1_i64_zero:
-; SSE42:       # %bb.0:
-; SSE42-NEXT:    movq %rsi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT:    movdqa %xmm0, %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE42-NEXT:    movq %rdi, %rax
-; SSE42-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
-; SSE42-NEXT:    packssdw %xmm1, %xmm2
-; SSE42-NEXT:    movdqa %xmm0, %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    packssdw %xmm3, %xmm4
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packssdw %xmm5, %xmm1
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    packssdw %xmm1, %xmm2
-; SSE42-NEXT:    packsswb %xmm4, %xmm2
-; SSE42-NEXT:    pmovmskb %xmm2, %ecx
+; SSE42:       # %bb.0:
+; SSE42-NEXT:    movq %rdi, %xmm0
+; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
+; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
@@ -4759,13 +2727,9 @@ define <32 x i1> @lane_mask_v32i1_i64_zero(i64 %TC) {
 ; SSE42-NEXT:    packssdw %xmm1, %xmm0
 ; SSE42-NEXT:    packssdw %xmm2, %xmm0
 ; SSE42-NEXT:    packsswb %xmm3, %xmm0
-; SSE42-NEXT:    pmovmskb %xmm0, %edx
-; SSE42-NEXT:    shll $16, %edx
-; SSE42-NEXT:    orl %ecx, %edx
-; SSE42-NEXT:    movl %edx, (%rdi)
 ; SSE42-NEXT:    retq
 ;
-; AVX2-LABEL: lane_mask_v32i1_i64_zero:
+; AVX2-LABEL: lane_mask_v16i1_i64_zero:
 ; AVX2:       # %bb.0:
 ; AVX2-NEXT:    vmovq %rdi, %xmm0
 ; AVX2-NEXT:    vpbroadcastq %xmm0, %ymm0
@@ -4776,43 +2740,32 @@ define <32 x i1> @lane_mask_v32i1_i64_zero(i64 %TC) {
 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
-; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
-; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
-; AVX2-NEXT:    vpackssdw %ymm3, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
 ; AVX2-NEXT:    vpackssdw %ymm2, %ymm0, %ymm0
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
+; AVX2-NEXT:    vpackssdw %ymm1, %ymm0, %ymm0
+; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX2-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
+; AVX2-NEXT:    vzeroupper
 ; AVX2-NEXT:    retq
 ;
-; AVX512-LABEL: lane_mask_v32i1_i64_zero:
+; AVX512-LABEL: lane_mask_v16i1_i64_zero:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastq %rdi, %zmm0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k2
-; AVX512-NEXT:    kunpckbw %k0, %k1, %k0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    kunpckbw %k2, %k1, %k1
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
-; AVX512-NEXT:    vpmovm2b %k0, %ymm0
+; AVX512-NEXT:    cmpq $16, %rdi
+; AVX512-NEXT:    movl $16, %eax
+; AVX512-NEXT:    cmovbq %rdi, %rax
+; AVX512-NEXT:    movl $-1, %ecx
+; AVX512-NEXT:    bzhil %eax, %ecx, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
+; AVX512-NEXT:    vpmovm2b %k0, %xmm0
 ; AVX512-NEXT:    retq
-  %active.lane.mask = call <32 x i1> @llvm.get.active.lane.mask.v32i1.i64(i64 0, i64 %TC)
-  ret <32 x i1> %active.lane.mask
+  %active.lane.mask = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i64(i64 0, i64 %TC)
+  ret <16 x i1> %active.lane.mask
 }
 
-define <64 x i1> @lane_mask_v64i1_i64_zero(i64 %TC) {
-; SSE2-LABEL: lane_mask_v64i1_i64_zero:
+define <32 x i1> @lane_mask_v32i1_i64_zero(i64 %TC) {
+; SSE2-LABEL: lane_mask_v32i1_i64_zero:
 ; SSE2:       # %bb.0:
 ; SSE2-NEXT:    movq %rsi, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
@@ -4875,7 +2828,7 @@ define <64 x i1> @lane_mask_v64i1_i64_zero(i64 %TC) {
 ; SSE2-NEXT:    packssdw %xmm3, %xmm6
 ; SSE2-NEXT:    packssdw %xmm4, %xmm6
 ; SSE2-NEXT:    packsswb %xmm2, %xmm6
-; SSE2-NEXT:    pmovmskb %xmm6, %edx
+; SSE2-NEXT:    pmovmskb %xmm6, %ecx
 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
 ; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
@@ -4921,120 +2874,6 @@ define <64 x i1> @lane_mask_v64i1_i64_zero(i64 %TC) {
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
 ; SSE2-NEXT:    pand %xmm1, %xmm5
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    movdqa %xmm0, %xmm6
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm6
-; SSE2-NEXT:    por %xmm5, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm6
-; SSE2-NEXT:    packssdw %xmm3, %xmm6
-; SSE2-NEXT:    packssdw %xmm4, %xmm6
-; SSE2-NEXT:    packsswb %xmm2, %xmm6
-; SSE2-NEXT:    pmovmskb %xmm6, %ecx
-; SSE2-NEXT:    shll $16, %ecx
-; SSE2-NEXT:    orl %edx, %ecx
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    movdqa %xmm0, %xmm4
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE2-NEXT:    por %xmm3, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm3, %xmm4
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packssdw %xmm2, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm2, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm2
-; SSE2-NEXT:    packssdw %xmm3, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packssdw %xmm4, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm4
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm4
-; SSE2-NEXT:    packssdw %xmm3, %xmm4
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm5
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; SSE2-NEXT:    por %xmm6, %xmm5
-; SSE2-NEXT:    packssdw %xmm3, %xmm5
-; SSE2-NEXT:    packssdw %xmm4, %xmm5
-; SSE2-NEXT:    packsswb %xmm2, %xmm5
-; SSE2-NEXT:    pmovmskb %xmm5, %edx
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    movdqa %xmm0, %xmm4
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE2-NEXT:    por %xmm3, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm3, %xmm4
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packssdw %xmm2, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm2, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm2[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm2
-; SSE2-NEXT:    packssdw %xmm3, %xmm2
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    packssdw %xmm4, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm3
-; SSE2-NEXT:    movdqa %xmm0, %xmm4
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm5, %xmm4
-; SSE2-NEXT:    packssdw %xmm3, %xmm4
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pand %xmm1, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
 ; SSE2-NEXT:    por %xmm5, %xmm3
 ; SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2]
@@ -5044,203 +2883,147 @@ define <64 x i1> @lane_mask_v64i1_i64_zero(i64 %TC) {
 ; SSE2-NEXT:    packssdw %xmm3, %xmm0
 ; SSE2-NEXT:    packssdw %xmm4, %xmm0
 ; SSE2-NEXT:    packsswb %xmm2, %xmm0
-; SSE2-NEXT:    pmovmskb %xmm0, %esi
-; SSE2-NEXT:    shll $16, %esi
-; SSE2-NEXT:    orl %edx, %esi
-; SSE2-NEXT:    shlq $32, %rsi
-; SSE2-NEXT:    orq %rcx, %rsi
-; SSE2-NEXT:    movq %rsi, (%rdi)
+; SSE2-NEXT:    pmovmskb %xmm0, %edx
+; SSE2-NEXT:    shll $16, %edx
+; SSE2-NEXT:    orl %ecx, %edx
+; SSE2-NEXT:    movl %edx, (%rdi)
 ; SSE2-NEXT:    retq
 ;
-; SSE42-LABEL: lane_mask_v64i1_i64_zero:
+; SSE42-LABEL: lane_mask_v32i1_i64_zero:
 ; SSE42:       # %bb.0:
 ; SSE42-NEXT:    movq %rsi, %xmm0
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
 ; SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; SSE42-NEXT:    movdqa %xmm0, %xmm1
+; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
 ; SSE42-NEXT:    movdqa %xmm0, %xmm4
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE42-NEXT:    movdqa %xmm0, %xmm1
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
 ; SSE42-NEXT:    movq %rdi, %rax
 ; SSE42-NEXT:    movdqa %xmm0, %xmm5
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
-; SSE42-NEXT:    packssdw %xmm2, %xmm3
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packssdw %xmm4, %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE42-NEXT:    packssdw %xmm3, %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    packssdw %xmm5, %xmm2
-; SSE42-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
-; SSE42-NEXT:    packssdw %xmm4, %xmm3
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE42-NEXT:    packssdw %xmm2, %xmm3
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packsswb %xmm1, %xmm3
+; SSE42-NEXT:    packssdw %xmm1, %xmm2
 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    pmovmskb %xmm3, %edx
+; SSE42-NEXT:    packssdw %xmm3, %xmm4
 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    packssdw %xmm5, %xmm4
-; SSE42-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5
-; SSE42-NEXT:    packssdw %xmm2, %xmm1
+; SSE42-NEXT:    packssdw %xmm2, %xmm4
 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packssdw %xmm4, %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE42-NEXT:    packssdw %xmm3, %xmm5
-; SSE42-NEXT:    packssdw %xmm2, %xmm4
-; SSE42-NEXT:    packssdw %xmm5, %xmm4
-; SSE42-NEXT:    packsswb %xmm1, %xmm4
-; SSE42-NEXT:    pmovmskb %xmm4, %ecx
+; SSE42-NEXT:    packssdw %xmm5, %xmm1
+; SSE42-NEXT:    packssdw %xmm3, %xmm2
+; SSE42-NEXT:    packssdw %xmm1, %xmm2
+; SSE42-NEXT:    packsswb %xmm4, %xmm2
+; SSE42-NEXT:    pmovmskb %xmm2, %ecx
 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    shll $16, %ecx
 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    orl %edx, %ecx
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
 ; SSE42-NEXT:    packssdw %xmm1, %xmm2
 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    packssdw %xmm3, %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    movdqa %xmm0, %xmm4
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4
-; SSE42-NEXT:    packssdw %xmm3, %xmm4
-; SSE42-NEXT:    packssdw %xmm2, %xmm4
-; SSE42-NEXT:    movdqa %xmm0, %xmm2
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packsswb %xmm1, %xmm4
+; SSE42-NEXT:    packssdw %xmm1, %xmm3
+; SSE42-NEXT:    packssdw %xmm2, %xmm3
 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    pmovmskb %xmm4, %edx
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
-; SSE42-NEXT:    packssdw %xmm2, %xmm1
 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
 ; SSE42-NEXT:    packssdw %xmm1, %xmm2
 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
-; SSE42-NEXT:    packssdw %xmm3, %xmm1
-; SSE42-NEXT:    movdqa %xmm0, %xmm3
-; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3
 ; SSE42-NEXT:    pcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE42-NEXT:    packssdw %xmm3, %xmm0
 ; SSE42-NEXT:    packssdw %xmm1, %xmm0
-; SSE42-NEXT:    packsswb %xmm2, %xmm0
-; SSE42-NEXT:    pmovmskb %xmm0, %esi
-; SSE42-NEXT:    shll $16, %esi
-; SSE42-NEXT:    orl %edx, %esi
-; SSE42-NEXT:    shlq $32, %rsi
-; SSE42-NEXT:    orq %rcx, %rsi
-; SSE42-NEXT:    movq %rsi, (%rdi)
+; SSE42-NEXT:    packssdw %xmm2, %xmm0
+; SSE42-NEXT:    packsswb %xmm3, %xmm0
+; SSE42-NEXT:    pmovmskb %xmm0, %edx
+; SSE42-NEXT:    shll $16, %edx
+; SSE42-NEXT:    orl %ecx, %edx
+; SSE42-NEXT:    movl %edx, (%rdi)
 ; SSE42-NEXT:    retq
 ;
-; AVX2-LABEL: lane_mask_v64i1_i64_zero:
+; AVX2-LABEL: lane_mask_v32i1_i64_zero:
 ; AVX2:       # %bb.0:
-; AVX2-NEXT:    vmovq %rsi, %xmm0
+; AVX2-NEXT:    vmovq %rdi, %xmm0
 ; AVX2-NEXT:    vpbroadcastq %xmm0, %ymm0
 ; AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm1 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808]
 ; AVX2-NEXT:    vpxor %ymm1, %ymm0, %ymm0
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm1
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    movq %rdi, %rax
 ; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
-; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
 ; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm4
-; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm3, %ymm4, %ymm3
-; AVX2-NEXT:    vpermq {{.*#+}} ymm3 = ymm3[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]
-; AVX2-NEXT:    vpacksswb %ymm1, %ymm2, %ymm1
+; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpsllw $7, %ymm1, %ymm1
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
-; AVX2-NEXT:    vpmovmskb %ymm1, %ecx
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm1
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
 ; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]
-; AVX2-NEXT:    vpackssdw %ymm1, %ymm2, %ymm1
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm2
-; AVX2-NEXT:    vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3]
-; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
-; AVX2-NEXT:    vpackssdw %ymm2, %ymm3, %ymm2
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm3
 ; AVX2-NEXT:    vpcmpgtq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
-; AVX2-NEXT:    vpermq {{.*#+}} ymm2 = ymm2[0,2,1,3]
 ; AVX2-NEXT:    vpackssdw %ymm3, %ymm0, %ymm0
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
 ; AVX2-NEXT:    vpackssdw %ymm2, %ymm0, %ymm0
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
 ; AVX2-NEXT:    vpacksswb %ymm1, %ymm0, %ymm0
 ; AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT:    vpsllw $7, %ymm0, %ymm0
-; AVX2-NEXT:    vpmovmskb %ymm0, %edx
-; AVX2-NEXT:    shlq $32, %rdx
-; AVX2-NEXT:    orq %rcx, %rdx
-; AVX2-NEXT:    movq %rdx, (%rdi)
-; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    retq
+;
+; AVX512-LABEL: lane_mask_v32i1_i64_zero:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    cmpq $32, %rdi
+; AVX512-NEXT:    movl $32, %eax
+; AVX512-NEXT:    cmovbq %rdi, %rax
+; AVX512-NEXT:    movl $-1, %ecx
+; AVX512-NEXT:    bzhil %eax, %ecx, %eax
+; AVX512-NEXT:    kmovd %eax, %k0
+; AVX512-NEXT:    vpmovm2b %k0, %ymm0
+; AVX512-NEXT:    retq
+  %active.lane.mask = call <32 x i1> @llvm.get.active.lane.mask.v32i1.i64(i64 0, i64 %TC)
+  ret <32 x i1> %active.lane.mask
+}
+
+define <64 x i1> @lane_mask_v64i1_i64_zero(i64 %TC) {
+; SSE-LABEL: lane_mask_v64i1_i64_zero:
+; SSE:       # %bb.0:
+; SSE-NEXT:    cmpq $64, %rsi
+; SSE-NEXT:    movl $64, %ecx
+; SSE-NEXT:    cmovbq %rsi, %rcx
+; SSE-NEXT:    movl $1, %edx
+; SSE-NEXT:    # kill: def $cl killed $cl killed $rcx
+; SSE-NEXT:    shlq %cl, %rdx
+; SSE-NEXT:    movq %rdi, %rax
+; SSE-NEXT:    decq %rdx
+; SSE-NEXT:    movq %rdx, (%rdi)
+; SSE-NEXT:    retq
+;
+; AVX2-LABEL: lane_mask_v64i1_i64_zero:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    cmpq $64, %rsi
+; AVX2-NEXT:    movl $64, %ecx
+; AVX2-NEXT:    cmovbq %rsi, %rcx
+; AVX2-NEXT:    movq %rdi, %rax
+; AVX2-NEXT:    movq $-1, %rdx
+; AVX2-NEXT:    bzhiq %rcx, %rdx, %rcx
+; AVX2-NEXT:    movq %rcx, (%rdi)
 ; AVX2-NEXT:    retq
 ;
 ; AVX512-LABEL: lane_mask_v64i1_i64_zero:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vpbroadcastq %rdi, %zmm0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k2
-; AVX512-NEXT:    kunpckbw %k0, %k1, %k0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    kunpckbw %k2, %k1, %k1
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k2
-; AVX512-NEXT:    kunpckwd %k0, %k1, %k0
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k1
-; AVX512-NEXT:    kunpckbw %k2, %k1, %k1
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k2
-; AVX512-NEXT:    vpcmpnleuq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %k3
-; AVX512-NEXT:    kunpckbw %k2, %k3, %k2
-; AVX512-NEXT:    kunpckwd %k1, %k2, %k1
-; AVX512-NEXT:    kunpckdq %k0, %k1, %k0
+; AVX512-NEXT:    cmpq $64, %rdi
+; AVX512-NEXT:    movl $64, %eax
+; AVX512-NEXT:    cmovbq %rdi, %rax
+; AVX512-NEXT:    movq $-1, %rcx
+; AVX512-NEXT:    bzhiq %rax, %rcx, %rax
+; AVX512-NEXT:    kmovq %rax, %k0
 ; AVX512-NEXT:    vpmovm2b %k0, %zmm0
 ; AVX512-NEXT:    retq
   %active.lane.mask = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i64(i64 0, i64 %TC)
diff --git a/llvm/test/CodeGen/X86/pr47299.ll b/llvm/test/CodeGen/X86/pr47299.ll
index 7cb1112402ebe..1e502fd52268b 100644
--- a/llvm/test/CodeGen/X86/pr47299.ll
+++ b/llvm/test/CodeGen/X86/pr47299.ll
@@ -56,12 +56,13 @@ define <7 x i1> @create_mask7(i64 %0) {
 define <16 x i1> @create_mask16(i64 %0) {
 ; CHECK-LABEL: create_mask16:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpbroadcastq zmm0, rdi
-; CHECK-NEXT:    vpcmpnleuq k0, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleuq k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckbw k0, k1, k0
+; CHECK-NEXT:    cmp rdi, 16
+; CHECK-NEXT:    mov eax, 16
+; CHECK-NEXT:    cmovb rax, rdi
+; CHECK-NEXT:    mov ecx, -1
+; CHECK-NEXT:    bzhi eax, ecx, eax
+; CHECK-NEXT:    kmovd k0, eax
 ; CHECK-NEXT:    vpmovm2b xmm0, k0
-; CHECK-NEXT:    vzeroupper
 ; CHECK-NEXT:    ret
   %2 = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i64(i64 0, i64 %0)
   ret <16 x i1> %2
@@ -70,14 +71,12 @@ define <16 x i1> @create_mask16(i64 %0) {
 define <32 x i1> @create_mask32(i64 %0) {
 ; CHECK-LABEL: create_mask32:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpbroadcastq zmm0, rdi
-; CHECK-NEXT:    vpcmpnleuq k0, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleuq k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleuq k2, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckbw k0, k1, k0
-; CHECK-NEXT:    vpcmpnleuq k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckbw k1, k1, k2
-; CHECK-NEXT:    kunpckwd k0, k1, k0
+; CHECK-NEXT:    cmp rdi, 32
+; CHECK-NEXT:    mov eax, 32
+; CHECK-NEXT:    cmovb rax, rdi
+; CHECK-NEXT:    mov ecx, -1
+; CHECK-NEXT:    bzhi eax, ecx, eax
+; CHECK-NEXT:    kmovd k0, eax
 ; CHECK-NEXT:    vpmovm2b ymm0, k0
 ; CHECK-NEXT:    ret
   %2 = call <32 x i1> @llvm.get.active.lane.mask.v32i1.i64(i64 0, i64 %0)
@@ -87,22 +86,12 @@ define <32 x i1> @create_mask32(i64 %0) {
 define <64 x i1> @create_mask64(i64 %0) {
 ; CHECK-LABEL: create_mask64:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpbroadcastq zmm0, rdi
-; CHECK-NEXT:    vpcmpnleuq k0, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleuq k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleuq k2, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckbw k0, k1, k0
-; CHECK-NEXT:    vpcmpnleuq k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckbw k1, k1, k2
-; CHECK-NEXT:    vpcmpnleuq k2, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckwd k0, k1, k0
-; CHECK-NEXT:    vpcmpnleuq k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckbw k1, k1, k2
-; CHECK-NEXT:    vpcmpnleuq k2, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleuq k3, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckbw k2, k3, k2
-; CHECK-NEXT:    kunpckwd k1, k2, k1
-; CHECK-NEXT:    kunpckdq k0, k1, k0
+; CHECK-NEXT:    cmp rdi, 64
+; CHECK-NEXT:    mov eax, 64
+; CHECK-NEXT:    cmovb rax, rdi
+; CHECK-NEXT:    mov rcx, -1
+; CHECK-NEXT:    bzhi rax, rcx, rax
+; CHECK-NEXT:    kmovq k0, rax
 ; CHECK-NEXT:    vpmovm2b zmm0, k0
 ; CHECK-NEXT:    ret
   %2 = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i64(i64 0, i64 %0)
@@ -112,10 +101,13 @@ define <64 x i1> @create_mask64(i64 %0) {
 define <16 x i1> @create_mask16_i32(i32 %0) {
 ; CHECK-LABEL: create_mask16_i32:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpbroadcastd zmm0, edi
-; CHECK-NEXT:    vpcmpnleud k0, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
+; CHECK-NEXT:    cmp edi, 16
+; CHECK-NEXT:    mov eax, 16
+; CHECK-NEXT:    cmovb eax, edi
+; CHECK-NEXT:    mov ecx, -1
+; CHECK-NEXT:    bzhi eax, ecx, eax
+; CHECK-NEXT:    kmovd k0, eax
 ; CHECK-NEXT:    vpmovm2b xmm0, k0
-; CHECK-NEXT:    vzeroupper
 ; CHECK-NEXT:    ret
   %2 = call <16 x i1> @llvm.get.active.lane.mask.v16i1.i32(i32 0, i32 %0)
   ret <16 x i1> %2
@@ -124,14 +116,12 @@ define <16 x i1> @create_mask16_i32(i32 %0) {
 define <64 x i1> @create_mask64_i32(i32 %0) {
 ; CHECK-LABEL: create_mask64_i32:
 ; CHECK:       # %bb.0:
-; CHECK-NEXT:    vpbroadcastd zmm0, edi
-; CHECK-NEXT:    vpcmpnleud k0, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleud k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    vpcmpnleud k2, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckwd k0, k1, k0
-; CHECK-NEXT:    vpcmpnleud k1, zmm0, zmmword ptr [rip + {{\.?LCPI[0-9]+_[0-9]+}}]
-; CHECK-NEXT:    kunpckwd k1, k1, k2
-; CHECK-NEXT:    kunpckdq k0, k1, k0
+; CHECK-NEXT:    cmp edi, 64
+; CHECK-NEXT:    mov eax, 64
+; CHECK-NEXT:    cmovb eax, edi
+; CHECK-NEXT:    mov rcx, -1
+; CHECK-NEXT:    bzhi rax, rcx, rax
+; CHECK-NEXT:    kmovq k0, rax
 ; CHECK-NEXT:    vpmovm2b zmm0, k0
 ; CHECK-NEXT:    ret
   %2 = call <64 x i1> @llvm.get.active.lane.mask.v64i1.i32(i32 0, i32 %0)

>From 2c7897d59ccc46133c91f6a1137d80541ecf0b54 Mon Sep 17 00:00:00 2001
From: william <we3223 at gmail.com>
Date: Wed, 30 Sep 2026 23:54:13 +0800
Subject: [PATCH 2/2] [X86][test] Add common SSE check prefix in
 active_lane_mask.ll-1

---
 llvm/test/CodeGen/X86/active_lane_mask.ll | 376 +++++++++++-----------
 1 file changed, 188 insertions(+), 188 deletions(-)

diff --git a/llvm/test/CodeGen/X86/active_lane_mask.ll b/llvm/test/CodeGen/X86/active_lane_mask.ll
index 74a37c8ba6b4a..d316db74246d9 100644
--- a/llvm/test/CodeGen/X86/active_lane_mask.ll
+++ b/llvm/test/CodeGen/X86/active_lane_mask.ll
@@ -272,34 +272,34 @@ define <16 x i1> @lane_mask_v16i1_i32(i32 %index, i32 %TC) {
 ; SSE42-LABEL: lane_mask_v16i1_i32:
 ; SSE42:       # %bb.0:
 ; SSE42-NEXT:    movd %edi, %xmm0
-; SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,0,0,0]
+; SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,0,0]
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [4294967295,4294967294,4294967293,4294967292]
-; SSE42-NEXT:    pminud %xmm1, %xmm0
+; SSE42-NEXT:    pminud %xmm2, %xmm0
 ; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [0,1,2,3]
-; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967291,4294967290,4294967289,4294967288]
-; SSE42-NEXT:    pminud %xmm1, %xmm2
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,5,6,7]
+; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [4294967291,4294967290,4294967289,4294967288]
+; SSE42-NEXT:    pminud %xmm2, %xmm1
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [4,5,6,7]
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967287,4294967286,4294967285,4294967284]
-; SSE42-NEXT:    pminud %xmm1, %xmm3
+; SSE42-NEXT:    pminud %xmm2, %xmm3
 ; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [8,9,10,11]
 ; SSE42-NEXT:    movd %esi, %xmm4
-; SSE42-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; SSE42-NEXT:    pminud {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1 # [12,13,14,15]
-; SSE42-NEXT:    movdqa %xmm1, %xmm5
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [12,13,14,15]
+; SSE42-NEXT:    movdqa %xmm2, %xmm5
 ; SSE42-NEXT:    pmaxud %xmm4, %xmm5
-; SSE42-NEXT:    pcmpeqd %xmm1, %xmm5
-; SSE42-NEXT:    movdqa %xmm3, %xmm1
-; SSE42-NEXT:    pmaxud %xmm4, %xmm1
-; SSE42-NEXT:    pcmpeqd %xmm3, %xmm1
-; SSE42-NEXT:    packssdw %xmm5, %xmm1
-; SSE42-NEXT:    movdqa %xmm2, %xmm3
+; SSE42-NEXT:    pcmpeqd %xmm2, %xmm5
+; SSE42-NEXT:    movdqa %xmm3, %xmm2
+; SSE42-NEXT:    pmaxud %xmm4, %xmm2
+; SSE42-NEXT:    pcmpeqd %xmm3, %xmm2
+; SSE42-NEXT:    packssdw %xmm5, %xmm2
+; SSE42-NEXT:    movdqa %xmm1, %xmm3
 ; SSE42-NEXT:    pmaxud %xmm4, %xmm3
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
+; SSE42-NEXT:    pcmpeqd %xmm1, %xmm3
 ; SSE42-NEXT:    pmaxud %xmm0, %xmm4
 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm4
 ; SSE42-NEXT:    packssdw %xmm3, %xmm4
-; SSE42-NEXT:    packsswb %xmm1, %xmm4
+; SSE42-NEXT:    packsswb %xmm2, %xmm4
 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm0
 ; SSE42-NEXT:    pxor %xmm4, %xmm0
 ; SSE42-NEXT:    retq
@@ -408,20 +408,9 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
 ; SSE2-NEXT:    por %xmm4, %xmm6
 ; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm3, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm4
-; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [24,25,26,27]
-; SSE2-NEXT:    paddd %xmm2, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm1, %xmm6
-; SSE2-NEXT:    movdqa %xmm0, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
-; SSE2-NEXT:    por %xmm5, %xmm7
-; SSE2-NEXT:    pxor %xmm1, %xmm7
 ; SSE2-NEXT:    movdqa %xmm3, %xmm5
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
-; SSE2-NEXT:    packssdw %xmm4, %xmm5
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [20,21,22,23]
+; SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
+; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [24,25,26,27]
 ; SSE2-NEXT:    paddd %xmm2, %xmm4
 ; SSE2-NEXT:    movdqa %xmm4, %xmm6
 ; SSE2-NEXT:    pxor %xmm1, %xmm6
@@ -431,6 +420,17 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE2-NEXT:    pxor %xmm1, %xmm7
 ; SSE2-NEXT:    movdqa %xmm3, %xmm4
 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm4
+; SSE2-NEXT:    packssdw %xmm5, %xmm4
+; SSE2-NEXT:    movdqa {{.*#+}} xmm5 = [20,21,22,23]
+; SSE2-NEXT:    paddd %xmm2, %xmm5
+; SSE2-NEXT:    movdqa %xmm5, %xmm6
+; SSE2-NEXT:    pxor %xmm1, %xmm6
+; SSE2-NEXT:    movdqa %xmm0, %xmm7
+; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
+; SSE2-NEXT:    por %xmm5, %xmm7
+; SSE2-NEXT:    pxor %xmm1, %xmm7
+; SSE2-NEXT:    movdqa %xmm3, %xmm5
+; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
 ; SSE2-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [16,17,18,19]
 ; SSE2-NEXT:    movdqa %xmm2, %xmm6
 ; SSE2-NEXT:    pxor %xmm1, %xmm6
@@ -438,8 +438,8 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE2-NEXT:    por %xmm2, %xmm0
 ; SSE2-NEXT:    pxor %xmm1, %xmm0
 ; SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
-; SSE2-NEXT:    packssdw %xmm4, %xmm3
-; SSE2-NEXT:    packsswb %xmm5, %xmm3
+; SSE2-NEXT:    packssdw %xmm5, %xmm3
+; SSE2-NEXT:    packsswb %xmm4, %xmm3
 ; SSE2-NEXT:    pmovmskb %xmm3, %edx
 ; SSE2-NEXT:    shll $16, %edx
 ; SSE2-NEXT:    orl %ecx, %edx
@@ -459,28 +459,28 @@ define <32 x i1> @lane_mask_v32i1_i32(i32 %index, i32 %TC) {
 ; SSE42-NEXT:    movdqa %xmm2, %xmm3
 ; SSE42-NEXT:    pmaxud %xmm0, %xmm3
 ; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
-; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967287,4294967286,4294967285,4294967284]
-; SSE42-NEXT:    pminud %xmm1, %xmm2
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [8,9,10,11]
-; SSE42-NEXT:    movdqa %xmm2, %xmm4
+; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [4294967287,4294967286,4294967285,4294967284]
+; SSE42-NEXT:    pminud %xmm1, %xmm4
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [8,9,10,11]
+; SSE42-NEXT:    movdqa %xmm4, %xmm2
+; SSE42-NEXT:    pmaxud %xmm0, %xmm2
+; SSE42-NEXT:    pcmpeqd %xmm4, %xmm2
+; SSE42-NEXT:    packssdw %xmm3, %xmm2
+; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [4294967291,4294967290,4294967289,4294967288]
+; SSE42-NEXT:    pminud %xmm1, %xmm3
+; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 # [4,5,6,7]
+; SSE42-NEXT:    movdqa %xmm3, %xmm4
 ; SSE42-NEXT:    pmaxud %xmm0, %xmm4
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm4
-; SSE42-NEXT:    packssdw %xmm3, %xmm4
-; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967291,4294967290,4294967289,4294967288]
-; SSE42-NEXT:    pminud %xmm1, %xmm2
-; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [4,5,6,7]
-; SSE42-NEXT:    movdqa %xmm2, %xmm3
-; SSE42-NEXT:    pmaxud %xmm0, %xmm3
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [4294967295,4294967294,4294967293,4294967292]
 ; SSE42-NEXT:    pminud %xmm1, %xmm5
 ; SSE42-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [0,1,2,3]
-; SSE42-NEXT:    pcmpeqd %xmm2, %xmm3
-; SSE42-NEXT:    movdqa %xmm5, %xmm2
-; SSE42-NEXT:    pmaxud %xmm0, %xmm2
-; SSE42-NEXT:    pcmpeqd %xmm5, %xmm2
-; SSE42-NEXT:    packssdw %xmm3, %xmm2
-; SSE42-NEXT:    packsswb %xmm4, %xmm2
-; SSE42-NEXT:    pmovmskb %xmm2, %ecx
+; SSE42-NEXT:    pcmpeqd %xmm3, %xmm4
+; SSE42-NEXT:    movdqa %xmm5, %xmm3
+; SSE42-NEXT:    pmaxud %xmm0, %xmm3
+; SSE42-NEXT:    pcmpeqd %xmm5, %xmm3
+; SSE42-NEXT:    packssdw %xmm4, %xmm3
+; SSE42-NEXT:    packsswb %xmm2, %xmm3
+; SSE42-NEXT:    pmovmskb %xmm3, %ecx
 ; SSE42-NEXT:    xorl $65535, %ecx # imm = 0xFFFF
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [4294967267,4294967266,4294967265,4294967264]
 ; SSE42-NEXT:    pminud %xmm1, %xmm2
@@ -1400,195 +1400,195 @@ define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
 ; SSE2-LABEL: lane_mask_v16i1_i64:
 ; SSE2:       # %bb.0:
 ; SSE2-NEXT:    movq %rdi, %xmm0
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm0[0,1,0,1]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm0[0,1,0,1]
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm6
+; SSE2-NEXT:    movdqa %xmm4, %xmm5
+; SSE2-NEXT:    pxor %xmm0, %xmm5
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
-; SSE2-NEXT:    paddq %xmm5, %xmm2
+; SSE2-NEXT:    paddq %xmm4, %xmm2
 ; SSE2-NEXT:    movdqa %xmm2, %xmm1
 ; SSE2-NEXT:    pxor %xmm0, %xmm1
-; SSE2-NEXT:    movdqa %xmm6, %xmm3
+; SSE2-NEXT:    movdqa %xmm5, %xmm3
 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm1
+; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3]
-; SSE2-NEXT:    pand %xmm4, %xmm7
+; SSE2-NEXT:    pand %xmm6, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
 ; SSE2-NEXT:    por %xmm2, %xmm1
 ; SSE2-NEXT:    por %xmm7, %xmm1
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2,3]
-; SSE2-NEXT:    paddq %xmm5, %xmm3
+; SSE2-NEXT:    paddq %xmm4, %xmm3
 ; SSE2-NEXT:    movdqa %xmm3, %xmm2
 ; SSE2-NEXT:    pxor %xmm0, %xmm2
-; SSE2-NEXT:    movdqa %xmm6, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm2
+; SSE2-NEXT:    movdqa %xmm5, %xmm6
+; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm2[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm7, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
 ; SSE2-NEXT:    por %xmm3, %xmm2
 ; SSE2-NEXT:    por %xmm8, %xmm2
-; SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [4,5]
-; SSE2-NEXT:    paddq %xmm5, %xmm4
-; SSE2-NEXT:    movdqa %xmm4, %xmm3
+; SSE2-NEXT:    movdqa {{.*#+}} xmm6 = [4,5]
+; SSE2-NEXT:    paddq %xmm4, %xmm6
+; SSE2-NEXT:    movdqa %xmm6, %xmm3
 ; SSE2-NEXT:    pxor %xmm0, %xmm3
-; SSE2-NEXT:    movdqa %xmm6, %xmm7
+; SSE2-NEXT:    movdqa %xmm5, %xmm7
 ; SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm3
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm8, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm3
+; SSE2-NEXT:    por %xmm6, %xmm3
 ; SSE2-NEXT:    por %xmm9, %xmm3
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm7 = [6,7]
-; SSE2-NEXT:    paddq %xmm5, %xmm7
-; SSE2-NEXT:    movdqa %xmm7, %xmm4
-; SSE2-NEXT:    pxor %xmm0, %xmm4
-; SSE2-NEXT:    movdqa %xmm6, %xmm8
-; SSE2-NEXT:    pcmpgtd %xmm4, %xmm8
+; SSE2-NEXT:    paddq %xmm4, %xmm7
+; SSE2-NEXT:    movdqa %xmm7, %xmm6
+; SSE2-NEXT:    pxor %xmm0, %xmm6
+; SSE2-NEXT:    movdqa %xmm5, %xmm8
+; SSE2-NEXT:    pcmpgtd %xmm6, %xmm8
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm8[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm4[1,1,3,3]
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm9, %xmm10
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm8[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm4
-; SSE2-NEXT:    por %xmm10, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm8[1,1,3,3]
+; SSE2-NEXT:    por %xmm7, %xmm6
+; SSE2-NEXT:    por %xmm10, %xmm6
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm8 = [8,9]
-; SSE2-NEXT:    paddq %xmm5, %xmm8
+; SSE2-NEXT:    paddq %xmm4, %xmm8
 ; SSE2-NEXT:    movdqa %xmm8, %xmm7
 ; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm6, %xmm9
+; SSE2-NEXT:    movdqa %xmm5, %xmm9
 ; SSE2-NEXT:    pcmpgtd %xmm7, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm9[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm7
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm7[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm10, %xmm11
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm9[1,1,3,3]
 ; SSE2-NEXT:    por %xmm8, %xmm7
 ; SSE2-NEXT:    por %xmm11, %xmm7
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm9 = [10,11]
-; SSE2-NEXT:    paddq %xmm5, %xmm9
+; SSE2-NEXT:    paddq %xmm4, %xmm9
 ; SSE2-NEXT:    movdqa %xmm9, %xmm8
 ; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm6, %xmm10
+; SSE2-NEXT:    movdqa %xmm5, %xmm10
 ; SSE2-NEXT:    pcmpgtd %xmm8, %xmm10
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm8
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm8
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm8[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm11, %xmm12
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm10[1,1,3,3]
 ; SSE2-NEXT:    por %xmm9, %xmm8
 ; SSE2-NEXT:    por %xmm12, %xmm8
 ; SSE2-NEXT:    movdqa {{.*#+}} xmm10 = [12,13]
-; SSE2-NEXT:    paddq %xmm5, %xmm10
+; SSE2-NEXT:    paddq %xmm4, %xmm10
 ; SSE2-NEXT:    movdqa %xmm10, %xmm9
 ; SSE2-NEXT:    pxor %xmm0, %xmm9
-; SSE2-NEXT:    movdqa %xmm6, %xmm11
+; SSE2-NEXT:    movdqa %xmm5, %xmm11
 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm11
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm9
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm13 = xmm9[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm12, %xmm13
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm11[1,1,3,3]
 ; SSE2-NEXT:    por %xmm10, %xmm9
 ; SSE2-NEXT:    por %xmm13, %xmm9
-; SSE2-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 # [14,15]
-; SSE2-NEXT:    movdqa %xmm5, %xmm10
+; SSE2-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm4 # [14,15]
+; SSE2-NEXT:    movdqa %xmm4, %xmm10
 ; SSE2-NEXT:    pxor %xmm0, %xmm10
-; SSE2-NEXT:    movdqa %xmm6, %xmm11
+; SSE2-NEXT:    movdqa %xmm5, %xmm11
 ; SSE2-NEXT:    pcmpgtd %xmm10, %xmm11
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm11[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm6, %xmm10
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm10[1,1,3,3]
-; SSE2-NEXT:    pand %xmm12, %xmm6
+; SSE2-NEXT:    pcmpeqd %xmm5, %xmm10
+; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm10[1,1,3,3]
+; SSE2-NEXT:    pand %xmm12, %xmm5
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm11[1,1,3,3]
+; SSE2-NEXT:    por %xmm4, %xmm10
 ; SSE2-NEXT:    por %xmm5, %xmm10
-; SSE2-NEXT:    por %xmm6, %xmm10
-; SSE2-NEXT:    movq %rsi, %xmm5
-; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,1,0,1]
+; SSE2-NEXT:    movq %rsi, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
 ; SSE2-NEXT:    pxor %xmm0, %xmm10
-; SSE2-NEXT:    pxor %xmm0, %xmm5
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm10, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm10
+; SSE2-NEXT:    pxor %xmm0, %xmm4
+; SSE2-NEXT:    movdqa %xmm4, %xmm5
+; SSE2-NEXT:    pcmpgtd %xmm10, %xmm5
+; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm5[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm10
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm10[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm11, %xmm10
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm10, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
+; SSE2-NEXT:    por %xmm10, %xmm5
 ; SSE2-NEXT:    pxor %xmm0, %xmm9
-; SSE2-NEXT:    movdqa %xmm5, %xmm10
+; SSE2-NEXT:    movdqa %xmm4, %xmm10
 ; SSE2-NEXT:    pcmpgtd %xmm9, %xmm10
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm11 = xmm10[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm9
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm9
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm12 = xmm9[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm11, %xmm12
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm10[1,1,3,3]
 ; SSE2-NEXT:    por %xmm12, %xmm9
-; SSE2-NEXT:    packssdw %xmm6, %xmm9
+; SSE2-NEXT:    packssdw %xmm5, %xmm9
 ; SSE2-NEXT:    pxor %xmm0, %xmm8
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm8, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm8
+; SSE2-NEXT:    movdqa %xmm4, %xmm5
+; SSE2-NEXT:    pcmpgtd %xmm8, %xmm5
+; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm8
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm8[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm10, %xmm8
-; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm10 = xmm5[1,1,3,3]
 ; SSE2-NEXT:    por %xmm8, %xmm10
 ; SSE2-NEXT:    pxor %xmm0, %xmm7
-; SSE2-NEXT:    movdqa %xmm5, %xmm6
-; SSE2-NEXT:    pcmpgtd %xmm7, %xmm6
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm7
+; SSE2-NEXT:    movdqa %xmm4, %xmm5
+; SSE2-NEXT:    pcmpgtd %xmm7, %xmm5
+; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm5[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm8, %xmm7
-; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; SSE2-NEXT:    por %xmm7, %xmm6
-; SSE2-NEXT:    packssdw %xmm10, %xmm6
-; SSE2-NEXT:    packssdw %xmm9, %xmm6
-; SSE2-NEXT:    pxor %xmm0, %xmm4
-; SSE2-NEXT:    movdqa %xmm5, %xmm7
-; SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
+; SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
+; SSE2-NEXT:    por %xmm7, %xmm5
+; SSE2-NEXT:    packssdw %xmm10, %xmm5
+; SSE2-NEXT:    packssdw %xmm9, %xmm5
+; SSE2-NEXT:    pxor %xmm0, %xmm6
+; SSE2-NEXT:    movdqa %xmm4, %xmm7
+; SSE2-NEXT:    pcmpgtd %xmm6, %xmm7
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    pand %xmm8, %xmm4
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
+; SSE2-NEXT:    pand %xmm8, %xmm6
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
-; SSE2-NEXT:    por %xmm4, %xmm7
+; SSE2-NEXT:    por %xmm6, %xmm7
 ; SSE2-NEXT:    pxor %xmm0, %xmm3
-; SSE2-NEXT:    movdqa %xmm5, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm3
+; SSE2-NEXT:    movdqa %xmm4, %xmm6
+; SSE2-NEXT:    pcmpgtd %xmm3, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm6[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm3
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm9 = xmm3[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm8, %xmm9
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
 ; SSE2-NEXT:    por %xmm9, %xmm3
 ; SSE2-NEXT:    packssdw %xmm7, %xmm3
 ; SSE2-NEXT:    pxor %xmm0, %xmm2
-; SSE2-NEXT:    movdqa %xmm5, %xmm4
-; SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm4[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm2
+; SSE2-NEXT:    movdqa %xmm4, %xmm6
+; SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
+; SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm2
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm7, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; SSE2-NEXT:    por %xmm2, %xmm4
+; SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
+; SSE2-NEXT:    por %xmm2, %xmm6
 ; SSE2-NEXT:    pxor %xmm0, %xmm1
-; SSE2-NEXT:    movdqa %xmm5, %xmm0
+; SSE2-NEXT:    movdqa %xmm4, %xmm0
 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
-; SSE2-NEXT:    pcmpeqd %xmm5, %xmm1
+; SSE2-NEXT:    pcmpeqd %xmm4, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
 ; SSE2-NEXT:    pand %xmm2, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
 ; SSE2-NEXT:    por %xmm1, %xmm0
-; SSE2-NEXT:    packssdw %xmm4, %xmm0
+; SSE2-NEXT:    packssdw %xmm6, %xmm0
 ; SSE2-NEXT:    packssdw %xmm3, %xmm0
-; SSE2-NEXT:    packsswb %xmm6, %xmm0
+; SSE2-NEXT:    packsswb %xmm5, %xmm0
 ; SSE2-NEXT:    retq
 ;
 ; SSE42-LABEL: lane_mask_v16i1_i64:
@@ -1596,72 +1596,72 @@ define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    movq %rdi, %xmm0
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; SSE42-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NEXT:    pxor %xmm1, %xmm5
+; SSE42-NEXT:    movdqa %xmm0, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm4
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0]
 ; SSE42-NEXT:    paddq %xmm0, %xmm3
-; SSE42-NEXT:    movdqa %xmm3, %xmm4
-; SSE42-NEXT:    pxor %xmm1, %xmm4
-; SSE42-NEXT:    movdqa %xmm5, %xmm2
-; SSE42-NEXT:    pcmpgtq %xmm4, %xmm2
+; SSE42-NEXT:    movdqa %xmm3, %xmm5
+; SSE42-NEXT:    pxor %xmm1, %xmm5
+; SSE42-NEXT:    movdqa %xmm4, %xmm2
+; SSE42-NEXT:    pcmpgtq %xmm5, %xmm2
 ; SSE42-NEXT:    por %xmm3, %xmm2
-; SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [2,3]
-; SSE42-NEXT:    paddq %xmm0, %xmm4
-; SSE42-NEXT:    movdqa %xmm4, %xmm6
+; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [2,3]
+; SSE42-NEXT:    paddq %xmm0, %xmm5
+; SSE42-NEXT:    movdqa %xmm5, %xmm6
 ; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm5, %xmm3
+; SSE42-NEXT:    movdqa %xmm4, %xmm3
 ; SSE42-NEXT:    pcmpgtq %xmm6, %xmm3
-; SSE42-NEXT:    por %xmm4, %xmm3
+; SSE42-NEXT:    por %xmm5, %xmm3
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [4,5]
 ; SSE42-NEXT:    paddq %xmm0, %xmm6
 ; SSE42-NEXT:    movdqa %xmm6, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm5, %xmm4
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm4
-; SSE42-NEXT:    por %xmm6, %xmm4
+; SSE42-NEXT:    movdqa %xmm4, %xmm5
+; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
+; SSE42-NEXT:    por %xmm6, %xmm5
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm7 = [6,7]
 ; SSE42-NEXT:    paddq %xmm0, %xmm7
 ; SSE42-NEXT:    movdqa %xmm7, %xmm8
 ; SSE42-NEXT:    pxor %xmm1, %xmm8
-; SSE42-NEXT:    movdqa %xmm5, %xmm6
+; SSE42-NEXT:    movdqa %xmm4, %xmm6
 ; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
 ; SSE42-NEXT:    por %xmm7, %xmm6
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm8 = [8,9]
 ; SSE42-NEXT:    paddq %xmm0, %xmm8
 ; SSE42-NEXT:    movdqa %xmm8, %xmm9
 ; SSE42-NEXT:    pxor %xmm1, %xmm9
-; SSE42-NEXT:    movdqa %xmm5, %xmm7
+; SSE42-NEXT:    movdqa %xmm4, %xmm7
 ; SSE42-NEXT:    pcmpgtq %xmm9, %xmm7
 ; SSE42-NEXT:    por %xmm8, %xmm7
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [10,11]
 ; SSE42-NEXT:    paddq %xmm0, %xmm9
 ; SSE42-NEXT:    movdqa %xmm9, %xmm10
 ; SSE42-NEXT:    pxor %xmm1, %xmm10
-; SSE42-NEXT:    movdqa %xmm5, %xmm8
+; SSE42-NEXT:    movdqa %xmm4, %xmm8
 ; SSE42-NEXT:    pcmpgtq %xmm10, %xmm8
 ; SSE42-NEXT:    por %xmm9, %xmm8
 ; SSE42-NEXT:    movdqa {{.*#+}} xmm9 = [12,13]
 ; SSE42-NEXT:    paddq %xmm0, %xmm9
 ; SSE42-NEXT:    movdqa %xmm9, %xmm10
 ; SSE42-NEXT:    pxor %xmm1, %xmm10
-; SSE42-NEXT:    movdqa %xmm5, %xmm11
+; SSE42-NEXT:    movdqa %xmm4, %xmm11
 ; SSE42-NEXT:    pcmpgtq %xmm10, %xmm11
 ; SSE42-NEXT:    por %xmm9, %xmm11
 ; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [14,15]
 ; SSE42-NEXT:    movdqa %xmm0, %xmm9
 ; SSE42-NEXT:    pxor %xmm1, %xmm9
-; SSE42-NEXT:    pcmpgtq %xmm9, %xmm5
-; SSE42-NEXT:    por %xmm0, %xmm5
+; SSE42-NEXT:    pcmpgtq %xmm9, %xmm4
+; SSE42-NEXT:    por %xmm0, %xmm4
 ; SSE42-NEXT:    movq %rsi, %xmm0
 ; SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
-; SSE42-NEXT:    pxor %xmm1, %xmm5
+; SSE42-NEXT:    pxor %xmm1, %xmm4
 ; SSE42-NEXT:    pxor %xmm1, %xmm0
 ; SSE42-NEXT:    movdqa %xmm0, %xmm9
-; SSE42-NEXT:    pcmpgtq %xmm5, %xmm9
+; SSE42-NEXT:    pcmpgtq %xmm4, %xmm9
 ; SSE42-NEXT:    pxor %xmm1, %xmm11
-; SSE42-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm11, %xmm5
-; SSE42-NEXT:    packssdw %xmm9, %xmm5
+; SSE42-NEXT:    movdqa %xmm0, %xmm4
+; SSE42-NEXT:    pcmpgtq %xmm11, %xmm4
+; SSE42-NEXT:    packssdw %xmm9, %xmm4
 ; SSE42-NEXT:    pxor %xmm1, %xmm8
 ; SSE42-NEXT:    movdqa %xmm0, %xmm9
 ; SSE42-NEXT:    pcmpgtq %xmm8, %xmm9
@@ -1669,14 +1669,14 @@ define <16 x i1> @lane_mask_v16i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    movdqa %xmm0, %xmm8
 ; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
 ; SSE42-NEXT:    packssdw %xmm9, %xmm8
-; SSE42-NEXT:    packssdw %xmm5, %xmm8
+; SSE42-NEXT:    packssdw %xmm4, %xmm8
 ; SSE42-NEXT:    pxor %xmm1, %xmm6
-; SSE42-NEXT:    movdqa %xmm0, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm6, %xmm5
-; SSE42-NEXT:    pxor %xmm1, %xmm4
+; SSE42-NEXT:    movdqa %xmm0, %xmm4
+; SSE42-NEXT:    pcmpgtq %xmm6, %xmm4
+; SSE42-NEXT:    pxor %xmm1, %xmm5
 ; SSE42-NEXT:    movdqa %xmm0, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm4, %xmm6
-; SSE42-NEXT:    packssdw %xmm5, %xmm6
+; SSE42-NEXT:    pcmpgtq %xmm5, %xmm6
+; SSE42-NEXT:    packssdw %xmm4, %xmm6
 ; SSE42-NEXT:    pxor %xmm1, %xmm3
 ; SSE42-NEXT:    movdqa %xmm0, %xmm4
 ; SSE42-NEXT:    pcmpgtq %xmm3, %xmm4
@@ -2282,20 +2282,9 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    pcmpgtq %xmm6, %xmm7
 ; SSE42-NEXT:    por %xmm5, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm3, %xmm5
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm5
-; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [20,21]
-; SSE42-NEXT:    paddq %xmm2, %xmm6
-; SSE42-NEXT:    movdqa %xmm6, %xmm7
-; SSE42-NEXT:    pxor %xmm1, %xmm7
-; SSE42-NEXT:    movdqa %xmm0, %xmm8
-; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
-; SSE42-NEXT:    por %xmm6, %xmm8
-; SSE42-NEXT:    pxor %xmm1, %xmm8
 ; SSE42-NEXT:    movdqa %xmm3, %xmm6
-; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
-; SSE42-NEXT:    packssdw %xmm5, %xmm6
-; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [18,19]
+; SSE42-NEXT:    pcmpgtq %xmm7, %xmm6
+; SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [20,21]
 ; SSE42-NEXT:    paddq %xmm2, %xmm5
 ; SSE42-NEXT:    movdqa %xmm5, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
@@ -2305,6 +2294,17 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    pxor %xmm1, %xmm8
 ; SSE42-NEXT:    movdqa %xmm3, %xmm5
 ; SSE42-NEXT:    pcmpgtq %xmm8, %xmm5
+; SSE42-NEXT:    packssdw %xmm6, %xmm5
+; SSE42-NEXT:    movdqa {{.*#+}} xmm6 = [18,19]
+; SSE42-NEXT:    paddq %xmm2, %xmm6
+; SSE42-NEXT:    movdqa %xmm6, %xmm7
+; SSE42-NEXT:    pxor %xmm1, %xmm7
+; SSE42-NEXT:    movdqa %xmm0, %xmm8
+; SSE42-NEXT:    pcmpgtq %xmm7, %xmm8
+; SSE42-NEXT:    por %xmm6, %xmm8
+; SSE42-NEXT:    pxor %xmm1, %xmm8
+; SSE42-NEXT:    movdqa %xmm3, %xmm6
+; SSE42-NEXT:    pcmpgtq %xmm8, %xmm6
 ; SSE42-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2 # [16,17]
 ; SSE42-NEXT:    movdqa %xmm2, %xmm7
 ; SSE42-NEXT:    pxor %xmm1, %xmm7
@@ -2312,8 +2312,8 @@ define <32 x i1> @lane_mask_v32i1_i64(i64 %index, i64 %TC) {
 ; SSE42-NEXT:    por %xmm2, %xmm0
 ; SSE42-NEXT:    pxor %xmm1, %xmm0
 ; SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
-; SSE42-NEXT:    packssdw %xmm5, %xmm3
 ; SSE42-NEXT:    packssdw %xmm6, %xmm3
+; SSE42-NEXT:    packssdw %xmm5, %xmm3
 ; SSE42-NEXT:    packsswb %xmm4, %xmm3
 ; SSE42-NEXT:    pmovmskb %xmm3, %edx
 ; SSE42-NEXT:    shll $16, %edx



More information about the llvm-commits mailing list