[llvm] [WIP][X86] Replace custom minmax reduction pattern matching with ISD::VEC_REDUCE_*MIN/MAX support (PR #194473)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Mon May 4 09:08:26 PDT 2026


https://github.com/RKSimon updated https://github.com/llvm/llvm-project/pull/194473

>From ff693896f9f624e6a9cb982125972ef5564b8264 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Mon, 27 Apr 2026 23:10:12 +0100
Subject: [PATCH] [WIP][X86] Replace custom minmax reduction pattern matching
 with ISD::VEC_REDUCE_*MIN/MAX support

Support middle-end reduction integer min/max patterns instead of relying on the ExpandReductions pass and then matching the expanded pattern in DAG

There's still a number of things that need addressing including:
 - Move the horizontal-reduce-* test coverage to VectorCombine
 - Ensure VectorCombine correctly handles partial reduction patterns
 - Better legalisation/expansion of small sub-legal vector types (especially where there is legal vector MIN/MAX ops)

Once this is in place we can continue with other VECREDUCE_ opcodes
---
 llvm/lib/Target/X86/X86ISelLowering.cpp       |   45 -
 .../lib/Target/X86/X86TargetTransformInfo.cpp |   12 +
 llvm/lib/Target/X86/X86TargetTransformInfo.h  |    2 +
 .../X86/avx512-intrinsics-fast-isel.ll        |  184 +-
 llvm/test/CodeGen/X86/combine-reductions.ll   |   16 +-
 .../CodeGen/X86/horizontal-reduce-smax.ll     |  936 +++---
 .../CodeGen/X86/horizontal-reduce-smin.ll     |  934 +++---
 .../CodeGen/X86/horizontal-reduce-umax.ll     | 1379 +++++----
 .../CodeGen/X86/horizontal-reduce-umin.ll     |  982 ++++--
 llvm/test/CodeGen/X86/vector-reduce-smax.ll   | 2648 +++++++++++-----
 llvm/test/CodeGen/X86/vector-reduce-smin.ll   | 2657 +++++++++++------
 llvm/test/CodeGen/X86/vector-reduce-umax.ll   | 2043 +++++++------
 llvm/test/CodeGen/X86/vector-reduce-umin.ll   | 2315 ++++++++------
 .../X86/vector-reductions-expanded.ll         |   16 +-
 14 files changed, 8863 insertions(+), 5306 deletions(-)

diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 5a1171b2b4ee6..8d0e68a33fbdc 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -47095,46 +47095,6 @@ static SDValue createPSADBW(SelectionDAG &DAG, SDValue N0, SDValue N1,
                           PSADBWBuilder);
 }
 
