[X86][SSE] Enable SMIN/SMAX/UMIN/UMAX custom lowering for all legal types

This allows us to recognise more saturation patterns and also simplify some MINMAX codegen that was failing to combine CMPGE comparisons to a legal CMPGT.

Differential Revision: https://reviews.llvm.org/D43014

llvm-svn: 324837
This commit is contained in:
Simon Pilgrim 2018-02-11 10:52:37 +00:00
parent 91e2b9d081
commit 0be5567a89
18 changed files with 10847 additions and 12729 deletions

View File

@ -3351,6 +3351,25 @@ SDValue DAGCombiner::visitIMINMAX(SDNode *N) {
!DAG.isConstantIntBuildVectorOrConstantInt(N1))
return DAG.getNode(N->getOpcode(), SDLoc(N), VT, N1, N0);
// Is sign bits are zero, flip between UMIN/UMAX and SMIN/SMAX.
// Only do this if the current op isn't legal and the flipped is.
unsigned Opcode = N->getOpcode();
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
if (!TLI.isOperationLegal(Opcode, VT) &&
(N0.isUndef() || DAG.SignBitIsZero(N0)) &&
(N1.isUndef() || DAG.SignBitIsZero(N1))) {
unsigned AltOpcode;
switch (Opcode) {
case ISD::SMIN: AltOpcode = ISD::UMIN; break;
case ISD::SMAX: AltOpcode = ISD::UMAX; break;
case ISD::UMIN: AltOpcode = ISD::SMIN; break;
case ISD::UMAX: AltOpcode = ISD::SMAX; break;
default: llvm_unreachable("Unknown MINMAX opcode");
}
if (TLI.isOperationLegal(AltOpcode, VT))
return DAG.getNode(AltOpcode, SDLoc(N), VT, N0, N1);
}
return SDValue();
}

View File

