[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