-// Attempt to replace an integer min/max horizontal reduction with
-// ISD::VECREDUCE_SMIN/SMAX/UMIN/UMAX.
-static SDValue combineMinMaxReduction(SDNode *Extract, SelectionDAG &DAG,
-                                      const X86Subtarget &Subtarget) {
-  EVT ExtractVT = Extract->getValueType(0);
-  if (!DAG.getTargetLoweringInfo().isTypeLegal(ExtractVT))
-    return SDValue();
-
-  // Check for SMAX/SMIN/UMAX/UMIN horizontal reduction patterns.
-  ISD::NodeType BinOp;
-  SDValue Src = DAG.matchBinOpReduction(
-      Extract, BinOp, {ISD::SMAX, ISD::SMIN, ISD::UMAX, ISD::UMIN}, true);
-  if (!Src)
-    return SDValue();
-
-  EVT SrcVT = Src.getValueType();
-  if ((SrcVT.getSizeInBits() % 128) != 0)
-    return SDValue();
-
-  ISD::NodeType RdxOp;
-  switch (BinOp) {
-  case ISD::SMAX:
-    RdxOp = ISD::VECREDUCE_SMAX;
-    break;
-  case ISD::SMIN:
-    RdxOp = ISD::VECREDUCE_SMIN;
-    break;
-  case ISD::UMAX:
-    RdxOp = ISD::VECREDUCE_UMAX;
-    break;
-  case ISD::UMIN:
-    RdxOp = ISD::VECREDUCE_UMIN;
-    break;
-  default:
-    llvm_unreachable("Unexpected reduction");
-  }
-
-  return DAG.getNode(RdxOp, SDLoc(Extract), ExtractVT, Src);
-}
-
 // Attempt to replace an all_of/any_of/parity style horizontal reduction with a MOVMSK.
 static SDValue combinePredicateReduction(SDNode *Extract, SelectionDAG &DAG,
                                          const X86Subtarget &Subtarget) {
@@ -48087,11 +48047,6 @@ static SDValue combineExtractVectorElt(SDNode *N, SelectionDAG &DAG,
   if (SDValue Cmp = combinePredicateReduction(N, DAG, Subtarget))
     return Cmp;
 
-  // Attempt to replace min/max v8i16/v16i8 reductions with ISD::VECREDUCE.
-  if (DCI.isBeforeLegalizeOps())
-    if (SDValue MinMax = combineMinMaxReduction(N, DAG, Subtarget))
-      return MinMax;
-
   // Attempt to optimize ADD/FADD/MUL reductions with HADD, promotion etc..
   if (SDValue V = combineArithReduction(N, DAG, Subtarget))
     return V;
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
index 1bc0ff397e476..1bd044d0b2b9a 100644
--- a/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
+++ b/llvm/lib/Target/X86/X86TargetTransformInfo.cpp
@@ -6686,6 +6686,18 @@ bool X86TTIImpl::enableInterleavedAccessVectorization() const {
   return !(ST->isAtom());
 }
 
+bool X86TTIImpl::shouldExpandReduction(const IntrinsicInst *II) const {
+  switch (II->getIntrinsicID()) {
+  default:
+    return true;
+  case Intrinsic::vector_reduce_smax:
+  case Intrinsic::vector_reduce_smin:
+  case Intrinsic::vector_reduce_umax:
+  case Intrinsic::vector_reduce_umin:
+    return false;
+  }
+}
+
 // Get estimation for interleaved load/store operations and strided load.
 // \p Indices contains indices for strided load.
 // \p Factor - the factor of interleaving.
diff --git a/llvm/lib/Target/X86/X86TargetTransformInfo.h b/llvm/lib/Target/X86/X86TargetTransformInfo.h
index ee1afdd8aaea9..c1054a98e7c98 100644
--- a/llvm/lib/Target/X86/X86TargetTransformInfo.h
+++ b/llvm/lib/Target/X86/X86TargetTransformInfo.h
@@ -324,6 +324,8 @@ class X86TTIImpl final : public BasicTTIImplBase<X86TTIImpl> {
   bool supportsEfficientVectorElementLoadStore() const override;
   bool enableInterleavedAccessVectorization() const override;
 
+  bool shouldExpandReduction(const IntrinsicInst *II) const override;
+
   InstructionCost getBranchMispredictPenalty() const override;
 
   bool isProfitableToSinkOperands(Instruction *I,
diff --git a/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll b/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll
index 25632378cf23c..ddd65c9a12784 100644
--- a/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll
+++ b/llvm/test/CodeGen/X86/avx512-intrinsics-fast-isel.ll
@@ -7490,14 +7490,29 @@ entry:
 define i64 @test_mm512_reduce_max_epi64(<8 x i64> %__W) {
 ; X86-LABEL: test_mm512_reduce_max_epi64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
 ; X86-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    cmpl %esi, %eax
+; X86-NEXT:    movl %edx, %edi
+; X86-NEXT:    sbbl %ecx, %edi
+; X86-NEXT:    cmovll %esi, %eax
+; X86-NEXT:    cmovll %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
@@ -7520,14 +7535,29 @@ entry:
 define i64 @test_mm512_reduce_max_epu64(<8 x i64> %__W) {
 ; X86-LABEL: test_mm512_reduce_max_epu64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
 ; X86-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    cmpl %esi, %eax
+; X86-NEXT:    movl %edx, %edi
+; X86-NEXT:    sbbl %ecx, %edi
+; X86-NEXT:    cmovbl %esi, %eax
+; X86-NEXT:    cmovbl %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
@@ -7589,14 +7619,29 @@ entry:
 define i64 @test_mm512_reduce_min_epi64(<8 x i64> %__W) {
 ; X86-LABEL: test_mm512_reduce_min_epi64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
 ; X86-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    cmpl %eax, %esi
+; X86-NEXT:    movl %ecx, %edi
+; X86-NEXT:    sbbl %edx, %edi
+; X86-NEXT:    cmovll %esi, %eax
+; X86-NEXT:    cmovll %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
@@ -7619,14 +7664,29 @@ entry:
 define i64 @test_mm512_reduce_min_epu64(<8 x i64> %__W) {
 ; X86-LABEL: test_mm512_reduce_min_epu64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
 ; X86-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    cmpl %eax, %esi
+; X86-NEXT:    movl %ecx, %edi
+; X86-NEXT:    sbbl %edx, %edi
+; X86-NEXT:    cmovbl %esi, %eax
+; X86-NEXT:    cmovbl %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
@@ -7688,6 +7748,12 @@ entry:
 define i64 @test_mm512_mask_reduce_max_epi64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-LABEL: test_mm512_mask_reduce_max_epi64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
 ; X86-NEXT:    kmovw %eax, %k1
 ; X86-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648,0,2147483648,0,2147483648,0,2147483648,0,2147483648]
@@ -7696,10 +7762,19 @@ define i64 @test_mm512_mask_reduce_max_epi64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-NEXT:    vpmaxsq %zmm0, %zmm1, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    cmpl %esi, %eax
+; X86-NEXT:    movl %edx, %edi
+; X86-NEXT:    sbbl %ecx, %edi
+; X86-NEXT:    cmovll %esi, %eax
+; X86-NEXT:    cmovll %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
@@ -7727,6 +7802,12 @@ entry:
 define i64 @test_mm512_mask_reduce_max_epu64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-LABEL: test_mm512_mask_reduce_max_epu64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
 ; X86-NEXT:    kmovw %eax, %k1
 ; X86-NEXT:    vmovdqa64 %zmm0, %zmm0 {%k1} {z}
@@ -7734,10 +7815,19 @@ define i64 @test_mm512_mask_reduce_max_epu64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    cmpl %esi, %eax
+; X86-NEXT:    movl %edx, %edi
+; X86-NEXT:    sbbl %ecx, %edi
+; X86-NEXT:    cmovbl %esi, %eax
+; X86-NEXT:    cmovbl %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
@@ -7812,6 +7902,12 @@ entry:
 define i64 @test_mm512_mask_reduce_min_epi64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-LABEL: test_mm512_mask_reduce_min_epi64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
 ; X86-NEXT:    kmovw %eax, %k1
 ; X86-NEXT:    vpbroadcastq {{.*#+}} zmm1 = [4294967295,2147483647,4294967295,2147483647,4294967295,2147483647,4294967295,2147483647,4294967295,2147483647,4294967295,2147483647,4294967295,2147483647,4294967295,2147483647]
@@ -7820,10 +7916,19 @@ define i64 @test_mm512_mask_reduce_min_epi64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-NEXT:    vpminsq %zmm0, %zmm1, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    cmpl %eax, %esi
+; X86-NEXT:    movl %ecx, %edi
+; X86-NEXT:    sbbl %edx, %edi
+; X86-NEXT:    cmovll %esi, %eax
+; X86-NEXT:    cmovll %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
@@ -7851,6 +7956,12 @@ entry:
 define i64 @test_mm512_mask_reduce_min_epu64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-LABEL: test_mm512_mask_reduce_min_epu64:
 ; X86:       # %bb.0: # %entry
+; X86-NEXT:    pushl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    pushl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 12
+; X86-NEXT:    .cfi_offset %esi, -12
+; X86-NEXT:    .cfi_offset %edi, -8
 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
 ; X86-NEXT:    kmovw %eax, %k1
 ; X86-NEXT:    vpternlogd {{.*#+}} zmm1 = -1
@@ -7859,10 +7970,19 @@ define i64 @test_mm512_mask_reduce_min_epu64(i8 zeroext %__M, <8 x i64> %__W) {
 ; X86-NEXT:    vpminuq %zmm0, %zmm1, %zmm0
 ; X86-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
-; X86-NEXT:    vmovd %xmm0, %eax
-; X86-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-NEXT:    vmovd %xmm0, %esi
+; X86-NEXT:    cmpl %eax, %esi
+; X86-NEXT:    movl %ecx, %edi
+; X86-NEXT:    sbbl %edx, %edi
+; X86-NEXT:    cmovbl %esi, %eax
+; X86-NEXT:    cmovbl %ecx, %edx
+; X86-NEXT:    popl %esi
+; X86-NEXT:    .cfi_def_cfa_offset 8
+; X86-NEXT:    popl %edi
+; X86-NEXT:    .cfi_def_cfa_offset 4
 ; X86-NEXT:    vzeroupper
 ; X86-NEXT:    retl
 ;
diff --git a/llvm/test/CodeGen/X86/combine-reductions.ll b/llvm/test/CodeGen/X86/combine-reductions.ll
index 2106dae8fd769..844cd13e71d49 100644
--- a/llvm/test/CodeGen/X86/combine-reductions.ll
+++ b/llvm/test/CodeGen/X86/combine-reductions.ll
@@ -9,16 +9,9 @@ define { i16, i16 } @test_reduce_v16i16_with_umin(<16 x i16> %x, <16 x i16> %y)
 ; SSE41:       # %bb.0:
 ; SSE41-NEXT:    movdqa %xmm0, %xmm4
 ; SSE41-NEXT:    pminuw %xmm1, %xmm4
-; SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[2,3,2,3]
-; SSE41-NEXT:    pminuw %xmm4, %xmm5
-; SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[1,1,1,1]
-; SSE41-NEXT:    pminuw %xmm5, %xmm6
-; SSE41-NEXT:    movdqa %xmm6, %xmm5
-; SSE41-NEXT:    psrld $16, %xmm5
-; SSE41-NEXT:    pminuw %xmm6, %xmm5
 ; SSE41-NEXT:    phminposuw %xmm4, %xmm4
 ; SSE41-NEXT:    movd %xmm4, %eax
-; SSE41-NEXT:    pshuflw {{.*#+}} xmm4 = xmm5[0,0,0,0,4,5,6,7]
+; SSE41-NEXT:    pshuflw {{.*#+}} xmm4 = xmm4[0,0,0,0,4,5,6,7]
 ; SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1]
 ; SSE41-NEXT:    pcmpeqw %xmm4, %xmm1
 ; SSE41-NEXT:    pcmpeqd %xmm5, %xmm5
@@ -38,14 +31,9 @@ define { i16, i16 } @test_reduce_v16i16_with_umin(<16 x i16> %x, <16 x i16> %y)
 ; AVX2:       # %bb.0:
 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm2
 ; AVX2-NEXT:    vpminuw %xmm2, %xmm0, %xmm2
-; AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm2[2,3,2,3]
-; AVX2-NEXT:    vpminuw %xmm3, %xmm2, %xmm3
-; AVX2-NEXT:    vpshufd {{.*#+}} xmm4 = xmm3[1,1,1,1]
-; AVX2-NEXT:    vpminuw %xmm4, %xmm3, %xmm3
-; AVX2-NEXT:    vpsrld $16, %xmm3, %xmm4
 ; AVX2-NEXT:    vphminposuw %xmm2, %xmm2
 ; AVX2-NEXT:    vmovd %xmm2, %eax
-; AVX2-NEXT:    vpminuw %xmm4, %xmm3, %xmm2
+; AVX2-NEXT:    vmovd %eax, %xmm2
 ; AVX2-NEXT:    vpbroadcastw %xmm2, %ymm2
 ; AVX2-NEXT:    vpcmpeqw %ymm2, %ymm0, %ymm0
 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm2, %ymm2
diff --git a/llvm/test/CodeGen/X86/horizontal-reduce-smax.ll b/llvm/test/CodeGen/X86/horizontal-reduce-smax.ll
index ebb5bc9069890..384ffddba0866 100644
--- a/llvm/test/CodeGen/X86/horizontal-reduce-smax.ll
+++ b/llvm/test/CodeGen/X86/horizontal-reduce-smax.ll
@@ -58,11 +58,23 @@ define i64 @test_reduce_v2i64(<2 x i64> %a0) {
 ;
 ; X64-SSE2-LABEL: test_reduce_v2i64:
 ; X64-SSE2:       ## %bb.0:
-; X64-SSE2-NEXT:    movq %xmm0, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovgq %rcx, %rax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v2i64:
@@ -104,11 +116,13 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
 ; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovgl %ecx, %eax
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm2, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v4i32:
@@ -137,11 +151,13 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
 ; X64-SSE2-NEXT:    por %xmm0, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %ecx
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovgl %ecx, %eax
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i32:
@@ -187,19 +203,26 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    retl
 ;
@@ -218,30 +241,28 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v8i16:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
-; X64-AVX1OR2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp sgt <8 x i16> %a0, %1
   %3  = select <8 x i1> %2, <8 x i16> %a0, <8 x i16> %1
@@ -290,24 +311,31 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorb $127, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorb $127, %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    retl
 ;
@@ -345,37 +373,33 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorb $127, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v16i8:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1OR2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorb $127, %al
-; X64-AVX1OR2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorb $127, %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <16 x i8> %a0, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp sgt <16 x i8> %a0, %1
   %3  = select <16 x i1> %2, <16 x i8> %a0, <16 x i8> %1
@@ -479,23 +503,35 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm4
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm5
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm2, %xmm3
-; X64-SSE2-NEXT:    pand %xmm3, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X64-SSE2-NEXT:    por %xmm0, %xmm3
-; X64-SSE2-NEXT:    movq %xmm3, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovgq %rcx, %rax
+; X64-SSE2-NEXT:    pand %xmm6, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm3, %xmm4
+; X64-SSE2-NEXT:    pand %xmm4, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
+; X64-SSE2-NEXT:    por %xmm0, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm4, %xmm2
+; X64-SSE2-NEXT:    movq %xmm2, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i64:
@@ -567,11 +603,13 @@ define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X86-SSE2-NEXT:    pand %xmm1, %xmm2
 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
 ; X86-SSE2-NEXT:    por %xmm2, %xmm1
-; X86-SSE2-NEXT:    movd %xmm1, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovgl %ecx, %eax
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i32:
@@ -621,11 +659,13 @@ define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm1, %xmm2
 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
 ; X64-SSE2-NEXT:    por %xmm2, %xmm1
-; X64-SSE2-NEXT:    movd %xmm1, %ecx
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovgl %ecx, %eax
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    movd %xmm2, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i32:
@@ -704,10 +744,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v16i16:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -715,10 +759,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -727,10 +774,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -752,10 +802,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v16i16:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -763,10 +817,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -775,10 +832,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -787,10 +847,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -851,13 +914,17 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v32i8:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorb $127, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -865,12 +932,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorb $127, %al
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -879,12 +949,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    xorb $127, %al
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -929,13 +1002,17 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v32i8:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorb $127, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -943,12 +1020,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    xorb $127, %al
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -957,12 +1037,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    xorb $127, %al
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -971,12 +1054,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorb $127, %al
 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1128,9 +1214,9 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-LABEL: test_reduce_v8i64:
 ; X64-SSE2:       ## %bb.0:
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
-; X64-SSE2-NEXT:    movdqa %xmm3, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm5
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm6
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
@@ -1140,43 +1226,55 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm8, %xmm6
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
 ; X64-SSE2-NEXT:    por %xmm6, %xmm5
-; X64-SSE2-NEXT:    pand %xmm5, %xmm1
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm5
-; X64-SSE2-NEXT:    por %xmm1, %xmm5
+; X64-SSE2-NEXT:    pand %xmm5, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm5
+; X64-SSE2-NEXT:    por %xmm0, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm6
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm7, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
 ; X64-SSE2-NEXT:    movdqa %xmm5, %xmm1
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm6
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm8, %xmm3
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm3, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
 ; X64-SSE2-NEXT:    pand %xmm6, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm2, %xmm6
-; X64-SSE2-NEXT:    por %xmm0, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm6, %xmm4
-; X64-SSE2-NEXT:    movdqa %xmm4, %xmm0
-; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm2, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm1, %xmm0
-; X64-SSE2-NEXT:    pand %xmm0, %xmm6
-; X64-SSE2-NEXT:    pandn %xmm5, %xmm0
-; X64-SSE2-NEXT:    por %xmm6, %xmm0
-; X64-SSE2-NEXT:    movq %xmm0, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovgq %rcx, %rax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm5
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm1
+; X64-SSE2-NEXT:    por %xmm5, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i64:
@@ -1232,7 +1330,7 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v8i64:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxsq %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxsq %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxsq %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1277,11 +1375,13 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
 ; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovgl %ecx, %eax
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm2, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i32:
@@ -1347,11 +1447,13 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
 ; X64-SSE2-NEXT:    por %xmm0, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %ecx
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovgl %ecx, %eax
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i32:
@@ -1397,7 +1499,7 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v16i32:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxsd %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxsd %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1445,10 +1547,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-SSE42-NEXT:    pmaxsw %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pmaxsw %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -1459,10 +1565,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1472,10 +1581,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1501,10 +1613,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-SSE42-NEXT:    pmaxsw %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pmaxsw %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1515,10 +1631,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX1-NEXT:    vpmaxsw %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpmaxsw %xmm2, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1528,10 +1647,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX2-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1539,13 +1661,16 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v32i16:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxsw %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxsw %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1621,13 +1746,17 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-SSE42-NEXT:    pmaxsb %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pmaxsb %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorb $127, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -1638,12 +1767,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorb $127, %al
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1653,12 +1785,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    xorb $127, %al
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1715,13 +1850,17 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-SSE42-NEXT:    pmaxsb %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pmaxsb %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorb $127, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1732,12 +1871,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX1-NEXT:    vpmaxsb %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpmaxsb %xmm2, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    xorb $127, %al
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1747,12 +1889,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX2-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    xorb $127, %al
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1760,15 +1905,18 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v64i8:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxsb %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxsb %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorb $127, %al
 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1814,19 +1962,26 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -1846,32 +2001,29 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v16i16_v8i16:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
-; X64-AVX1OR2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v16i16_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v16i16_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <16 x i16> %a0, <16 x i16> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp sgt <16 x i16> %a0, %1
   %3  = select <16 x i1> %2, <16 x i16> %a0, <16 x i16> %1
@@ -1901,19 +2053,26 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -1933,32 +2092,29 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v32i16_v8i16:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
-; X64-AVX1OR2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v32i16_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32767, %eax ## imm = 0x7FFF
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v32i16_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <32 x i16> %a0, <32 x i16> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp sgt <32 x i16> %a0, %1
   %3  = select <32 x i1> %2, <32 x i16> %a0, <32 x i16> %1
@@ -2007,24 +2163,31 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorb $127, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i8_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorb $127, %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -2063,39 +2226,34 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorb $127, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v32i8_v16i8:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1OR2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorb $127, %al
-; X64-AVX1OR2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v32i8_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorb $127, %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v32i8_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <32 x i8> %a0, <32 x i8> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp sgt <32 x i8> %a0, %1
   %3  = select <32 x i1> %2, <32 x i8> %a0, <32 x i8> %1
@@ -2147,24 +2305,31 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorb $127, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v64i8_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorb $127, %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -2203,39 +2368,34 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pmaxsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorb $127, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v64i8_v16i8:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1OR2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorb $127, %al
-; X64-AVX1OR2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v64i8_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorb $127, %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v64i8_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <64 x i8> %a0, <64 x i8> undef, <64 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp sgt <64 x i8> %a0, %1
   %3  = select <64 x i1> %2, <64 x i8> %a0, <64 x i8> %1
diff --git a/llvm/test/CodeGen/X86/horizontal-reduce-smin.ll b/llvm/test/CodeGen/X86/horizontal-reduce-smin.ll
index 5e93f93a6d599..13020f43cc60d 100644
--- a/llvm/test/CodeGen/X86/horizontal-reduce-smin.ll
+++ b/llvm/test/CodeGen/X86/horizontal-reduce-smin.ll
@@ -59,11 +59,23 @@ define i64 @test_reduce_v2i64(<2 x i64> %a0) {
 ;
 ; X64-SSE2-LABEL: test_reduce_v2i64:
 ; X64-SSE2:       ## %bb.0:
-; X64-SSE2-NEXT:    movq %xmm0, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovlq %rcx, %rax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v2i64:
@@ -106,11 +118,13 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ; X86-SSE2-NEXT:    pand %xmm2, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
 ; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovll %ecx, %eax
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm2, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v4i32:
@@ -139,11 +153,13 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm2, %xmm0
 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
 ; X64-SSE2-NEXT:    por %xmm0, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %ecx
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovll %ecx, %eax
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i32:
@@ -189,19 +205,26 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    retl
 ;
@@ -220,30 +243,28 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v8i16:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorl $32768, %eax ## imm = 0x8000
-; X64-AVX1OR2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32768, %eax ## imm = 0x8000
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp slt <8 x i16> %a0, %1
   %3  = select <8 x i1> %2, <8 x i16> %a0, <8 x i16> %1
@@ -292,24 +313,31 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    addb $-128, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    addb $-128, %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    retl
 ;
@@ -347,37 +375,33 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    addb $-128, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v16i8:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1OR2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    addb $-128, %al
-; X64-AVX1OR2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    addb $-128, %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <16 x i8> %a0, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp slt <16 x i8> %a0, %1
   %3  = select <16 x i1> %2, <16 x i8> %a0, <16 x i8> %1
@@ -482,23 +506,35 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648]
 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm5
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm2, %xmm3
-; X64-SSE2-NEXT:    pand %xmm3, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X64-SSE2-NEXT:    por %xmm0, %xmm3
-; X64-SSE2-NEXT:    movq %xmm3, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovlq %rcx, %rax
+; X64-SSE2-NEXT:    pand %xmm6, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm3, %xmm4
+; X64-SSE2-NEXT:    pand %xmm4, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
+; X64-SSE2-NEXT:    por %xmm0, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm4, %xmm2
+; X64-SSE2-NEXT:    movq %xmm2, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i64:
@@ -571,11 +607,13 @@ define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X86-SSE2-NEXT:    pand %xmm1, %xmm2
 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
 ; X86-SSE2-NEXT:    por %xmm2, %xmm1
-; X86-SSE2-NEXT:    movd %xmm1, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovll %ecx, %eax
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i32:
@@ -625,11 +663,13 @@ define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm1, %xmm2
 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
 ; X64-SSE2-NEXT:    por %xmm2, %xmm1
-; X64-SSE2-NEXT:    movd %xmm1, %ecx
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovll %ecx, %eax
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    movd %xmm2, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i32:
@@ -708,10 +748,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v16i16:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pminsw %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -719,10 +763,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -731,10 +778,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -756,10 +806,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v16i16:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pminsw %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -767,10 +821,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -779,10 +836,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -791,10 +851,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -855,13 +918,17 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v32i8:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    addb $-128, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -869,12 +936,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    addb $-128, %al
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -883,12 +953,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    addb $-128, %al
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -933,13 +1006,17 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v32i8:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    addb $-128, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -947,12 +1024,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    addb $-128, %al
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -961,12 +1041,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    addb $-128, %al
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -975,12 +1058,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    addb $-128, %al
 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1132,9 +1218,9 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-LABEL: test_reduce_v8i64:
 ; X64-SSE2:       ## %bb.0:
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648]
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm5
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
@@ -1144,43 +1230,55 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm8, %xmm6
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
 ; X64-SSE2-NEXT:    por %xmm6, %xmm5
-; X64-SSE2-NEXT:    pand %xmm5, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm2, %xmm5
-; X64-SSE2-NEXT:    por %xmm0, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm5, %xmm0
+; X64-SSE2-NEXT:    pand %xmm5, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm5
+; X64-SSE2-NEXT:    por %xmm1, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm7, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm5, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm7
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm8, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm2, %xmm6
-; X64-SSE2-NEXT:    pand %xmm6, %xmm1
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm6
-; X64-SSE2-NEXT:    por %xmm1, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm6, %xmm4
-; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
-; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm6, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
 ; X64-SSE2-NEXT:    por %xmm0, %xmm1
-; X64-SSE2-NEXT:    pand %xmm1, %xmm5
-; X64-SSE2-NEXT:    pandn %xmm6, %xmm1
-; X64-SSE2-NEXT:    por %xmm5, %xmm1
-; X64-SSE2-NEXT:    movq %xmm1, %rcx
+; X64-SSE2-NEXT:    pand %xmm1, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm5, %xmm1
+; X64-SSE2-NEXT:    por %xmm3, %xmm1
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovlq %rcx, %rax
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i64:
@@ -1236,7 +1334,7 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v8i64:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminsq %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminsq %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminsq %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1281,11 +1379,13 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X86-SSE2-NEXT:    pand %xmm2, %xmm1
 ; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
 ; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovll %ecx, %eax
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm2, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i32:
@@ -1351,11 +1451,13 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm2, %xmm1
 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
 ; X64-SSE2-NEXT:    por %xmm1, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %ecx
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovll %ecx, %eax
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i32:
@@ -1401,7 +1503,7 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v16i32:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminsd %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminsd %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1449,10 +1551,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-SSE42-NEXT:    pminsw %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pminsw %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pminsw %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -1463,10 +1569,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpminsw %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1476,10 +1585,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1505,10 +1617,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-SSE42-NEXT:    pminsw %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pminsw %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pminsw %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1519,10 +1635,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX1-NEXT:    vpminsw %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpminsw %xmm2, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1532,10 +1651,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX2-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1543,13 +1665,16 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v32i16:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminsw %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminsw %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1625,13 +1750,17 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-SSE42-NEXT:    pminsb %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pminsb %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    addb $-128, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -1642,12 +1771,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    addb $-128, %al
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1657,12 +1789,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    addb $-128, %al
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1719,13 +1854,17 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-SSE42-NEXT:    pminsb %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pminsb %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    addb $-128, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1736,12 +1875,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX1-NEXT:    vpminsb %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpminsb %xmm2, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    addb $-128, %al
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1751,12 +1893,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX2-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    addb $-128, %al
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1764,15 +1909,18 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v64i8:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminsb %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminsb %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    addb $-128, %al
 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1818,19 +1966,26 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -1850,32 +2005,29 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v16i16_v8i16:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorl $32768, %eax ## imm = 0x8000
-; X64-AVX1OR2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v16i16_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32768, %eax ## imm = 0x8000
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v16i16_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <16 x i16> %a0, <16 x i16> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp slt <16 x i16> %a0, %1
   %3  = select <16 x i1> %2, <16 x i16> %a0, <16 x i16> %1
@@ -1905,19 +2057,26 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    xorl $32768, %eax ## imm = 0x8000
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -1937,32 +2096,29 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    xorl $32768, %eax ## imm = 0x8000
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v32i16_v8i16:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    xorl $32768, %eax ## imm = 0x8000
-; X64-AVX1OR2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v32i16_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    xorl $32768, %eax ## imm = 0x8000
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v32i16_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <32 x i16> %a0, <32 x i16> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp slt <32 x i16> %a0, %1
   %3  = select <32 x i1> %2, <32 x i16> %a0, <32 x i16> %1
@@ -2011,24 +2167,31 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    addb $-128, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i8_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    addb $-128, %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -2067,39 +2230,34 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    addb $-128, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v32i8_v16i8:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1OR2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    addb $-128, %al
-; X64-AVX1OR2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v32i8_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    addb $-128, %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v32i8_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <32 x i8> %a0, <32 x i8> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp slt <32 x i8> %a0, %1
   %3  = select <32 x i1> %2, <32 x i8> %a0, <32 x i8> %1
@@ -2151,24 +2309,31 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
-; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    addb $-128, %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v64i8_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    addb $-128, %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -2207,39 +2372,34 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
-; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminsb %xmm0, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminsb %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    addb $-128, %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1OR2-LABEL: test_reduce_v64i8_v16i8:
-; X64-AVX1OR2:       ## %bb.0:
-; X64-AVX1OR2-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1OR2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1OR2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1OR2-NEXT:    addb $-128, %al
-; X64-AVX1OR2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1OR2-NEXT:    vzeroupper
-; X64-AVX1OR2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v64i8_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    addb $-128, %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v64i8_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <64 x i8> %a0, <64 x i8> undef, <64 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp slt <64 x i8> %a0, %1
   %3  = select <64 x i1> %2, <64 x i8> %a0, <64 x i8> %1
diff --git a/llvm/test/CodeGen/X86/horizontal-reduce-umax.ll b/llvm/test/CodeGen/X86/horizontal-reduce-umax.ll
index aa2b6bacdd902..2c4ce3334451e 100644
--- a/llvm/test/CodeGen/X86/horizontal-reduce-umax.ll
+++ b/llvm/test/CodeGen/X86/horizontal-reduce-umax.ll
@@ -77,45 +77,57 @@ define i64 @test_reduce_v2i64(<2 x i64> %a0) {
 ;
 ; X64-SSE2-LABEL: test_reduce_v2i64:
 ; X64-SSE2:       ## %bb.0:
-; X64-SSE2-NEXT:    movq %xmm0, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovaq %rcx, %rax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v2i64:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; X64-SSE42-NEXT:    pxor %xmm2, %xmm0
-; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]
-; X64-SSE42-NEXT:    pxor %xmm3, %xmm2
-; X64-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
-; X64-SSE42-NEXT:    movq %xmm3, %rax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
+; X64-SSE42-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
+; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
+; X64-SSE42-NEXT:    movq %xmm2, %rax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX1-LABEL: test_reduce_v2i64:
 ; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; X64-AVX1-NEXT:    ## xmm1 = mem[0,0]
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
-; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm3, %xmm1
-; X64-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX1-NEXT:    ## xmm2 = mem[0,0]
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX1-NEXT:    retq
 ;
 ; X64-AVX2-LABEL: test_reduce_v2i64:
 ; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm2
-; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm3, %xmm1
-; X64-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
-; X64-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX2-NEXT:    retq
 ;
@@ -135,20 +147,25 @@ define i64 @test_reduce_v2i64(<2 x i64> %a0) {
 define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ; X86-SSE2-LABEL: test_reduce_v4i32:
 ; X86-SSE2:       ## %bb.0:
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmoval %ecx, %eax
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm1
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X86-SSE2-NEXT:    pand %xmm3, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X86-SSE2-NEXT:    por %xmm1, %xmm3
+; X86-SSE2-NEXT:    movd %xmm3, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v4i32:
@@ -171,20 +188,25 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ;
 ; X64-SSE2-LABEL: test_reduce_v4i32:
 ; X64-SSE2:       ## %bb.0:
-; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm2
-; X64-SSE2-NEXT:    por %xmm0, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmoval %ecx, %eax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm3, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i32:
@@ -233,21 +255,26 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notl %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    notl %eax
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    retl
 ;
@@ -269,42 +296,28 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notl %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1-LABEL: test_reduce_v8i16:
-; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notl %eax
-; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1-NEXT:    retq
-;
-; X64-AVX2-LABEL: test_reduce_v8i16:
-; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notl %eax
-; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notl %eax
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <8 x i16> %a0, <8 x i16> undef, <8 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp ugt <8 x i16> %a0, %1
   %3  = select <8 x i1> %2, <8 x i16> %a0, <8 x i16> %1
@@ -337,26 +350,31 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X86-SSE42-NEXT:    psrlw $8, %xmm0
-; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notb %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    notb %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    retl
 ;
@@ -378,51 +396,33 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X64-SSE42-NEXT:    psrlw $8, %xmm0
-; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notb %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1-LABEL: test_reduce_v16i8:
-; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notb %al
-; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1-NEXT:    retq
-;
-; X64-AVX2-LABEL: test_reduce_v16i8:
-; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notb %al
-; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notb %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <16 x i8> %a0, <16 x i8> undef, <16 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp ugt <16 x i8> %a0, %1
   %3  = select <16 x i1> %2, <16 x i8> %a0, <16 x i8> %1
@@ -543,23 +543,35 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm4
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm5
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm2, %xmm3
-; X64-SSE2-NEXT:    pand %xmm3, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X64-SSE2-NEXT:    por %xmm0, %xmm3
-; X64-SSE2-NEXT:    movq %xmm3, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovaq %rcx, %rax
+; X64-SSE2-NEXT:    pand %xmm6, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm3, %xmm4
+; X64-SSE2-NEXT:    pand %xmm4, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
+; X64-SSE2-NEXT:    por %xmm0, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm4, %xmm2
+; X64-SSE2-NEXT:    movq %xmm2, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i64:
@@ -571,9 +583,9 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
 ; X64-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X64-SSE42-NEXT:    movapd %xmm1, %xmm0
-; X64-SSE42-NEXT:    xorpd %xmm3, %xmm0
 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
 ; X64-SSE42-NEXT:    pxor %xmm2, %xmm3
 ; X64-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
@@ -589,11 +601,11 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm4
 ; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
 ; X64-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm2
-; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
+; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
+; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -606,11 +618,11 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm4
 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
 ; X64-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm3, %xmm2
-; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
+; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -637,28 +649,33 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X86-SSE2-LABEL: test_reduce_v8i32:
 ; X86-SSE2:       ## %bb.0:
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
+; X86-SSE2-NEXT:    pand %xmm3, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X86-SSE2-NEXT:    por %xmm0, %xmm3
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm0
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm3
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    movd %xmm0, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmoval %ecx, %eax
+; X86-SSE2-NEXT:    por %xmm3, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X86-SSE2-NEXT:    pand %xmm3, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X86-SSE2-NEXT:    por %xmm0, %xmm3
+; X86-SSE2-NEXT:    movd %xmm3, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i32:
@@ -706,19 +723,24 @@ define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
-; X64-SSE2-NEXT:    movdqa %xmm4, %xmm0
-; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
-; X64-SSE2-NEXT:    pand %xmm0, %xmm4
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm0
-; X64-SSE2-NEXT:    por %xmm4, %xmm0
-; X64-SSE2-NEXT:    movd %xmm0, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmoval %ecx, %eax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm4, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    movd %xmm3, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i32:
@@ -801,11 +823,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v16i16:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notl %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -813,11 +838,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    notl %eax
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -826,11 +853,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    notl %eax
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -856,11 +885,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v16i16:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notl %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -868,11 +900,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notl %eax
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -881,11 +915,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notl %eax
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -894,10 +930,13 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notl %eax
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -938,14 +977,17 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v32i8:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X86-SSE42-NEXT:    psrlw $8, %xmm0
-; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notb %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -953,13 +995,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    notb %al
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -968,13 +1012,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    notb %al
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -999,14 +1045,17 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v32i8:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X64-SSE42-NEXT:    psrlw $8, %xmm0
-; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notb %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1014,13 +1063,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notb %al
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1029,13 +1080,15 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notb %al
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1044,14 +1097,17 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notb %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    vzeroupper
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vmovd %xmm0, %eax
+; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
   %1  = shufflevector <32 x i8> %a0, <32 x i8> undef, <32 x i32> <i32 16, i32 17, i32 18, i32 19, i32 20, i32 21, i32 22, i32 23, i32 24, i32 25, i32 26, i32 27, i32 28, i32 29, i32 30, i32 31, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp ugt <32 x i8> %a0, %1
@@ -1229,9 +1285,9 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-LABEL: test_reduce_v8i64:
 ; X64-SSE2:       ## %bb.0:
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
-; X64-SSE2-NEXT:    movdqa %xmm3, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm5
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm6
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
@@ -1241,70 +1297,81 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm8, %xmm6
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
 ; X64-SSE2-NEXT:    por %xmm6, %xmm5
-; X64-SSE2-NEXT:    pand %xmm5, %xmm1
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm5
-; X64-SSE2-NEXT:    por %xmm1, %xmm5
+; X64-SSE2-NEXT:    pand %xmm5, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm5
+; X64-SSE2-NEXT:    por %xmm0, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm6
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm7, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
 ; X64-SSE2-NEXT:    movdqa %xmm5, %xmm1
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm7
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm6
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm8, %xmm3
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm3, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
 ; X64-SSE2-NEXT:    pand %xmm6, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm2, %xmm6
-; X64-SSE2-NEXT:    por %xmm0, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm6, %xmm4
-; X64-SSE2-NEXT:    movdqa %xmm4, %xmm0
-; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm2, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm1, %xmm0
-; X64-SSE2-NEXT:    pand %xmm0, %xmm6
-; X64-SSE2-NEXT:    pandn %xmm5, %xmm0
-; X64-SSE2-NEXT:    por %xmm6, %xmm0
-; X64-SSE2-NEXT:    movq %xmm0, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovaq %rcx, %rax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm5
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm1
+; X64-SSE2-NEXT:    por %xmm5, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm4, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i64:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm4
 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
-; X64-SSE42-NEXT:    movdqa %xmm3, %xmm6
+; X64-SSE42-NEXT:    movdqa %xmm2, %xmm6
 ; X64-SSE42-NEXT:    pxor %xmm5, %xmm6
-; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X64-SSE42-NEXT:    pxor %xmm5, %xmm0
 ; X64-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
+; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
+; X64-SSE42-NEXT:    movdqa %xmm3, %xmm4
+; X64-SSE42-NEXT:    pxor %xmm5, %xmm4
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    pxor %xmm5, %xmm0
+; X64-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
 ; X64-SSE42-NEXT:    movapd %xmm3, %xmm1
 ; X64-SSE42-NEXT:    xorpd %xmm5, %xmm1
-; X64-SSE42-NEXT:    movdqa %xmm2, %xmm6
-; X64-SSE42-NEXT:    pxor %xmm5, %xmm6
-; X64-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X64-SSE42-NEXT:    pxor %xmm5, %xmm0
-; X64-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
-; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm2
 ; X64-SSE42-NEXT:    movapd %xmm2, %xmm0
 ; X64-SSE42-NEXT:    xorpd %xmm5, %xmm0
 ; X64-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
-; X64-SSE42-NEXT:    movapd %xmm3, %xmm0
-; X64-SSE42-NEXT:    xorpd %xmm5, %xmm0
 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
+; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
+; X64-SSE42-NEXT:    pxor %xmm5, %xmm0
 ; X64-SSE42-NEXT:    pxor %xmm1, %xmm5
 ; X64-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
@@ -1313,27 +1380,27 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ;
 ; X64-AVX1-LABEL: test_reduce_v8i64:
 ; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
-; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
-; X64-AVX1-NEXT:    ## xmm3 = mem[0,0]
-; X64-AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
-; X64-AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm6
-; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
-; X64-AVX1-NEXT:    vblendvpd %xmm4, %xmm5, %xmm2, %xmm2
-; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm2, %xmm4
-; X64-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm5
-; X64-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm6
-; X64-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
-; X64-AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm0
-; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
-; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm2, %xmm3
-; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
+; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX1-NEXT:    ## xmm2 = mem[0,0]
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm3
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm4
+; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
+; X64-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm3
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm4
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm5
+; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm4
+; X64-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
+; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
+; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
+; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1350,11 +1417,11 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm4
 ; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
 ; X64-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm3, %xmm2
-; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
+; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1362,7 +1429,7 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v8i64:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1387,43 +1454,48 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X86-SSE2-LABEL: test_reduce_v16i32:
 ; X86-SSE2:       ## %bb.0:
 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm6
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm5
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm5
 ; X86-SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
-; X86-SSE2-NEXT:    pand %xmm5, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm3, %xmm5
-; X86-SSE2-NEXT:    por %xmm1, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    pand %xmm5, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm5
+; X86-SSE2-NEXT:    por %xmm0, %xmm5
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm0
+; X86-SSE2-NEXT:    por %xmm1, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE2-NEXT:    pcmpgtd %xmm6, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm5
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm5, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
 ; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm0
 ; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
 ; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    movd %xmm1, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmoval %ecx, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i32:
@@ -1469,43 +1541,48 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-SSE2-LABEL: test_reduce_v16i32:
 ; X64-SSE2:       ## %bb.0:
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
-; X64-SSE2-NEXT:    movdqa %xmm3, %xmm5
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm6
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
-; X64-SSE2-NEXT:    pand %xmm6, %xmm1
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm6
-; X64-SSE2-NEXT:    por %xmm1, %xmm6
-; X64-SSE2-NEXT:    movdqa %xmm6, %xmm1
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm5
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
+; X64-SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
 ; X64-SSE2-NEXT:    pand %xmm5, %xmm0
 ; X64-SSE2-NEXT:    pandn %xmm2, %xmm5
 ; X64-SSE2-NEXT:    por %xmm0, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm5, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
-; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm0
-; X64-SSE2-NEXT:    pand %xmm0, %xmm5
-; X64-SSE2-NEXT:    pandn %xmm6, %xmm0
-; X64-SSE2-NEXT:    por %xmm5, %xmm0
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm5, %xmm1
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X64-SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
-; X64-SSE2-NEXT:    pand %xmm1, %xmm0
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm5
 ; X64-SSE2-NEXT:    pandn %xmm2, %xmm1
-; X64-SSE2-NEXT:    por %xmm0, %xmm1
-; X64-SSE2-NEXT:    movd %xmm1, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmoval %ecx, %eax
+; X64-SSE2-NEXT:    por %xmm5, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm4, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i32:
@@ -1551,7 +1628,7 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v16i32:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxud %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1605,11 +1682,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-SSE42-NEXT:    pmaxuw %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pmaxuw %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notl %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -1620,11 +1700,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    notl %eax
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1634,11 +1716,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    notl %eax
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1670,11 +1754,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-SSE42-NEXT:    pmaxuw %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pmaxuw %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notl %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1685,11 +1772,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX1-NEXT:    vpmaxuw %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpmaxuw %xmm2, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notl %eax
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1699,11 +1788,13 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX2-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notl %eax
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1711,13 +1802,16 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v32i16:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxuw %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notl %eax
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1765,14 +1859,17 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-SSE42-NEXT:    pmaxub %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pmaxub %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X86-SSE42-NEXT:    psrlw $8, %xmm0
-; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notb %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -1783,13 +1880,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    notb %al
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1799,13 +1898,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    notb %al
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1834,14 +1935,17 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-SSE42-NEXT:    pmaxub %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pmaxub %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X64-SSE42-NEXT:    psrlw $8, %xmm0
-; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notb %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1852,13 +1956,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX1-NEXT:    vpmaxub %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpmaxub %xmm2, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notb %al
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1868,13 +1974,15 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX2-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notb %al
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1882,15 +1990,18 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v64i8:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpmaxub %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notb %al
 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
 ; X64-AVX512-NEXT:    retq
@@ -1939,21 +2050,26 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notl %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    notl %eax
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -1976,45 +2092,29 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notl %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1-LABEL: test_reduce_v16i16_v8i16:
-; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notl %eax
-; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1-NEXT:    vzeroupper
-; X64-AVX1-NEXT:    retq
-;
-; X64-AVX2-LABEL: test_reduce_v16i16_v8i16:
-; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notl %eax
-; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX2-NEXT:    vzeroupper
-; X64-AVX2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v16i16_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notl %eax
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v16i16_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <16 x i16> %a0, <16 x i16> undef, <16 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp ugt <16 x i16> %a0, %1
   %3  = select <16 x i1> %2, <16 x i16> %a0, <16 x i16> %1
@@ -2047,21 +2147,26 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notl %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    notl %eax
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -2084,45 +2189,29 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notl %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1-LABEL: test_reduce_v32i16_v8i16:
-; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notl %eax
-; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX1-NEXT:    vzeroupper
-; X64-AVX1-NEXT:    retq
-;
-; X64-AVX2-LABEL: test_reduce_v32i16_v8i16:
-; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notl %eax
-; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX2-NEXT:    vzeroupper
-; X64-AVX2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v32i16_v8i16:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notl %eax
-; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v32i16_v8i16:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <32 x i16> %a0, <32 x i16> undef, <32 x i32> <i32 4, i32 5, i32 6, i32 7, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp ugt <32 x i16> %a0, %1
   %3  = select <32 x i1> %2, <32 x i16> %a0, <32 x i16> %1
@@ -2155,26 +2244,31 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X86-SSE42-NEXT:    psrlw $8, %xmm0
-; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notb %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i8_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    notb %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -2197,54 +2291,34 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X64-SSE42-NEXT:    psrlw $8, %xmm0
-; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notb %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1-LABEL: test_reduce_v32i8_v16i8:
-; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notb %al
-; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1-NEXT:    vzeroupper
-; X64-AVX1-NEXT:    retq
-;
-; X64-AVX2-LABEL: test_reduce_v32i8_v16i8:
-; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notb %al
-; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX2-NEXT:    vzeroupper
-; X64-AVX2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v32i8_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notb %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v32i8_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <32 x i8> %a0, <32 x i8> undef, <32 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp ugt <32 x i8> %a0, %1
   %3  = select <32 x i1> %2, <32 x i8> %a0, <32 x i8> %1
@@ -2280,26 +2354,31 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X86-SSE42-NEXT:    psrlw $8, %xmm0
-; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
-; X86-SSE42-NEXT:    notb %al
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v64i8_v16i8:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    notb %al
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
 ; X86-AVX-NEXT:    retl
@@ -2322,54 +2401,34 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pmaxub %xmm0, %xmm1
 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X64-SSE42-NEXT:    psrlw $8, %xmm0
-; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE42-NEXT:    pmaxub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
-; X64-SSE42-NEXT:    notb %al
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
-; X64-AVX1-LABEL: test_reduce_v64i8_v16i8:
-; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notb %al
-; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX1-NEXT:    vzeroupper
-; X64-AVX1-NEXT:    retq
-;
-; X64-AVX2-LABEL: test_reduce_v64i8_v16i8:
-; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notb %al
-; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX2-NEXT:    vzeroupper
-; X64-AVX2-NEXT:    retq
-;
-; X64-AVX512-LABEL: test_reduce_v64i8_v16i8:
-; X64-AVX512:       ## %bb.0:
-; X64-AVX512-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX512-NEXT:    vmovd %xmm0, %eax
-; X64-AVX512-NEXT:    notb %al
-; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
-; X64-AVX512-NEXT:    vzeroupper
-; X64-AVX512-NEXT:    retq
+; X64-AVX-LABEL: test_reduce_v64i8_v16i8:
+; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
   %1  = shufflevector <64 x i8> %a0, <64 x i8> undef, <64 x i32> <i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
   %2  = icmp ugt <64 x i8> %a0, %1
   %3  = select <64 x i1> %2, <64 x i8> %a0, <64 x i8> %1
diff --git a/llvm/test/CodeGen/X86/horizontal-reduce-umin.ll b/llvm/test/CodeGen/X86/horizontal-reduce-umin.ll
index a7ab20f246fb5..29bd41ae48d4d 100644
--- a/llvm/test/CodeGen/X86/horizontal-reduce-umin.ll
+++ b/llvm/test/CodeGen/X86/horizontal-reduce-umin.ll
@@ -78,46 +78,58 @@ define i64 @test_reduce_v2i64(<2 x i64> %a0) {
 ;
 ; X64-SSE2-LABEL: test_reduce_v2i64:
 ; X64-SSE2:       ## %bb.0:
-; X64-SSE2-NEXT:    movq %xmm0, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovbq %rcx, %rax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v2i64:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
-; X64-SSE42-NEXT:    movdqa %xmm1, %xmm2
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm2
-; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]
-; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
-; X64-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
-; X64-SSE42-NEXT:    movq %xmm3, %rax
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE42-NEXT:    pxor %xmm0, %xmm3
+; X64-SSE42-NEXT:    pxor %xmm2, %xmm0
+; X64-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
+; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
+; X64-SSE42-NEXT:    movq %xmm2, %rax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX1-LABEL: test_reduce_v2i64:
 ; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; X64-AVX1-NEXT:    ## xmm1 = mem[0,0]
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm2
-; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm3, %xmm1
-; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX1-NEXT:    ## xmm2 = mem[0,0]
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
+; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX1-NEXT:    retq
 ;
 ; X64-AVX2-LABEL: test_reduce_v2i64:
 ; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm2
-; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm3, %xmm1
-; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
+; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX2-NEXT:    retq
 ;
@@ -137,20 +149,25 @@ define i64 @test_reduce_v2i64(<2 x i64> %a0) {
 define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ; X86-SSE2-LABEL: test_reduce_v4i32:
 ; X86-SSE2:       ## %bb.0:
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm4
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm4
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm2
 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm3, %xmm1
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    movd %xmm1, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovbl %ecx, %eax
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm2, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v4i32:
@@ -173,20 +190,25 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
 ;
 ; X64-SSE2-LABEL: test_reduce_v4i32:
 ; X64-SSE2:       ## %bb.0:
-; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
-; X64-SSE2-NEXT:    pand %xmm1, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm1
-; X64-SSE2-NEXT:    por %xmm0, %xmm1
-; X64-SSE2-NEXT:    movd %xmm1, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovbl %ecx, %eax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X64-SSE2-NEXT:    pand %xmm4, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
+; X64-SSE2-NEXT:    por %xmm0, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm4, %xmm2
+; X64-SSE2-NEXT:    movd %xmm2, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i32:
@@ -238,14 +260,25 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    retl
@@ -271,14 +304,25 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX-LABEL: test_reduce_v8i16:
 ; X64-AVX:       ## %bb.0:
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX-NEXT:    retq
@@ -314,19 +358,30 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i8:
 ; X86-SSE42:       ## %bb.0:
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i8:
 ; X86-AVX:       ## %bb.0:
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    retl
@@ -349,19 +404,30 @@ define i8 @test_reduce_v16i8(<16 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i8:
 ; X64-SSE42:       ## %bb.0:
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX-LABEL: test_reduce_v16i8:
 ; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX-NEXT:    retq
@@ -487,23 +553,35 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
 ; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm4
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm5
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm2, %xmm3
-; X64-SSE2-NEXT:    pand %xmm3, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X64-SSE2-NEXT:    por %xmm0, %xmm3
-; X64-SSE2-NEXT:    movq %xmm3, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovbq %rcx, %rax
+; X64-SSE2-NEXT:    pand %xmm6, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm3, %xmm4
+; X64-SSE2-NEXT:    pand %xmm4, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
+; X64-SSE2-NEXT:    por %xmm0, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm4, %xmm2
+; X64-SSE2-NEXT:    movq %xmm2, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v4i64:
@@ -516,9 +594,9 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
 ; X64-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X64-SSE42-NEXT:    movapd %xmm1, %xmm0
-; X64-SSE42-NEXT:    xorpd %xmm3, %xmm0
 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    pxor %xmm3, %xmm0
 ; X64-SSE42-NEXT:    pxor %xmm2, %xmm3
 ; X64-SSE42-NEXT:    pcmpgtq %xmm0, %xmm3
 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
@@ -535,28 +613,28 @@ define i64 @test_reduce_v4i64(<4 x i64> %a0) {
 ; X64-AVX1-NEXT:    vpxor %xmm1, %xmm3, %xmm4
 ; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
 ; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
-; X64-AVX1-NEXT:    vxorpd %xmm1, %xmm0, %xmm2
-; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX1-NEXT:    vxorpd %xmm1, %xmm3, %xmm1
-; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vxorpd %xmm1, %xmm0, %xmm3
+; X64-AVX1-NEXT:    vxorpd %xmm1, %xmm2, %xmm1
+; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
 ;
 ; X64-AVX2-LABEL: test_reduce_v4i64:
 ; X64-AVX2:       ## %bb.0:
-; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [9223372036854775808,9223372036854775808]
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm2
-; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm3, %xmm4
-; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
-; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
-; X64-AVX2-NEXT:    vxorpd %xmm1, %xmm0, %xmm2
-; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX2-NEXT:    vxorpd %xmm1, %xmm3, %xmm1
-; X64-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm4
+; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
+; X64-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
+; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -592,19 +670,24 @@ define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm0
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm3
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X86-SSE2-NEXT:    por %xmm3, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
 ; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovbl %ecx, %eax
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v8i32:
@@ -652,19 +735,24 @@ define i32 @test_reduce_v8i32(<8 x i32> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm4, %xmm0
 ; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
 ; X64-SSE2-NEXT:    por %xmm0, %xmm4
-; X64-SSE2-NEXT:    movdqa %xmm4, %xmm0
-; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
-; X64-SSE2-NEXT:    pand %xmm2, %xmm4
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X64-SSE2-NEXT:    por %xmm4, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovbl %ecx, %eax
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X64-SSE2-NEXT:    por %xmm4, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm3, %xmm2
+; X64-SSE2-NEXT:    movd %xmm2, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i32:
@@ -751,8 +839,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v16i16:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -760,7 +854,12 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
@@ -770,7 +869,12 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
@@ -801,8 +905,14 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v16i16:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -810,7 +920,12 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
@@ -820,7 +935,12 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
@@ -830,7 +950,12 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
@@ -872,10 +997,16 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-SSE42-LABEL: test_reduce_v32i8:
 ; X86-SSE42:       ## %bb.0:
 ; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
@@ -884,9 +1015,14 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX1:       ## %bb.0:
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
@@ -896,9 +1032,14 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X86-AVX2:       ## %bb.0:
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
@@ -924,10 +1065,16 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-SSE42-LABEL: test_reduce_v32i8:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
@@ -936,9 +1083,14 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX1:       ## %bb.0:
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
@@ -948,9 +1100,14 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX2:       ## %bb.0:
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
@@ -960,9 +1117,14 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
@@ -1145,9 +1307,9 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-LABEL: test_reduce_v8i64:
 ; X64-SSE2:       ## %bb.0:
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456]
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm5
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
 ; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm7
@@ -1157,70 +1319,82 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-SSE2-NEXT:    pand %xmm8, %xmm6
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
 ; X64-SSE2-NEXT:    por %xmm6, %xmm5
-; X64-SSE2-NEXT:    pand %xmm5, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm2, %xmm5
-; X64-SSE2-NEXT:    por %xmm0, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm5, %xmm0
+; X64-SSE2-NEXT:    pand %xmm5, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm5
+; X64-SSE2-NEXT:    por %xmm1, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm1, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm7, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm5, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm7
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm6
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm8, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm7[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm2, %xmm6
-; X64-SSE2-NEXT:    pand %xmm6, %xmm1
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm6
-; X64-SSE2-NEXT:    por %xmm1, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm6, %xmm4
-; X64-SSE2-NEXT:    movdqa %xmm4, %xmm1
-; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
+; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm2[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm6, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
 ; X64-SSE2-NEXT:    por %xmm0, %xmm1
-; X64-SSE2-NEXT:    pand %xmm1, %xmm5
-; X64-SSE2-NEXT:    pandn %xmm6, %xmm1
-; X64-SSE2-NEXT:    por %xmm5, %xmm1
-; X64-SSE2-NEXT:    movq %xmm1, %rcx
+; X64-SSE2-NEXT:    pand %xmm1, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm5, %xmm1
+; X64-SSE2-NEXT:    por %xmm3, %xmm1
 ; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    cmpq %rax, %rcx
-; X64-SSE2-NEXT:    cmovbq %rcx, %rax
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm2, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v8i64:
 ; X64-SSE42:       ## %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm5
 ; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
-; X64-SSE42-NEXT:    movdqa %xmm0, %xmm6
-; X64-SSE42-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X64-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
-; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
-; X64-SSE42-NEXT:    movapd %xmm2, %xmm5
-; X64-SSE42-NEXT:    xorpd %xmm4, %xmm5
 ; X64-SSE42-NEXT:    movdqa %xmm1, %xmm6
 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm6
 ; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
 ; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
 ; X64-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
+; X64-SSE42-NEXT:    movdqa %xmm5, %xmm1
+; X64-SSE42-NEXT:    pxor %xmm4, %xmm1
+; X64-SSE42-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
+; X64-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
+; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
+; X64-SSE42-NEXT:    movapd %xmm2, %xmm1
+; X64-SSE42-NEXT:    xorpd %xmm4, %xmm1
 ; X64-SSE42-NEXT:    movapd %xmm3, %xmm0
 ; X64-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X64-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
+; X64-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
 ; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
-; X64-SSE42-NEXT:    movapd %xmm3, %xmm0
-; X64-SSE42-NEXT:    xorpd %xmm4, %xmm0
 ; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]
+; X64-SSE42-NEXT:    movdqa %xmm3, %xmm0
+; X64-SSE42-NEXT:    pxor %xmm4, %xmm0
 ; X64-SSE42-NEXT:    pxor %xmm1, %xmm4
 ; X64-SSE42-NEXT:    pcmpgtq %xmm0, %xmm4
 ; X64-SSE42-NEXT:    movdqa %xmm4, %xmm0
@@ -1230,27 +1404,27 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ;
 ; X64-AVX1-LABEL: test_reduce_v8i64:
 ; X64-AVX1:       ## %bb.0:
-; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; X64-AVX1-NEXT:    ## xmm2 = mem[0,0]
-; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm3
-; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm4
-; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
-; X64-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm3
-; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm4
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
-; X64-AVX1-NEXT:    vpxor %xmm2, %xmm0, %xmm5
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm2, %xmm1, %xmm6
-; X64-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
-; X64-AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm0
-; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm2
-; X64-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
-; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
+; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808]
+; X64-AVX1-NEXT:    ## xmm3 = mem[0,0]
+; X64-AVX1-NEXT:    vpxor %xmm3, %xmm2, %xmm4
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
+; X64-AVX1-NEXT:    vpxor %xmm3, %xmm5, %xmm6
+; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
+; X64-AVX1-NEXT:    vblendvpd %xmm4, %xmm2, %xmm5, %xmm2
+; X64-AVX1-NEXT:    vpxor %xmm3, %xmm0, %xmm4
+; X64-AVX1-NEXT:    vpxor %xmm3, %xmm1, %xmm5
+; X64-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm2, %xmm4
+; X64-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
+; X64-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
+; X64-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
+; X64-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
+; X64-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX1-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -1262,16 +1436,16 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
 ; X64-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
 ; X64-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm3
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm3, %xmm4
-; X64-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
-; X64-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm3, %xmm2
-; X64-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
-; X64-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X64-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm4
+; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
+; X64-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
+; X64-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
+; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
 ; X64-AVX2-NEXT:    vmovq %xmm0, %rax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
@@ -1279,7 +1453,7 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v8i64:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminuq %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminuq %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminuq %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1304,43 +1478,48 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X86-SSE2-LABEL: test_reduce_v16i32:
 ; X86-SSE2:       ## %bb.0:
 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm6
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm6
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm5
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm5
 ; X86-SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
-; X86-SSE2-NEXT:    pand %xmm5, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm5
-; X86-SSE2-NEXT:    por %xmm0, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm2
+; X86-SSE2-NEXT:    pand %xmm5, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm5
+; X86-SSE2-NEXT:    por %xmm1, %xmm5
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pand %xmm6, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm3, %xmm6
-; X86-SSE2-NEXT:    por %xmm1, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm5, %xmm0
 ; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
 ; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm0
-; X86-SSE2-NEXT:    por %xmm5, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X86-SSE2-NEXT:    pand %xmm0, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm5, %xmm0
+; X86-SSE2-NEXT:    por %xmm1, %xmm0
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
-; X86-SSE2-NEXT:    pand %xmm4, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm4
-; X86-SSE2-NEXT:    por %xmm0, %xmm4
-; X86-SSE2-NEXT:    movd %xmm4, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    cmpl %eax, %ecx
-; X86-SSE2-NEXT:    cmovbl %ecx, %eax
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm3
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
+; X86-SSE2-NEXT:    pand %xmm4, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm4
+; X86-SSE2-NEXT:    por %xmm1, %xmm4
+; X86-SSE2-NEXT:    movd %xmm4, %eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i32:
@@ -1386,43 +1565,48 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-SSE2-LABEL: test_reduce_v16i32:
 ; X64-SSE2:       ## %bb.0:
 ; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm6
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm5
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm5
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm5
-; X64-SSE2-NEXT:    pcmpgtd %xmm6, %xmm5
-; X64-SSE2-NEXT:    pand %xmm5, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm2, %xmm5
-; X64-SSE2-NEXT:    por %xmm0, %xmm5
-; X64-SSE2-NEXT:    movdqa %xmm5, %xmm0
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
 ; X64-SSE2-NEXT:    movdqa %xmm3, %xmm6
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm6
-; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
+; X64-SSE2-NEXT:    pcmpgtd %xmm5, %xmm6
 ; X64-SSE2-NEXT:    pand %xmm6, %xmm1
 ; X64-SSE2-NEXT:    pandn %xmm3, %xmm6
 ; X64-SSE2-NEXT:    por %xmm1, %xmm6
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm0
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
 ; X64-SSE2-NEXT:    movdqa %xmm6, %xmm1
 ; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
 ; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm1
-; X64-SSE2-NEXT:    pand %xmm1, %xmm5
+; X64-SSE2-NEXT:    pand %xmm1, %xmm3
 ; X64-SSE2-NEXT:    pandn %xmm6, %xmm1
-; X64-SSE2-NEXT:    por %xmm5, %xmm1
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X64-SSE2-NEXT:    pxor %xmm4, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X64-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
-; X64-SSE2-NEXT:    pand %xmm4, %xmm1
-; X64-SSE2-NEXT:    pandn %xmm2, %xmm4
-; X64-SSE2-NEXT:    por %xmm1, %xmm4
-; X64-SSE2-NEXT:    movd %xmm4, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    cmpl %eax, %ecx
-; X64-SSE2-NEXT:    cmovbl %ecx, %eax
+; X64-SSE2-NEXT:    por %xmm3, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X64-SSE2-NEXT:    por %xmm1, %xmm3
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm3, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm4, %xmm1
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
+; X64-SSE2-NEXT:    pand %xmm4, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm4
+; X64-SSE2-NEXT:    por %xmm3, %xmm4
+; X64-SSE2-NEXT:    movd %xmm4, %eax
 ; X64-SSE2-NEXT:    retq
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i32:
@@ -1468,7 +1652,7 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v16i32:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminud %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminud %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
@@ -1528,8 +1712,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-SSE42-NEXT:    pminuw %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pminuw %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
@@ -1540,7 +1730,12 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
@@ -1551,7 +1746,12 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X86-AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
@@ -1590,8 +1790,14 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-SSE42-NEXT:    pminuw %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pminuw %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
@@ -1602,7 +1808,12 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX1-NEXT:    vpminuw %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpminuw %xmm2, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX1-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
@@ -1613,7 +1824,12 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX2-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX2-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
@@ -1622,10 +1838,15 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v32i16:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminuw %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminuw %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX512-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
@@ -1674,10 +1895,16 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-SSE42-NEXT:    pminub %xmm3, %xmm1
 ; X86-SSE42-NEXT:    pminub %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
@@ -1689,9 +1916,14 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
@@ -1702,9 +1934,14 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X86-AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
@@ -1734,10 +1971,16 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-SSE42-NEXT:    pminub %xmm3, %xmm1
 ; X64-SSE42-NEXT:    pminub %xmm2, %xmm0
 ; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
@@ -1749,9 +1992,14 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX1-NEXT:    vpminub %xmm2, %xmm3, %xmm2
 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpminub %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX1-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
@@ -1762,9 +2010,14 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX2-NEXT:    vpminub %ymm1, %ymm0, %ymm0
 ; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX2-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX2-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
@@ -1773,12 +2026,17 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
 ; X64-AVX512-LABEL: test_reduce_v64i8:
 ; X64-AVX512:       ## %bb.0:
 ; X64-AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
-; X64-AVX512-NEXT:    vpminub %ymm1, %ymm0, %ymm0
+; X64-AVX512-NEXT:    vpminub %zmm1, %zmm0, %zmm0
 ; X64-AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX512-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX512-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX512-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX512-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX512-NEXT:    vzeroupper
@@ -1831,14 +2089,25 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v16i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
@@ -1865,14 +2134,25 @@ define i16 @test_reduce_v16i16_v8i16(<16 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v16i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX-LABEL: test_reduce_v16i16_v8i16:
 ; X64-AVX:       ## %bb.0:
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX-NEXT:    vzeroupper
@@ -1912,14 +2192,25 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X86-SSE42:       ## %bb.0:
-; X86-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE42-NEXT:    movd %xmm0, %eax
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
+; X86-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X86-SSE42-NEXT:    movd %xmm1, %eax
 ; X86-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i16_v8i16:
 ; X86-AVX:       ## %bb.0:
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    vzeroupper
@@ -1946,14 +2237,25 @@ define i16 @test_reduce_v32i16_v8i16(<32 x i16> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i16_v8i16:
 ; X64-SSE42:       ## %bb.0:
-; X64-SSE42-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE42-NEXT:    movd %xmm0, %eax
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
+; X64-SSE42-NEXT:    pminuw %xmm0, %xmm1
+; X64-SSE42-NEXT:    movd %xmm1, %eax
 ; X64-SSE42-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX-LABEL: test_reduce_v32i16_v8i16:
 ; X64-AVX:       ## %bb.0:
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX-NEXT:    ## kill: def $ax killed $ax killed $eax
 ; X64-AVX-NEXT:    vzeroupper
@@ -1990,19 +2292,30 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v32i8_v16i8:
 ; X86-AVX:       ## %bb.0:
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
@@ -2026,19 +2339,30 @@ define i8 @test_reduce_v32i8_v16i8(<32 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v32i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX-LABEL: test_reduce_v32i8_v16i8:
 ; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX-NEXT:    vzeroupper
@@ -2078,19 +2402,30 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X86-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X86-SSE42:       ## %bb.0:
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    psrlw $8, %xmm1
+; X86-SSE42-NEXT:    psrld $16, %xmm1
 ; X86-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    psrlw $8, %xmm0
+; X86-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X86-SSE42-NEXT:    movd %xmm0, %eax
 ; X86-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-SSE42-NEXT:    retl
 ;
 ; X86-AVX-LABEL: test_reduce_v64i8_v16i8:
 ; X86-AVX:       ## %bb.0:
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
 ; X86-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X86-AVX-NEXT:    vzeroupper
@@ -2114,19 +2449,30 @@ define i8 @test_reduce_v64i8_v16i8(<64 x i8> %a0) {
 ;
 ; X64-SSE42-LABEL: test_reduce_v64i8_v16i8:
 ; X64-SSE42:       ## %bb.0:
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE42-NEXT:    psrlw $8, %xmm1
+; X64-SSE42-NEXT:    psrld $16, %xmm1
 ; X64-SSE42-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE42-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE42-NEXT:    psrlw $8, %xmm0
+; X64-SSE42-NEXT:    pminub %xmm1, %xmm0
 ; X64-SSE42-NEXT:    movd %xmm0, %eax
 ; X64-SSE42-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-SSE42-NEXT:    retq
 ;
 ; X64-AVX-LABEL: test_reduce_v64i8_v16i8:
 ; X64-AVX:       ## %bb.0:
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
 ; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
 ; X64-AVX-NEXT:    ## kill: def $al killed $al killed $eax
 ; X64-AVX-NEXT:    vzeroupper
diff --git a/llvm/test/CodeGen/X86/vector-reduce-smax.ll b/llvm/test/CodeGen/X86/vector-reduce-smax.ll
index a302649decee8..e061df525a3db 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-smax.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-smax.ll
@@ -19,25 +19,22 @@
 define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v2i64:
 ; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm3
-; X86-SSE2-NEXT:    pand %xmm3, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    movd %xmm3, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm1, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm1, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    cmovll %esi, %eax
+; X86-SSE2-NEXT:    cmovll %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v2i64:
@@ -49,26 +46,22 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovgq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v2i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm5, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    movd %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %ecx, %edi
+; X86-SSE4-NEXT:    cmovll %esi, %eax
+; X86-SSE4-NEXT:    cmovll %ecx, %edx
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v2i64:
 ; X64-SSE41:       # %bb.0:
@@ -90,16 +83,6 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm3, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v2i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v2i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
@@ -111,11 +94,19 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ;
 ; X86-AVX-LABEL: test_v2i64:
 ; X86-AVX:       # %bb.0:
-; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX-NEXT:    pushl %edi
+; X86-AVX-NEXT:    pushl %esi
+; X86-AVX-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX-NEXT:    vmovd %xmm0, %esi
+; X86-AVX-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX-NEXT:    cmpl %esi, %eax
+; X86-AVX-NEXT:    movl %edx, %edi
+; X86-AVX-NEXT:    sbbl %ecx, %edi
+; X86-AVX-NEXT:    cmovll %esi, %eax
+; X86-AVX-NEXT:    cmovll %ecx, %edx
+; X86-AVX-NEXT:    popl %esi
+; X86-AVX-NEXT:    popl %edi
 ; X86-AVX-NEXT:    retl
 ;
 ; X64-AVX-LABEL: test_v2i64:
@@ -148,40 +139,37 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v4i64:
 ; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm6, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm4, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm5, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,3,3,3]
 ; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    cmovll %esi, %eax
+; X86-SSE2-NEXT:    cmovll %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v4i64:
@@ -210,36 +198,33 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE41-LABEL: test_v4i64:
 ; X86-SSE41:       # %bb.0:
+; X86-SSE41-NEXT:    pushl %edi
+; X86-SSE41-NEXT:    pushl %esi
 ; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm6, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm4, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]
+; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm2, %xmm0
 ; X86-SSE41-NEXT:    movdqa %xmm0, %xmm4
 ; X86-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
 ; X86-SSE41-NEXT:    pand %xmm5, %xmm3
 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
 ; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE41-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE41-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE41-NEXT:    movd %xmm1, %esi
+; X86-SSE41-NEXT:    pextrd $2, %xmm1, %eax
+; X86-SSE41-NEXT:    cmpl %esi, %eax
+; X86-SSE41-NEXT:    movl %edx, %edi
+; X86-SSE41-NEXT:    sbbl %ecx, %edi
+; X86-SSE41-NEXT:    cmovll %esi, %eax
+; X86-SSE41-NEXT:    cmovll %ecx, %edx
+; X86-SSE41-NEXT:    popl %esi
+; X86-SSE41-NEXT:    popl %edi
 ; X86-SSE41-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v4i64:
@@ -277,15 +262,22 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE42-LABEL: test_v4i64:
 ; X86-SSE42:       # %bb.0:
+; X86-SSE42-NEXT:    pushl %edi
+; X86-SSE42-NEXT:    pushl %esi
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm2
 ; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
+; X86-SSE42-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE42-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE42-NEXT:    movd %xmm1, %esi
+; X86-SSE42-NEXT:    pextrd $2, %xmm1, %eax
+; X86-SSE42-NEXT:    cmpl %esi, %eax
+; X86-SSE42-NEXT:    movl %edx, %edi
+; X86-SSE42-NEXT:    sbbl %ecx, %edi
+; X86-SSE42-NEXT:    cmovll %esi, %eax
+; X86-SSE42-NEXT:    cmovll %ecx, %edx
+; X86-SSE42-NEXT:    popl %esi
+; X86-SSE42-NEXT:    popl %edi
 ; X86-SSE42-NEXT:    retl
 ;
 ; X64-SSE42-LABEL: test_v4i64:
@@ -302,14 +294,22 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v4i64:
 ; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
 ; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %ecx, %edi
+; X86-AVX1-NEXT:    cmovll %esi, %eax
+; X86-AVX1-NEXT:    cmovll %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -327,14 +327,22 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v4i64:
 ; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %ecx, %edi
+; X86-AVX2-NEXT:    cmovll %esi, %eax
+; X86-AVX2-NEXT:    cmovll %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -379,74 +387,75 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %ebx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
 ; X86-SSE2-NEXT:    subl $16, %esp
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,0,2147483648,0]
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm7
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm7, %xmm4
-; X86-SSE2-NEXT:    pand %xmm4, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm4
-; X86-SSE2-NEXT:    por %xmm0, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm7
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm7, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm2
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm4
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
-; X86-SSE2-NEXT:    por %xmm4, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovll %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %ebx
+; X86-SSE2-NEXT:    cmovll %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ebx
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovgel %ebx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 20(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    leal -12(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
+; X86-SSE2-NEXT:    popl %ebx
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -504,72 +513,69 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovgq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v8i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $16, %esp
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm5
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm5
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm7
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm7, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm3
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm6
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE41-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovll %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovll %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %ecx, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v8i64:
 ; X64-SSE41:       # %bb.0:
@@ -630,33 +636,6 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v8i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $16, %esp
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm4
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
-; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE42-NEXT:    movapd %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
-; X86-SSE42-NEXT:    movd %xmm1, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v8i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm4
@@ -678,6 +657,8 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v8i64:
 ; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm4
@@ -686,11 +667,17 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X86-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm1
 ; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %ecx, %edi
+; X86-AVX1-NEXT:    cmovll %esi, %eax
+; X86-AVX1-NEXT:    cmovll %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -713,16 +700,24 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v8i64:
 ; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
 ; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
 ; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %ecx, %edi
+; X86-AVX2-NEXT:    cmovll %esi, %eax
+; X86-AVX2-NEXT:    cmovll %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -772,141 +767,131 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %ebx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
-; X86-SSE2-NEXT:    subl $32, %esp
-; X86-SSE2-NEXT:    movaps %xmm2, (%esp) # 16-byte Spill
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa 40(%ebp), %xmm6
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,0,2147483648,0]
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm0
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm4
-; X86-SSE2-NEXT:    movdqa 72(%ebp), %xmm7
-; X86-SSE2-NEXT:    pand %xmm4, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm4
-; X86-SSE2-NEXT:    por %xmm1, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa 24(%ebp), %xmm6
-; X86-SSE2-NEXT:    pand %xmm1, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm7, %xmm1
-; X86-SSE2-NEXT:    por %xmm5, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm5
-; X86-SSE2-NEXT:    movdqa 56(%ebp), %xmm0
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm5
-; X86-SSE2-NEXT:    por %xmm2, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa (%esp), %xmm7 # 16-byte Reload
-; X86-SSE2-NEXT:    movdqa %xmm7, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm6
-; X86-SSE2-NEXT:    pand %xmm6, %xmm7
-; X86-SSE2-NEXT:    movdqa 56(%ebp), %xmm2
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm6
-; X86-SSE2-NEXT:    por %xmm7, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm0
-; X86-SSE2-NEXT:    por %xmm5, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm5, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm4
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm4, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm4, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm0, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    subl $16, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovll %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %ebx
+; X86-SSE2-NEXT:    cmovll %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ebx
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovgel %ebx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 20(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 28(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movl 36(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 32(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 44(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 52(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 48(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 60(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movl 68(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 64(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 76(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 84(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 80(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    leal -12(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
+; X86-SSE2-NEXT:    popl %ebx
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -1024,133 +1009,125 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovgq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v16i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $48, %esp
-; X86-SSE41-NEXT:    movaps %xmm2, (%esp) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    movdqa 40(%ebp), %xmm2
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm7
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm7, %xmm0
-; X86-SSE41-NEXT:    movdqa 72(%ebp), %xmm5
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
-; X86-SSE41-NEXT:    movapd %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 24(%ebp), %xmm7
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE41-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 56(%ebp), %xmm1
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa (%esp), %xmm6 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm2
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm7, %xmm2
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm2
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm5
-; X86-SSE41-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm2
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovll %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovll %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %ecx, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 28(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    movl 36(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 32(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 44(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 52(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 48(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 60(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    movl 68(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 64(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 76(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 84(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 80(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v16i64:
 ; X64-SSE41:       # %bb.0:
@@ -1263,49 +1240,6 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v16i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $16, %esp
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 72(%ebp), %xmm4
-; X86-SSE42-NEXT:    movdqa 56(%ebp), %xmm5
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE42-NEXT:    movdqa 24(%ebp), %xmm2
-; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm3
-; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
-; X86-SSE42-NEXT:    movdqa 40(%ebp), %xmm3
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
-; X86-SSE42-NEXT:    movapd %xmm3, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm4
-; X86-SSE42-NEXT:    movapd %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE42-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm4
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
-; X86-SSE42-NEXT:    movd %xmm1, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v16i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm8
@@ -1341,33 +1275,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX1:       # %bb.0:
 ; X86-AVX1-NEXT:    pushl %ebp
 ; X86-AVX1-NEXT:    movl %esp, %ebp
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    andl $-32, %esp
 ; X86-AVX1-NEXT:    subl $32, %esp
-; X86-AVX1-NEXT:    vmovdqa 8(%ebp), %xmm3
-; X86-AVX1-NEXT:    vmovdqa 24(%ebp), %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm5
-; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm3, %xmm3
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm5
-; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm2, %xmm5
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
-; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm6
-; X86-AVX1-NEXT:    vblendvpd %xmm6, %xmm1, %xmm4, %xmm1
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %ecx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm4
-; X86-AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm2, %xmm0
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm5, %xmm1
-; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm5, %xmm3, %xmm1
-; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX1-NEXT:    movl %ebp, %esp
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX1-NEXT:    cmovll %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmovll %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %ecx, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %ecx, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm2, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %ecx, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    movl 12(%ebp), %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %edi, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    movl 20(%ebp), %esi
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    movl 16(%ebp), %edi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %esi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    movl 24(%ebp), %esi
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %ecx, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    movl 36(%ebp), %edi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %edi, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    leal -8(%ebp), %esp
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    popl %ebp
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1403,24 +1427,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX2:       # %bb.0:
 ; X86-AVX2-NEXT:    pushl %ebp
 ; X86-AVX2-NEXT:    movl %esp, %ebp
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    andl $-32, %esp
 ; X86-AVX2-NEXT:    subl $32, %esp
-; X86-AVX2-NEXT:    vmovdqa 8(%ebp), %ymm3
-; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm1, %ymm4
-; X86-AVX2-NEXT:    vblendvpd %ymm4, %ymm1, %ymm3, %ymm1
-; X86-AVX2-NEXT:    vpcmpgtq %ymm2, %ymm0, %ymm3
-; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm2, %ymm0
-; X86-AVX2-NEXT:    vpcmpgtq %ymm1, %ymm0, %ymm2
-; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
-; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX2-NEXT:    movl %ebp, %esp
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %ecx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX2-NEXT:    cmovll %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmovll %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm0
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %ecx, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %ecx, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm2, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %ecx, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    movl 12(%ebp), %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %edi, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    movl 20(%ebp), %esi
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    movl 16(%ebp), %edi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %esi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    movl 24(%ebp), %esi
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %ecx, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    movl 36(%ebp), %edi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %edi, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    leal -8(%ebp), %esp
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    popl %ebp
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1479,17 +1602,27 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 define i32 @test_v2i32(<2 x i32> %a0) nounwind {
 ; SSE2-LABEL: test_v2i32:
 ; SSE2:       # %bb.0:
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
+; SSE2-NEXT:    movd %eax, %xmm1
+; SSE2-NEXT:    movaps %xmm0, %xmm2
+; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm1[0,0]
+; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,u,u]
 ; SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
-; SSE2-NEXT:    pand %xmm2, %xmm0
+; SSE2-NEXT:    andps %xmm2, %xmm0
 ; SSE2-NEXT:    pandn %xmm1, %xmm2
 ; SSE2-NEXT:    por %xmm0, %xmm2
-; SSE2-NEXT:    movd %xmm2, %eax
+; SSE2-NEXT:    movd %xmm2, %ecx
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; SSE2-NEXT:    movd %xmm0, %eax
+; SSE2-NEXT:    cmpl %eax, %ecx
+; SSE2-NEXT:    cmovgl %ecx, %eax
 ; SSE2-NEXT:    ret{{[l|q]}}
 ;
 ; SSE4-LABEL: test_v2i32:
 ; SSE4:       # %bb.0:
+; SSE4-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
+; SSE4-NEXT:    pinsrd $2, %eax, %xmm0
+; SSE4-NEXT:    pinsrd $3, %eax, %xmm0
 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
 ; SSE4-NEXT:    pmaxsd %xmm0, %xmm1
 ; SSE4-NEXT:    movd %xmm1, %eax
@@ -1497,6 +1630,9 @@ define i32 @test_v2i32(<2 x i32> %a0) nounwind {
 ;
 ; AVX-LABEL: test_v2i32:
 ; AVX:       # %bb.0:
+; AVX-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
+; AVX-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
 ; AVX-NEXT:    vpmaxsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vmovd %xmm0, %eax
@@ -2012,54 +2148,15 @@ define i32 @test_v32i32(<32 x i32> %a0) nounwind {
 ;
 
 define i16 @test_v2i16(<2 x i16> %a0) nounwind {
-; SSE-LABEL: test_v2i16:
-; SSE:       # %bb.0:
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrld $16, %xmm1
-; SSE-NEXT:    pmaxsw %xmm0, %xmm1
-; SSE-NEXT:    movd %xmm1, %eax
-; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v2i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i16 @llvm.vector.reduce.smax.v2i16(<2 x i16> %a0)
-  ret i16 %1
-}
-
-define i16 @test_v4i16(<4 x i16> %a0) nounwind {
-; SSE-LABEL: test_v4i16:
-; SSE:       # %bb.0:
-; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE-NEXT:    pmaxsw %xmm0, %xmm1
-; SSE-NEXT:    movdqa %xmm1, %xmm0
-; SSE-NEXT:    psrld $16, %xmm0
-; SSE-NEXT:    pmaxsw %xmm1, %xmm0
-; SSE-NEXT:    movd %xmm0, %eax
-; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v4i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i16 @llvm.vector.reduce.smax.v4i16(<4 x i16> %a0)
-  ret i16 %1
-}
-
-define i16 @test_v8i16(<8 x i16> %a0) nounwind {
-; SSE2-LABEL: test_v8i16:
+; SSE2-LABEL: test_v2i16:
 ; SSE2:       # %bb.0:
+; SSE2-NEXT:    movl $32768, %eax # imm = 0x8000
+; SSE2-NEXT:    pinsrw $2, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $3, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $4, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $5, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $6, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $7, %eax, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
@@ -2071,8 +2168,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; SSE2-NEXT:    ret{{[l|q]}}
 ;
-; X86-SSE4-LABEL: test_v8i16:
+; X86-SSE4-LABEL: test_v2i16:
 ; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $32768, %eax # imm = 0x8000
+; X86-SSE4-NEXT:    pinsrw $2, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $3, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
 ; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X86-SSE4-NEXT:    movd %xmm0, %eax
@@ -2080,8 +2184,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-SSE4-NEXT:    retl
 ;
-; X64-SSE4-LABEL: test_v8i16:
+; X64-SSE4-LABEL: test_v2i16:
 ; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $32768, %eax # imm = 0x8000
+; X64-SSE4-NEXT:    pinsrw $2, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $3, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X64-SSE4-NEXT:    movd %xmm0, %eax
@@ -2089,8 +2200,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-SSE4-NEXT:    retq
 ;
-; X86-AVX-LABEL: test_v8i16:
+; X86-AVX-LABEL: test_v2i16:
 ; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $32768, %eax # imm = 0x8000
+; X86-AVX-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
@@ -2098,8 +2216,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    retl
 ;
-; X64-AVX-LABEL: test_v8i16:
+; X64-AVX-LABEL: test_v2i16:
 ; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $32768, %eax # imm = 0x8000
+; X64-AVX-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
@@ -2107,8 +2232,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-AVX-NEXT:    retq
 ;
-; AVX512BW-LABEL: test_v8i16:
+; AVX512BW-LABEL: test_v2i16:
 ; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $32768, %eax # imm = 0x8000
+; AVX512BW-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
@@ -2116,22 +2248,33 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
 ; AVX512BW-NEXT:    retq
 ;
-; AVX512VL-LABEL: test_v8i16:
+; AVX512VL-LABEL: test_v2i16:
 ; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $32768, %eax # imm = 0x8000
+; AVX512VL-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
 ; AVX512VL-NEXT:    xorl $32767, %eax # imm = 0x7FFF
 ; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
 ; AVX512VL-NEXT:    retq
-  %1 = call i16 @llvm.vector.reduce.smax.v8i16(<8 x i16> %a0)
+  %1 = call i16 @llvm.vector.reduce.smax.v2i16(<2 x i16> %a0)
   ret i16 %1
 }
 
-define i16 @test_v16i16(<16 x i16> %a0) nounwind {
-; SSE2-LABEL: test_v16i16:
+define i16 @test_v4i16(<4 x i16> %a0) nounwind {
+; SSE2-LABEL: test_v4i16:
 ; SSE2:       # %bb.0:
-; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
+; SSE2-NEXT:    movl $32768, %eax # imm = 0x8000
+; SSE2-NEXT:    pinsrw $4, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $5, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $6, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $7, %eax, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
 ; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
@@ -2143,9 +2286,13 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; SSE2-NEXT:    ret{{[l|q]}}
 ;
-; X86-SSE4-LABEL: test_v16i16:
+; X86-SSE4-LABEL: test_v4i16:
 ; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    pmaxsw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movl $32768, %eax # imm = 0x8000
+; X86-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
 ; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X86-SSE4-NEXT:    movd %xmm0, %eax
@@ -2153,9 +2300,13 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
 ; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-SSE4-NEXT:    retl
 ;
-; X64-SSE4-LABEL: test_v16i16:
+; X64-SSE4-LABEL: test_v4i16:
 ; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    pmaxsw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movl $32768, %eax # imm = 0x8000
+; X64-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X64-SSE4-NEXT:    movd %xmm0, %eax
@@ -2163,29 +2314,194 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
 ; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-SSE4-NEXT:    retq
 ;
-; X86-AVX1-LABEL: test_v16i16:
-; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
-; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
-; X86-AVX1-NEXT:    vzeroupper
-; X86-AVX1-NEXT:    retl
+; X86-AVX-LABEL: test_v4i16:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $32768, %eax # imm = 0x8000
+; X86-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX-NEXT:    retl
 ;
-; X64-AVX1-LABEL: test_v16i16:
-; X64-AVX1:       # %bb.0:
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
-; X64-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
-; X64-AVX1-NEXT:    vzeroupper
-; X64-AVX1-NEXT:    retq
+; X64-AVX-LABEL: test_v4i16:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $32768, %eax # imm = 0x8000
+; X64-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v4i16:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $32768, %eax # imm = 0x8000
+; AVX512BW-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v4i16:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $32768, %eax # imm = 0x8000
+; AVX512VL-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    retq
+  %1 = call i16 @llvm.vector.reduce.smax.v4i16(<4 x i16> %a0)
+  ret i16 %1
+}
+
+define i16 @test_v8i16(<8 x i16> %a0) nounwind {
+; SSE2-LABEL: test_v8i16:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrld $16, %xmm1
+; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
+; SSE2-NEXT:    movd %xmm1, %eax
+; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; SSE2-NEXT:    ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: test_v8i16:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v8i16:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v8i16:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v8i16:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v8i16:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v8i16:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    retq
+  %1 = call i16 @llvm.vector.reduce.smax.v8i16(<8 x i16> %a0)
+  ret i16 %1
+}
+
+define i16 @test_v16i16(<16 x i16> %a0) nounwind {
+; SSE2-LABEL: test_v16i16:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
+; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; SSE2-NEXT:    pmaxsw %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrld $16, %xmm1
+; SSE2-NEXT:    pmaxsw %xmm0, %xmm1
+; SSE2-NEXT:    movd %xmm1, %eax
+; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; SSE2-NEXT:    ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: test_v16i16:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pmaxsw %xmm1, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v16i16:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    pmaxsw %xmm1, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v16i16:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v16i16:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxsw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    xorl $32767, %eax # imm = 0x7FFF
+; X64-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT:    vzeroupper
+; X64-AVX1-NEXT:    retq
 ;
 ; X86-AVX2-LABEL: test_v16i16:
 ; X86-AVX2:       # %bb.0:
@@ -2602,42 +2918,67 @@ define i16 @test_v64i16(<64 x i16> %a0) nounwind {
 ;
 
 define i8 @test_v2i8(<2 x i8> %a0) nounwind {
-; SSE2-LABEL: test_v2i8:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    psrlw $8, %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
-; SSE2-NEXT:    pand %xmm2, %xmm0
-; SSE2-NEXT:    pandn %xmm1, %xmm2
-; SSE2-NEXT:    por %xmm0, %xmm2
-; SSE2-NEXT:    movd %xmm2, %eax
-; SSE2-NEXT:    # kill: def $al killed $al killed $eax
-; SSE2-NEXT:    ret{{[l|q]}}
-;
-; SSE4-LABEL: test_v2i8:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrlw $8, %xmm1
-; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
-; SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v2i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i8 @llvm.vector.reduce.smax.v2i8(<2 x i8> %a0)
-  ret i8 %1
-}
-
-define i8 @test_v4i8(<4 x i8> %a0) nounwind {
-; X86-SSE2-LABEL: test_v4i8:
+; X86-SSE2-LABEL: test_v2i8:
 ; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl $128, %eax
+; X86-SSE2-NEXT:    movd %eax, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE2-NEXT:    psllq $40, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm3, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psllq $48, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm0, %xmm3
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    psllq $56, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
+; X86-SSE2-NEXT:    por %xmm3, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
 ; X86-SSE2-NEXT:    psrld $16, %xmm2
 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
@@ -2656,15 +2997,74 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
 ; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X86-SSE2-NEXT:    retl
 ;
-; X64-SSE2-LABEL: test_v4i8:
+; X64-SSE2-LABEL: test_v2i8:
 ; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE2-NEXT:    psrld $16, %xmm1
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
+; X64-SSE2-NEXT:    movl $128, %eax
+; X64-SSE2-NEXT:    movd %eax, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    psllq $40, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm2, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psllq $48, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm3, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    psllq $56, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm0
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
 ; X64-SSE2-NEXT:    por %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X64-SSE2-NEXT:    por %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrld $16, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
@@ -2676,27 +3076,463 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
 ; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X64-SSE2-NEXT:    retq
 ;
-; SSE4-LABEL: test_v4i8:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrld $16, %xmm1
-; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
-; SSE4-NEXT:    movdqa %xmm1, %xmm0
-; SSE4-NEXT:    psrlw $8, %xmm0
-; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
-; SSE4-NEXT:    movd %xmm0, %eax
-; SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
+; X86-SSE4-LABEL: test_v2i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $128, %eax
+; X86-SSE4-NEXT:    pinsrb $2, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $3, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    xorb $127, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
 ;
-; AVX-LABEL: test_v4i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X64-SSE4-LABEL: test_v2i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $128, %eax
+; X64-SSE4-NEXT:    pinsrb $2, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $3, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    xorb $127, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v2i8:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $128, %eax
+; X86-AVX-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    xorb $127, %al
+; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v2i8:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $128, %eax
+; X64-AVX-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    xorb $127, %al
+; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v2i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $128, %eax
+; AVX512BW-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    xorb $127, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v2i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $128, %eax
+; AVX512VL-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    xorb $127, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
+  %1 = call i8 @llvm.vector.reduce.smax.v2i8(<2 x i8> %a0)
+  ret i8 %1
+}
+
+define i8 @test_v4i8(<4 x i8> %a0) nounwind {
+; X86-SSE2-LABEL: test_v4i8:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl $128, %eax
+; X86-SSE2-NEXT:    movd %eax, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE2-NEXT:    psllq $40, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm3, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psllq $48, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm0, %xmm3
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    psllq $56, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
+; X86-SSE2-NEXT:    por %xmm3, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psrld $16, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: test_v4i8:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movl $128, %eax
+; X64-SSE2-NEXT:    movd %eax, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    psllq $40, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm2, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psllq $48, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm3, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    psllq $56, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm0
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X64-SSE2-NEXT:    por %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X64-SSE2-NEXT:    por %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrld $16, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: test_v4i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $128, %eax
+; X86-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    xorb $127, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v4i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $128, %eax
+; X64-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    xorb $127, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v4i8:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $128, %eax
+; X86-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    xorb $127, %al
+; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v4i8:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $128, %eax
+; X64-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    xorb $127, %al
+; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v4i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $128, %eax
+; AVX512BW-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    xorb $127, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v4i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $128, %eax
+; AVX512VL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    xorb $127, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.smax.v4i8(<4 x i8> %a0)
   ret i8 %1
 }
@@ -2704,81 +3540,235 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
 define i8 @test_v8i8(<8 x i8> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v8i8:
 ; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movl $128, %eax
+; X86-SSE2-NEXT:    movd %eax, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X86-SSE2-NEXT:    por %xmm2, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psrld $16, %xmm2
 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
 ; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
 ; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    psrld $16, %xmm2
 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    psrlw $8, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
 ; X86-SSE2-NEXT:    movd %xmm2, %eax
 ; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v8i8:
 ; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
+; X64-SSE2-NEXT:    movl $128, %eax
+; X64-SSE2-NEXT:    movd %eax, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
 ; X64-SSE2-NEXT:    por %xmm0, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X64-SSE2-NEXT:    psrld $16, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
 ; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
 ; X64-SSE2-NEXT:    pand %xmm1, %xmm2
 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
 ; X64-SSE2-NEXT:    por %xmm2, %xmm1
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    psrld $16, %xmm0
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
 ; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
 ; X64-SSE2-NEXT:    pand %xmm2, %xmm1
 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
 ; X64-SSE2-NEXT:    por %xmm1, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %eax
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X64-SSE2-NEXT:    retq
 ;
-; SSE4-LABEL: test_v8i8:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
-; SSE4-NEXT:    movdqa %xmm1, %xmm0
-; SSE4-NEXT:    psrld $16, %xmm0
-; SSE4-NEXT:    pmaxsb %xmm1, %xmm0
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrlw $8, %xmm1
-; SSE4-NEXT:    pmaxsb %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
-; SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
+; X86-SSE4-LABEL: test_v8i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $128, %eax
+; X86-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    xorb $127, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
 ;
-; AVX-LABEL: test_v8i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X64-SSE4-LABEL: test_v8i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $128, %eax
+; X64-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    xorb $127, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v8i8:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $128, %eax
+; X86-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    xorb $127, %al
+; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v8i8:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $128, %eax
+; X64-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    xorb $127, %al
+; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v8i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $128, %eax
+; AVX512BW-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    xorb $127, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v8i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $128, %eax
+; AVX512VL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    xorb $127, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.smax.v8i8(<8 x i8> %a0)
   ret i8 %1
 }
@@ -3688,3 +4678,5 @@ declare i8 @llvm.vector.reduce.smax.v16i8(<16 x i8>)
 declare i8 @llvm.vector.reduce.smax.v32i8(<32 x i8>)
 declare i8 @llvm.vector.reduce.smax.v64i8(<64 x i8>)
 declare i8 @llvm.vector.reduce.smax.v128i8(<128 x i8>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; SSE: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-smin.ll b/llvm/test/CodeGen/X86/vector-reduce-smin.ll
index c010290c0d60d..df8d95fc2a315 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-smin.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-smin.ll
@@ -19,25 +19,22 @@
 define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v2i64:
 ; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm3
-; X86-SSE2-NEXT:    pand %xmm3, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    movd %xmm3, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm1, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm1, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    cmovll %esi, %eax
+; X86-SSE2-NEXT:    cmovll %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v2i64:
@@ -49,26 +46,22 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovlq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v2i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm4
-; X86-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm5, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    movd %xmm0, %esi
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %ecx, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    cmovll %esi, %eax
+; X86-SSE4-NEXT:    cmovll %ecx, %edx
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v2i64:
 ; X64-SSE41:       # %bb.0:
@@ -90,17 +83,6 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm3, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v2i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v2i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
@@ -113,11 +95,19 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ;
 ; X86-AVX-LABEL: test_v2i64:
 ; X86-AVX:       # %bb.0:
-; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX-NEXT:    pushl %edi
+; X86-AVX-NEXT:    pushl %esi
+; X86-AVX-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX-NEXT:    vmovd %xmm0, %esi
+; X86-AVX-NEXT:    cmpl %eax, %esi
+; X86-AVX-NEXT:    movl %ecx, %edi
+; X86-AVX-NEXT:    sbbl %edx, %edi
+; X86-AVX-NEXT:    cmovll %esi, %eax
+; X86-AVX-NEXT:    cmovll %ecx, %edx
+; X86-AVX-NEXT:    popl %esi
+; X86-AVX-NEXT:    popl %edi
 ; X86-AVX-NEXT:    retl
 ;
 ; X64-AVX-LABEL: test_v2i64:
@@ -150,40 +140,37 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v4i64:
 ; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0]
 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm6, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm4, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm5, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,3,3,3]
 ; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    cmovll %esi, %eax
+; X86-SSE2-NEXT:    cmovll %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v4i64:
@@ -212,35 +199,33 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE41-LABEL: test_v4i64:
 ; X86-SSE41:       # %bb.0:
+; X86-SSE41-NEXT:    pushl %edi
+; X86-SSE41-NEXT:    pushl %esi
 ; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm3 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm6, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm4, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = [2147483648,2147483648]
+; X86-SSE41-NEXT:    movdqa %xmm2, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
+; X86-SSE41-NEXT:    movdqa %xmm0, %xmm4
+; X86-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
 ; X86-SSE41-NEXT:    pand %xmm5, %xmm3
 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
 ; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE41-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE41-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE41-NEXT:    extractps $2, %xmm1, %eax
+; X86-SSE41-NEXT:    movd %xmm1, %esi
+; X86-SSE41-NEXT:    cmpl %eax, %esi
+; X86-SSE41-NEXT:    movl %ecx, %edi
+; X86-SSE41-NEXT:    sbbl %edx, %edi
+; X86-SSE41-NEXT:    cmovll %esi, %eax
+; X86-SSE41-NEXT:    cmovll %ecx, %edx
+; X86-SSE41-NEXT:    popl %esi
+; X86-SSE41-NEXT:    popl %edi
 ; X86-SSE41-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v4i64:
@@ -277,16 +262,23 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE42-LABEL: test_v4i64:
 ; X86-SSE42:       # %bb.0:
+; X86-SSE42-NEXT:    pushl %edi
+; X86-SSE42-NEXT:    pushl %esi
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm2
 ; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
 ; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
 ; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
+; X86-SSE42-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE42-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE42-NEXT:    extractps $2, %xmm1, %eax
+; X86-SSE42-NEXT:    movd %xmm1, %esi
+; X86-SSE42-NEXT:    cmpl %eax, %esi
+; X86-SSE42-NEXT:    movl %ecx, %edi
+; X86-SSE42-NEXT:    sbbl %edx, %edi
+; X86-SSE42-NEXT:    cmovll %esi, %eax
+; X86-SSE42-NEXT:    cmovll %ecx, %edx
+; X86-SSE42-NEXT:    popl %esi
+; X86-SSE42-NEXT:    popl %edi
 ; X86-SSE42-NEXT:    retl
 ;
 ; X64-SSE42-LABEL: test_v4i64:
@@ -304,14 +296,22 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v4i64:
 ; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
 ; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %ecx, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    cmovll %esi, %eax
+; X86-AVX1-NEXT:    cmovll %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -329,14 +329,22 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v4i64:
 ; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %ecx, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    cmovll %esi, %eax
+; X86-AVX2-NEXT:    cmovll %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -381,74 +389,72 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
-; X86-SSE2-NEXT:    subl $16, %esp
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,0,2147483648,0]
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm6, %xmm4
-; X86-SSE2-NEXT:    pand %xmm4, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm4
-; X86-SSE2-NEXT:    por %xmm1, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm5, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm4, %xmm0
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovll %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovll %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %ecx, %esi
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movd %xmm3, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 20(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    leal -8(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -506,72 +512,69 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovlq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v8i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $16, %esp
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm4
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm5 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm6
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm6, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm5, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm4, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm5, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm5
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovll %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovll %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %ecx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v8i64:
 ; X64-SSE41:       # %bb.0:
@@ -631,33 +634,6 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v8i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $16, %esp
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm4
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
-; X86-SSE42-NEXT:    movapd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
-; X86-SSE42-NEXT:    movd %xmm1, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v8i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm4
@@ -679,6 +655,8 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v8i64:
 ; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
 ; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm2
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
@@ -687,11 +665,17 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X86-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
 ; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm0, %xmm1
 ; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm2, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %ecx, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    cmovll %esi, %eax
+; X86-AVX1-NEXT:    cmovll %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -714,16 +698,24 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v8i64:
 ; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
 ; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
 ; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %ecx, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    cmovll %esi, %eax
+; X86-AVX2-NEXT:    cmovll %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -773,143 +765,128 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
-; X86-SSE2-NEXT:    subl $48, %esp
-; X86-SSE2-NEXT:    movaps %xmm1, (%esp) # 16-byte Spill
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa 56(%ebp), %xmm5
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,0,2147483648,0]
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm0
-; X86-SSE2-NEXT:    movdqa 24(%ebp), %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm4
-; X86-SSE2-NEXT:    pand %xmm4, %xmm2
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm4
-; X86-SSE2-NEXT:    por %xmm2, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm0
-; X86-SSE2-NEXT:    movdqa 72(%ebp), %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm7
-; X86-SSE2-NEXT:    pand %xmm2, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm2
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movdqa 40(%ebp), %xmm6
-; X86-SSE2-NEXT:    pand %xmm0, %xmm7
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm0
-; X86-SSE2-NEXT:    por %xmm7, %xmm0
-; X86-SSE2-NEXT:    movdqa (%esp), %xmm4 # 16-byte Reload
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm5
-; X86-SSE2-NEXT:    pand %xmm5, %xmm4
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm5
-; X86-SSE2-NEXT:    por %xmm4, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm6, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
-; X86-SSE2-NEXT:    por %xmm5, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm4 # 16-byte Reload
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm7
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm7, %xmm5
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pandn %xmm4, %xmm5
-; X86-SSE2-NEXT:    por %xmm2, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
-; X86-SSE2-NEXT:    por %xmm5, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovll %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovll %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %ecx, %esi
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movd %xmm3, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 20(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 28(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movl 36(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 32(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 44(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 52(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 48(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 60(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movl 68(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    movl 64(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 76(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 84(%ebp), %esi
+; X86-SSE2-NEXT:    cmovgel %edi, %edx
+; X86-SSE2-NEXT:    movl 80(%ebp), %edi
+; X86-SSE2-NEXT:    cmovgel %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    cmovgel %edi, %eax
+; X86-SSE2-NEXT:    cmovgel %esi, %edx
+; X86-SSE2-NEXT:    leal -8(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -1027,135 +1004,125 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovlq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v16i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $48, %esp
-; X86-SSE41-NEXT:    movaps %xmm1, (%esp) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    movdqa 56(%ebp), %xmm1
-; X86-SSE41-NEXT:    pmovzxdq {{.*#+}} xmm4 = [2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm5
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    movdqa 24(%ebp), %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE41-NEXT:    movapd %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    movdqa 72(%ebp), %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm7
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 40(%ebp), %xmm3
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm2
-; X86-SSE41-NEXT:    movdqa (%esp), %xmm5 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
-; X86-SSE41-NEXT:    movapd %xmm3, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm6, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm5
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm3, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm4, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovll %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovll %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %ecx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 28(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    movl 36(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 32(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 44(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 52(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 48(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 60(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    movl 68(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    movl 64(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 76(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 84(%ebp), %esi
+; X86-SSE4-NEXT:    cmovgel %edi, %edx
+; X86-SSE4-NEXT:    movl 80(%ebp), %edi
+; X86-SSE4-NEXT:    cmovgel %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    cmovgel %edi, %eax
+; X86-SSE4-NEXT:    cmovgel %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v16i64:
 ; X64-SSE41:       # %bb.0:
@@ -1267,49 +1234,6 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v16i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $16, %esp
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE42-NEXT:    movdqa 40(%ebp), %xmm4
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
-; X86-SSE42-NEXT:    movdqa 72(%ebp), %xmm1
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE42-NEXT:    movdqa 24(%ebp), %xmm5
-; X86-SSE42-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm5
-; X86-SSE42-NEXT:    movdqa 56(%ebp), %xmm3
-; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm3
-; X86-SSE42-NEXT:    movapd %xmm3, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
-; X86-SSE42-NEXT:    movapd %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm1, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v16i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm8
@@ -1345,33 +1269,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX1:       # %bb.0:
 ; X86-AVX1-NEXT:    pushl %ebp
 ; X86-AVX1-NEXT:    movl %esp, %ebp
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    andl $-32, %esp
 ; X86-AVX1-NEXT:    subl $32, %esp
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm5
-; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm3, %xmm4, %xmm3
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm4
-; X86-AVX1-NEXT:    vmovdqa 8(%ebp), %xmm5
-; X86-AVX1-NEXT:    vmovdqa 24(%ebp), %xmm6
-; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm7
-; X86-AVX1-NEXT:    vblendvpd %xmm7, %xmm4, %xmm6, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm2, %xmm6
-; X86-AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm2, %xmm0
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm5, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm5, %xmm1
-; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm1
-; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm4, %xmm1
-; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX1-NEXT:    movl %ebp, %esp
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vmovd %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX1-NEXT:    cmovll %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmovll %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %ecx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %ecx, %esi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm2, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %ecx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    movl 12(%ebp), %edi
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %edi, %esi
+; X86-AVX1-NEXT:    movl 20(%ebp), %esi
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    movl 16(%ebp), %edi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %esi, %ecx
+; X86-AVX1-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovgel %esi, %edx
+; X86-AVX1-NEXT:    movl 24(%ebp), %esi
+; X86-AVX1-NEXT:    cmovgel %edi, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %ecx, %edi
+; X86-AVX1-NEXT:    movl 36(%ebp), %edi
+; X86-AVX1-NEXT:    cmovgel %ecx, %edx
+; X86-AVX1-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovgel %esi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %edi, %esi
+; X86-AVX1-NEXT:    cmovgel %ecx, %eax
+; X86-AVX1-NEXT:    cmovgel %edi, %edx
+; X86-AVX1-NEXT:    leal -8(%ebp), %esp
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    popl %ebp
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1407,24 +1421,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX2:       # %bb.0:
 ; X86-AVX2-NEXT:    pushl %ebp
 ; X86-AVX2-NEXT:    movl %esp, %ebp
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    andl $-32, %esp
 ; X86-AVX2-NEXT:    subl $32, %esp
-; X86-AVX2-NEXT:    vmovdqa 8(%ebp), %ymm3
-; X86-AVX2-NEXT:    vpcmpgtq %ymm0, %ymm2, %ymm4
-; X86-AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
-; X86-AVX2-NEXT:    vpcmpgtq %ymm1, %ymm3, %ymm2
-; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm3, %ymm1
-; X86-AVX2-NEXT:    vpcmpgtq %ymm0, %ymm1, %ymm2
-; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
-; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpcmpgtq %xmm0, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX2-NEXT:    movl %ebp, %esp
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vmovd %xmm0, %ecx
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX2-NEXT:    cmovll %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmovll %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm0
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %ecx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %ecx, %esi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm2, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %ecx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    movl 12(%ebp), %edi
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %edi, %esi
+; X86-AVX2-NEXT:    movl 20(%ebp), %esi
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    movl 16(%ebp), %edi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %esi, %ecx
+; X86-AVX2-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovgel %esi, %edx
+; X86-AVX2-NEXT:    movl 24(%ebp), %esi
+; X86-AVX2-NEXT:    cmovgel %edi, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %ecx, %edi
+; X86-AVX2-NEXT:    movl 36(%ebp), %edi
+; X86-AVX2-NEXT:    cmovgel %ecx, %edx
+; X86-AVX2-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovgel %esi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %edi, %esi
+; X86-AVX2-NEXT:    cmovgel %ecx, %eax
+; X86-AVX2-NEXT:    cmovgel %edi, %edx
+; X86-AVX2-NEXT:    leal -8(%ebp), %esp
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    popl %ebp
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1483,17 +1596,28 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 define i32 @test_v2i32(<2 x i32> %a0) nounwind {
 ; SSE2-LABEL: test_v2i32:
 ; SSE2:       # %bb.0:
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE2-NEXT:    movdqa %xmm1, %xmm2
-; SSE2-NEXT:    pcmpgtd %xmm0, %xmm2
-; SSE2-NEXT:    pand %xmm2, %xmm0
-; SSE2-NEXT:    pandn %xmm1, %xmm2
-; SSE2-NEXT:    por %xmm0, %xmm2
-; SSE2-NEXT:    movd %xmm2, %eax
+; SSE2-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
+; SSE2-NEXT:    movd %eax, %xmm1
+; SSE2-NEXT:    movaps %xmm0, %xmm2
+; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm1[0,0]
+; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483647,2147483647,u,u]
+; SSE2-NEXT:    movdqa %xmm1, %xmm3
+; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
+; SSE2-NEXT:    andps %xmm3, %xmm0
+; SSE2-NEXT:    pandn %xmm1, %xmm3
+; SSE2-NEXT:    por %xmm0, %xmm3
+; SSE2-NEXT:    movd %xmm3, %ecx
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; SSE2-NEXT:    movd %xmm0, %eax
+; SSE2-NEXT:    cmpl %eax, %ecx
+; SSE2-NEXT:    cmovll %ecx, %eax
 ; SSE2-NEXT:    ret{{[l|q]}}
 ;
 ; SSE4-LABEL: test_v2i32:
 ; SSE4:       # %bb.0:
+; SSE4-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
+; SSE4-NEXT:    pinsrd $2, %eax, %xmm0
+; SSE4-NEXT:    pinsrd $3, %eax, %xmm0
 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
 ; SSE4-NEXT:    pminsd %xmm0, %xmm1
 ; SSE4-NEXT:    movd %xmm1, %eax
@@ -1501,6 +1625,9 @@ define i32 @test_v2i32(<2 x i32> %a0) nounwind {
 ;
 ; AVX-LABEL: test_v2i32:
 ; AVX:       # %bb.0:
+; AVX-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
+; AVX-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX-NEXT:    vpinsrd $3, %eax, %xmm0, %xmm0
 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
 ; AVX-NEXT:    vpminsd %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vmovd %xmm0, %eax
@@ -2016,54 +2143,15 @@ define i32 @test_v32i32(<32 x i32> %a0) nounwind {
 ;
 
 define i16 @test_v2i16(<2 x i16> %a0) nounwind {
-; SSE-LABEL: test_v2i16:
-; SSE:       # %bb.0:
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrld $16, %xmm1
-; SSE-NEXT:    pminsw %xmm0, %xmm1
-; SSE-NEXT:    movd %xmm1, %eax
-; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v2i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i16 @llvm.vector.reduce.smin.v2i16(<2 x i16> %a0)
-  ret i16 %1
-}
-
-define i16 @test_v4i16(<4 x i16> %a0) nounwind {
-; SSE-LABEL: test_v4i16:
-; SSE:       # %bb.0:
-; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE-NEXT:    pminsw %xmm0, %xmm1
-; SSE-NEXT:    movdqa %xmm1, %xmm0
-; SSE-NEXT:    psrld $16, %xmm0
-; SSE-NEXT:    pminsw %xmm1, %xmm0
-; SSE-NEXT:    movd %xmm0, %eax
-; SSE-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v4i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i16 @llvm.vector.reduce.smin.v4i16(<4 x i16> %a0)
-  ret i16 %1
-}
-
-define i16 @test_v8i16(<8 x i16> %a0) nounwind {
-; SSE2-LABEL: test_v8i16:
+; SSE2-LABEL: test_v2i16:
 ; SSE2:       # %bb.0:
+; SSE2-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; SSE2-NEXT:    pinsrw $2, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $3, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $4, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $5, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $6, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $7, %eax, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
 ; SSE2-NEXT:    pminsw %xmm0, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
@@ -2075,8 +2163,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; SSE2-NEXT:    ret{{[l|q]}}
 ;
-; X86-SSE4-LABEL: test_v8i16:
+; X86-SSE4-LABEL: test_v2i16:
 ; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X86-SSE4-NEXT:    pinsrw $2, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $3, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
 ; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X86-SSE4-NEXT:    movd %xmm0, %eax
@@ -2084,8 +2179,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-SSE4-NEXT:    retl
 ;
-; X64-SSE4-LABEL: test_v8i16:
+; X64-SSE4-LABEL: test_v2i16:
 ; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X64-SSE4-NEXT:    pinsrw $2, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $3, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X64-SSE4-NEXT:    movd %xmm0, %eax
@@ -2093,8 +2195,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-SSE4-NEXT:    retq
 ;
-; X86-AVX-LABEL: test_v8i16:
+; X86-AVX-LABEL: test_v2i16:
 ; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X86-AVX-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
 ; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X86-AVX-NEXT:    vmovd %xmm0, %eax
@@ -2102,8 +2211,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    retl
 ;
-; X64-AVX-LABEL: test_v8i16:
+; X64-AVX-LABEL: test_v2i16:
 ; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X64-AVX-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
 ; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX-NEXT:    vmovd %xmm0, %eax
@@ -2111,8 +2227,15 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-AVX-NEXT:    retq
 ;
-; AVX512BW-LABEL: test_v8i16:
+; AVX512BW-LABEL: test_v2i16:
 ; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; AVX512BW-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
 ; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
 ; AVX512BW-NEXT:    vmovd %xmm0, %eax
@@ -2120,22 +2243,33 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
 ; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
 ; AVX512BW-NEXT:    retq
 ;
-; AVX512VL-LABEL: test_v8i16:
+; AVX512VL-LABEL: test_v2i16:
 ; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; AVX512VL-NEXT:    vpinsrw $2, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $3, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
 ; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
 ; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
 ; AVX512VL-NEXT:    vmovd %xmm0, %eax
 ; AVX512VL-NEXT:    xorl $32768, %eax # imm = 0x8000
 ; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
 ; AVX512VL-NEXT:    retq
-  %1 = call i16 @llvm.vector.reduce.smin.v8i16(<8 x i16> %a0)
+  %1 = call i16 @llvm.vector.reduce.smin.v2i16(<2 x i16> %a0)
   ret i16 %1
 }
 
-define i16 @test_v16i16(<16 x i16> %a0) nounwind {
-; SSE2-LABEL: test_v16i16:
+define i16 @test_v4i16(<4 x i16> %a0) nounwind {
+; SSE2-LABEL: test_v4i16:
 ; SSE2:       # %bb.0:
-; SSE2-NEXT:    pminsw %xmm1, %xmm0
+; SSE2-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; SSE2-NEXT:    pinsrw $4, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $5, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $6, %eax, %xmm0
+; SSE2-NEXT:    pinsrw $7, %eax, %xmm0
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
 ; SSE2-NEXT:    pminsw %xmm0, %xmm1
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
@@ -2147,9 +2281,13 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; SSE2-NEXT:    ret{{[l|q]}}
 ;
-; X86-SSE4-LABEL: test_v16i16:
+; X86-SSE4-LABEL: test_v4i16:
 ; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    pminsw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X86-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
 ; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X86-SSE4-NEXT:    movd %xmm0, %eax
@@ -2157,9 +2295,13 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
 ; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-SSE4-NEXT:    retl
 ;
-; X64-SSE4-LABEL: test_v16i16:
+; X64-SSE4-LABEL: test_v4i16:
 ; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    pminsw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X64-SSE4-NEXT:    pinsrw $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrw $7, %eax, %xmm0
 ; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
 ; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
 ; X64-SSE4-NEXT:    movd %xmm0, %eax
@@ -2167,22 +2309,187 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
 ; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-SSE4-NEXT:    retq
 ;
-; X86-AVX1-LABEL: test_v16i16:
-; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    xorl $32768, %eax # imm = 0x8000
-; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
-; X86-AVX1-NEXT:    vzeroupper
-; X86-AVX1-NEXT:    retl
+; X86-AVX-LABEL: test_v4i16:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X86-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX-NEXT:    retl
 ;
-; X64-AVX1-LABEL: test_v16i16:
-; X64-AVX1:       # %bb.0:
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X64-AVX-LABEL: test_v4i16:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; X64-AVX-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v4i16:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; AVX512BW-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    xorl $32768, %eax # imm = 0x8000
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v4i16:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $32767, %eax # imm = 0x7FFF
+; AVX512VL-NEXT:    vpinsrw $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrw $7, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    xorl $32768, %eax # imm = 0x8000
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    retq
+  %1 = call i16 @llvm.vector.reduce.smin.v4i16(<4 x i16> %a0)
+  ret i16 %1
+}
+
+define i16 @test_v8i16(<8 x i16> %a0) nounwind {
+; SSE2-LABEL: test_v8i16:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE2-NEXT:    pminsw %xmm0, %xmm1
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; SSE2-NEXT:    pminsw %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrld $16, %xmm1
+; SSE2-NEXT:    pminsw %xmm0, %xmm1
+; SSE2-NEXT:    movd %xmm1, %eax
+; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; SSE2-NEXT:    ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: test_v8i16:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v8i16:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v8i16:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v8i16:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v8i16:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    xorl $32768, %eax # imm = 0x8000
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v8i16:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    xorl $32768, %eax # imm = 0x8000
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    retq
+  %1 = call i16 @llvm.vector.reduce.smin.v8i16(<8 x i16> %a0)
+  ret i16 %1
+}
+
+define i16 @test_v16i16(<16 x i16> %a0) nounwind {
+; SSE2-LABEL: test_v16i16:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    pminsw %xmm1, %xmm0
+; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; SSE2-NEXT:    pminsw %xmm0, %xmm1
+; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; SSE2-NEXT:    pminsw %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrld $16, %xmm1
+; SSE2-NEXT:    pminsw %xmm0, %xmm1
+; SSE2-NEXT:    movd %xmm1, %eax
+; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; SSE2-NEXT:    ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: test_v16i16:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pminsw %xmm1, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v16i16:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    pminsw %xmm1, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v16i16:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    xorl $32768, %eax # imm = 0x8000
+; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v16i16:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT:    vpminsw %xmm1, %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
 ; X64-AVX1-NEXT:    vmovd %xmm0, %eax
@@ -2606,42 +2913,67 @@ define i16 @test_v64i16(<64 x i16> %a0) nounwind {
 ;
 
 define i8 @test_v2i8(<2 x i8> %a0) nounwind {
-; SSE2-LABEL: test_v2i8:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    psrlw $8, %xmm1
-; SSE2-NEXT:    movdqa %xmm1, %xmm2
-; SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
-; SSE2-NEXT:    pand %xmm2, %xmm0
-; SSE2-NEXT:    pandn %xmm1, %xmm2
-; SSE2-NEXT:    por %xmm0, %xmm2
-; SSE2-NEXT:    movd %xmm2, %eax
-; SSE2-NEXT:    # kill: def $al killed $al killed $eax
-; SSE2-NEXT:    ret{{[l|q]}}
-;
-; SSE4-LABEL: test_v2i8:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrlw $8, %xmm1
-; SSE4-NEXT:    pminsb %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
-; SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v2i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i8 @llvm.vector.reduce.smin.v2i8(<2 x i8> %a0)
-  ret i8 %1
-}
-
-define i8 @test_v4i8(<4 x i8> %a0) nounwind {
-; X86-SSE2-LABEL: test_v4i8:
+; X86-SSE2-LABEL: test_v2i8:
 ; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl $127, %eax
+; X86-SSE2-NEXT:    movd %eax, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE2-NEXT:    psllq $40, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm3, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psllq $48, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm0, %xmm3
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    psllq $56, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
+; X86-SSE2-NEXT:    por %xmm3, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
 ; X86-SSE2-NEXT:    psrld $16, %xmm2
 ; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
@@ -2660,15 +2992,74 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
 ; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X86-SSE2-NEXT:    retl
 ;
-; X64-SSE2-LABEL: test_v4i8:
+; X64-SSE2-LABEL: test_v2i8:
 ; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE2-NEXT:    psrld $16, %xmm1
+; X64-SSE2-NEXT:    movl $127, %eax
+; X64-SSE2-NEXT:    movd %eax, %xmm1
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
+; X64-SSE2-NEXT:    psllq $40, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm2, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psllq $48, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm3, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    psllq $56, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm0
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
 ; X64-SSE2-NEXT:    por %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X64-SSE2-NEXT:    por %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrld $16, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
 ; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
 ; X64-SSE2-NEXT:    psrlw $8, %xmm0
 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
@@ -2680,109 +3071,699 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
 ; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X64-SSE2-NEXT:    retq
 ;
-; SSE4-LABEL: test_v4i8:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrld $16, %xmm1
-; SSE4-NEXT:    pminsb %xmm0, %xmm1
-; SSE4-NEXT:    movdqa %xmm1, %xmm0
-; SSE4-NEXT:    psrlw $8, %xmm0
-; SSE4-NEXT:    pminsb %xmm1, %xmm0
-; SSE4-NEXT:    movd %xmm0, %eax
-; SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
+; X86-SSE4-LABEL: test_v2i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $127, %eax
+; X86-SSE4-NEXT:    pinsrb $2, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $3, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    addb $-128, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
 ;
-; AVX-LABEL: test_v4i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i8 @llvm.vector.reduce.smin.v4i8(<4 x i8> %a0)
-  ret i8 %1
-}
-
-define i8 @test_v8i8(<8 x i8> %a0) nounwind {
-; X86-SSE2-LABEL: test_v8i8:
-; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[1,1,1,1]
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
+; X64-SSE4-LABEL: test_v2i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $127, %eax
+; X64-SSE4-NEXT:    pinsrb $2, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $3, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    addb $-128, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v2i8:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $127, %eax
+; X86-AVX-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    addb $-128, %al
+; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v2i8:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $127, %eax
+; X64-AVX-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    addb $-128, %al
+; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v2i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $127, %eax
+; AVX512BW-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    addb $-128, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v2i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $127, %eax
+; AVX512VL-NEXT:    vpinsrb $2, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $3, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    addb $-128, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
+  %1 = call i8 @llvm.vector.reduce.smin.v2i8(<2 x i8> %a0)
+  ret i8 %1
+}
+
+define i8 @test_v4i8(<4 x i8> %a0) nounwind {
+; X86-SSE2-LABEL: test_v4i8:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl $127, %eax
+; X86-SSE2-NEXT:    movd %eax, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE2-NEXT:    psllq $40, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm3, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psllq $48, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm3
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X86-SSE2-NEXT:    pand %xmm0, %xmm3
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    psllq $56, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
+; X86-SSE2-NEXT:    por %xmm3, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psrld $16, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
 ; X86-SSE2-NEXT:    pand %xmm1, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
 ; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: test_v4i8:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movl $127, %eax
+; X64-SSE2-NEXT:    movd %eax, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    psllq $40, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm2, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm2, %xmm3
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psllq $48, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm3, %xmm2
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255]
+; X64-SSE2-NEXT:    pand %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    psllq $56, %xmm3
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm0
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X64-SSE2-NEXT:    por %xmm0, %xmm2
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1]
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X64-SSE2-NEXT:    por %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrld $16, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: test_v4i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $127, %eax
+; X86-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    addb $-128, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v4i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $127, %eax
+; X64-SSE4-NEXT:    pinsrb $4, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $5, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $6, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $7, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    addb $-128, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v4i8:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $127, %eax
+; X86-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    addb $-128, %al
+; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v4i8:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $127, %eax
+; X64-AVX-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    addb $-128, %al
+; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v4i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $127, %eax
+; AVX512BW-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    addb $-128, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v4i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $127, %eax
+; AVX512VL-NEXT:    vpinsrb $4, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $5, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $6, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $7, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    addb $-128, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
+  %1 = call i8 @llvm.vector.reduce.smin.v4i8(<4 x i8> %a0)
+  ret i8 %1
+}
+
+define i8 @test_v8i8(<8 x i8> %a0) nounwind {
+; X86-SSE2-LABEL: test_v8i8:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl $127, %eax
+; X86-SSE2-NEXT:    movd %eax, %xmm1
 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    psrld $16, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    psrlw $8, %xmm1
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
 ; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm2
+; X86-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X86-SSE2-NEXT:    por %xmm2, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    pcmpgtb %xmm2, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psrld $16, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X86-SSE2-NEXT:    pcmpgtb %xmm0, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X86-SSE2-NEXT:    por %xmm1, %xmm2
 ; X86-SSE2-NEXT:    movd %xmm2, %eax
 ; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v8i8:
 ; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-SSE2-NEXT:    movl $127, %eax
+; X64-SSE2-NEXT:    movd %eax, %xmm1
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X64-SSE2-NEXT:    pcmpgtb %xmm0, %xmm2
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2]
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    por %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1]
 ; X64-SSE2-NEXT:    por %xmm0, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X64-SSE2-NEXT:    psrld $16, %xmm0
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm2
+; X64-SSE2-NEXT:    pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0]
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
+; X64-SSE2-NEXT:    por %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
 ; X64-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
 ; X64-SSE2-NEXT:    pand %xmm1, %xmm2
 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
 ; X64-SSE2-NEXT:    por %xmm2, %xmm1
 ; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    psrld $16, %xmm0
 ; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
 ; X64-SSE2-NEXT:    pcmpgtb %xmm1, %xmm2
 ; X64-SSE2-NEXT:    pand %xmm2, %xmm1
 ; X64-SSE2-NEXT:    pandn %xmm0, %xmm2
 ; X64-SSE2-NEXT:    por %xmm1, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %eax
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    pcmpgtb %xmm2, %xmm1
+; X64-SSE2-NEXT:    pand %xmm1, %xmm2
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm2, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
 ; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
 ; X64-SSE2-NEXT:    retq
 ;
-; SSE4-LABEL: test_v8i8:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE4-NEXT:    pminsb %xmm0, %xmm1
-; SSE4-NEXT:    movdqa %xmm1, %xmm0
-; SSE4-NEXT:    psrld $16, %xmm0
-; SSE4-NEXT:    pminsb %xmm1, %xmm0
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrlw $8, %xmm1
-; SSE4-NEXT:    pminsb %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
-; SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
+; X86-SSE4-LABEL: test_v8i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl $127, %eax
+; X86-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X86-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X86-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    addb $-128, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
 ;
-; AVX-LABEL: test_v8i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpminsb %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X64-SSE4-LABEL: test_v8i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movl $127, %eax
+; X64-SSE4-NEXT:    pinsrb $8, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $9, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $10, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $11, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $12, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $13, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $14, %eax, %xmm0
+; X64-SSE4-NEXT:    pinsrb $15, %eax, %xmm0
+; X64-SSE4-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    addb $-128, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: test_v8i8:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl $127, %eax
+; X86-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    addb $-128, %al
+; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: test_v8i8:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    movl $127, %eax
+; X64-AVX-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    addb $-128, %al
+; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: test_v8i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    movl $127, %eax
+; AVX512BW-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    addb $-128, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v8i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    movl $127, %eax
+; AVX512VL-NEXT:    vpinsrb $8, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $9, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $10, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $11, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $12, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $13, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $14, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpinsrb $15, %eax, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpxord {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    addb $-128, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.smin.v8i8(<8 x i8> %a0)
   ret i8 %1
 }
@@ -3692,3 +4673,5 @@ declare i8 @llvm.vector.reduce.smin.v16i8(<16 x i8>)
 declare i8 @llvm.vector.reduce.smin.v32i8(<32 x i8>)
 declare i8 @llvm.vector.reduce.smin.v64i8(<64 x i8>)
 declare i8 @llvm.vector.reduce.smin.v128i8(<128 x i8>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; SSE: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-umax.ll b/llvm/test/CodeGen/X86/vector-reduce-umax.ll
index 145c27e5eb976..eef91e4fd2a6d 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-umax.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-umax.ll
@@ -19,25 +19,22 @@
 define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v2i64:
 ; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm3
-; X86-SSE2-NEXT:    pand %xmm3, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    movd %xmm3, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm1, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm1, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    cmovbl %esi, %eax
+; X86-SSE2-NEXT:    cmovbl %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v2i64:
@@ -49,26 +46,22 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovaq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v2i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm5, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    movd %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %ecx, %edi
+; X86-SSE4-NEXT:    cmovbl %esi, %eax
+; X86-SSE4-NEXT:    cmovbl %ecx, %edx
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v2i64:
 ; X64-SSE41:       # %bb.0:
@@ -90,19 +83,6 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm3, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v2i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v2i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
@@ -117,15 +97,19 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v2i64:
 ; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm3
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %ecx, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %eax
+; X86-AVX1-NEXT:    cmovbl %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    retl
 ;
 ; X64-AVX1-LABEL: test_v2i64:
@@ -142,14 +126,19 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v2i64:
 ; X86-AVX2:       # %bb.0:
-; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %ecx, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %eax
+; X86-AVX2-NEXT:    cmovbl %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    retl
 ;
 ; X64-AVX2-LABEL: test_v2i64:
@@ -185,40 +174,37 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v4i64:
 ; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
 ; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm6, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm4, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm5, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,3,3,3]
 ; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    cmovbl %esi, %eax
+; X86-SSE2-NEXT:    cmovbl %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v4i64:
@@ -247,36 +233,33 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE41-LABEL: test_v4i64:
 ; X86-SSE41:       # %bb.0:
+; X86-SSE41-NEXT:    pushl %edi
+; X86-SSE41-NEXT:    pushl %esi
 ; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm6, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm4, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm2, %xmm0
 ; X86-SSE41-NEXT:    movdqa %xmm0, %xmm4
 ; X86-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
 ; X86-SSE41-NEXT:    pand %xmm5, %xmm3
 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
 ; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE41-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE41-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE41-NEXT:    movd %xmm1, %esi
+; X86-SSE41-NEXT:    pextrd $2, %xmm1, %eax
+; X86-SSE41-NEXT:    cmpl %esi, %eax
+; X86-SSE41-NEXT:    movl %edx, %edi
+; X86-SSE41-NEXT:    sbbl %ecx, %edi
+; X86-SSE41-NEXT:    cmovbl %esi, %eax
+; X86-SSE41-NEXT:    cmovbl %ecx, %edx
+; X86-SSE41-NEXT:    popl %esi
+; X86-SSE41-NEXT:    popl %edi
 ; X86-SSE41-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v4i64:
@@ -314,21 +297,26 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE42-LABEL: test_v4i64:
 ; X86-SSE42:       # %bb.0:
+; X86-SSE42-NEXT:    pushl %edi
+; X86-SSE42-NEXT:    pushl %esi
 ; X86-SSE42-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE42-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE42-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [0,2147483648,0,2147483648]
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE42-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE42-NEXT:    pxor %xmm2, %xmm0
 ; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
+; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE42-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE42-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE42-NEXT:    movd %xmm1, %esi
+; X86-SSE42-NEXT:    pextrd $2, %xmm1, %eax
+; X86-SSE42-NEXT:    cmpl %esi, %eax
+; X86-SSE42-NEXT:    movl %edx, %edi
+; X86-SSE42-NEXT:    sbbl %ecx, %edi
+; X86-SSE42-NEXT:    cmovbl %esi, %eax
+; X86-SSE42-NEXT:    cmovbl %ecx, %edx
+; X86-SSE42-NEXT:    popl %esi
+; X86-SSE42-NEXT:    popl %edi
 ; X86-SSE42-NEXT:    retl
 ;
 ; X64-SSE42-LABEL: test_v4i64:
@@ -351,20 +339,26 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v4i64:
 ; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
 ; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
 ; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm3
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
-; X86-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm2
+; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
 ; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %ecx, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %eax
+; X86-AVX1-NEXT:    cmovbl %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -388,19 +382,25 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v4i64:
 ; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
 ; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm4
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
-; X86-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
+; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %ecx, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %eax
+; X86-AVX2-NEXT:    cmovbl %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -450,74 +450,75 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %ebx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
 ; X86-SSE2-NEXT:    subl $16, %esp
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm7
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm7, %xmm4
-; X86-SSE2-NEXT:    pand %xmm4, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm4
-; X86-SSE2-NEXT:    por %xmm0, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm7
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm7, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm2
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm4
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm0
-; X86-SSE2-NEXT:    por %xmm4, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovbl %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %ebx
+; X86-SSE2-NEXT:    cmovbl %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ebx
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovael %ebx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 20(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    leal -12(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
+; X86-SSE2-NEXT:    popl %ebx
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -575,72 +576,69 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovaq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v8i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $16, %esp
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm5
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm5
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm7
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm7, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm3
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm6
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE41-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovbl %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovbl %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %ecx, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v8i64:
 ; X64-SSE41:       # %bb.0:
@@ -701,44 +699,6 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v8i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $16, %esp
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm4
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm5 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE42-NEXT:    pxor %xmm5, %xmm6
-; X86-SSE42-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm3
-; X86-SSE42-NEXT:    pxor %xmm5, %xmm3
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
-; X86-SSE42-NEXT:    movapd %xmm4, %xmm1
-; X86-SSE42-NEXT:    xorpd %xmm5, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm2, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm5, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm1, %xmm5
-; X86-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
-; X86-SSE42-NEXT:    movd %xmm1, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v8i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm4
@@ -772,29 +732,35 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v8i64:
 ; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm3
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
-; X86-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm3
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm4
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm5
-; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
-; X86-AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
-; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
+; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
+; X86-AVX1-NEXT:    # xmm3 = mem[0,0]
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm4
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm5, %xmm6
+; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
+; X86-AVX1-NEXT:    vblendvpd %xmm4, %xmm5, %xmm2, %xmm2
+; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm2, %xmm4
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm5
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm6
+; X86-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
+; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm1
+; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %ecx, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %eax
+; X86-AVX1-NEXT:    cmovbl %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -827,6 +793,8 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v8i64:
 ; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm4
@@ -834,16 +802,20 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
 ; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
 ; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm3
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm4
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
-; X86-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
+; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm2
+; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
 ; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %ecx, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %eax
+; X86-AVX2-NEXT:    cmovbl %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -900,141 +872,131 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %ebx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
-; X86-SSE2-NEXT:    subl $32, %esp
-; X86-SSE2-NEXT:    movaps %xmm2, (%esp) # 16-byte Spill
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa 40(%ebp), %xmm6
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm0
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm4
-; X86-SSE2-NEXT:    movdqa 72(%ebp), %xmm7
-; X86-SSE2-NEXT:    pand %xmm4, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm4
-; X86-SSE2-NEXT:    por %xmm1, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa 24(%ebp), %xmm6
-; X86-SSE2-NEXT:    pand %xmm1, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm7, %xmm1
-; X86-SSE2-NEXT:    por %xmm5, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm5
-; X86-SSE2-NEXT:    movdqa 56(%ebp), %xmm0
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm5
-; X86-SSE2-NEXT:    por %xmm2, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa (%esp), %xmm7 # 16-byte Reload
-; X86-SSE2-NEXT:    movdqa %xmm7, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm6
-; X86-SSE2-NEXT:    pand %xmm6, %xmm7
-; X86-SSE2-NEXT:    movdqa 56(%ebp), %xmm2
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm6
-; X86-SSE2-NEXT:    por %xmm7, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm0
-; X86-SSE2-NEXT:    por %xmm5, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm5, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm4
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm4, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm5
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm4, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm0, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    subl $16, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %ecx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovbl %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %ebx
+; X86-SSE2-NEXT:    cmovbl %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ebx
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovael %ebx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 20(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 28(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movl 36(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 32(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 44(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 52(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 48(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 60(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %edi, %esi
+; X86-SSE2-NEXT:    sbbl %edx, %esi
+; X86-SSE2-NEXT:    movl 68(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 64(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %edi
+; X86-SSE2-NEXT:    movl %esi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 76(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movl 84(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 80(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %edi, %ecx
+; X86-SSE2-NEXT:    sbbl %edx, %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    leal -12(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
+; X86-SSE2-NEXT:    popl %ebx
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -1152,133 +1114,125 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovaq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v16i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $48, %esp
-; X86-SSE41-NEXT:    movaps %xmm2, (%esp) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    movdqa 40(%ebp), %xmm2
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm6
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm7
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm7, %xmm0
-; X86-SSE41-NEXT:    movdqa 72(%ebp), %xmm5
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
-; X86-SSE41-NEXT:    movapd %xmm6, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 24(%ebp), %xmm7
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE41-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 56(%ebp), %xmm1
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa (%esp), %xmm6 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm2
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm7, %xmm2
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm6 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm2
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm5
-; X86-SSE41-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm2
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm2, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm4, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovbl %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovbl %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %ecx, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 28(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    movl 36(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 32(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 44(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 52(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 48(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 60(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    movl 68(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 64(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %edi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 76(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %edi, %esi
+; X86-SSE4-NEXT:    sbbl %edx, %esi
+; X86-SSE4-NEXT:    movl 84(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 80(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %eax, %edi
+; X86-SSE4-NEXT:    movl %esi, %ecx
+; X86-SSE4-NEXT:    sbbl %edx, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v16i64:
 ; X64-SSE41:       # %bb.0:
@@ -1391,74 +1345,6 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v16i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $16, %esp
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm7
-; X86-SSE42-NEXT:    movdqa 40(%ebp), %xmm6
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    movdqa %xmm6, %xmm5
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm5
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm5, %xmm0
-; X86-SSE42-NEXT:    movdqa 72(%ebp), %xmm5
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm6
-; X86-SSE42-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE42-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    movdqa 24(%ebp), %xmm7
-; X86-SSE42-NEXT:    movapd 8(%ebp), %xmm1
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE42-NEXT:    movdqa %xmm7, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE42-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    movdqa 56(%ebp), %xmm1
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm3
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm1, %xmm2
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm2
-; X86-SSE42-NEXT:    movapd %xmm7, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm7, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm5, %xmm2
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm2
-; X86-SSE42-NEXT:    movapd %xmm6, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm6, %xmm5
-; X86-SSE42-NEXT:    movapd %xmm5, %xmm2
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm2
-; X86-SSE42-NEXT:    movapd %xmm1, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE42-NEXT:    movd %xmm1, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v16i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm8
@@ -1518,51 +1404,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX1:       # %bb.0:
 ; X86-AVX1-NEXT:    pushl %ebp
 ; X86-AVX1-NEXT:    movl %esp, %ebp
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    andl $-32, %esp
 ; X86-AVX1-NEXT:    subl $32, %esp
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm4
-; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
-; X86-AVX1-NEXT:    # xmm3 = mem[0,0]
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm5
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm6
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm6, %xmm7
-; X86-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
-; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm6, %xmm4, %xmm4
-; X86-AVX1-NEXT:    vxorps 24(%ebp), %xmm3, %xmm6
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm7
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm7, %xmm5
-; X86-AVX1-NEXT:    vpcmpgtq %xmm6, %xmm5, %xmm5
-; X86-AVX1-NEXT:    vmovapd 24(%ebp), %xmm6
-; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm7, %xmm6, %xmm5
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm6
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm7
-; X86-AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
-; X86-AVX1-NEXT:    vmovaps 8(%ebp), %xmm7
-; X86-AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm2, %xmm0
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm7, %xmm2
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm6
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm7, %xmm1
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm6
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm6, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm5, %xmm1
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm4, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
-; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm4, %xmm5, %xmm1
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX1-NEXT:    movl %ebp, %esp
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %ecx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmovbl %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %ecx, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %ecx, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm2, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %ecx, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %edi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    movl 12(%ebp), %edi
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %edi, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    movl 20(%ebp), %esi
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    movl 16(%ebp), %edi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %edi
+; X86-AVX1-NEXT:    movl %esi, %ecx
+; X86-AVX1-NEXT:    sbbl %edx, %ecx
+; X86-AVX1-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    movl 24(%ebp), %esi
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %ecx, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    movl 36(%ebp), %edi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %edi, %esi
+; X86-AVX1-NEXT:    sbbl %edx, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    leal -8(%ebp), %esp
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    popl %ebp
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1616,35 +1574,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX2:       # %bb.0:
 ; X86-AVX2-NEXT:    pushl %ebp
 ; X86-AVX2-NEXT:    movl %esp, %ebp
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    andl $-32, %esp
 ; X86-AVX2-NEXT:    subl $32, %esp
-; X86-AVX2-NEXT:    vmovdqa 8(%ebp), %ymm4
-; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm5
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm6
-; X86-AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
-; X86-AVX2-NEXT:    vblendvpd %ymm5, %ymm0, %ymm2, %ymm0
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm4, %ymm2
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm5
-; X86-AVX2-NEXT:    vpcmpgtq %ymm2, %ymm5, %ymm2
-; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm1, %ymm4, %ymm1
-; X86-AVX2-NEXT:    vxorpd %ymm3, %ymm1, %ymm2
-; X86-AVX2-NEXT:    vxorpd %ymm3, %ymm0, %ymm4
-; X86-AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
-; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
-; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm0, %xmm4
-; X86-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX2-NEXT:    movl %ebp, %esp
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %ecx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmovbl %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm0
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %ecx, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %ecx, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm2, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %ecx, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %edi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    movl 12(%ebp), %edi
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %edi, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    movl 20(%ebp), %esi
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    movl 16(%ebp), %edi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %edi
+; X86-AVX2-NEXT:    movl %esi, %ecx
+; X86-AVX2-NEXT:    sbbl %edx, %ecx
+; X86-AVX2-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    movl 24(%ebp), %esi
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %ecx, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    movl 36(%ebp), %edi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %edi, %esi
+; X86-AVX2-NEXT:    sbbl %edx, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    leal -8(%ebp), %esp
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    popl %ebp
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1712,30 +1758,44 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ;
 
 define i32 @test_v2i32(<2 x i32> %a0) nounwind {
-; SSE2-LABEL: test_v2i32:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pxor %xmm2, %xmm3
-; SSE2-NEXT:    pxor %xmm1, %xmm2
-; SSE2-NEXT:    pcmpgtd %xmm2, %xmm3
-; SSE2-NEXT:    pand %xmm3, %xmm0
-; SSE2-NEXT:    pandn %xmm1, %xmm3
-; SSE2-NEXT:    por %xmm0, %xmm3
-; SSE2-NEXT:    movd %xmm3, %eax
-; SSE2-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v2i32:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE2-NEXT:    pand %xmm0, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    cmoval %ecx, %eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: test_v2i32:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; X64-SSE2-NEXT:    pand %xmm0, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %ecx
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    cmpl %eax, %ecx
+; X64-SSE2-NEXT:    cmoval %ecx, %eax
+; X64-SSE2-NEXT:    retq
 ;
 ; SSE4-LABEL: test_v2i32:
 ; SSE4:       # %bb.0:
 ; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE4-NEXT:    pmaxud %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
+; SSE4-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
+; SSE4-NEXT:    pmaxud %xmm1, %xmm0
+; SSE4-NEXT:    movd %xmm0, %eax
 ; SSE4-NEXT:    ret{{[l|q]}}
 ;
 ; AVX-LABEL: test_v2i32:
 ; AVX:       # %bb.0:
 ; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; AVX-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
 ; AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
 ; AVX-NEXT:    vmovd %xmm0, %eax
 ; AVX-NEXT:    ret{{[l|q]}}
@@ -2359,30 +2419,74 @@ define i32 @test_v32i32(<32 x i32> %a0) nounwind {
 define i16 @test_v2i16(<2 x i16> %a0) nounwind {
 ; SSE2-LABEL: test_v2i16:
 ; SSE2:       # %bb.0:
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    psrld $16, %xmm1
-; SSE2-NEXT:    psubusw %xmm0, %xmm1
-; SSE2-NEXT:    paddw %xmm0, %xmm1
-; SSE2-NEXT:    movd %xmm1, %eax
+; SSE2-NEXT:    xorps %xmm1, %xmm1
+; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
+; SSE2-NEXT:    movaps %xmm1, %xmm2
+; SSE2-NEXT:    psrld $16, %xmm2
+; SSE2-NEXT:    psubusw %xmm1, %xmm2
+; SSE2-NEXT:    paddw %xmm0, %xmm2
+; SSE2-NEXT:    movd %xmm2, %eax
 ; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; SSE2-NEXT:    ret{{[l|q]}}
 ;
 ; SSE4-LABEL: test_v2i16:
 ; SSE4:       # %bb.0:
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrld $16, %xmm1
-; SSE4-NEXT:    pmaxuw %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
+; SSE4-NEXT:    pxor %xmm1, %xmm1
+; SSE4-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
+; SSE4-NEXT:    pxor %xmm1, %xmm0
+; SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; SSE4-NEXT:    movd %xmm0, %eax
+; SSE4-NEXT:    notl %eax
 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; SSE4-NEXT:    ret{{[l|q]}}
 ;
-; AVX-LABEL: test_v2i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; AVX1-LABEL: test_v2i16:
+; AVX1:       # %bb.0:
+; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX1-NEXT:    vmovd %xmm0, %eax
+; AVX1-NEXT:    notl %eax
+; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX1-NEXT:    ret{{[l|q]}}
+;
+; AVX2-LABEL: test_v2i16:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
+; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %xmm0, %eax
+; AVX2-NEXT:    notl %eax
+; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX2-NEXT:    ret{{[l|q]}}
+;
+; AVX512BW-LABEL: test_v2i16:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX512BW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    notl %eax
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v2i16:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    notl %eax
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i16 @llvm.vector.reduce.umax.v2i16(<2 x i16> %a0)
   ret i16 %1
 }
@@ -2390,6 +2494,7 @@ define i16 @test_v2i16(<2 x i16> %a0) nounwind {
 define i16 @test_v4i16(<4 x i16> %a0) nounwind {
 ; SSE2-LABEL: test_v4i16:
 ; SSE2:       # %bb.0:
+; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
 ; SSE2-NEXT:    psubusw %xmm0, %xmm1
 ; SSE2-NEXT:    paddw %xmm0, %xmm1
@@ -2403,24 +2508,57 @@ define i16 @test_v4i16(<4 x i16> %a0) nounwind {
 ;
 ; SSE4-LABEL: test_v4i16:
 ; SSE4:       # %bb.0:
-; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE4-NEXT:    pmaxuw %xmm0, %xmm1
-; SSE4-NEXT:    movdqa %xmm1, %xmm0
-; SSE4-NEXT:    psrld $16, %xmm0
-; SSE4-NEXT:    pmaxuw %xmm1, %xmm0
+; SSE4-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
+; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT:    pxor %xmm0, %xmm1
+; SSE4-NEXT:    phminposuw %xmm1, %xmm0
 ; SSE4-NEXT:    movd %xmm0, %eax
+; SSE4-NEXT:    notl %eax
 ; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; SSE4-NEXT:    ret{{[l|q]}}
 ;
-; AVX-LABEL: test_v4i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; AVX1-LABEL: test_v4i16:
+; AVX1:       # %bb.0:
+; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX1-NEXT:    vmovd %xmm0, %eax
+; AVX1-NEXT:    notl %eax
+; AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX1-NEXT:    ret{{[l|q]}}
+;
+; AVX2-LABEL: test_v4i16:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %xmm0, %eax
+; AVX2-NEXT:    notl %eax
+; AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX2-NEXT:    ret{{[l|q]}}
+;
+; AVX512BW-LABEL: test_v4i16:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    notl %eax
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v4i16:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    notl %eax
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i16 @llvm.vector.reduce.umax.v4i16(<4 x i16> %a0)
   ret i16 %1
 }
@@ -2961,78 +3099,267 @@ define i16 @test_v64i16(<64 x i16> %a0) nounwind {
 ;
 
 define i8 @test_v2i8(<2 x i8> %a0) nounwind {
-; SSE-LABEL: test_v2i8:
-; SSE:       # %bb.0:
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrlw $8, %xmm1
-; SSE-NEXT:    pmaxub %xmm0, %xmm1
-; SSE-NEXT:    movd %xmm1, %eax
-; SSE-NEXT:    # kill: def $al killed $al killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v2i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v2i8:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrlw $8, %xmm1
+; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: test_v2i8:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrlw $8, %xmm1
+; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; SSE4-LABEL: test_v2i8:
+; SSE4:       # %bb.0:
+; SSE4-NEXT:    pxor %xmm1, %xmm1
+; SSE4-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3,4,5,6,7]
+; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
+; SSE4-NEXT:    pxor %xmm1, %xmm0
+; SSE4-NEXT:    movdqa %xmm0, %xmm1
+; SSE4-NEXT:    psrlw $8, %xmm1
+; SSE4-NEXT:    pminub %xmm0, %xmm1
+; SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; SSE4-NEXT:    movd %xmm0, %eax
+; SSE4-NEXT:    notb %al
+; SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; SSE4-NEXT:    ret{{[l|q]}}
+;
+; AVX1-LABEL: test_v2i8:
+; AVX1:       # %bb.0:
+; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]
+; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX1-NEXT:    vmovd %xmm0, %eax
+; AVX1-NEXT:    notb %al
+; AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; AVX1-NEXT:    ret{{[l|q]}}
+;
+; AVX2-LABEL: test_v2i8:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]
+; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %xmm0, %eax
+; AVX2-NEXT:    notb %al
+; AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; AVX2-NEXT:    ret{{[l|q]}}
+;
+; AVX512BW-LABEL: test_v2i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX512BW-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    notb %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v2i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX512VL-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3,4,5,6,7]
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    notb %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.umax.v2i8(<2 x i8> %a0)
   ret i8 %1
 }
 
 define i8 @test_v4i8(<4 x i8> %a0) nounwind {
-; SSE-LABEL: test_v4i8:
-; SSE:       # %bb.0:
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrld $16, %xmm1
-; SSE-NEXT:    pmaxub %xmm0, %xmm1
-; SSE-NEXT:    movdqa %xmm1, %xmm0
-; SSE-NEXT:    psrlw $8, %xmm0
-; SSE-NEXT:    pmaxub %xmm1, %xmm0
-; SSE-NEXT:    movd %xmm0, %eax
-; SSE-NEXT:    # kill: def $al killed $al killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v4i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; SSE2-LABEL: test_v4i8:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    xorps %xmm1, %xmm1
+; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3]
+; SSE2-NEXT:    movaps %xmm1, %xmm0
+; SSE2-NEXT:    psrld $16, %xmm0
+; SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrlw $8, %xmm1
+; SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; SSE2-NEXT:    movd %xmm1, %eax
+; SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; SSE2-NEXT:    ret{{[l|q]}}
+;
+; SSE4-LABEL: test_v4i8:
+; SSE4:       # %bb.0:
+; SSE4-NEXT:    pxor %xmm1, %xmm1
+; SSE4-NEXT:    pblendw {{.*#+}} xmm1 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; SSE4-NEXT:    pcmpeqd %xmm0, %xmm0
+; SSE4-NEXT:    pxor %xmm1, %xmm0
+; SSE4-NEXT:    movdqa %xmm0, %xmm1
+; SSE4-NEXT:    psrlw $8, %xmm1
+; SSE4-NEXT:    pminub %xmm0, %xmm1
+; SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; SSE4-NEXT:    movd %xmm0, %eax
+; SSE4-NEXT:    notb %al
+; SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; SSE4-NEXT:    ret{{[l|q]}}
+;
+; AVX1-LABEL: test_v4i8:
+; AVX1:       # %bb.0:
+; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7]
+; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX1-NEXT:    vmovd %xmm0, %eax
+; AVX1-NEXT:    notb %al
+; AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; AVX1-NEXT:    ret{{[l|q]}}
+;
+; AVX2-LABEL: test_v4i8:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
+; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %xmm0, %eax
+; AVX2-NEXT:    notb %al
+; AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; AVX2-NEXT:    ret{{[l|q]}}
+;
+; AVX512BW-LABEL: test_v4i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX512BW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    notb %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v4i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vpxor %xmm1, %xmm1, %xmm1
+; AVX512VL-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    notb %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.umax.v4i8(<4 x i8> %a0)
   ret i8 %1
 }
 
 define i8 @test_v8i8(<8 x i8> %a0) nounwind {
-; SSE-LABEL: test_v8i8:
-; SSE:       # %bb.0:
-; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE-NEXT:    pmaxub %xmm0, %xmm1
-; SSE-NEXT:    movdqa %xmm1, %xmm0
-; SSE-NEXT:    psrld $16, %xmm0
-; SSE-NEXT:    pmaxub %xmm1, %xmm0
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrlw $8, %xmm1
-; SSE-NEXT:    pmaxub %xmm0, %xmm1
-; SSE-NEXT:    movd %xmm1, %eax
-; SSE-NEXT:    # kill: def $al killed $al killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v8i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; SSE2-LABEL: test_v8i8:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; SSE2-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
+; SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; SSE2-NEXT:    movdqa %xmm0, %xmm1
+; SSE2-NEXT:    psrld $16, %xmm1
+; SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; SSE2-NEXT:    movdqa %xmm1, %xmm0
+; SSE2-NEXT:    psrlw $8, %xmm0
+; SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; SSE2-NEXT:    movd %xmm0, %eax
+; SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; SSE2-NEXT:    ret{{[l|q]}}
+;
+; SSE4-LABEL: test_v8i8:
+; SSE4:       # %bb.0:
+; SSE4-NEXT:    movq {{.*#+}} xmm0 = xmm0[0],zero
+; SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT:    pxor %xmm0, %xmm1
+; SSE4-NEXT:    movdqa %xmm1, %xmm0
+; SSE4-NEXT:    psrlw $8, %xmm0
+; SSE4-NEXT:    pminub %xmm1, %xmm0
+; SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; SSE4-NEXT:    movd %xmm0, %eax
+; SSE4-NEXT:    notb %al
+; SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; SSE4-NEXT:    ret{{[l|q]}}
+;
+; AVX1-LABEL: test_v8i8:
+; AVX1:       # %bb.0:
+; AVX1-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX1-NEXT:    vmovd %xmm0, %eax
+; AVX1-NEXT:    notb %al
+; AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; AVX1-NEXT:    ret{{[l|q]}}
+;
+; AVX2-LABEL: test_v8i8:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %xmm0, %eax
+; AVX2-NEXT:    notb %al
+; AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; AVX2-NEXT:    ret{{[l|q]}}
+;
+; AVX512BW-LABEL: test_v8i8:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    notb %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: test_v8i8:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vmovq {{.*#+}} xmm0 = xmm0[0],zero
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    notb %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.umax.v8i8(<8 x i8> %a0)
   ret i8 %1
 }
@@ -3621,3 +3948,5 @@ declare i8 @llvm.vector.reduce.umax.v16i8(<16 x i8>)
 declare i8 @llvm.vector.reduce.umax.v32i8(<32 x i8>)
 declare i8 @llvm.vector.reduce.umax.v64i8(<64 x i8>)
 declare i8 @llvm.vector.reduce.umax.v128i8(<128 x i8>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; SSE: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-umin.ll b/llvm/test/CodeGen/X86/vector-reduce-umin.ll
index 84315e6c60895..22fc790f76648 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-umin.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-umin.ll
@@ -19,25 +19,22 @@
 define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v2i64:
 ; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm3
-; X86-SSE2-NEXT:    pand %xmm3, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    movd %xmm3, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm1, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm1, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    cmovbl %esi, %eax
+; X86-SSE2-NEXT:    cmovbl %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v2i64:
@@ -49,26 +46,22 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovbq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v2i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm4
-; X86-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm5, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %ecx
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    movd %xmm0, %esi
+; X86-SSE4-NEXT:    cmpl %eax, %esi
+; X86-SSE4-NEXT:    movl %ecx, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    cmovbl %esi, %eax
+; X86-SSE4-NEXT:    cmovbl %ecx, %edx
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v2i64:
 ; X64-SSE41:       # %bb.0:
@@ -90,20 +83,6 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm3, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v2i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE42-NEXT:    pxor %xmm0, %xmm3
-; X86-SSE42-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movd %xmm2, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm2, %edx
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v2i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm1
@@ -119,15 +98,19 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v2i64:
 ; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm3
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %ecx, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %eax
+; X86-AVX1-NEXT:    cmovbl %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    retl
 ;
 ; X64-AVX1-LABEL: test_v2i64:
@@ -144,14 +127,19 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v2i64:
 ; X86-AVX2:       # %bb.0:
-; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %ecx, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %eax
+; X86-AVX2-NEXT:    cmovbl %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    retl
 ;
 ; X64-AVX2-LABEL: test_v2i64:
@@ -187,40 +175,37 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
 define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ; X86-SSE2-LABEL: test_v4i64:
 ; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
 ; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
 ; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm6, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm4, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm5, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
 ; X86-SSE2-NEXT:    pand %xmm3, %xmm0
 ; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
 ; X86-SSE2-NEXT:    por %xmm0, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm2, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm4
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm2
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,3,3,3]
 ; X86-SSE2-NEXT:    movd %xmm0, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %esi
+; X86-SSE2-NEXT:    movl %ecx, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    cmovbl %esi, %eax
+; X86-SSE2-NEXT:    cmovbl %ecx, %edx
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    retl
 ;
 ; X64-SSE2-LABEL: test_v4i64:
@@ -249,35 +234,33 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE41-LABEL: test_v4i64:
 ; X86-SSE41:       # %bb.0:
+; X86-SSE41-NEXT:    pushl %edi
+; X86-SSE41-NEXT:    pushl %esi
 ; X86-SSE41-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2]
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm6, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm4, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm2, %xmm3
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm4, %xmm5
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE41-NEXT:    movdqa %xmm2, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm1, %xmm0
+; X86-SSE41-NEXT:    movdqa %xmm0, %xmm4
+; X86-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
 ; X86-SSE41-NEXT:    pand %xmm5, %xmm3
 ; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
 ; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE41-NEXT:    movd %xmm2, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm2, %edx
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE41-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE41-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE41-NEXT:    extractps $2, %xmm1, %eax
+; X86-SSE41-NEXT:    movd %xmm1, %esi
+; X86-SSE41-NEXT:    cmpl %eax, %esi
+; X86-SSE41-NEXT:    movl %ecx, %edi
+; X86-SSE41-NEXT:    sbbl %edx, %edi
+; X86-SSE41-NEXT:    cmovbl %esi, %eax
+; X86-SSE41-NEXT:    cmovbl %ecx, %edx
+; X86-SSE41-NEXT:    popl %esi
+; X86-SSE41-NEXT:    popl %edi
 ; X86-SSE41-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v4i64:
@@ -314,23 +297,26 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-SSE42-LABEL: test_v4i64:
 ; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm4
-; X86-SSE42-NEXT:    pxor %xmm2, %xmm4
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm1
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm3 = xmm1[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE42-NEXT:    pcmpgtq %xmm0, %xmm2
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm3
-; X86-SSE42-NEXT:    movd %xmm3, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm3, %edx
+; X86-SSE42-NEXT:    pushl %edi
+; X86-SSE42-NEXT:    pushl %esi
+; X86-SSE42-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [0,2147483648,0,2147483648]
+; X86-SSE42-NEXT:    movdqa %xmm2, %xmm3
+; X86-SSE42-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE42-NEXT:    pxor %xmm1, %xmm0
+; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
+; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE42-NEXT:    extractps $3, %xmm1, %edx
+; X86-SSE42-NEXT:    extractps $1, %xmm1, %ecx
+; X86-SSE42-NEXT:    extractps $2, %xmm1, %eax
+; X86-SSE42-NEXT:    movd %xmm1, %esi
+; X86-SSE42-NEXT:    cmpl %eax, %esi
+; X86-SSE42-NEXT:    movl %ecx, %edi
+; X86-SSE42-NEXT:    sbbl %edx, %edi
+; X86-SSE42-NEXT:    cmovbl %esi, %eax
+; X86-SSE42-NEXT:    cmovbl %ecx, %edx
+; X86-SSE42-NEXT:    popl %esi
+; X86-SSE42-NEXT:    popl %edi
 ; X86-SSE42-NEXT:    retl
 ;
 ; X64-SSE42-LABEL: test_v4i64:
@@ -355,20 +341,26 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v4i64:
 ; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
 ; X86-AVX1-NEXT:    # xmm1 = mem[0,0]
 ; X86-AVX1-NEXT:    vxorps %xmm1, %xmm0, %xmm2
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
-; X86-AVX1-NEXT:    vxorps %xmm1, %xmm3, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm3, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm2 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vxorpd %xmm1, %xmm0, %xmm3
-; X86-AVX1-NEXT:    vxorpd %xmm1, %xmm2, %xmm1
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm1, %xmm1
-; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    vxorps %xmm1, %xmm3, %xmm1
+; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
+; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %ecx, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %eax
+; X86-AVX1-NEXT:    cmovbl %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -392,19 +384,25 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v4i64:
 ; X86-AVX2:       # %bb.0:
-; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm4
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
-; X86-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
+; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
+; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm2
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm3
+; X86-AVX2-NEXT:    vpxor %xmm1, %xmm3, %xmm1
+; X86-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm1, %xmm1
+; X86-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %ecx, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %eax
+; X86-AVX2-NEXT:    cmovbl %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -454,74 +452,72 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
-; X86-SSE2-NEXT:    subl $16, %esp
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm6, %xmm4
-; X86-SSE2-NEXT:    pand %xmm4, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm4
-; X86-SSE2-NEXT:    por %xmm1, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm5, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
-; X86-SSE2-NEXT:    por %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm5
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm4, %xmm0
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovbl %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovbl %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %ecx, %esi
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movd %xmm3, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 20(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    leal -8(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -579,72 +575,69 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovbq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v8i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $16, %esp
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm4
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm6
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm6, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm5, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm4, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm5, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm5
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm2
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm2
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE41-NEXT:    pmovsxdq %xmm2, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm3
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm3, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovbl %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovbl %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %ecx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v8i64:
 ; X64-SSE41:       # %bb.0:
@@ -704,46 +697,6 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v8i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $16, %esp
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm5
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm6
-; X86-SSE42-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE42-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE42-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE42-NEXT:    pcmpgtq %xmm0, %xmm4
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE42-NEXT:    movd %xmm1, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v8i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm5
@@ -778,29 +731,35 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX1-LABEL: test_v8i64:
 ; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
 ; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm3, %xmm4
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm5
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm5, %xmm6
-; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
-; X86-AVX1-NEXT:    vblendvpd %xmm4, %xmm3, %xmm5, %xmm3
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm4
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm5
-; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm5, %xmm4
-; X86-AVX1-NEXT:    vblendvpd %xmm4, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm3
+; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm4
+; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
+; X86-AVX1-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm3
 ; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm3, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm4, %xmm1
-; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm5
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
+; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm6
+; X86-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
+; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm1
+; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm3, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmpl %eax, %esi
+; X86-AVX1-NEXT:    movl %ecx, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %eax
+; X86-AVX1-NEXT:    cmovbl %ecx, %edx
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -833,23 +792,29 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
 ;
 ; X86-AVX2-LABEL: test_v8i64:
 ; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm3
 ; X86-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm4
 ; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
 ; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
-; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm4
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm4, %xmm3
-; X86-AVX2-NEXT:    vblendvpd %xmm3, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm3
-; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm2
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm3
+; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm3, %xmm2
+; X86-AVX2-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
+; X86-AVX2-NEXT:    vblendvpd %xmm1, %xmm0, %xmm3, %xmm0
+; X86-AVX2-NEXT:    vextractps $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    vextractps $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmpl %eax, %esi
+; X86-AVX2-NEXT:    movl %ecx, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %eax
+; X86-AVX2-NEXT:    cmovbl %ecx, %edx
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -906,143 +871,128 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-SSE2:       # %bb.0:
 ; X86-SSE2-NEXT:    pushl %ebp
 ; X86-SSE2-NEXT:    movl %esp, %ebp
+; X86-SSE2-NEXT:    pushl %edi
+; X86-SSE2-NEXT:    pushl %esi
 ; X86-SSE2-NEXT:    andl $-16, %esp
-; X86-SSE2-NEXT:    subl $48, %esp
-; X86-SSE2-NEXT:    movaps %xmm1, (%esp) # 16-byte Spill
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa 56(%ebp), %xmm5
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm4, %xmm0
-; X86-SSE2-NEXT:    movdqa 24(%ebp), %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm4
-; X86-SSE2-NEXT:    pand %xmm4, %xmm2
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm4
-; X86-SSE2-NEXT:    por %xmm2, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm4, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm0
-; X86-SSE2-NEXT:    movdqa 72(%ebp), %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movdqa 8(%ebp), %xmm7
-; X86-SSE2-NEXT:    pand %xmm2, %xmm1
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm2
-; X86-SSE2-NEXT:    por %xmm1, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movdqa 40(%ebp), %xmm6
-; X86-SSE2-NEXT:    pand %xmm0, %xmm7
-; X86-SSE2-NEXT:    pandn %xmm5, %xmm0
-; X86-SSE2-NEXT:    por %xmm7, %xmm0
-; X86-SSE2-NEXT:    movdqa (%esp), %xmm4 # 16-byte Reload
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pand %xmm5, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm1, %xmm5
-; X86-SSE2-NEXT:    pand %xmm5, %xmm4
-; X86-SSE2-NEXT:    pandn %xmm6, %xmm5
-; X86-SSE2-NEXT:    por %xmm4, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm6
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm6
-; X86-SSE2-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm7
-; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm1, %xmm6
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm6, %xmm1
-; X86-SSE2-NEXT:    pand %xmm1, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
-; X86-SSE2-NEXT:    por %xmm5, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm4 # 16-byte Reload
-; X86-SSE2-NEXT:    movdqa %xmm4, %xmm5
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm6
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm5
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm7
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm7, %xmm5
-; X86-SSE2-NEXT:    pand %xmm5, %xmm2
-; X86-SSE2-NEXT:    pandn %xmm4, %xmm5
-; X86-SSE2-NEXT:    por %xmm2, %xmm5
-; X86-SSE2-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm0, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm5
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm0
-; X86-SSE2-NEXT:    por %xmm5, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm3
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm4
-; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[0,0,2,2]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
-; X86-SSE2-NEXT:    pand %xmm2, %xmm3
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3]
-; X86-SSE2-NEXT:    por %xmm3, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm1, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm3, %edx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm3, %esi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm2[3,3,3,3]
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    movl %esi, %edi
+; X86-SSE2-NEXT:    sbbl %edx, %edi
+; X86-SSE2-NEXT:    movd %xmm0, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    cmovbl %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %esi
+; X86-SSE2-NEXT:    cmovbl %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
 ; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %edx
-; X86-SSE2-NEXT:    movl %ebp, %esp
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movd %xmm1, %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %ecx, %esi
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %edx
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movd %xmm3, %edi
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movd %xmm0, %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 12(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 20(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 16(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 28(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movl 36(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 32(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 44(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 52(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 48(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 60(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %edi
+; X86-SSE2-NEXT:    sbbl %esi, %edi
+; X86-SSE2-NEXT:    movl 68(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    movl 64(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %esi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %edi, %ecx
+; X86-SSE2-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 76(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %esi, %eax
+; X86-SSE2-NEXT:    cmpl %ecx, %eax
+; X86-SSE2-NEXT:    movl %edx, %esi
+; X86-SSE2-NEXT:    sbbl %edi, %esi
+; X86-SSE2-NEXT:    movl 84(%ebp), %esi
+; X86-SSE2-NEXT:    cmovael %edi, %edx
+; X86-SSE2-NEXT:    movl 80(%ebp), %edi
+; X86-SSE2-NEXT:    cmovael %ecx, %eax
+; X86-SSE2-NEXT:    cmpl %edi, %eax
+; X86-SSE2-NEXT:    movl %edx, %ecx
+; X86-SSE2-NEXT:    sbbl %esi, %ecx
+; X86-SSE2-NEXT:    cmovael %edi, %eax
+; X86-SSE2-NEXT:    cmovael %esi, %edx
+; X86-SSE2-NEXT:    leal -8(%ebp), %esp
+; X86-SSE2-NEXT:    popl %esi
+; X86-SSE2-NEXT:    popl %edi
 ; X86-SSE2-NEXT:    popl %ebp
 ; X86-SSE2-NEXT:    retl
 ;
@@ -1160,135 +1110,125 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE2-NEXT:    cmovbq %rcx, %rax
 ; X64-SSE2-NEXT:    retq
 ;
-; X86-SSE41-LABEL: test_v16i64:
-; X86-SSE41:       # %bb.0:
-; X86-SSE41-NEXT:    pushl %ebp
-; X86-SSE41-NEXT:    movl %esp, %ebp
-; X86-SSE41-NEXT:    andl $-16, %esp
-; X86-SSE41-NEXT:    subl $48, %esp
-; X86-SSE41-NEXT:    movaps %xmm1, (%esp) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE41-NEXT:    movdqa 56(%ebp), %xmm1
-; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm5
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    movdqa 24(%ebp), %xmm6
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE41-NEXT:    movapd %xmm5, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm6, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    movdqa 72(%ebp), %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 8(%ebp), %xmm7
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm6
-; X86-SSE41-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa 40(%ebp), %xmm3
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm7, %xmm2
-; X86-SSE41-NEXT:    movdqa (%esp), %xmm5 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm3, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm3
-; X86-SSE41-NEXT:    movapd %xmm3, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm7
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm7
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
-; X86-SSE41-NEXT:    movapd %xmm6, %xmm0
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm5 # 16-byte Reload
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm1
-; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    movdqa %xmm5, %xmm1
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm6, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm5
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE41-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE41-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE41-NEXT:    movapd %xmm1, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[0,0,2,2]
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm1
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm1, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
-; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE41-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE41-NEXT:    movdqa %xmm4, %xmm3
-; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm3
-; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
-; X86-SSE41-NEXT:    pmovsxdq %xmm3, %xmm0
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
-; X86-SSE41-NEXT:    pand %xmm0, %xmm4
-; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3]
-; X86-SSE41-NEXT:    por %xmm4, %xmm0
-; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
-; X86-SSE41-NEXT:    movd %xmm1, %eax
-; X86-SSE41-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE41-NEXT:    movl %ebp, %esp
-; X86-SSE41-NEXT:    popl %ebp
-; X86-SSE41-NEXT:    retl
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    pushl %ebp
+; X86-SSE4-NEXT:    movl %esp, %ebp
+; X86-SSE4-NEXT:    pushl %edi
+; X86-SSE4-NEXT:    pushl %esi
+; X86-SSE4-NEXT:    andl $-16, %esp
+; X86-SSE4-NEXT:    pextrd $3, %xmm0, %edx
+; X86-SSE4-NEXT:    pextrd $1, %xmm0, %esi
+; X86-SSE4-NEXT:    pextrd $2, %xmm0, %eax
+; X86-SSE4-NEXT:    movd %xmm0, %ecx
+; X86-SSE4-NEXT:    cmpl %eax, %ecx
+; X86-SSE4-NEXT:    movl %esi, %edi
+; X86-SSE4-NEXT:    sbbl %edx, %edi
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovbl %esi, %edx
+; X86-SSE4-NEXT:    movd %xmm1, %esi
+; X86-SSE4-NEXT:    cmovbl %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    pextrd $3, %xmm1, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm1, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %ecx, %esi
+; X86-SSE4-NEXT:    pextrd $1, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %edx
+; X86-SSE4-NEXT:    movd %xmm2, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    pextrd $3, %xmm2, %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    pextrd $2, %xmm2, %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 8(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 12(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 20(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 16(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    movl 24(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 28(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    movl 36(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 32(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 40(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 44(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 52(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 48(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    movl 56(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 60(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %edi
+; X86-SSE4-NEXT:    sbbl %esi, %edi
+; X86-SSE4-NEXT:    movl 68(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    movl 64(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %esi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %edi, %ecx
+; X86-SSE4-NEXT:    movl 72(%ebp), %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 76(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %esi, %eax
+; X86-SSE4-NEXT:    cmpl %ecx, %eax
+; X86-SSE4-NEXT:    movl %edx, %esi
+; X86-SSE4-NEXT:    sbbl %edi, %esi
+; X86-SSE4-NEXT:    movl 84(%ebp), %esi
+; X86-SSE4-NEXT:    cmovael %edi, %edx
+; X86-SSE4-NEXT:    movl 80(%ebp), %edi
+; X86-SSE4-NEXT:    cmovael %ecx, %eax
+; X86-SSE4-NEXT:    cmpl %edi, %eax
+; X86-SSE4-NEXT:    movl %edx, %ecx
+; X86-SSE4-NEXT:    sbbl %esi, %ecx
+; X86-SSE4-NEXT:    cmovael %edi, %eax
+; X86-SSE4-NEXT:    cmovael %esi, %edx
+; X86-SSE4-NEXT:    leal -8(%ebp), %esp
+; X86-SSE4-NEXT:    popl %esi
+; X86-SSE4-NEXT:    popl %edi
+; X86-SSE4-NEXT:    popl %ebp
+; X86-SSE4-NEXT:    retl
 ;
 ; X64-SSE41-LABEL: test_v16i64:
 ; X64-SSE41:       # %bb.0:
@@ -1400,76 +1340,6 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X64-SSE41-NEXT:    movq %xmm1, %rax
 ; X64-SSE41-NEXT:    retq
 ;
-; X86-SSE42-LABEL: test_v16i64:
-; X86-SSE42:       # %bb.0:
-; X86-SSE42-NEXT:    pushl %ebp
-; X86-SSE42-NEXT:    movl %esp, %ebp
-; X86-SSE42-NEXT:    andl $-16, %esp
-; X86-SSE42-NEXT:    subl $32, %esp
-; X86-SSE42-NEXT:    movaps %xmm1, (%esp) # 16-byte Spill
-; X86-SSE42-NEXT:    movdqa %xmm0, %xmm3
-; X86-SSE42-NEXT:    movdqa 72(%ebp), %xmm5
-; X86-SSE42-NEXT:    movdqa 56(%ebp), %xmm6
-; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm4 = [0,2147483648,0,2147483648]
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm7
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm7
-; X86-SSE42-NEXT:    movdqa %xmm6, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm7, %xmm0
-; X86-SSE42-NEXT:    movdqa 24(%ebp), %xmm7
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm6
-; X86-SSE42-NEXT:    movdqa %xmm3, %xmm2
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE42-NEXT:    movdqa %xmm7, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    movdqa 8(%ebp), %xmm1
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm7
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm2
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm2
-; X86-SSE42-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm2, %xmm0
-; X86-SSE42-NEXT:    movdqa 40(%ebp), %xmm2
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm5
-; X86-SSE42-NEXT:    movdqa (%esp), %xmm1 # 16-byte Reload
-; X86-SSE42-NEXT:    movdqa %xmm1, %xmm3
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm3
-; X86-SSE42-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X86-SSE42-NEXT:    movapd %xmm2, %xmm1
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm5
-; X86-SSE42-NEXT:    movapd %xmm7, %xmm1
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm6, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm7, %xmm6
-; X86-SSE42-NEXT:    movapd %xmm6, %xmm1
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm1
-; X86-SSE42-NEXT:    movapd %xmm5, %xmm0
-; X86-SSE42-NEXT:    xorpd %xmm4, %xmm0
-; X86-SSE42-NEXT:    pcmpgtq %xmm1, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm6, %xmm5
-; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm1 = xmm5[2,3,2,3]
-; X86-SSE42-NEXT:    movdqa %xmm5, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm4, %xmm0
-; X86-SSE42-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE42-NEXT:    pcmpgtq %xmm0, %xmm4
-; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
-; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm1
-; X86-SSE42-NEXT:    movd %xmm1, %eax
-; X86-SSE42-NEXT:    pextrd $1, %xmm1, %edx
-; X86-SSE42-NEXT:    movl %ebp, %esp
-; X86-SSE42-NEXT:    popl %ebp
-; X86-SSE42-NEXT:    retl
-;
 ; X64-SSE42-LABEL: test_v16i64:
 ; X64-SSE42:       # %bb.0:
 ; X64-SSE42-NEXT:    movdqa %xmm0, %xmm9
@@ -1530,51 +1400,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX1:       # %bb.0:
 ; X86-AVX1-NEXT:    pushl %ebp
 ; X86-AVX1-NEXT:    movl %esp, %ebp
+; X86-AVX1-NEXT:    pushl %edi
+; X86-AVX1-NEXT:    pushl %esi
 ; X86-AVX1-NEXT:    andl $-32, %esp
 ; X86-AVX1-NEXT:    subl $32, %esp
-; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
-; X86-AVX1-NEXT:    # xmm3 = mem[0,0]
-; X86-AVX1-NEXT:    vmovaps 8(%ebp), %xmm4
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm4, %xmm6
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm7
-; X86-AVX1-NEXT:    vpcmpgtq %xmm7, %xmm6, %xmm6
-; X86-AVX1-NEXT:    vblendvpd %xmm6, %xmm1, %xmm4, %xmm4
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm6
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm7
-; X86-AVX1-NEXT:    vpcmpgtq %xmm6, %xmm7, %xmm6
-; X86-AVX1-NEXT:    vxorps 24(%ebp), %xmm3, %xmm7
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm1
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm5
-; X86-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
-; X86-AVX1-NEXT:    vblendvpd %xmm6, %xmm0, %xmm2, %xmm6
-; X86-AVX1-NEXT:    vmovapd 24(%ebp), %xmm7
-; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm1, %xmm7, %xmm1
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm3
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX1-NEXT:    vmovd %xmm0, %ecx
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm0
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm5
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm2, %xmm2
-; X86-AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm7
-; X86-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm7, %xmm5
-; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm2, %xmm0
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm5
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm5, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm6, %xmm1
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm4, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm1, %xmm2, %xmm1
-; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm6, %xmm4, %xmm1
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm2
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm4
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
-; X86-AVX1-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX1-NEXT:    movl %ebp, %esp
+; X86-AVX1-NEXT:    cmpl %eax, %ecx
+; X86-AVX1-NEXT:    movl %esi, %edi
+; X86-AVX1-NEXT:    sbbl %edx, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX1-NEXT:    cmovbl %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %esi
+; X86-AVX1-NEXT:    cmovbl %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm0
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %ecx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm0, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %ecx, %esi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    vmovd %xmm2, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %ecx, %esi
+; X86-AVX1-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %esi, %edi
+; X86-AVX1-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %edi, %ecx
+; X86-AVX1-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    movl 12(%ebp), %edi
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %edi, %esi
+; X86-AVX1-NEXT:    movl 20(%ebp), %esi
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    movl 16(%ebp), %edi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmpl %edi, %eax
+; X86-AVX1-NEXT:    movl %edx, %ecx
+; X86-AVX1-NEXT:    sbbl %esi, %ecx
+; X86-AVX1-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovael %esi, %edx
+; X86-AVX1-NEXT:    movl 24(%ebp), %esi
+; X86-AVX1-NEXT:    cmovael %edi, %eax
+; X86-AVX1-NEXT:    cmpl %esi, %eax
+; X86-AVX1-NEXT:    movl %edx, %edi
+; X86-AVX1-NEXT:    sbbl %ecx, %edi
+; X86-AVX1-NEXT:    movl 36(%ebp), %edi
+; X86-AVX1-NEXT:    cmovael %ecx, %edx
+; X86-AVX1-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX1-NEXT:    cmovael %esi, %eax
+; X86-AVX1-NEXT:    cmpl %ecx, %eax
+; X86-AVX1-NEXT:    movl %edx, %esi
+; X86-AVX1-NEXT:    sbbl %edi, %esi
+; X86-AVX1-NEXT:    cmovael %ecx, %eax
+; X86-AVX1-NEXT:    cmovael %edi, %edx
+; X86-AVX1-NEXT:    leal -8(%ebp), %esp
+; X86-AVX1-NEXT:    popl %esi
+; X86-AVX1-NEXT:    popl %edi
 ; X86-AVX1-NEXT:    popl %ebp
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -1628,35 +1570,123 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ; X86-AVX2:       # %bb.0:
 ; X86-AVX2-NEXT:    pushl %ebp
 ; X86-AVX2-NEXT:    movl %esp, %ebp
+; X86-AVX2-NEXT:    pushl %edi
+; X86-AVX2-NEXT:    pushl %esi
 ; X86-AVX2-NEXT:    andl $-32, %esp
 ; X86-AVX2-NEXT:    subl $32, %esp
-; X86-AVX2-NEXT:    vmovdqa 8(%ebp), %ymm4
-; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm3 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm1, %ymm5
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm4, %ymm6
-; X86-AVX2-NEXT:    vpcmpgtq %ymm5, %ymm6, %ymm5
-; X86-AVX2-NEXT:    vblendvpd %ymm5, %ymm1, %ymm4, %ymm1
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm0, %ymm4
-; X86-AVX2-NEXT:    vpxor %ymm3, %ymm2, %ymm5
-; X86-AVX2-NEXT:    vpcmpgtq %ymm4, %ymm5, %ymm4
-; X86-AVX2-NEXT:    vblendvpd %ymm4, %ymm0, %ymm2, %ymm0
-; X86-AVX2-NEXT:    vxorpd %ymm3, %ymm0, %ymm2
-; X86-AVX2-NEXT:    vxorpd %ymm3, %ymm1, %ymm4
-; X86-AVX2-NEXT:    vpcmpgtq %ymm2, %ymm4, %ymm2
-; X86-AVX2-NEXT:    vblendvpd %ymm2, %ymm0, %ymm1, %ymm0
-; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm1, %xmm4
-; X86-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm4, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vxorpd %xmm3, %xmm1, %xmm3
-; X86-AVX2-NEXT:    vpcmpgtq %xmm2, %xmm3, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edx
-; X86-AVX2-NEXT:    movl %ebp, %esp
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm2, %xmm3
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %edx
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %esi
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %eax
+; X86-AVX2-NEXT:    vmovd %xmm0, %ecx
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm0
+; X86-AVX2-NEXT:    cmpl %eax, %ecx
+; X86-AVX2-NEXT:    movl %esi, %edi
+; X86-AVX2-NEXT:    sbbl %edx, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %edi
+; X86-AVX2-NEXT:    cmovbl %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %esi
+; X86-AVX2-NEXT:    cmovbl %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %edi
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm1, %xmm0
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %ecx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm1, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm1, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm1, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm0, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %ecx, %esi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm0, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm0, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    vmovd %xmm2, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    vpextrd $3, %xmm2, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm2, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %ecx, %esi
+; X86-AVX2-NEXT:    vpextrd $1, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    vmovd %xmm3, %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %esi, %edi
+; X86-AVX2-NEXT:    vpextrd $3, %xmm3, %edi
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    vpextrd $2, %xmm3, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %edi, %ecx
+; X86-AVX2-NEXT:    movl 8(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    movl 12(%ebp), %edi
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %edi, %esi
+; X86-AVX2-NEXT:    movl 20(%ebp), %esi
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    movl 16(%ebp), %edi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmpl %edi, %eax
+; X86-AVX2-NEXT:    movl %edx, %ecx
+; X86-AVX2-NEXT:    sbbl %esi, %ecx
+; X86-AVX2-NEXT:    movl 28(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovael %esi, %edx
+; X86-AVX2-NEXT:    movl 24(%ebp), %esi
+; X86-AVX2-NEXT:    cmovael %edi, %eax
+; X86-AVX2-NEXT:    cmpl %esi, %eax
+; X86-AVX2-NEXT:    movl %edx, %edi
+; X86-AVX2-NEXT:    sbbl %ecx, %edi
+; X86-AVX2-NEXT:    movl 36(%ebp), %edi
+; X86-AVX2-NEXT:    cmovael %ecx, %edx
+; X86-AVX2-NEXT:    movl 32(%ebp), %ecx
+; X86-AVX2-NEXT:    cmovael %esi, %eax
+; X86-AVX2-NEXT:    cmpl %ecx, %eax
+; X86-AVX2-NEXT:    movl %edx, %esi
+; X86-AVX2-NEXT:    sbbl %edi, %esi
+; X86-AVX2-NEXT:    cmovael %ecx, %eax
+; X86-AVX2-NEXT:    cmovael %edi, %edx
+; X86-AVX2-NEXT:    leal -8(%ebp), %esp
+; X86-AVX2-NEXT:    popl %esi
+; X86-AVX2-NEXT:    popl %edi
 ; X86-AVX2-NEXT:    popl %ebp
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -1724,47 +1754,113 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
 ;
 
 define i32 @test_v2i32(<2 x i32> %a0) nounwind {
-; SSE2-LABEL: test_v2i32:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NEXT:    movdqa %xmm0, %xmm3
-; SSE2-NEXT:    pxor %xmm2, %xmm3
-; SSE2-NEXT:    pxor %xmm1, %xmm2
-; SSE2-NEXT:    pcmpgtd %xmm3, %xmm2
-; SSE2-NEXT:    pand %xmm2, %xmm0
-; SSE2-NEXT:    pandn %xmm1, %xmm2
-; SSE2-NEXT:    por %xmm0, %xmm2
-; SSE2-NEXT:    movd %xmm2, %eax
-; SSE2-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v2i32:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,0,4294967295,4294967295]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483647,2147483647,u,u]
+; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm3, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    cmpl %eax, %ecx
+; X86-SSE2-NEXT:    cmovbl %ecx, %eax
+; X86-SSE2-NEXT:    retl
 ;
-; SSE4-LABEL: test_v2i32:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE4-NEXT:    pminud %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
-; SSE4-NEXT:    ret{{[l|q]}}
+; X64-SSE2-LABEL: test_v2i32:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [0,0,4294967295,4294967295]
+; X64-SSE2-NEXT:    por %xmm0, %xmm1
+; X64-SSE2-NEXT:    pxor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483647,2147483647,u,u]
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pcmpgtd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1
+; X64-SSE2-NEXT:    pandn %xmm0, %xmm1
+; X64-SSE2-NEXT:    por %xmm3, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %ecx
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    cmpl %eax, %ecx
+; X64-SSE2-NEXT:    cmovbl %ecx, %eax
+; X64-SSE2-NEXT:    retq
 ;
-; AVX-LABEL: test_v2i32:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpminud %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    ret{{[l|q]}}
-  %1 = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> %a0)
-  ret i32 %1
-}
-
-define i32 @test_v4i32(<4 x i32> %a0) nounwind {
-; SSE2-LABEL: test_v4i32:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    pxor %xmm1, %xmm2
-; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; SSE2-NEXT:    pxor %xmm3, %xmm1
-; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
-; SSE2-NEXT:    pand %xmm1, %xmm0
+; X86-SSE4-LABEL: test_v2i32:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE4-NEXT:    pminud %xmm0, %xmm1
+; X86-SSE4-NEXT:    movd %xmm1, %eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v2i32:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-SSE4-NEXT:    pminud %xmm0, %xmm1
+; X64-SSE4-NEXT:    movd %xmm1, %eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v2i32:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v2i32:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpminud %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: test_v2i32:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: test_v2i32:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpminud %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    retq
+;
+; AVX512-LABEL: test_v2i32:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; AVX512-NEXT:    vpminud %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    retq
+  %1 = call i32 @llvm.vector.reduce.umin.v2i32(<2 x i32> %a0)
+  ret i32 %1
+}
+
+define i32 @test_v4i32(<4 x i32> %a0) nounwind {
+; SSE2-LABEL: test_v4i32:
+; SSE2:       # %bb.0:
+; SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; SSE2-NEXT:    movdqa %xmm0, %xmm2
+; SSE2-NEXT:    pxor %xmm1, %xmm2
+; SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
+; SSE2-NEXT:    pxor %xmm3, %xmm1
+; SSE2-NEXT:    pcmpgtd %xmm2, %xmm1
+; SSE2-NEXT:    pand %xmm1, %xmm0
 ; SSE2-NEXT:    pandn %xmm3, %xmm1
 ; SSE2-NEXT:    por %xmm0, %xmm1
 ; SSE2-NEXT:    movd %xmm1, %ecx
@@ -2369,73 +2465,201 @@ define i32 @test_v32i32(<32 x i32> %a0) nounwind {
 ;
 
 define i16 @test_v2i16(<2 x i16> %a0) nounwind {
-; SSE2-LABEL: test_v2i16:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    psrld $16, %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    psubusw %xmm1, %xmm2
-; SSE2-NEXT:    psubw %xmm2, %xmm0
-; SSE2-NEXT:    movd %xmm0, %eax
-; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE2-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v2i16:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X86-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X86-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrld $16, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X86-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE2-NEXT:    retl
 ;
-; SSE4-LABEL: test_v2i16:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    movdqa %xmm0, %xmm1
-; SSE4-NEXT:    psrld $16, %xmm1
-; SSE4-NEXT:    pminuw %xmm0, %xmm1
-; SSE4-NEXT:    movd %xmm1, %eax
-; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
+; X64-SSE2-LABEL: test_v2i16:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X64-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X64-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrld $16, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X64-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE2-NEXT:    retq
 ;
-; AVX-LABEL: test_v2i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X86-SSE4-LABEL: test_v2i16:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v2i16:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v2i16:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v2i16:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: test_v2i16:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: test_v2i16:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX2-NEXT:    retq
+;
+; AVX512-LABEL: test_v2i16:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512-NEXT:    retq
   %1 = call i16 @llvm.vector.reduce.umin.v2i16(<2 x i16> %a0)
   ret i16 %1
 }
 
 define i16 @test_v4i16(<4 x i16> %a0) nounwind {
-; SSE2-LABEL: test_v4i16:
-; SSE2:       # %bb.0:
-; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    psubusw %xmm1, %xmm2
-; SSE2-NEXT:    psubw %xmm2, %xmm0
-; SSE2-NEXT:    movdqa %xmm0, %xmm1
-; SSE2-NEXT:    psrld $16, %xmm1
-; SSE2-NEXT:    movdqa %xmm0, %xmm2
-; SSE2-NEXT:    psubusw %xmm1, %xmm2
-; SSE2-NEXT:    psubw %xmm2, %xmm0
-; SSE2-NEXT:    movd %xmm0, %eax
-; SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE2-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v4i16:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X86-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X86-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrld $16, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X86-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE2-NEXT:    retl
 ;
-; SSE4-LABEL: test_v4i16:
-; SSE4:       # %bb.0:
-; SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE4-NEXT:    pminuw %xmm0, %xmm1
-; SSE4-NEXT:    movdqa %xmm1, %xmm0
-; SSE4-NEXT:    psrld $16, %xmm0
-; SSE4-NEXT:    pminuw %xmm1, %xmm0
-; SSE4-NEXT:    movd %xmm0, %eax
-; SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
-; SSE4-NEXT:    ret{{[l|q]}}
+; X64-SSE2-LABEL: test_v4i16:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X64-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X64-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrld $16, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm2
+; X64-SSE2-NEXT:    psubw %xmm2, %xmm0
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE2-NEXT:    retq
 ;
-; AVX-LABEL: test_v4i16:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminuw %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X86-SSE4-LABEL: test_v4i16:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v4i16:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v4i16:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v4i16:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: test_v4i16:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: test_v4i16:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX2-NEXT:    retq
+;
+; AVX512-LABEL: test_v4i16:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512-NEXT:    retq
   %1 = call i16 @llvm.vector.reduce.umin.v4i16(<4 x i16> %a0)
   ret i16 %1
 }
@@ -2888,78 +3112,311 @@ define i16 @test_v64i16(<64 x i16> %a0) nounwind {
 ;
 
 define i8 @test_v2i8(<2 x i8> %a0) nounwind {
-; SSE-LABEL: test_v2i8:
-; SSE:       # %bb.0:
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrlw $8, %xmm1
-; SSE-NEXT:    pminub %xmm0, %xmm1
-; SSE-NEXT:    movd %xmm1, %eax
-; SSE-NEXT:    # kill: def $al killed $al killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v2i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v2i8:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrld $16, %xmm1
+; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: test_v2i8:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrld $16, %xmm1
+; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: test_v2i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v2i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v2i8:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v2i8:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: test_v2i8:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: test_v2i8:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT:    retq
+;
+; AVX512-LABEL: test_v2i8:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.umin.v2i8(<2 x i8> %a0)
   ret i8 %1
 }
 
 define i8 @test_v4i8(<4 x i8> %a0) nounwind {
-; SSE-LABEL: test_v4i8:
-; SSE:       # %bb.0:
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrld $16, %xmm1
-; SSE-NEXT:    pminub %xmm0, %xmm1
-; SSE-NEXT:    movdqa %xmm1, %xmm0
-; SSE-NEXT:    psrlw $8, %xmm0
-; SSE-NEXT:    pminub %xmm1, %xmm0
-; SSE-NEXT:    movd %xmm0, %eax
-; SSE-NEXT:    # kill: def $al killed $al killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v4i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v4i8:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrld $16, %xmm1
+; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: test_v4i8:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrld $16, %xmm1
+; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: test_v4i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v4i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v4i8:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v4i8:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: test_v4i8:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: test_v4i8:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT:    retq
+;
+; AVX512-LABEL: test_v4i8:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.umin.v4i8(<4 x i8> %a0)
   ret i8 %1
 }
 
 define i8 @test_v8i8(<8 x i8> %a0) nounwind {
-; SSE-LABEL: test_v8i8:
-; SSE:       # %bb.0:
-; SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; SSE-NEXT:    pminub %xmm0, %xmm1
-; SSE-NEXT:    movdqa %xmm1, %xmm0
-; SSE-NEXT:    psrld $16, %xmm0
-; SSE-NEXT:    pminub %xmm1, %xmm0
-; SSE-NEXT:    movdqa %xmm0, %xmm1
-; SSE-NEXT:    psrlw $8, %xmm1
-; SSE-NEXT:    pminub %xmm0, %xmm1
-; SSE-NEXT:    movd %xmm1, %eax
-; SSE-NEXT:    # kill: def $al killed $al killed $eax
-; SSE-NEXT:    ret{{[l|q]}}
-;
-; AVX-LABEL: test_v8i8:
-; AVX:       # %bb.0:
-; AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrld $16, %xmm0, %xmm1
-; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX-NEXT:    vmovd %xmm0, %eax
-; AVX-NEXT:    # kill: def $al killed $al killed $eax
-; AVX-NEXT:    ret{{[l|q]}}
+; X86-SSE2-LABEL: test_v8i8:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrld $16, %xmm0
+; X86-SSE2-NEXT:    pminub %xmm1, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrlw $8, %xmm1
+; X86-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: test_v8i8:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrld $16, %xmm0
+; X64-SSE2-NEXT:    pminub %xmm1, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrlw $8, %xmm1
+; X64-SSE2-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE2-NEXT:    movd %xmm1, %eax
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: test_v8i8:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: test_v8i8:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    por {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: test_v8i8:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: test_v8i8:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: test_v8i8:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: test_v8i8:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT:    retq
+;
+; AVX512-LABEL: test_v8i8:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vpor {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
+; AVX512-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512-NEXT:    retq
   %1 = call i8 @llvm.vector.reduce.umin.v8i8(<8 x i8> %a0)
   ret i8 %1
 }
@@ -3414,3 +3871,5 @@ declare i8 @llvm.vector.reduce.umin.v16i8(<16 x i8>)
 declare i8 @llvm.vector.reduce.umin.v32i8(<32 x i8>)
 declare i8 @llvm.vector.reduce.umin.v64i8(<64 x i8>)
 declare i8 @llvm.vector.reduce.umin.v128i8(<128 x i8>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; SSE: {{.*}}
diff --git a/llvm/test/Transforms/PhaseOrdering/X86/vector-reductions-expanded.ll b/llvm/test/Transforms/PhaseOrdering/X86/vector-reductions-expanded.ll
index 928f49aa2dc3d..acddf254c2998 100644
--- a/llvm/test/Transforms/PhaseOrdering/X86/vector-reductions-expanded.ll
+++ b/llvm/test/Transforms/PhaseOrdering/X86/vector-reductions-expanded.ll
@@ -137,12 +137,8 @@ for.end:
 define i32 @smin_v4i32(ptr %p) {
 ; CHECK-LABEL: @smin_v4i32(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[P:%.*]], align 4, !tbaa [[TBAA0]]
-; CHECK-NEXT:    [[RDX_SHUF:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 poison, i32 poison>
-; CHECK-NEXT:    [[RDX_MINMAX:%.*]] = call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[TMP1]], <4 x i32> [[RDX_SHUF]])
-; CHECK-NEXT:    [[RDX_SHUF3:%.*]] = shufflevector <4 x i32> [[RDX_MINMAX]], <4 x i32> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
-; CHECK-NEXT:    [[RDX_MINMAX2:%.*]] = call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[RDX_MINMAX]], <4 x i32> [[RDX_SHUF3]])
-; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i32> [[RDX_MINMAX2]], i32 0
+; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i32>, ptr [[P:%.*]], align 4, !tbaa [[TBAA0]]
+; CHECK-NEXT:    [[TMP2:%.*]] = tail call i32 @llvm.vector.reduce.smin.v4i32(<4 x i32> [[TMP0]])
 ; CHECK-NEXT:    ret i32 [[TMP2]]
 ;
 entry:
@@ -188,12 +184,8 @@ for.end:
 define i32 @umax_v4i32(ptr %p) {
 ; CHECK-LABEL: @umax_v4i32(
 ; CHECK-NEXT:  entry:
-; CHECK-NEXT:    [[TMP1:%.*]] = load <4 x i32>, ptr [[P:%.*]], align 4, !tbaa [[TBAA0]]
-; CHECK-NEXT:    [[RDX_SHUF:%.*]] = shufflevector <4 x i32> [[TMP1]], <4 x i32> poison, <4 x i32> <i32 2, i32 3, i32 poison, i32 poison>
-; CHECK-NEXT:    [[RDX_MINMAX:%.*]] = call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[TMP1]], <4 x i32> [[RDX_SHUF]])
-; CHECK-NEXT:    [[RDX_SHUF3:%.*]] = shufflevector <4 x i32> [[RDX_MINMAX]], <4 x i32> poison, <4 x i32> <i32 1, i32 poison, i32 poison, i32 poison>
-; CHECK-NEXT:    [[RDX_MINMAX2:%.*]] = call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[RDX_MINMAX]], <4 x i32> [[RDX_SHUF3]])
-; CHECK-NEXT:    [[TMP2:%.*]] = extractelement <4 x i32> [[RDX_MINMAX2]], i32 0
+; CHECK-NEXT:    [[TMP0:%.*]] = load <4 x i32>, ptr [[P:%.*]], align 4, !tbaa [[TBAA0]]
+; CHECK-NEXT:    [[TMP2:%.*]] = tail call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> [[TMP0]])
 ; CHECK-NEXT:    ret i32 [[TMP2]]
 ;
 entry:



More information about the llvm-commits mailing list