@ -790,10 +790,12 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
setOperationAction(ISD::FABS, MVT::v2f64, Custom);
setOperationAction(ISD::FCOPYSIGN, MVT::v2f64, Custom);
setOperationAction(ISD::SMAX, MVT::v8i16, Legal);
setOperationAction(ISD::UMAX, MVT::v16i8, Legal);
setOperationAction(ISD::SMIN, MVT::v8i16, Legal);
setOperationAction(ISD::UMIN, MVT::v16i8, Legal);
for (auto VT : { MVT::v16i8, MVT::v8i16, MVT::v4i32, MVT::v2i64 }) {
setOperationAction(ISD::SMAX, VT, VT == MVT::v8i16 ? Legal : Custom);
setOperationAction(ISD::SMIN, VT, VT == MVT::v8i16 ? Legal : Custom);
setOperationAction(ISD::UMAX, VT, VT == MVT::v16i8 ? Legal : Custom);
setOperationAction(ISD::UMIN, VT, VT == MVT::v16i8 ? Legal : Custom);
}
setOperationAction(ISD::INSERT_VECTOR_ELT, MVT::v8i16, Custom);
setOperationAction(ISD::INSERT_VECTOR_ELT, MVT::v4i32, Custom);
@ -1067,6 +1069,11 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
setOperationAction(ISD::MULHU, MVT::v32i8, Custom);
setOperationAction(ISD::MULHS, MVT::v32i8, Custom);
setOperationAction(ISD::SMAX, MVT::v4i64, Custom);
setOperationAction(ISD::UMAX, MVT::v4i64, Custom);
setOperationAction(ISD::SMIN, MVT::v4i64, Custom);
setOperationAction(ISD::UMIN, MVT::v4i64, Custom);
for (auto VT : { MVT::v32i8, MVT::v16i16, MVT::v8i32 }) {
setOperationAction(ISD::ABS, VT, HasInt256 ? Legal : Custom);
setOperationAction(ISD::SMAX, VT, HasInt256 ? Legal : Custom);
@ -22062,10 +22069,42 @@ static SDValue LowerABS(SDValue Op, SelectionDAG &DAG) {
}
static SDValue LowerMINMAX(SDValue Op, SelectionDAG &DAG) {
assert(Op.getSimpleValueType().is256BitVector() &&
Op.getSimpleValueType().isInteger() &&
"Only handle AVX 256-bit vector integer operation");
return Lower256IntArith(Op, DAG);
MVT VT = Op.getSimpleValueType();
// For AVX1 cases, split to use use legal ops (everything but v4i64).
if (VT.getScalarType() != MVT::i64 && VT.is256BitVector())
return Lower256IntArith(Op, DAG);
SDLoc DL(Op);
unsigned Opcode = Op.getOpcode();
SDValue N0 = Op.getOperand(0);
SDValue N1 = Op.getOperand(1);
// For pre-SSE41, we can perform UMIN/UMAX v8i16 by flipping the signbit,
// using the SMIN/SMAX instructions and flipping the signbit back.
if (VT == MVT::v8i16) {
assert((Opcode == ISD::UMIN || Opcode == ISD::UMAX) &&
"Unexpected MIN/MAX opcode");
SDValue Sign = DAG.getConstant(APInt::getSignedMinValue(16), DL, VT);
N0 = DAG.getNode(ISD::XOR, DL, VT, N0, Sign);
N1 = DAG.getNode(ISD::XOR, DL, VT, N1, Sign);
Opcode = (Opcode == ISD::UMIN ? ISD::SMIN : ISD::SMAX);
SDValue Result = DAG.getNode(Opcode, DL, VT, N0, N1);
return DAG.getNode(ISD::XOR, DL, VT, Result, Sign);
}
// Else, expand to a compare/select.
ISD::CondCode CC;
switch (Opcode) {
case ISD::SMIN: CC = ISD::CondCode::SETLT; break;
case ISD::SMAX: CC = ISD::CondCode::SETGT; break;
case ISD::UMIN: CC = ISD::CondCode::SETULT; break;
case ISD::UMAX: CC = ISD::CondCode::SETUGT; break;
default: llvm_unreachable("Unknown MINMAX opcode");
}
SDValue Cond = DAG.getSetCC(DL, VT, N0, N1, CC);
return DAG.getSelect(DL, VT, Cond, N0, N1);
}
static SDValue LowerMUL(SDValue Op, const X86Subtarget &Subtarget,

View File

@ -13,12 +13,7 @@ define <16 x i8> @test_v16i8_nosignbit(<16 x i8> %a, <16 x i8> %b) {
; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
; SSE2-NEXT: pand %xmm2, %xmm0
; SSE2-NEXT: pand %xmm2, %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: movdqa %xmm2, %xmm0
; SSE2-NEXT: pmaxub %xmm1, %xmm0
; SSE2-NEXT: retq
;
; SSE41-LABEL: test_v16i8_nosignbit:

View File

@ -13,11 +13,7 @@ define <16 x i8> @test_v16i8_nosignbit(<16 x i8> %a, <16 x i8> %b) {
; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15]
; SSE2-NEXT: pand %xmm2, %xmm0
; SSE2-NEXT: pand %xmm2, %xmm1
; SSE2-NEXT: movdqa %xmm1, %xmm2
; SSE2-NEXT: pcmpgtb %xmm0, %xmm2
; SSE2-NEXT: pand %xmm2, %xmm0
; SSE2-NEXT: pandn %xmm1, %xmm2
; SSE2-NEXT: por %xmm2, %xmm0
; SSE2-NEXT: pminub %xmm1, %xmm0
; SSE2-NEXT: retq
;
; SSE41-LABEL: test_v16i8_nosignbit:

View File

@ -12,11 +12,7 @@ define <8 x i16> @test_v8i16_nosignbit(<8 x i16> %a, <8 x i16> %b) {
; SSE2: # %bb.0:
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
; SSE2-NEXT: psrlw $1, %xmm1
; SSE2-NEXT: movdqa %xmm1, %xmm2
; SSE2-NEXT: pcmpgtw %xmm0, %xmm2
; SSE2-NEXT: pand %xmm2, %xmm0
; SSE2-NEXT: pandn %xmm1, %xmm2
; SSE2-NEXT: por %xmm2, %xmm0
; SSE2-NEXT: pminsw %xmm1, %xmm0
; SSE2-NEXT: retq
;
; SSE41-LABEL: test_v8i16_nosignbit:

View File

@ -12,12 +12,7 @@ define <8 x i16> @test_v8i16_nosignbit(<8 x i16> %a, <8 x i16> %b) {
; SSE2: # %bb.0:
; SSE2-NEXT: pand {{.*}}(%rip), %xmm0
; SSE2-NEXT: psrlw $1, %xmm1
; SSE2-NEXT: movdqa %xmm0, %xmm2
; SSE2-NEXT: pcmpgtw %xmm1, %xmm2
; SSE2-NEXT: pand %xmm2, %xmm0
; SSE2-NEXT: pandn %xmm1, %xmm2
; SSE2-NEXT: por %xmm0, %xmm2
; SSE2-NEXT: movdqa %xmm2, %xmm0
; SSE2-NEXT: pmaxsw %xmm1, %xmm0
; SSE2-NEXT: retq
;
; SSE41-LABEL: test_v8i16_nosignbit:

View File

@ -1058,16 +1058,10 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-LABEL: test_reduce_v8i64:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: subl $28, %esp
; X86-SSE2-NEXT: .cfi_def_cfa_offset 32
; X86-SSE2-NEXT: movdqa %xmm3, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, (%esp) ## 16-byte Spill
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm2, %xmm6
; X86-SSE2-NEXT: movdqa %xmm0, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm6, %xmm7
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
@ -1077,43 +1071,43 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: pand %xmm5, %xmm6
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: por %xmm6, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm0, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: movdqa %xmm7, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm6, %xmm0
; X86-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
; X86-SSE2-NEXT: pand %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; X86-SSE2-NEXT: por %xmm7, %xmm6
; X86-SSE2-NEXT: pand %xmm6, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm6
; X86-SSE2-NEXT: por %xmm1, %xmm6
; X86-SSE2-NEXT: pand %xmm5, %xmm2
; X86-SSE2-NEXT: pandn (%esp), %xmm5 ## 16-byte Folded Reload
; X86-SSE2-NEXT: por %xmm2, %xmm5
; X86-SSE2-NEXT: movdqa %xmm5, %xmm0
; X86-SSE2-NEXT: pand %xmm5, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm5
; X86-SSE2-NEXT: por %xmm0, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm6, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[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 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: por %xmm1, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm6
; X86-SSE2-NEXT: pandn %xmm5, %xmm0
; X86-SSE2-NEXT: por %xmm6, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm1, %xmm4
; 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 {{.*#+}} xmm2 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: pand %xmm0, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
; X86-SSE2-NEXT: por %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, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm5, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm3
; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,0,2,2]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: pand %xmm1, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: por %xmm2, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm5
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm5, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm0, %xmm4
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtd %xmm4, %xmm3
; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm4
@ -1122,24 +1116,22 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: pand %xmm2, %xmm4
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: por %xmm4, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm0
; X86-SSE2-NEXT: pandn %xmm1, %xmm2
; X86-SSE2-NEXT: por %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: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X86-SSE2-NEXT: movd %xmm0, %edx
; X86-SSE2-NEXT: addl $28, %esp
; X86-SSE2-NEXT: retl
;
; X86-SSE42-LABEL: test_reduce_v8i64:
; X86-SSE42: ## %bb.0:
; X86-SSE42-NEXT: movdqa %xmm0, %xmm4
; X86-SSE42-NEXT: movdqa %xmm0, %xmm5
; X86-SSE42-NEXT: pcmpgtq %xmm2, %xmm5
; X86-SSE42-NEXT: movdqa %xmm1, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm3, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
; X86-SSE42-NEXT: movdqa %xmm5, %xmm0
; X86-SSE42-NEXT: movdqa %xmm4, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm2, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2
; X86-SSE42-NEXT: movapd %xmm2, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm3, %xmm0
@ -1194,9 +1186,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,0,2147483648,0]
; 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
@ -1204,41 +1196,41 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X64-SSE2-NEXT: pcmpeqd %xmm5, %xmm6
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm8, %xmm6
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
; X64-SSE2-NEXT: por %xmm6, %xmm8
; X64-SSE2-NEXT: movdqa %xmm2, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: movdqa %xmm0, %xmm7
; X64-SSE2-NEXT: pxor %xmm4, %xmm7
; X64-SSE2-NEXT: movdqa %xmm7, %xmm5
; X64-SSE2-NEXT: pcmpgtd %xmm6, %xmm5
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm9, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
; X64-SSE2-NEXT: por %xmm7, %xmm6
; X64-SSE2-NEXT: pand %xmm6, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm6
; X64-SSE2-NEXT: por %xmm0, %xmm6
; X64-SSE2-NEXT: pand %xmm8, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm8
; X64-SSE2-NEXT: por %xmm1, %xmm8
; X64-SSE2-NEXT: movdqa %xmm8, %xmm0
; 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 %xmm3, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: movdqa %xmm6, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
; 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 %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 %xmm3, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm6, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
; X64-SSE2-NEXT: por %xmm0, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm6
; X64-SSE2-NEXT: pandn %xmm8, %xmm1
; X64-SSE2-NEXT: por %xmm6, %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,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1260,12 +1252,11 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X64-SSE42-LABEL: test_reduce_v8i64:
; X64-SSE42: ## %bb.0:
; X64-SSE42-NEXT: movdqa %xmm0, %xmm4
; X64-SSE42-NEXT: movdqa %xmm0, %xmm5
; X64-SSE42-NEXT: pcmpgtq %xmm2, %xmm5
; X64-SSE42-NEXT: movdqa %xmm1, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm3, %xmm0
; X64-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
; X64-SSE42-NEXT: movdqa %xmm5, %xmm0
; X64-SSE42-NEXT: movdqa %xmm4, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm2, %xmm0
; X64-SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2
; X64-SSE42-NEXT: movapd %xmm2, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm3, %xmm0
@ -1341,21 +1332,21 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
define i32 @test_reduce_v16i32(<16 x i32> %a0) {
; X86-SSE2-LABEL: test_reduce_v16i32:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa %xmm0, %xmm4
; X86-SSE2-NEXT: pcmpgtd %xmm2, %xmm4
; X86-SSE2-NEXT: movdqa %xmm1, %xmm5
; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm5
; X86-SSE2-NEXT: pand %xmm5, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm5
; X86-SSE2-NEXT: por %xmm1, %xmm5
; X86-SSE2-NEXT: pand %xmm4, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm4
; X86-SSE2-NEXT: por %xmm0, %xmm4
; X86-SSE2-NEXT: movdqa %xmm4, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm4
; X86-SSE2-NEXT: pandn %xmm5, %xmm0
; X86-SSE2-NEXT: por %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm1, %xmm4
; X86-SSE2-NEXT: pcmpgtd %xmm3, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm4
; X86-SSE2-NEXT: por %xmm1, %xmm4
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pcmpgtd %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: pcmpgtd %xmm4, %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,0,1]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm2
@ -1413,21 +1404,21 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v16i32:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa %xmm0, %xmm4
; X64-SSE2-NEXT: pcmpgtd %xmm2, %xmm4
; X64-SSE2-NEXT: movdqa %xmm1, %xmm5
; X64-SSE2-NEXT: pcmpgtd %xmm3, %xmm5
; X64-SSE2-NEXT: pand %xmm5, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm5
; X64-SSE2-NEXT: por %xmm1, %xmm5
; X64-SSE2-NEXT: pand %xmm4, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm4
; X64-SSE2-NEXT: por %xmm0, %xmm4
; X64-SSE2-NEXT: movdqa %xmm4, %xmm0
; X64-SSE2-NEXT: pcmpgtd %xmm5, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm4
; X64-SSE2-NEXT: pandn %xmm5, %xmm0
; X64-SSE2-NEXT: por %xmm4, %xmm0
; X64-SSE2-NEXT: movdqa %xmm1, %xmm4
; X64-SSE2-NEXT: pcmpgtd %xmm3, %xmm4
; X64-SSE2-NEXT: pand %xmm4, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm4
; X64-SSE2-NEXT: por %xmm1, %xmm4
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtd %xmm2, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm1
; X64-SSE2-NEXT: por %xmm0, %xmm1
; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
; X64-SSE2-NEXT: pcmpgtd %xmm4, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm1
; X64-SSE2-NEXT: pandn %xmm4, %xmm0
; X64-SSE2-NEXT: por %xmm1, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm2
; X64-SSE2-NEXT: pcmpgtd %xmm1, %xmm2
@ -1667,21 +1658,21 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
define i8 @test_reduce_v64i8(<64 x i8> %a0) {
; X86-SSE2-LABEL: test_reduce_v64i8:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa %xmm0, %xmm4
; X86-SSE2-NEXT: pcmpgtb %xmm2, %xmm4
; X86-SSE2-NEXT: movdqa %xmm1, %xmm5
; X86-SSE2-NEXT: pcmpgtb %xmm3, %xmm5
; X86-SSE2-NEXT: pand %xmm5, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm5
; X86-SSE2-NEXT: por %xmm1, %xmm5
; X86-SSE2-NEXT: pand %xmm4, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm4
; X86-SSE2-NEXT: por %xmm0, %xmm4
; X86-SSE2-NEXT: movdqa %xmm4, %xmm0
; X86-SSE2-NEXT: pcmpgtb %xmm5, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm4
; X86-SSE2-NEXT: pandn %xmm5, %xmm0
; X86-SSE2-NEXT: por %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm1, %xmm4
; X86-SSE2-NEXT: pcmpgtb %xmm3, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm4
; X86-SSE2-NEXT: por %xmm1, %xmm4
; 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: pcmpgtb %xmm4, %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,0,1]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm2
@ -1764,21 +1755,21 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v64i8:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa %xmm0, %xmm4
; X64-SSE2-NEXT: pcmpgtb %xmm2, %xmm4
; X64-SSE2-NEXT: movdqa %xmm1, %xmm5
; X64-SSE2-NEXT: pcmpgtb %xmm3, %xmm5
; X64-SSE2-NEXT: pand %xmm5, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm5
; X64-SSE2-NEXT: por %xmm1, %xmm5
; X64-SSE2-NEXT: pand %xmm4, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm4
; X64-SSE2-NEXT: por %xmm0, %xmm4
; X64-SSE2-NEXT: movdqa %xmm4, %xmm0
; X64-SSE2-NEXT: pcmpgtb %xmm5, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm4
; X64-SSE2-NEXT: pandn %xmm5, %xmm0
; X64-SSE2-NEXT: por %xmm4, %xmm0
; X64-SSE2-NEXT: movdqa %xmm1, %xmm4
; X64-SSE2-NEXT: pcmpgtb %xmm3, %xmm4
; X64-SSE2-NEXT: pand %xmm4, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm4
; X64-SSE2-NEXT: por %xmm1, %xmm4
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtb %xmm2, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm1
; X64-SSE2-NEXT: por %xmm0, %xmm1
; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
; X64-SSE2-NEXT: pcmpgtb %xmm4, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm1
; X64-SSE2-NEXT: pandn %xmm4, %xmm0
; X64-SSE2-NEXT: por %xmm1, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm2
; X64-SSE2-NEXT: pcmpgtb %xmm1, %xmm2

View File

@ -1062,14 +1062,10 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-LABEL: test_reduce_v8i64:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: subl $28, %esp
; X86-SSE2-NEXT: .cfi_def_cfa_offset 32
; X86-SSE2-NEXT: movdqa %xmm2, %xmm6
; X86-SSE2-NEXT: movdqa %xmm2, (%esp) ## 16-byte Spill
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm6, %xmm7
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
@ -1079,39 +1075,39 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: pand %xmm5, %xmm6
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: por %xmm6, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm3, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: movdqa %xmm7, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm6, %xmm0
; X86-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
; X86-SSE2-NEXT: pand %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; X86-SSE2-NEXT: por %xmm7, %xmm6
; X86-SSE2-NEXT: pand %xmm6, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm6
; X86-SSE2-NEXT: por %xmm1, %xmm6
; X86-SSE2-NEXT: pand %xmm5, %xmm2
; X86-SSE2-NEXT: pandn (%esp), %xmm5 ## 16-byte Folded Reload
; X86-SSE2-NEXT: por %xmm2, %xmm5
; X86-SSE2-NEXT: movdqa %xmm5, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm6, %xmm1
; X86-SSE2-NEXT: pand %xmm5, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm5
; X86-SSE2-NEXT: por %xmm1, %xmm5
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pxor %xmm4, %xmm3
; X86-SSE2-NEXT: movdqa %xmm3, %xmm6
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm6
; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm3
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: pand %xmm1, %xmm3
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
; X86-SSE2-NEXT: por %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, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm5, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm3
; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[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 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: por %xmm2, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: pandn %xmm5, %xmm0
; X86-SSE2-NEXT: por %xmm1, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm5
; X86-SSE2-NEXT: pandn %xmm6, %xmm0
; X86-SSE2-NEXT: por %xmm5, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1130,18 +1126,16 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: movd %xmm2, %eax
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X86-SSE2-NEXT: movd %xmm0, %edx
; X86-SSE2-NEXT: addl $28, %esp
; X86-SSE2-NEXT: retl
;
; X86-SSE42-LABEL: test_reduce_v8i64:
; X86-SSE42: ## %bb.0:
; X86-SSE42-NEXT: movdqa %xmm0, %xmm4
; X86-SSE42-NEXT: movdqa %xmm3, %xmm5
; X86-SSE42-NEXT: pcmpgtq %xmm1, %xmm5
; X86-SSE42-NEXT: movdqa %xmm2, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm4, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2
; X86-SSE42-NEXT: movdqa %xmm5, %xmm0
; X86-SSE42-NEXT: movdqa %xmm3, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm1, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
; X86-SSE42-NEXT: movapd %xmm3, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm2, %xmm0
@ -1195,11 +1189,11 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v8i64:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,0,2147483648,0]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm5
; X64-SSE2-NEXT: pxor %xmm9, %xmm5
; X64-SSE2-NEXT: movdqa %xmm2, %xmm6
; X64-SSE2-NEXT: pxor %xmm9, %xmm6
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,0,2147483648,0]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm5
; X64-SSE2-NEXT: pxor %xmm4, %xmm5
; X64-SSE2-NEXT: movdqa %xmm3, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: movdqa %xmm6, %xmm7
; X64-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
@ -1208,49 +1202,49 @@ 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: movdqa %xmm1, %xmm6
; X64-SSE2-NEXT: pxor %xmm9, %xmm6
; X64-SSE2-NEXT: movdqa %xmm3, %xmm7
; X64-SSE2-NEXT: pxor %xmm9, %xmm7
; X64-SSE2-NEXT: movdqa %xmm7, %xmm4
; X64-SSE2-NEXT: pcmpgtd %xmm6, %xmm4
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm8, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
; X64-SSE2-NEXT: por %xmm7, %xmm6
; X64-SSE2-NEXT: pand %xmm6, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm6
; X64-SSE2-NEXT: por %xmm1, %xmm6
; 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 %xmm9, %xmm0
; X64-SSE2-NEXT: movdqa %xmm6, %xmm1
; X64-SSE2-NEXT: pxor %xmm9, %xmm1
; 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: pcmpgtd %xmm0, %xmm2
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
; 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 %xmm3, %xmm0
; 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: pand %xmm1, %xmm3
; X64-SSE2-NEXT: pandn %xmm5, %xmm1
; X64-SSE2-NEXT: por %xmm3, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm9, %xmm2
; X64-SSE2-NEXT: pxor %xmm0, %xmm9
; X64-SSE2-NEXT: movdqa %xmm9, %xmm3
; 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 {{.*#+}} xmm4 = xmm3[0,0,2,2]
; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm9
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm9[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm4, %xmm2
; 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
@ -1262,12 +1256,11 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X64-SSE42-LABEL: test_reduce_v8i64:
; X64-SSE42: ## %bb.0:
; X64-SSE42-NEXT: movdqa %xmm0, %xmm4
; X64-SSE42-NEXT: movdqa %xmm3, %xmm5
; X64-SSE42-NEXT: pcmpgtq %xmm1, %xmm5
; X64-SSE42-NEXT: movdqa %xmm2, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm4, %xmm0
; X64-SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2
; X64-SSE42-NEXT: movdqa %xmm5, %xmm0
; X64-SSE42-NEXT: movdqa %xmm3, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm1, %xmm0
; X64-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
; X64-SSE42-NEXT: movapd %xmm3, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm2, %xmm0
@ -1343,27 +1336,27 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
define i32 @test_reduce_v16i32(<16 x i32> %a0) {
; X86-SSE2-LABEL: test_reduce_v16i32:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa %xmm3, %xmm4
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm4
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm5
; X86-SSE2-NEXT: pand %xmm5, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm5
; X86-SSE2-NEXT: por %xmm0, %xmm5
; X86-SSE2-NEXT: pand %xmm4, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm4
; X86-SSE2-NEXT: por %xmm1, %xmm4
; X86-SSE2-NEXT: movdqa %xmm4, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm5
; X86-SSE2-NEXT: pandn %xmm4, %xmm0
; X86-SSE2-NEXT: por %xmm5, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm0
; X86-SSE2-NEXT: pandn %xmm1, %xmm2
; X86-SSE2-NEXT: por %xmm0, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm4
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm4
; X86-SSE2-NEXT: por %xmm0, %xmm4
; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm0
; X86-SSE2-NEXT: por %xmm1, %xmm0
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pcmpgtd %xmm4, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm4
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm4, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; 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: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pcmpgtd %xmm2, %xmm1
@ -1415,27 +1408,27 @@ define i32 @test_reduce_v16i32(<16 x i32> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v16i32:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa %xmm3, %xmm4
; X64-SSE2-NEXT: pcmpgtd %xmm1, %xmm4
; X64-SSE2-NEXT: movdqa %xmm2, %xmm5
; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm5
; X64-SSE2-NEXT: pand %xmm5, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm5
; X64-SSE2-NEXT: por %xmm0, %xmm5
; X64-SSE2-NEXT: pand %xmm4, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm4
; X64-SSE2-NEXT: por %xmm1, %xmm4
; X64-SSE2-NEXT: movdqa %xmm4, %xmm0
; X64-SSE2-NEXT: pcmpgtd %xmm5, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm5
; X64-SSE2-NEXT: pandn %xmm4, %xmm0
; X64-SSE2-NEXT: por %xmm5, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X64-SSE2-NEXT: pand %xmm2, %xmm0
; X64-SSE2-NEXT: pandn %xmm1, %xmm2
; X64-SSE2-NEXT: por %xmm0, %xmm2
; X64-SSE2-NEXT: movdqa %xmm2, %xmm4
; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm4
; X64-SSE2-NEXT: pand %xmm4, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm4
; X64-SSE2-NEXT: por %xmm0, %xmm4
; X64-SSE2-NEXT: movdqa %xmm3, %xmm0
; X64-SSE2-NEXT: pcmpgtd %xmm1, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm0
; X64-SSE2-NEXT: por %xmm1, %xmm0
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtd %xmm4, %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[2,3,0,1]
; 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: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtd %xmm2, %xmm1
@ -1669,27 +1662,27 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
define i8 @test_reduce_v64i8(<64 x i8> %a0) {
; X86-SSE2-LABEL: test_reduce_v64i8:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa %xmm3, %xmm4
; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm4
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: pcmpgtb %xmm0, %xmm5
; X86-SSE2-NEXT: pand %xmm5, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm5
; X86-SSE2-NEXT: por %xmm0, %xmm5
; X86-SSE2-NEXT: pand %xmm4, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm4
; X86-SSE2-NEXT: por %xmm1, %xmm4
; X86-SSE2-NEXT: movdqa %xmm4, %xmm0
; X86-SSE2-NEXT: pcmpgtb %xmm5, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm5
; X86-SSE2-NEXT: pandn %xmm4, %xmm0
; X86-SSE2-NEXT: por %xmm5, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; 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: por %xmm0, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm4
; X86-SSE2-NEXT: pcmpgtb %xmm0, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm4
; X86-SSE2-NEXT: por %xmm0, %xmm4
; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
; X86-SSE2-NEXT: pcmpgtb %xmm1, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm0
; X86-SSE2-NEXT: por %xmm1, %xmm0
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pcmpgtb %xmm4, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm4
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm4, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; 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 {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pcmpgtb %xmm2, %xmm1
@ -1766,27 +1759,27 @@ define i8 @test_reduce_v64i8(<64 x i8> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v64i8:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa %xmm3, %xmm4
; X64-SSE2-NEXT: pcmpgtb %xmm1, %xmm4
; X64-SSE2-NEXT: movdqa %xmm2, %xmm5
; X64-SSE2-NEXT: pcmpgtb %xmm0, %xmm5
; X64-SSE2-NEXT: pand %xmm5, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm5
; X64-SSE2-NEXT: por %xmm0, %xmm5
; X64-SSE2-NEXT: pand %xmm4, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm4
; X64-SSE2-NEXT: por %xmm1, %xmm4
; X64-SSE2-NEXT: movdqa %xmm4, %xmm0
; X64-SSE2-NEXT: pcmpgtb %xmm5, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm5
; X64-SSE2-NEXT: pandn %xmm4, %xmm0
; X64-SSE2-NEXT: por %xmm5, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; 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: por %xmm0, %xmm2
; X64-SSE2-NEXT: movdqa %xmm2, %xmm4
; X64-SSE2-NEXT: pcmpgtb %xmm0, %xmm4
; X64-SSE2-NEXT: pand %xmm4, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm4
; X64-SSE2-NEXT: por %xmm0, %xmm4
; X64-SSE2-NEXT: movdqa %xmm3, %xmm0
; X64-SSE2-NEXT: pcmpgtb %xmm1, %xmm0
; X64-SSE2-NEXT: pand %xmm0, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm0
; X64-SSE2-NEXT: por %xmm1, %xmm0
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtb %xmm4, %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[2,3,0,1]
; 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,2,3]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtb %xmm2, %xmm1

View File

@ -225,35 +225,24 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
define i16 @test_reduce_v8i16(<8 x i16> %a0) {
; X86-SSE2-LABEL: test_reduce_v8i16:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pxor %xmm1, %xmm3
; X86-SSE2-NEXT: movdqa %xmm2, %xmm4
; X86-SSE2-NEXT: pxor %xmm1, %xmm4
; X86-SSE2-NEXT: pcmpgtw %xmm4, %xmm3
; X86-SSE2-NEXT: pand %xmm3, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm3
; X86-SSE2-NEXT: por %xmm0, %xmm3
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
; X86-SSE2-NEXT: movdqa %xmm3, %xmm2
; X86-SSE2-NEXT: pxor %xmm1, %xmm2
; X86-SSE2-NEXT: movdqa %xmm0, %xmm4
; X86-SSE2-NEXT: pxor %xmm1, %xmm4
; X86-SSE2-NEXT: pcmpgtw %xmm4, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm3
; X86-SSE2-NEXT: pandn %xmm0, %xmm2
; X86-SSE2-NEXT: por %xmm3, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm0
; X86-SSE2-NEXT: psrld $16, %xmm0
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pxor %xmm1, %xmm3
; X86-SSE2-NEXT: pxor %xmm0, %xmm1
; X86-SSE2-NEXT: pcmpgtw %xmm1, %xmm3
; X86-SSE2-NEXT: pand %xmm3, %xmm2
; X86-SSE2-NEXT: pandn %xmm0, %xmm3
; X86-SSE2-NEXT: por %xmm2, %xmm3
; X86-SSE2-NEXT: movd %xmm3, %eax
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: psrld $16, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: movd %xmm1, %eax
; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X86-SSE2-NEXT: retl
;
@ -279,35 +268,24 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v8i16:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm3
; X64-SSE2-NEXT: pxor %xmm1, %xmm3
; X64-SSE2-NEXT: movdqa %xmm2, %xmm4
; X64-SSE2-NEXT: pxor %xmm1, %xmm4
; X64-SSE2-NEXT: pcmpgtw %xmm4, %xmm3
; X64-SSE2-NEXT: pand %xmm3, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm3
; X64-SSE2-NEXT: por %xmm0, %xmm3
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
; X64-SSE2-NEXT: movdqa %xmm3, %xmm2
; X64-SSE2-NEXT: pxor %xmm1, %xmm2
; X64-SSE2-NEXT: movdqa %xmm0, %xmm4
; X64-SSE2-NEXT: pxor %xmm1, %xmm4
; X64-SSE2-NEXT: pcmpgtw %xmm4, %xmm2
; X64-SSE2-NEXT: pand %xmm2, %xmm3
; X64-SSE2-NEXT: pandn %xmm0, %xmm2
; X64-SSE2-NEXT: por %xmm3, %xmm2
; X64-SSE2-NEXT: movdqa %xmm2, %xmm0
; X64-SSE2-NEXT: psrld $16, %xmm0
; X64-SSE2-NEXT: movdqa %xmm2, %xmm3
; X64-SSE2-NEXT: pxor %xmm1, %xmm3
; X64-SSE2-NEXT: pxor %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtw %xmm1, %xmm3
; X64-SSE2-NEXT: pand %xmm3, %xmm2
; X64-SSE2-NEXT: pandn %xmm0, %xmm3
; X64-SSE2-NEXT: por %xmm2, %xmm3
; X64-SSE2-NEXT: movd %xmm3, %eax
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: psrld $16, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: movd %xmm1, %eax
; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-SSE2-NEXT: retq
;
@ -859,41 +837,26 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
; X86-SSE2-LABEL: test_reduce_v16i16:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; 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: pcmpgtw %xmm3, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm0
; X86-SSE2-NEXT: pandn %xmm1, %xmm4
; X86-SSE2-NEXT: por %xmm0, %xmm4
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm4, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pxor %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtw %xmm3, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm4
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm4, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; 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: pcmpgtw %xmm4, %xmm3
; X86-SSE2-NEXT: pand %xmm3, %xmm1
; X86-SSE2-NEXT: pandn %xmm0, %xmm3
; X86-SSE2-NEXT: por %xmm1, %xmm3
; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
; X86-SSE2-NEXT: psrld $16, %xmm0
; X86-SSE2-NEXT: movdqa %xmm3, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpgtw %xmm2, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm3
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm3, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: psrld $16, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: movd %xmm1, %eax
; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X86-SSE2-NEXT: retl
@ -938,41 +901,26 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
; X64-SSE2-LABEL: test_reduce_v16i16:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm3
; X64-SSE2-NEXT: pxor %xmm2, %xmm3
; X64-SSE2-NEXT: movdqa %xmm0, %xmm4
; X64-SSE2-NEXT: pxor %xmm2, %xmm4
; X64-SSE2-NEXT: pcmpgtw %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,0,1]
; 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: pcmpgtw %xmm3, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm4
; X64-SSE2-NEXT: pandn %xmm0, %xmm1
; X64-SSE2-NEXT: por %xmm4, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm3
; X64-SSE2-NEXT: pxor %xmm2, %xmm3
; X64-SSE2-NEXT: movdqa %xmm0, %xmm4
; X64-SSE2-NEXT: pxor %xmm2, %xmm4
; X64-SSE2-NEXT: pcmpgtw %xmm4, %xmm3
; X64-SSE2-NEXT: pand %xmm3, %xmm1
; X64-SSE2-NEXT: pandn %xmm0, %xmm3
; X64-SSE2-NEXT: por %xmm1, %xmm3
; X64-SSE2-NEXT: movdqa %xmm3, %xmm0
; X64-SSE2-NEXT: psrld $16, %xmm0
; X64-SSE2-NEXT: movdqa %xmm3, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm0, %xmm2
; X64-SSE2-NEXT: pcmpgtw %xmm2, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm3
; X64-SSE2-NEXT: pandn %xmm0, %xmm1
; X64-SSE2-NEXT: por %xmm3, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: psrld $16, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: movd %xmm1, %eax
; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-SSE2-NEXT: retq
@ -1203,16 +1151,10 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-LABEL: test_reduce_v8i64:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: subl $28, %esp
; X86-SSE2-NEXT: .cfi_def_cfa_offset 32
; X86-SSE2-NEXT: movdqa %xmm3, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, (%esp) ## 16-byte Spill
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm2, %xmm6
; X86-SSE2-NEXT: movdqa %xmm0, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm6, %xmm7
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
@ -1222,43 +1164,43 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: pand %xmm5, %xmm6
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: por %xmm6, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm0, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: movdqa %xmm7, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm6, %xmm0
; X86-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
; X86-SSE2-NEXT: pand %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; X86-SSE2-NEXT: por %xmm7, %xmm6
; X86-SSE2-NEXT: pand %xmm6, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm6
; X86-SSE2-NEXT: por %xmm1, %xmm6
; X86-SSE2-NEXT: pand %xmm5, %xmm2
; X86-SSE2-NEXT: pandn (%esp), %xmm5 ## 16-byte Folded Reload
; X86-SSE2-NEXT: por %xmm2, %xmm5
; X86-SSE2-NEXT: movdqa %xmm5, %xmm0
; X86-SSE2-NEXT: pand %xmm5, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm5
; X86-SSE2-NEXT: por %xmm0, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm6, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[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 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: por %xmm1, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm6
; X86-SSE2-NEXT: pandn %xmm5, %xmm0
; X86-SSE2-NEXT: por %xmm6, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm1, %xmm4
; 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 {{.*#+}} xmm2 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: pand %xmm0, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
; X86-SSE2-NEXT: por %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, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm5, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm3
; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[0,0,2,2]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: pand %xmm1, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: por %xmm2, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm5
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm5, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm0, %xmm4
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtd %xmm4, %xmm3
; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm4
@ -1267,43 +1209,40 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: pand %xmm2, %xmm4
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: por %xmm4, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm0
; X86-SSE2-NEXT: pandn %xmm1, %xmm2
; X86-SSE2-NEXT: por %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: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X86-SSE2-NEXT: movd %xmm0, %edx
; X86-SSE2-NEXT: addl $28, %esp
; X86-SSE2-NEXT: retl
;
; X86-SSE42-LABEL: test_reduce_v8i64:
; X86-SSE42: ## %bb.0:
; X86-SSE42-NEXT: movdqa %xmm0, %xmm4
; X86-SSE42-NEXT: movdqa {{.*#+}} xmm6 = [0,2147483648,0,2147483648]
; X86-SSE42-NEXT: movdqa %xmm3, %xmm0
; X86-SSE42-NEXT: pxor %xmm6, %xmm0
; X86-SSE42-NEXT: movdqa %xmm1, %xmm5
; X86-SSE42-NEXT: pxor %xmm6, %xmm5
; X86-SSE42-NEXT: pcmpgtq %xmm0, %xmm5
; X86-SSE42-NEXT: movdqa %xmm2, %xmm7
; X86-SSE42-NEXT: pxor %xmm6, %xmm7
; X86-SSE42-NEXT: movdqa %xmm4, %xmm0
; X86-SSE42-NEXT: pxor %xmm6, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm7, %xmm0
; 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, %xmm4, %xmm2
; X86-SSE42-NEXT: movdqa %xmm5, %xmm0
; X86-SSE42-NEXT: movdqa %xmm3, %xmm4
; X86-SSE42-NEXT: pxor %xmm5, %xmm4
; X86-SSE42-NEXT: movdqa %xmm1, %xmm0
; X86-SSE42-NEXT: pxor %xmm5, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm4, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
; X86-SSE42-NEXT: movapd %xmm3, %xmm1
; X86-SSE42-NEXT: xorpd %xmm6, %xmm1
; X86-SSE42-NEXT: xorpd %xmm5, %xmm1
; X86-SSE42-NEXT: movapd %xmm2, %xmm0
; X86-SSE42-NEXT: xorpd %xmm6, %xmm0
; X86-SSE42-NEXT: xorpd %xmm5, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm1, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm3
; X86-SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
; X86-SSE42-NEXT: movdqa %xmm3, %xmm0
; X86-SSE42-NEXT: pxor %xmm6, %xmm0
; X86-SSE42-NEXT: pxor %xmm1, %xmm6
; X86-SSE42-NEXT: pcmpgtq %xmm6, %xmm0
; X86-SSE42-NEXT: pxor %xmm5, %xmm0
; X86-SSE42-NEXT: pxor %xmm1, %xmm5
; X86-SSE42-NEXT: pcmpgtq %xmm5, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm3, %xmm1
; X86-SSE42-NEXT: movd %xmm1, %eax
; X86-SSE42-NEXT: pextrd $1, %xmm1, %edx
@ -1368,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 = [2147483648,2147483648,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
@ -1378,41 +1317,41 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X64-SSE2-NEXT: pcmpeqd %xmm5, %xmm6
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm8, %xmm6
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[1,1,3,3]
; X64-SSE2-NEXT: por %xmm6, %xmm8
; X64-SSE2-NEXT: movdqa %xmm2, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: movdqa %xmm0, %xmm7
; X64-SSE2-NEXT: pxor %xmm4, %xmm7
; X64-SSE2-NEXT: movdqa %xmm7, %xmm5
; X64-SSE2-NEXT: pcmpgtd %xmm6, %xmm5
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm5[0,0,2,2]
; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm9, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3]
; X64-SSE2-NEXT: por %xmm7, %xmm6
; X64-SSE2-NEXT: pand %xmm6, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm6
; X64-SSE2-NEXT: por %xmm0, %xmm6
; X64-SSE2-NEXT: pand %xmm8, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm8
; X64-SSE2-NEXT: por %xmm1, %xmm8
; X64-SSE2-NEXT: movdqa %xmm8, %xmm0
; 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 %xmm3, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: movdqa %xmm6, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
; 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 %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 %xmm3, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm6, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
; X64-SSE2-NEXT: por %xmm0, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm6
; X64-SSE2-NEXT: pandn %xmm8, %xmm1
; X64-SSE2-NEXT: por %xmm6, %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,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1434,31 +1373,29 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X64-SSE42-LABEL: test_reduce_v8i64:
; X64-SSE42: ## %bb.0:
; X64-SSE42-NEXT: movdqa %xmm0, %xmm4
; X64-SSE42-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808]
; X64-SSE42-NEXT: movdqa %xmm3, %xmm0
; X64-SSE42-NEXT: pxor %xmm6, %xmm0
; X64-SSE42-NEXT: movdqa %xmm1, %xmm5
; X64-SSE42-NEXT: pxor %xmm6, %xmm5
; X64-SSE42-NEXT: pcmpgtq %xmm0, %xmm5
; X64-SSE42-NEXT: movdqa %xmm2, %xmm7
; X64-SSE42-NEXT: pxor %xmm6, %xmm7
; X64-SSE42-NEXT: movdqa %xmm4, %xmm0
; X64-SSE42-NEXT: pxor %xmm6, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm7, %xmm0
; X64-SSE42-NEXT: movdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808]
; X64-SSE42-NEXT: movdqa %xmm2, %xmm6
; X64-SSE42-NEXT: pxor %xmm5, %xmm6
; X64-SSE42-NEXT: pxor %xmm5, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm6, %xmm0
; X64-SSE42-NEXT: blendvpd %xmm0, %xmm4, %xmm2
; X64-SSE42-NEXT: movdqa %xmm5, %xmm0
; 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 %xmm6, %xmm1
; X64-SSE42-NEXT: xorpd %xmm5, %xmm1
; X64-SSE42-NEXT: movapd %xmm2, %xmm0
; X64-SSE42-NEXT: xorpd %xmm6, %xmm0
; X64-SSE42-NEXT: xorpd %xmm5, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm1, %xmm0
; X64-SSE42-NEXT: blendvpd %xmm0, %xmm2, %xmm3
; X64-SSE42-NEXT: pshufd {{.*#+}} xmm1 = xmm3[2,3,0,1]
; X64-SSE42-NEXT: movdqa %xmm3, %xmm0
; X64-SSE42-NEXT: pxor %xmm6, %xmm0
; X64-SSE42-NEXT: pxor %xmm1, %xmm6
; X64-SSE42-NEXT: pcmpgtq %xmm6, %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
; X64-SSE42-NEXT: movq %xmm1, %rax
; X64-SSE42-NEXT: retq
@ -1545,30 +1482,30 @@ 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, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm6
; X86-SSE2-NEXT: movdqa %xmm2, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm6
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: movdqa %xmm0, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm0, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
; X86-SSE2-NEXT: pand %xmm7, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm7
; X86-SSE2-NEXT: por %xmm0, %xmm7
; 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: 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 %xmm3, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm7, %xmm1
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm2
; X86-SSE2-NEXT: por %xmm1, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm5, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm7
; X86-SSE2-NEXT: pandn %xmm6, %xmm1
; X86-SSE2-NEXT: por %xmm7, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm5
; X86-SSE2-NEXT: pandn %xmm2, %xmm1
; X86-SSE2-NEXT: por %xmm5, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1632,30 +1569,30 @@ 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: movdqa %xmm2, %xmm5
; X64-SSE2-NEXT: movdqa %xmm0, %xmm5
; X64-SSE2-NEXT: pxor %xmm4, %xmm5
; X64-SSE2-NEXT: movdqa %xmm0, %xmm7
; X64-SSE2-NEXT: pxor %xmm4, %xmm7
; X64-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
; X64-SSE2-NEXT: pand %xmm7, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm7
; X64-SSE2-NEXT: por %xmm0, %xmm7
; X64-SSE2-NEXT: pand %xmm6, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm6
; X64-SSE2-NEXT: por %xmm1, %xmm6
; X64-SSE2-NEXT: movdqa %xmm6, %xmm0
; 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 %xmm3, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: movdqa %xmm7, %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: pcmpgtd %xmm0, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm7
; X64-SSE2-NEXT: pandn %xmm6, %xmm1
; X64-SSE2-NEXT: por %xmm7, %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,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1749,58 +1686,35 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
; X86-SSE2-LABEL: test_reduce_v32i16:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X86-SSE2-NEXT: movdqa %xmm3, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: pcmpgtw %xmm5, %xmm6
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm0, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: pcmpgtw %xmm5, %xmm7
; X86-SSE2-NEXT: pand %xmm7, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm7
; X86-SSE2-NEXT: por %xmm0, %xmm7
; 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: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm7, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pcmpgtw %xmm0, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm7
; X86-SSE2-NEXT: pandn %xmm6, %xmm1
; X86-SSE2-NEXT: por %xmm7, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pmaxsw %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm3
; X86-SSE2-NEXT: pcmpgtw %xmm3, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm1
; X86-SSE2-NEXT: pandn %xmm0, %xmm2
; X86-SSE2-NEXT: por %xmm1, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X86-SSE2-NEXT: movdqa %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pxor %xmm4, %xmm3
; X86-SSE2-NEXT: pcmpgtw %xmm3, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm2
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm2, %xmm1
; X86-SSE2-NEXT: pmaxsw %xmm3, %xmm1
; X86-SSE2-NEXT: movdqa %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm0, %xmm2
; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pmaxsw %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
; X86-SSE2-NEXT: psrld $16, %xmm0
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm0, %xmm4
; X86-SSE2-NEXT: pcmpgtw %xmm4, %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: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movd %xmm0, %eax
; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X86-SSE2-NEXT: retl
;
@ -1850,58 +1764,35 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
; X64-SSE2-LABEL: test_reduce_v32i16:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X64-SSE2-NEXT: movdqa %xmm3, %xmm5
; X64-SSE2-NEXT: pxor %xmm4, %xmm5
; X64-SSE2-NEXT: movdqa %xmm1, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: pcmpgtw %xmm5, %xmm6
; X64-SSE2-NEXT: movdqa %xmm2, %xmm5
; X64-SSE2-NEXT: pxor %xmm4, %xmm5
; X64-SSE2-NEXT: movdqa %xmm0, %xmm7
; X64-SSE2-NEXT: pxor %xmm4, %xmm7
; X64-SSE2-NEXT: pcmpgtw %xmm5, %xmm7
; X64-SSE2-NEXT: pand %xmm7, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm7
; X64-SSE2-NEXT: por %xmm0, %xmm7
; X64-SSE2-NEXT: pand %xmm6, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm6
; X64-SSE2-NEXT: por %xmm1, %xmm6
; X64-SSE2-NEXT: movdqa %xmm6, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: movdqa %xmm7, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: pcmpgtw %xmm0, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm7
; X64-SSE2-NEXT: pandn %xmm6, %xmm1
; X64-SSE2-NEXT: por %xmm7, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: movdqa %xmm0, %xmm3
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pmaxsw %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm3
; X64-SSE2-NEXT: pcmpgtw %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,2,3]
; X64-SSE2-NEXT: movdqa %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: movdqa %xmm0, %xmm3
; X64-SSE2-NEXT: pxor %xmm4, %xmm3
; X64-SSE2-NEXT: pcmpgtw %xmm3, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm2
; X64-SSE2-NEXT: pandn %xmm0, %xmm1
; X64-SSE2-NEXT: por %xmm2, %xmm1
; X64-SSE2-NEXT: pmaxsw %xmm3, %xmm1
; X64-SSE2-NEXT: movdqa %xmm4, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm0, %xmm2
; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pmaxsw %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: pmaxsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
; X64-SSE2-NEXT: psrld $16, %xmm0
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: pxor %xmm0, %xmm4
; X64-SSE2-NEXT: pcmpgtw %xmm4, %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: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pmaxsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: movd %xmm0, %eax
; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-SSE2-NEXT: retq
;

View File

@ -227,34 +227,23 @@ define i32 @test_reduce_v4i32(<4 x i32> %a0) {
define i16 @test_reduce_v8i16(<8 x i16> %a0) {
; X86-SSE2-LABEL: test_reduce_v8i16:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pxor %xmm1, %xmm3
; X86-SSE2-NEXT: movdqa %xmm2, %xmm4
; X86-SSE2-NEXT: pxor %xmm1, %xmm4
; X86-SSE2-NEXT: pcmpgtw %xmm3, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm4
; X86-SSE2-NEXT: por %xmm0, %xmm4
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
; X86-SSE2-NEXT: movdqa %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm1, %xmm2
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pxor %xmm1, %xmm3
; X86-SSE2-NEXT: pcmpgtw %xmm2, %xmm3
; X86-SSE2-NEXT: pand %xmm3, %xmm4
; X86-SSE2-NEXT: pandn %xmm0, %xmm3
; X86-SSE2-NEXT: por %xmm4, %xmm3
; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
; X86-SSE2-NEXT: psrld $16, %xmm0
; X86-SSE2-NEXT: movdqa %xmm3, %xmm2
; X86-SSE2-NEXT: pxor %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm0, %xmm1
; X86-SSE2-NEXT: pcmpgtw %xmm2, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm3
; X86-SSE2-NEXT: pandn %xmm0, %xmm1
; X86-SSE2-NEXT: por %xmm3, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pminsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pminsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: psrld $16, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pminsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: movd %xmm1, %eax
; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X86-SSE2-NEXT: retl
@ -275,34 +264,23 @@ define i16 @test_reduce_v8i16(<8 x i16> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v8i16:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm1 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm3
; X64-SSE2-NEXT: pxor %xmm1, %xmm3
; X64-SSE2-NEXT: movdqa %xmm2, %xmm4
; X64-SSE2-NEXT: pxor %xmm1, %xmm4
; X64-SSE2-NEXT: pcmpgtw %xmm3, %xmm4
; X64-SSE2-NEXT: pand %xmm4, %xmm0
; X64-SSE2-NEXT: pandn %xmm2, %xmm4
; X64-SSE2-NEXT: por %xmm0, %xmm4
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,1,2,3]
; X64-SSE2-NEXT: movdqa %xmm4, %xmm2
; X64-SSE2-NEXT: pxor %xmm1, %xmm2
; X64-SSE2-NEXT: movdqa %xmm0, %xmm3
; X64-SSE2-NEXT: pxor %xmm1, %xmm3
; X64-SSE2-NEXT: pcmpgtw %xmm2, %xmm3
; X64-SSE2-NEXT: pand %xmm3, %xmm4
; X64-SSE2-NEXT: pandn %xmm0, %xmm3
; X64-SSE2-NEXT: por %xmm4, %xmm3
; X64-SSE2-NEXT: movdqa %xmm3, %xmm0
; X64-SSE2-NEXT: psrld $16, %xmm0
; X64-SSE2-NEXT: movdqa %xmm3, %xmm2
; X64-SSE2-NEXT: pxor %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm0, %xmm1
; X64-SSE2-NEXT: pcmpgtw %xmm2, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm3
; X64-SSE2-NEXT: pandn %xmm0, %xmm1
; X64-SSE2-NEXT: por %xmm3, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pminsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pminsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: psrld $16, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pminsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: movd %xmm1, %eax
; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-SSE2-NEXT: retq
@ -799,42 +777,27 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
; X86-SSE2-LABEL: test_reduce_v16i16:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; 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: pcmpgtw %xmm3, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm0
; X86-SSE2-NEXT: pandn %xmm1, %xmm4
; X86-SSE2-NEXT: por %xmm0, %xmm4
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm4, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pxor %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtw %xmm1, %xmm3
; X86-SSE2-NEXT: pand %xmm3, %xmm4
; X86-SSE2-NEXT: pandn %xmm0, %xmm3
; X86-SSE2-NEXT: por %xmm4, %xmm3
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
; X86-SSE2-NEXT: movdqa %xmm3, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pminsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: movdqa %xmm0, %xmm4
; X86-SSE2-NEXT: pxor %xmm2, %xmm4
; X86-SSE2-NEXT: pcmpgtw %xmm1, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm3
; X86-SSE2-NEXT: pandn %xmm0, %xmm4
; X86-SSE2-NEXT: por %xmm3, %xmm4
; X86-SSE2-NEXT: movdqa %xmm4, %xmm0
; X86-SSE2-NEXT: psrld $16, %xmm0
; X86-SSE2-NEXT: movdqa %xmm4, %xmm1
; X86-SSE2-NEXT: pminsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpgtw %xmm1, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm4
; X86-SSE2-NEXT: pandn %xmm0, %xmm2
; X86-SSE2-NEXT: por %xmm4, %xmm2
; X86-SSE2-NEXT: movd %xmm2, %eax
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pminsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: psrld $16, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pminsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: movd %xmm1, %eax
; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X86-SSE2-NEXT: retl
;
@ -869,42 +832,27 @@ define i16 @test_reduce_v16i16(<16 x i16> %a0) {
; X64-SSE2-LABEL: test_reduce_v16i16:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768]
; 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: pcmpgtw %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,0,1]
; 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: pcmpgtw %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,2,3]
; X64-SSE2-NEXT: movdqa %xmm3, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pminsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: movdqa %xmm0, %xmm4
; X64-SSE2-NEXT: pxor %xmm2, %xmm4
; X64-SSE2-NEXT: pcmpgtw %xmm1, %xmm4
; X64-SSE2-NEXT: pand %xmm4, %xmm3
; X64-SSE2-NEXT: pandn %xmm0, %xmm4
; X64-SSE2-NEXT: por %xmm3, %xmm4
; X64-SSE2-NEXT: movdqa %xmm4, %xmm0
; X64-SSE2-NEXT: psrld $16, %xmm0
; X64-SSE2-NEXT: movdqa %xmm4, %xmm1
; X64-SSE2-NEXT: pminsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm0, %xmm2
; X64-SSE2-NEXT: pcmpgtw %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: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3]
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pminsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: movdqa %xmm0, %xmm1
; X64-SSE2-NEXT: psrld $16, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pminsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: movd %xmm1, %eax
; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-SSE2-NEXT: retq
;
@ -1103,14 +1051,10 @@ define i8 @test_reduce_v32i8(<32 x i8> %a0) {
define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-LABEL: test_reduce_v8i64:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: subl $28, %esp
; X86-SSE2-NEXT: .cfi_def_cfa_offset 32
; X86-SSE2-NEXT: movdqa %xmm2, %xmm6
; X86-SSE2-NEXT: movdqa %xmm2, (%esp) ## 16-byte Spill
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: movdqa %xmm3, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm6, %xmm7
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
@ -1120,39 +1064,39 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: pand %xmm5, %xmm6
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: por %xmm6, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm3, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: movdqa %xmm7, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm6, %xmm0
; X86-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[0,0,2,2]
; X86-SSE2-NEXT: pand %xmm6, %xmm7
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3]
; X86-SSE2-NEXT: por %xmm7, %xmm6
; X86-SSE2-NEXT: pand %xmm6, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm6
; X86-SSE2-NEXT: por %xmm1, %xmm6
; X86-SSE2-NEXT: pand %xmm5, %xmm2
; X86-SSE2-NEXT: pandn (%esp), %xmm5 ## 16-byte Folded Reload
; X86-SSE2-NEXT: por %xmm2, %xmm5
; X86-SSE2-NEXT: movdqa %xmm5, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm6, %xmm1
; X86-SSE2-NEXT: pand %xmm5, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm5
; X86-SSE2-NEXT: por %xmm1, %xmm5
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm2
; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,0,2,2]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3]
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pxor %xmm4, %xmm3
; X86-SSE2-NEXT: movdqa %xmm3, %xmm6
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm6
; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm3
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[0,0,2,2]
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: pand %xmm1, %xmm3
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3]
; X86-SSE2-NEXT: por %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, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm5, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm3
; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[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 = xmm3[1,1,3,3]
; X86-SSE2-NEXT: por %xmm2, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3]
; X86-SSE2-NEXT: pandn %xmm5, %xmm0
; X86-SSE2-NEXT: por %xmm1, %xmm0
; X86-SSE2-NEXT: pand %xmm0, %xmm5
; X86-SSE2-NEXT: pandn %xmm6, %xmm0
; X86-SSE2-NEXT: por %xmm5, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1171,24 +1115,23 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X86-SSE2-NEXT: movd %xmm2, %eax
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3]
; X86-SSE2-NEXT: movd %xmm0, %edx
; X86-SSE2-NEXT: addl $28, %esp
; X86-SSE2-NEXT: retl
;
; X86-SSE42-LABEL: test_reduce_v8i64:
; X86-SSE42: ## %bb.0:
; X86-SSE42-NEXT: movdqa %xmm0, %xmm5
; X86-SSE42-NEXT: movdqa {{.*#+}} xmm4 = [0,2147483648,0,2147483648]
; X86-SSE42-NEXT: pxor %xmm4, %xmm0
; X86-SSE42-NEXT: movdqa %xmm2, %xmm6
; X86-SSE42-NEXT: movdqa %xmm1, %xmm6
; X86-SSE42-NEXT: pxor %xmm4, %xmm6
; X86-SSE42-NEXT: pcmpgtq %xmm0, %xmm6
; X86-SSE42-NEXT: movdqa %xmm1, %xmm7
; X86-SSE42-NEXT: pxor %xmm4, %xmm7
; X86-SSE42-NEXT: movdqa %xmm3, %xmm0
; X86-SSE42-NEXT: pxor %xmm4, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm7, %xmm0
; X86-SSE42-NEXT: pcmpgtq %xmm6, %xmm0
; X86-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
; X86-SSE42-NEXT: movdqa %xmm6, %xmm0
; X86-SSE42-NEXT: movdqa %xmm5, %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, %xmm5, %xmm2
; X86-SSE42-NEXT: movapd %xmm2, %xmm1
; X86-SSE42-NEXT: xorpd %xmm4, %xmm1
@ -1265,11 +1208,11 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
;
; X64-SSE2-LABEL: test_reduce_v8i64:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm5
; X64-SSE2-NEXT: pxor %xmm9, %xmm5
; X64-SSE2-NEXT: movdqa %xmm2, %xmm6
; X64-SSE2-NEXT: pxor %xmm9, %xmm6
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm5
; X64-SSE2-NEXT: pxor %xmm4, %xmm5
; X64-SSE2-NEXT: movdqa %xmm3, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: movdqa %xmm6, %xmm7
; X64-SSE2-NEXT: pcmpgtd %xmm5, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm7[0,0,2,2]
@ -1278,49 +1221,49 @@ 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: movdqa %xmm1, %xmm6
; X64-SSE2-NEXT: pxor %xmm9, %xmm6
; X64-SSE2-NEXT: movdqa %xmm3, %xmm7
; X64-SSE2-NEXT: pxor %xmm9, %xmm7
; X64-SSE2-NEXT: movdqa %xmm7, %xmm4
; X64-SSE2-NEXT: pcmpgtd %xmm6, %xmm4
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm4[0,0,2,2]
; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm8, %xmm7
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3]
; X64-SSE2-NEXT: por %xmm7, %xmm6
; X64-SSE2-NEXT: pand %xmm6, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm6
; X64-SSE2-NEXT: por %xmm1, %xmm6
; 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 %xmm9, %xmm0
; X64-SSE2-NEXT: movdqa %xmm6, %xmm1
; X64-SSE2-NEXT: pxor %xmm9, %xmm1
; 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: pcmpgtd %xmm0, %xmm2
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2]
; 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 %xmm3, %xmm0
; 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: pand %xmm1, %xmm3
; X64-SSE2-NEXT: pandn %xmm5, %xmm1
; X64-SSE2-NEXT: por %xmm3, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm9, %xmm2
; X64-SSE2-NEXT: pxor %xmm0, %xmm9
; X64-SSE2-NEXT: movdqa %xmm9, %xmm3
; 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 {{.*#+}} xmm4 = xmm3[0,0,2,2]
; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm9
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm9[1,1,3,3]
; X64-SSE2-NEXT: pand %xmm4, %xmm2
; 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
@ -1333,17 +1276,17 @@ define i64 @test_reduce_v8i64(<8 x i64> %a0) {
; X64-SSE42: ## %bb.0:
; X64-SSE42-NEXT: movdqa %xmm0, %xmm5
; X64-SSE42-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808]
; X64-SSE42-NEXT: pxor %xmm4, %xmm0
; X64-SSE42-NEXT: movdqa %xmm2, %xmm6
; X64-SSE42-NEXT: movdqa %xmm1, %xmm6
; X64-SSE42-NEXT: pxor %xmm4, %xmm6
; X64-SSE42-NEXT: pcmpgtq %xmm0, %xmm6
; X64-SSE42-NEXT: movdqa %xmm1, %xmm7
; X64-SSE42-NEXT: pxor %xmm4, %xmm7
; X64-SSE42-NEXT: movdqa %xmm3, %xmm0
; X64-SSE42-NEXT: pxor %xmm4, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm7, %xmm0
; X64-SSE42-NEXT: pcmpgtq %xmm6, %xmm0
; X64-SSE42-NEXT: blendvpd %xmm0, %xmm1, %xmm3
; X64-SSE42-NEXT: movdqa %xmm6, %xmm0
; 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
@ -1443,30 +1386,30 @@ 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: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: pcmpgtd %xmm6, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm6
; X86-SSE2-NEXT: movdqa %xmm3, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm3, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: pcmpgtd %xmm6, %xmm7
; X86-SSE2-NEXT: pand %xmm7, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm7
; X86-SSE2-NEXT: por %xmm1, %xmm7
; X86-SSE2-NEXT: pand %xmm5, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm5
; X86-SSE2-NEXT: por %xmm0, %xmm5
; X86-SSE2-NEXT: movdqa %xmm5, %xmm0
; X86-SSE2-NEXT: pcmpgtd %xmm5, %xmm6
; X86-SSE2-NEXT: pand %xmm6, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm6
; X86-SSE2-NEXT: por %xmm1, %xmm6
; X86-SSE2-NEXT: movdqa %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm2, %xmm3
; X86-SSE2-NEXT: pxor %xmm4, %xmm3
; X86-SSE2-NEXT: pcmpgtd %xmm1, %xmm3
; X86-SSE2-NEXT: pand %xmm3, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm3
; X86-SSE2-NEXT: por %xmm0, %xmm3
; X86-SSE2-NEXT: movdqa %xmm3, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm7, %xmm1
; X86-SSE2-NEXT: movdqa %xmm6, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pcmpgtd %xmm0, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm5
; X86-SSE2-NEXT: pandn %xmm7, %xmm1
; X86-SSE2-NEXT: por %xmm5, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm3
; X86-SSE2-NEXT: pandn %xmm6, %xmm1
; X86-SSE2-NEXT: por %xmm3, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1530,30 +1473,30 @@ 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: movdqa %xmm1, %xmm6
; X64-SSE2-NEXT: movdqa %xmm3, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: movdqa %xmm3, %xmm7
; X64-SSE2-NEXT: pxor %xmm4, %xmm7
; X64-SSE2-NEXT: pcmpgtd %xmm6, %xmm7
; X64-SSE2-NEXT: pand %xmm7, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm7
; X64-SSE2-NEXT: por %xmm1, %xmm7
; 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: 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 %xmm7, %xmm1
; 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: pandn %xmm7, %xmm1
; X64-SSE2-NEXT: por %xmm5, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm3
; X64-SSE2-NEXT: pandn %xmm6, %xmm1
; X64-SSE2-NEXT: por %xmm3, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
@ -1647,58 +1590,35 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
; X86-SSE2-LABEL: test_reduce_v32i16:
; X86-SSE2: ## %bb.0:
; X86-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X86-SSE2-NEXT: movdqa %xmm0, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm2, %xmm5
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
; X86-SSE2-NEXT: pcmpgtw %xmm6, %xmm5
; X86-SSE2-NEXT: movdqa %xmm1, %xmm6
; X86-SSE2-NEXT: pxor %xmm4, %xmm6
; X86-SSE2-NEXT: movdqa %xmm3, %xmm7
; X86-SSE2-NEXT: pxor %xmm4, %xmm7
; X86-SSE2-NEXT: pcmpgtw %xmm6, %xmm7
; X86-SSE2-NEXT: pand %xmm7, %xmm1
; X86-SSE2-NEXT: pandn %xmm3, %xmm7
; X86-SSE2-NEXT: por %xmm1, %xmm7
; X86-SSE2-NEXT: pand %xmm5, %xmm0
; X86-SSE2-NEXT: pandn %xmm2, %xmm5
; X86-SSE2-NEXT: por %xmm0, %xmm5
; X86-SSE2-NEXT: movdqa %xmm5, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movdqa %xmm7, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pcmpgtw %xmm0, %xmm1
; X86-SSE2-NEXT: pand %xmm1, %xmm5
; X86-SSE2-NEXT: pandn %xmm7, %xmm1
; X86-SSE2-NEXT: por %xmm5, %xmm1
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X86-SSE2-NEXT: movdqa %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: movdqa %xmm0, %xmm3
; X86-SSE2-NEXT: pminsw %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm3
; X86-SSE2-NEXT: pcmpgtw %xmm2, %xmm3
; X86-SSE2-NEXT: pand %xmm3, %xmm1
; X86-SSE2-NEXT: pandn %xmm0, %xmm3
; X86-SSE2-NEXT: por %xmm1, %xmm3
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3]
; X86-SSE2-NEXT: movdqa %xmm3, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm0, %xmm2
; X86-SSE2-NEXT: pminsw %xmm3, %xmm1
; X86-SSE2-NEXT: movdqa %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pcmpgtw %xmm1, %xmm2
; X86-SSE2-NEXT: pand %xmm2, %xmm3
; X86-SSE2-NEXT: pandn %xmm0, %xmm2
; X86-SSE2-NEXT: por %xmm3, %xmm2
; X86-SSE2-NEXT: movdqa %xmm2, %xmm0
; X86-SSE2-NEXT: psrld $16, %xmm0
; X86-SSE2-NEXT: movdqa %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm2, %xmm1
; X86-SSE2-NEXT: pxor %xmm0, %xmm2
; X86-SSE2-NEXT: pminsw %xmm1, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
; X86-SSE2-NEXT: pxor %xmm4, %xmm2
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pminsw %xmm2, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pxor %xmm0, %xmm4
; X86-SSE2-NEXT: pcmpgtw %xmm1, %xmm4
; X86-SSE2-NEXT: pand %xmm4, %xmm2
; X86-SSE2-NEXT: pandn %xmm0, %xmm4
; X86-SSE2-NEXT: por %xmm2, %xmm4
; X86-SSE2-NEXT: movd %xmm4, %eax
; X86-SSE2-NEXT: pminsw %xmm0, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: movdqa %xmm1, %xmm0
; X86-SSE2-NEXT: psrld $16, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm1
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: pminsw %xmm1, %xmm0
; X86-SSE2-NEXT: pxor %xmm4, %xmm0
; X86-SSE2-NEXT: movd %xmm0, %eax
; X86-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X86-SSE2-NEXT: retl
;
@ -1739,58 +1659,35 @@ define i16 @test_reduce_v32i16(<32 x i16> %a0) {
; X64-SSE2-LABEL: test_reduce_v32i16:
; X64-SSE2: ## %bb.0:
; X64-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768]
; X64-SSE2-NEXT: movdqa %xmm0, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: movdqa %xmm2, %xmm5
; X64-SSE2-NEXT: pxor %xmm4, %xmm5
; X64-SSE2-NEXT: pcmpgtw %xmm6, %xmm5
; X64-SSE2-NEXT: movdqa %xmm1, %xmm6
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
; X64-SSE2-NEXT: movdqa %xmm3, %xmm7
; X64-SSE2-NEXT: pxor %xmm4, %xmm7
; X64-SSE2-NEXT: pcmpgtw %xmm6, %xmm7
; X64-SSE2-NEXT: pand %xmm7, %xmm1
; X64-SSE2-NEXT: pandn %xmm3, %xmm7
; X64-SSE2-NEXT: por %xmm1, %xmm7
; 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, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: movdqa %xmm7, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: pcmpgtw %xmm0, %xmm1
; X64-SSE2-NEXT: pand %xmm1, %xmm5
; X64-SSE2-NEXT: pandn %xmm7, %xmm1
; X64-SSE2-NEXT: por %xmm5, %xmm1
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
; X64-SSE2-NEXT: movdqa %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: movdqa %xmm0, %xmm3
; X64-SSE2-NEXT: pminsw %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm3
; X64-SSE2-NEXT: pcmpgtw %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,2,3]
; X64-SSE2-NEXT: movdqa %xmm3, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: movdqa %xmm0, %xmm2
; X64-SSE2-NEXT: pminsw %xmm3, %xmm1
; X64-SSE2-NEXT: movdqa %xmm4, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: pcmpgtw %xmm1, %xmm2
; X64-SSE2-NEXT: pand %xmm2, %xmm3
; X64-SSE2-NEXT: pandn %xmm0, %xmm2
; X64-SSE2-NEXT: por %xmm3, %xmm2
; X64-SSE2-NEXT: movdqa %xmm2, %xmm0
; X64-SSE2-NEXT: psrld $16, %xmm0
; X64-SSE2-NEXT: movdqa %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm2, %xmm1
; X64-SSE2-NEXT: pxor %xmm0, %xmm2
; X64-SSE2-NEXT: pminsw %xmm1, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1]
; X64-SSE2-NEXT: pxor %xmm4, %xmm2
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pminsw %xmm2, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3]
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: pxor %xmm0, %xmm4
; X64-SSE2-NEXT: pcmpgtw %xmm1, %xmm4
; X64-SSE2-NEXT: pand %xmm4, %xmm2
; X64-SSE2-NEXT: pandn %xmm0, %xmm4
; X64-SSE2-NEXT: por %xmm2, %xmm4
; X64-SSE2-NEXT: movd %xmm4, %eax
; X64-SSE2-NEXT: pminsw %xmm0, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: movdqa %xmm1, %xmm0
; X64-SSE2-NEXT: psrld $16, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm1
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: pminsw %xmm1, %xmm0
; X64-SSE2-NEXT: pxor %xmm4, %xmm0
; X64-SSE2-NEXT: movd %xmm0, %eax
; X64-SSE2-NEXT: ## kill: def $ax killed $ax killed $eax
; X64-SSE2-NEXT: retq
;

View File

@ -153,32 +153,30 @@ define <2 x double> @clamp_sitofp_2i64_2f64(<2 x i64> %a) nounwind {
; X32-SSE-NEXT: movdqa %xmm0, %xmm2
; X32-SSE-NEXT: pxor %xmm1, %xmm2
; X32-SSE-NEXT: movdqa {{.*#+}} xmm3 = [2147483393,4294967295,2147483393,4294967295]
; X32-SSE-NEXT: movdqa %xmm3, %xmm4
; X32-SSE-NEXT: pcmpgtd %xmm2, %xmm4
; X32-SSE-NEXT: movdqa %xmm2, %xmm4
; X32-SSE-NEXT: pcmpgtd %xmm3, %xmm4
; X32-SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
; X32-SSE-NEXT: pcmpeqd %xmm3, %xmm2
; X32-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
; X32-SSE-NEXT: pand %xmm5, %xmm2
; X32-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
; X32-SSE-NEXT: por %xmm2, %xmm3
; X32-SSE-NEXT: movdqa %xmm3, %xmm2
; X32-SSE-NEXT: pandn %xmm0, %xmm2
; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm3
; X32-SSE-NEXT: por %xmm2, %xmm3
; X32-SSE-NEXT: pand %xmm3, %xmm0
; X32-SSE-NEXT: pandn {{\.LCPI.*}}, %xmm3
; X32-SSE-NEXT: por %xmm0, %xmm3
; X32-SSE-NEXT: pxor %xmm3, %xmm1
; X32-SSE-NEXT: movdqa {{.*#+}} xmm0 = [2147483903,0,2147483903,0]
; X32-SSE-NEXT: movdqa %xmm1, %xmm2
; X32-SSE-NEXT: pcmpgtd %xmm0, %xmm2
; X32-SSE-NEXT: movdqa %xmm0, %xmm2
; X32-SSE-NEXT: pcmpgtd %xmm1, %xmm2
; X32-SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
; X32-SSE-NEXT: pcmpeqd %xmm0, %xmm1
; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
; X32-SSE-NEXT: pand %xmm4, %xmm0
; X32-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
; X32-SSE-NEXT: por %xmm0, %xmm1
; X32-SSE-NEXT: movdqa %xmm1, %xmm0
; X32-SSE-NEXT: pandn %xmm3, %xmm0
; X32-SSE-NEXT: pand {{\.LCPI.*}}, %xmm1
; X32-SSE-NEXT: por %xmm0, %xmm1
; X32-SSE-NEXT: pand %xmm1, %xmm3
; X32-SSE-NEXT: pandn {{\.LCPI.*}}, %xmm1
; X32-SSE-NEXT: por %xmm3, %xmm1
; X32-SSE-NEXT: movq {{.*#+}} xmm0 = xmm1[0],zero
; X32-SSE-NEXT: movq %xmm0, {{[0-9]+}}(%esp)
; X32-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1]
@ -200,11 +198,11 @@ define <2 x double> @clamp_sitofp_2i64_2f64(<2 x i64> %a) nounwind {
; X32-AVX-NEXT: andl $-8, %esp
; X32-AVX-NEXT: subl $32, %esp
; X32-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [4294967041,4294967295,4294967041,4294967295]
; X32-AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
; X32-AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; X32-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [255,0,255,0]
; X32-AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
; X32-AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; X32-AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; X32-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [255,0,255,0]
; X32-AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
; X32-AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; X32-AVX-NEXT: vmovq {{.*#+}} xmm1 = xmm0[0],zero
; X32-AVX-NEXT: vmovq %xmm1, {{[0-9]+}}(%esp)
; X32-AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[2,3,0,1]
@ -225,32 +223,30 @@ define <2 x double> @clamp_sitofp_2i64_2f64(<2 x i64> %a) nounwind {
; X64-SSE-NEXT: movdqa %xmm0, %xmm2
; X64-SSE-NEXT: pxor %xmm1, %xmm2
; X64-SSE-NEXT: movdqa {{.*#+}} xmm3 = [18446744071562067713,18446744071562067713]
; X64-SSE-NEXT: movdqa %xmm3, %xmm4
; X64-SSE-NEXT: pcmpgtd %xmm2, %xmm4
; X64-SSE-NEXT: movdqa %xmm2, %xmm4
; X64-SSE-NEXT: pcmpgtd %xmm3, %xmm4
; X64-SSE-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
; X64-SSE-NEXT: pcmpeqd %xmm3, %xmm2
; X64-SSE-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
; X64-SSE-NEXT: pand %xmm5, %xmm2
; X64-SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
; X64-SSE-NEXT: por %xmm2, %xmm3
; X64-SSE-NEXT: movdqa %xmm3, %xmm2
; X64-SSE-NEXT: pandn %xmm0, %xmm2
; X64-SSE-NEXT: pand {{.*}}(%rip), %xmm3
; X64-SSE-NEXT: por %xmm2, %xmm3
; X64-SSE-NEXT: pand %xmm3, %xmm0
; X64-SSE-NEXT: pandn {{.*}}(%rip), %xmm3
; X64-SSE-NEXT: por %xmm0, %xmm3
; X64-SSE-NEXT: pxor %xmm3, %xmm1
; X64-SSE-NEXT: movdqa {{.*#+}} xmm0 = [2147483903,2147483903]
; X64-SSE-NEXT: movdqa %xmm1, %xmm2
; X64-SSE-NEXT: pcmpgtd %xmm0, %xmm2
; X64-SSE-NEXT: movdqa %xmm0, %xmm2
; X64-SSE-NEXT: pcmpgtd %xmm1, %xmm2
; X64-SSE-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2]
; X64-SSE-NEXT: pcmpeqd %xmm0, %xmm1
; X64-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3]
; X64-SSE-NEXT: pand %xmm4, %xmm0
; X64-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3]
; X64-SSE-NEXT: por %xmm0, %xmm1
; X64-SSE-NEXT: movdqa %xmm1, %xmm0
; X64-SSE-NEXT: pandn %xmm3, %xmm0
; X64-SSE-NEXT: pand {{.*}}(%rip), %xmm1
; X64-SSE-NEXT: por %xmm0, %xmm1
; X64-SSE-NEXT: pand %xmm1, %xmm3
; X64-SSE-NEXT: pandn {{.*}}(%rip), %xmm1
; X64-SSE-NEXT: por %xmm3, %xmm1
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: xorps %xmm0, %xmm0
; X64-SSE-NEXT: cvtsi2sdq %rax, %xmm0
@ -264,11 +260,11 @@ define <2 x double> @clamp_sitofp_2i64_2f64(<2 x i64> %a) nounwind {
; X64-AVX-LABEL: clamp_sitofp_2i64_2f64:
; X64-AVX: # %bb.0:
; X64-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551361,18446744073709551361]
; X64-AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
; X64-AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; X64-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255]
; X64-AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2
; X64-AVX-NEXT: vblendvpd %xmm2, %xmm1, %xmm0, %xmm0
; X64-AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; X64-AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [255,255]
; X64-AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2
; X64-AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
; X64-AVX-NEXT: vpextrq $1, %xmm0, %rax
; X64-AVX-NEXT: vcvtsi2sdq %rax, %xmm3, %xmm1
; X64-AVX-NEXT: vmovq %xmm0, %rax

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff