diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -35922,6 +35922,13 @@ return Vec; break; } + case X86ISD::PCMPGT: + // icmp sgt(0, R) == ashr(R, BitWidth-1). + // iff we only need the sign bit then we can use R directly. + if (DemandedBits.isSignMask() && + ISD::isBuildVectorAllZeros(Op.getOperand(0).getNode())) + return Op.getOperand(1); + break; } APInt ShuffleUndef, ShuffleZero; diff --git a/llvm/test/CodeGen/X86/sadd_sat.ll b/llvm/test/CodeGen/X86/sadd_sat.ll --- a/llvm/test/CodeGen/X86/sadd_sat.ll +++ b/llvm/test/CodeGen/X86/sadd_sat.ll @@ -248,9 +248,9 @@ ; X64-NEXT: paddd %xmm0, %xmm1 ; X64-NEXT: pcmpgtd %xmm1, %xmm0 ; X64-NEXT: pxor %xmm3, %xmm0 -; X64-NEXT: pcmpgtd %xmm1, %xmm2 -; X64-NEXT: movdqa %xmm2, %xmm3 +; X64-NEXT: movdqa %xmm1, %xmm3 ; X64-NEXT: pandn {{.*}}(%rip), %xmm3 +; X64-NEXT: pcmpgtd %xmm1, %xmm2 ; X64-NEXT: psrld $1, %xmm2 ; X64-NEXT: por %xmm3, %xmm2 ; X64-NEXT: pand %xmm0, %xmm2 diff --git a/llvm/test/CodeGen/X86/sadd_sat_vec.ll b/llvm/test/CodeGen/X86/sadd_sat_vec.ll --- a/llvm/test/CodeGen/X86/sadd_sat_vec.ll +++ b/llvm/test/CodeGen/X86/sadd_sat_vec.ll @@ -575,9 +575,9 @@ ; SSE2-NEXT: paddd %xmm0, %xmm1 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 ; SSE2-NEXT: pxor %xmm3, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 -; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: movdqa %xmm1, %xmm3 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 +; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 ; SSE2-NEXT: psrld $1, %xmm2 ; SSE2-NEXT: por %xmm3, %xmm2 ; SSE2-NEXT: pand %xmm0, %xmm2 @@ -593,9 +593,9 @@ ; SSSE3-NEXT: paddd %xmm0, %xmm1 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 ; SSSE3-NEXT: pxor %xmm3, %xmm0 -; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 -; SSSE3-NEXT: movdqa %xmm2, %xmm3 +; SSSE3-NEXT: movdqa %xmm1, %xmm3 ; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 +; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 ; SSSE3-NEXT: psrld $1, %xmm2 ; SSSE3-NEXT: por %xmm3, %xmm2 ; SSSE3-NEXT: pand %xmm0, %xmm2 @@ -665,9 +665,9 @@ ; SSE2-NEXT: paddd %xmm0, %xmm1 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 ; SSE2-NEXT: pxor %xmm3, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 -; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: movdqa %xmm1, %xmm3 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 +; SSE2-NEXT: pcmpgtd %xmm1, %xmm2 ; SSE2-NEXT: psrld $1, %xmm2 ; SSE2-NEXT: por %xmm3, %xmm2 ; SSE2-NEXT: pand %xmm0, %xmm2 @@ -683,9 +683,9 @@ ; SSSE3-NEXT: paddd %xmm0, %xmm1 ; SSSE3-NEXT: pcmpgtd %xmm1, %xmm0 ; SSSE3-NEXT: pxor %xmm3, %xmm0 -; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 -; SSSE3-NEXT: movdqa %xmm2, %xmm3 +; SSSE3-NEXT: movdqa %xmm1, %xmm3 ; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm3 +; SSSE3-NEXT: pcmpgtd %xmm1, %xmm2 ; SSSE3-NEXT: psrld $1, %xmm2 ; SSSE3-NEXT: por %xmm3, %xmm2 ; SSSE3-NEXT: pand %xmm0, %xmm2 @@ -755,24 +755,24 @@ ; SSE2-NEXT: paddd %xmm0, %xmm2 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 ; SSE2-NEXT: pxor %xmm5, %xmm0 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm5 -; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm5, %xmm7 -; SSE2-NEXT: pandn %xmm6, %xmm7 -; SSE2-NEXT: psrld $1, %xmm5 -; SSE2-NEXT: por %xmm7, %xmm5 -; SSE2-NEXT: pand %xmm0, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm2, %xmm6 +; SSE2-NEXT: pandn %xmm5, %xmm6 +; SSE2-NEXT: pxor %xmm7, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm2, %xmm7 +; SSE2-NEXT: psrld $1, %xmm7 +; SSE2-NEXT: por %xmm6, %xmm7 +; SSE2-NEXT: pand %xmm0, %xmm7 ; SSE2-NEXT: pandn %xmm2, %xmm0 -; SSE2-NEXT: por %xmm5, %xmm0 +; SSE2-NEXT: por %xmm7, %xmm0 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 ; SSE2-NEXT: paddd %xmm1, %xmm3 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: movdqa %xmm3, %xmm2 +; SSE2-NEXT: pandn %xmm5, %xmm2 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm4 -; SSE2-NEXT: movdqa %xmm4, %xmm2 -; SSE2-NEXT: pandn %xmm6, %xmm2 ; SSE2-NEXT: psrld $1, %xmm4 ; SSE2-NEXT: por %xmm2, %xmm4 ; SSE2-NEXT: pand %xmm1, %xmm4 @@ -788,24 +788,24 @@ ; SSSE3-NEXT: paddd %xmm0, %xmm2 ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm0 ; SSSE3-NEXT: pxor %xmm5, %xmm0 -; SSSE3-NEXT: pxor %xmm5, %xmm5 -; SSSE3-NEXT: pcmpgtd %xmm2, %xmm5 -; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] -; SSSE3-NEXT: movdqa %xmm5, %xmm7 -; SSSE3-NEXT: pandn %xmm6, %xmm7 -; SSSE3-NEXT: psrld $1, %xmm5 -; SSSE3-NEXT: por %xmm7, %xmm5 -; SSSE3-NEXT: pand %xmm0, %xmm5 +; SSSE3-NEXT: movdqa {{.*#+}} xmm5 = [2147483648,2147483648,2147483648,2147483648] +; SSSE3-NEXT: movdqa %xmm2, %xmm6 +; SSSE3-NEXT: pandn %xmm5, %xmm6 +; SSSE3-NEXT: pxor %xmm7, %xmm7 +; SSSE3-NEXT: pcmpgtd %xmm2, %xmm7 +; SSSE3-NEXT: psrld $1, %xmm7 +; SSSE3-NEXT: por %xmm6, %xmm7 +; SSSE3-NEXT: pand %xmm0, %xmm7 ; SSSE3-NEXT: pandn %xmm2, %xmm0 -; SSSE3-NEXT: por %xmm5, %xmm0 +; SSSE3-NEXT: por %xmm7, %xmm0 ; SSSE3-NEXT: pxor %xmm2, %xmm2 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 ; SSSE3-NEXT: paddd %xmm1, %xmm3 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm1 ; SSSE3-NEXT: pxor %xmm2, %xmm1 +; SSSE3-NEXT: movdqa %xmm3, %xmm2 +; SSSE3-NEXT: pandn %xmm5, %xmm2 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm4 -; SSSE3-NEXT: movdqa %xmm4, %xmm2 -; SSSE3-NEXT: pandn %xmm6, %xmm2 ; SSSE3-NEXT: psrld $1, %xmm4 ; SSSE3-NEXT: por %xmm2, %xmm4 ; SSSE3-NEXT: pand %xmm1, %xmm4 @@ -892,25 +892,25 @@ ; SSE2-NEXT: paddd %xmm0, %xmm4 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm0 ; SSE2-NEXT: pxor %xmm9, %xmm0 -; SSE2-NEXT: pxor %xmm10, %xmm10 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm10 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm10, %xmm11 -; SSE2-NEXT: pandn %xmm9, %xmm11 -; SSE2-NEXT: psrld $1, %xmm10 -; SSE2-NEXT: por %xmm11, %xmm10 -; SSE2-NEXT: pand %xmm0, %xmm10 +; SSE2-NEXT: movdqa %xmm4, %xmm10 +; SSE2-NEXT: pandn %xmm9, %xmm10 +; SSE2-NEXT: pxor %xmm11, %xmm11 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm11 +; SSE2-NEXT: psrld $1, %xmm11 +; SSE2-NEXT: por %xmm10, %xmm11 +; SSE2-NEXT: pand %xmm0, %xmm11 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm10, %xmm0 +; SSE2-NEXT: por %xmm11, %xmm0 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 ; SSE2-NEXT: paddd %xmm1, %xmm5 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: movdqa %xmm5, %xmm10 +; SSE2-NEXT: pandn %xmm9, %xmm10 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 -; SSE2-NEXT: movdqa %xmm4, %xmm10 -; SSE2-NEXT: pandn %xmm9, %xmm10 ; SSE2-NEXT: psrld $1, %xmm4 ; SSE2-NEXT: por %xmm10, %xmm4 ; SSE2-NEXT: pand %xmm1, %xmm4 @@ -921,23 +921,23 @@ ; SSE2-NEXT: paddd %xmm2, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm2 ; SSE2-NEXT: pxor %xmm4, %xmm2 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 -; SSE2-NEXT: movdqa %xmm4, %xmm5 -; SSE2-NEXT: pandn %xmm9, %xmm5 -; SSE2-NEXT: psrld $1, %xmm4 -; SSE2-NEXT: por %xmm5, %xmm4 -; SSE2-NEXT: pand %xmm2, %xmm4 +; SSE2-NEXT: movdqa %xmm6, %xmm4 +; SSE2-NEXT: pandn %xmm9, %xmm4 +; SSE2-NEXT: pxor %xmm5, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm6, %xmm5 +; SSE2-NEXT: psrld $1, %xmm5 +; SSE2-NEXT: por %xmm4, %xmm5 +; SSE2-NEXT: pand %xmm2, %xmm5 ; SSE2-NEXT: pandn %xmm6, %xmm2 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: por %xmm5, %xmm2 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm4 ; SSE2-NEXT: paddd %xmm3, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm3 ; SSE2-NEXT: pxor %xmm4, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm7, %xmm8 -; SSE2-NEXT: movdqa %xmm8, %xmm4 +; SSE2-NEXT: movdqa %xmm7, %xmm4 ; SSE2-NEXT: pandn %xmm9, %xmm4 +; SSE2-NEXT: pcmpgtd %xmm7, %xmm8 ; SSE2-NEXT: psrld $1, %xmm8 ; SSE2-NEXT: por %xmm4, %xmm8 ; SSE2-NEXT: pand %xmm3, %xmm8 @@ -953,25 +953,25 @@ ; SSSE3-NEXT: paddd %xmm0, %xmm4 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm0 ; SSSE3-NEXT: pxor %xmm9, %xmm0 -; SSSE3-NEXT: pxor %xmm10, %xmm10 -; SSSE3-NEXT: pcmpgtd %xmm4, %xmm10 ; SSSE3-NEXT: movdqa {{.*#+}} xmm9 = [2147483648,2147483648,2147483648,2147483648] -; SSSE3-NEXT: movdqa %xmm10, %xmm11 -; SSSE3-NEXT: pandn %xmm9, %xmm11 -; SSSE3-NEXT: psrld $1, %xmm10 -; SSSE3-NEXT: por %xmm11, %xmm10 -; SSSE3-NEXT: pand %xmm0, %xmm10 +; SSSE3-NEXT: movdqa %xmm4, %xmm10 +; SSSE3-NEXT: pandn %xmm9, %xmm10 +; SSSE3-NEXT: pxor %xmm11, %xmm11 +; SSSE3-NEXT: pcmpgtd %xmm4, %xmm11 +; SSSE3-NEXT: psrld $1, %xmm11 +; SSSE3-NEXT: por %xmm10, %xmm11 +; SSSE3-NEXT: pand %xmm0, %xmm11 ; SSSE3-NEXT: pandn %xmm4, %xmm0 -; SSSE3-NEXT: por %xmm10, %xmm0 +; SSSE3-NEXT: por %xmm11, %xmm0 ; SSSE3-NEXT: pxor %xmm4, %xmm4 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 ; SSSE3-NEXT: paddd %xmm1, %xmm5 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1 ; SSSE3-NEXT: pxor %xmm4, %xmm1 +; SSSE3-NEXT: movdqa %xmm5, %xmm10 +; SSSE3-NEXT: pandn %xmm9, %xmm10 ; SSSE3-NEXT: pxor %xmm4, %xmm4 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 -; SSSE3-NEXT: movdqa %xmm4, %xmm10 -; SSSE3-NEXT: pandn %xmm9, %xmm10 ; SSSE3-NEXT: psrld $1, %xmm4 ; SSSE3-NEXT: por %xmm10, %xmm4 ; SSSE3-NEXT: pand %xmm1, %xmm4 @@ -982,23 +982,23 @@ ; SSSE3-NEXT: paddd %xmm2, %xmm6 ; SSSE3-NEXT: pcmpgtd %xmm6, %xmm2 ; SSSE3-NEXT: pxor %xmm4, %xmm2 -; SSSE3-NEXT: pxor %xmm4, %xmm4 -; SSSE3-NEXT: pcmpgtd %xmm6, %xmm4 -; SSSE3-NEXT: movdqa %xmm4, %xmm5 -; SSSE3-NEXT: pandn %xmm9, %xmm5 -; SSSE3-NEXT: psrld $1, %xmm4 -; SSSE3-NEXT: por %xmm5, %xmm4 -; SSSE3-NEXT: pand %xmm2, %xmm4 +; SSSE3-NEXT: movdqa %xmm6, %xmm4 +; SSSE3-NEXT: pandn %xmm9, %xmm4 +; SSSE3-NEXT: pxor %xmm5, %xmm5 +; SSSE3-NEXT: pcmpgtd %xmm6, %xmm5 +; SSSE3-NEXT: psrld $1, %xmm5 +; SSSE3-NEXT: por %xmm4, %xmm5 +; SSSE3-NEXT: pand %xmm2, %xmm5 ; SSSE3-NEXT: pandn %xmm6, %xmm2 -; SSSE3-NEXT: por %xmm4, %xmm2 +; SSSE3-NEXT: por %xmm5, %xmm2 ; SSSE3-NEXT: pxor %xmm4, %xmm4 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm4 ; SSSE3-NEXT: paddd %xmm3, %xmm7 ; SSSE3-NEXT: pcmpgtd %xmm7, %xmm3 ; SSSE3-NEXT: pxor %xmm4, %xmm3 -; SSSE3-NEXT: pcmpgtd %xmm7, %xmm8 -; SSSE3-NEXT: movdqa %xmm8, %xmm4 +; SSSE3-NEXT: movdqa %xmm7, %xmm4 ; SSSE3-NEXT: pandn %xmm9, %xmm4 +; SSSE3-NEXT: pcmpgtd %xmm7, %xmm8 ; SSSE3-NEXT: psrld $1, %xmm8 ; SSSE3-NEXT: por %xmm4, %xmm8 ; SSSE3-NEXT: pand %xmm3, %xmm8 diff --git a/llvm/test/CodeGen/X86/ssub_sat.ll b/llvm/test/CodeGen/X86/ssub_sat.ll --- a/llvm/test/CodeGen/X86/ssub_sat.ll +++ b/llvm/test/CodeGen/X86/ssub_sat.ll @@ -231,14 +231,14 @@ ; X64-NEXT: pcmpgtd %xmm2, %xmm1 ; X64-NEXT: pcmpgtd %xmm3, %xmm0 ; X64-NEXT: pxor %xmm1, %xmm0 -; X64-NEXT: pcmpgtd %xmm3, %xmm2 -; X64-NEXT: movdqa %xmm2, %xmm1 +; X64-NEXT: movdqa %xmm3, %xmm1 ; X64-NEXT: pandn {{.*}}(%rip), %xmm1 +; X64-NEXT: pcmpgtd %xmm3, %xmm2 ; X64-NEXT: psrld $1, %xmm2 -; X64-NEXT: por %xmm1, %xmm2 -; X64-NEXT: pand %xmm0, %xmm2 +; X64-NEXT: por %xmm2, %xmm1 +; X64-NEXT: pand %xmm0, %xmm1 ; X64-NEXT: pandn %xmm3, %xmm0 -; X64-NEXT: por %xmm2, %xmm0 +; X64-NEXT: por %xmm1, %xmm0 ; X64-NEXT: retq %tmp = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %x, <4 x i32> %y) ret <4 x i32> %tmp diff --git a/llvm/test/CodeGen/X86/ssub_sat_vec.ll b/llvm/test/CodeGen/X86/ssub_sat_vec.ll --- a/llvm/test/CodeGen/X86/ssub_sat_vec.ll +++ b/llvm/test/CodeGen/X86/ssub_sat_vec.ll @@ -571,14 +571,14 @@ ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 -; SSE2-NEXT: movdqa %xmm2, %xmm1 +; SSE2-NEXT: movdqa %xmm3, %xmm1 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1 +; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 ; SSE2-NEXT: psrld $1, %xmm2 -; SSE2-NEXT: por %xmm1, %xmm2 -; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: pand %xmm0, %xmm1 ; SSE2-NEXT: pandn %xmm3, %xmm0 -; SSE2-NEXT: por %xmm2, %xmm0 +; SSE2-NEXT: por %xmm1, %xmm0 ; SSE2-NEXT: retq ; ; SSSE3-LABEL: v2i32: @@ -589,14 +589,14 @@ ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 ; SSSE3-NEXT: pxor %xmm1, %xmm0 -; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 -; SSSE3-NEXT: movdqa %xmm2, %xmm1 +; SSSE3-NEXT: movdqa %xmm3, %xmm1 ; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm1 +; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 ; SSSE3-NEXT: psrld $1, %xmm2 -; SSSE3-NEXT: por %xmm1, %xmm2 -; SSSE3-NEXT: pand %xmm0, %xmm2 +; SSSE3-NEXT: por %xmm2, %xmm1 +; SSSE3-NEXT: pand %xmm0, %xmm1 ; SSSE3-NEXT: pandn %xmm3, %xmm0 -; SSSE3-NEXT: por %xmm2, %xmm0 +; SSSE3-NEXT: por %xmm1, %xmm0 ; SSSE3-NEXT: retq ; ; SSE41-LABEL: v2i32: @@ -667,14 +667,14 @@ ; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 -; SSE2-NEXT: movdqa %xmm2, %xmm1 +; SSE2-NEXT: movdqa %xmm3, %xmm1 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1 +; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 ; SSE2-NEXT: psrld $1, %xmm2 -; SSE2-NEXT: por %xmm1, %xmm2 -; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: pand %xmm0, %xmm1 ; SSE2-NEXT: pandn %xmm3, %xmm0 -; SSE2-NEXT: por %xmm2, %xmm0 +; SSE2-NEXT: por %xmm1, %xmm0 ; SSE2-NEXT: retq ; ; SSSE3-LABEL: v4i32: @@ -685,14 +685,14 @@ ; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 ; SSSE3-NEXT: pcmpgtd %xmm3, %xmm0 ; SSSE3-NEXT: pxor %xmm1, %xmm0 -; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 -; SSSE3-NEXT: movdqa %xmm2, %xmm1 +; SSSE3-NEXT: movdqa %xmm3, %xmm1 ; SSSE3-NEXT: pandn {{.*}}(%rip), %xmm1 +; SSSE3-NEXT: pcmpgtd %xmm3, %xmm2 ; SSSE3-NEXT: psrld $1, %xmm2 -; SSSE3-NEXT: por %xmm1, %xmm2 -; SSSE3-NEXT: pand %xmm0, %xmm2 +; SSSE3-NEXT: por %xmm2, %xmm1 +; SSSE3-NEXT: pand %xmm0, %xmm1 ; SSSE3-NEXT: pandn %xmm3, %xmm0 -; SSSE3-NEXT: por %xmm2, %xmm0 +; SSSE3-NEXT: por %xmm1, %xmm0 ; SSSE3-NEXT: retq ; ; SSE41-LABEL: v4i32: @@ -763,29 +763,29 @@ ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 ; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 ; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm2, %xmm7 -; SSE2-NEXT: pandn %xmm6, %xmm7 -; SSE2-NEXT: psrld $1, %xmm2 -; SSE2-NEXT: por %xmm7, %xmm2 -; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm5, %xmm6 +; SSE2-NEXT: pandn %xmm2, %xmm6 +; SSE2-NEXT: pxor %xmm7, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 +; SSE2-NEXT: psrld $1, %xmm7 +; SSE2-NEXT: por %xmm7, %xmm6 +; SSE2-NEXT: pand %xmm0, %xmm6 ; SSE2-NEXT: pandn %xmm5, %xmm0 -; SSE2-NEXT: por %xmm2, %xmm0 -; SSE2-NEXT: movdqa %xmm1, %xmm2 -; SSE2-NEXT: psubd %xmm3, %xmm2 +; SSE2-NEXT: por %xmm6, %xmm0 +; SSE2-NEXT: movdqa %xmm1, %xmm5 +; SSE2-NEXT: psubd %xmm3, %xmm5 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 ; SSE2-NEXT: pxor %xmm3, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 -; SSE2-NEXT: movdqa %xmm4, %xmm3 -; SSE2-NEXT: pandn %xmm6, %xmm3 +; SSE2-NEXT: movdqa %xmm5, %xmm3 +; SSE2-NEXT: pandn %xmm2, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm5, %xmm4 ; SSE2-NEXT: psrld $1, %xmm4 -; SSE2-NEXT: por %xmm3, %xmm4 -; SSE2-NEXT: pand %xmm1, %xmm4 -; SSE2-NEXT: pandn %xmm2, %xmm1 -; SSE2-NEXT: por %xmm4, %xmm1 +; SSE2-NEXT: por %xmm4, %xmm3 +; SSE2-NEXT: pand %xmm1, %xmm3 +; SSE2-NEXT: pandn %xmm5, %xmm1 +; SSE2-NEXT: por %xmm3, %xmm1 ; SSE2-NEXT: retq ; ; SSSE3-LABEL: v8i32: @@ -796,29 +796,29 @@ ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2 ; SSSE3-NEXT: pcmpgtd %xmm5, %xmm0 ; SSSE3-NEXT: pxor %xmm2, %xmm0 -; SSSE3-NEXT: pxor %xmm2, %xmm2 -; SSSE3-NEXT: pcmpgtd %xmm5, %xmm2 -; SSSE3-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] -; SSSE3-NEXT: movdqa %xmm2, %xmm7 -; SSSE3-NEXT: pandn %xmm6, %xmm7 -; SSSE3-NEXT: psrld $1, %xmm2 -; SSSE3-NEXT: por %xmm7, %xmm2 -; SSSE3-NEXT: pand %xmm0, %xmm2 +; SSSE3-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] +; SSSE3-NEXT: movdqa %xmm5, %xmm6 +; SSSE3-NEXT: pandn %xmm2, %xmm6 +; SSSE3-NEXT: pxor %xmm7, %xmm7 +; SSSE3-NEXT: pcmpgtd %xmm5, %xmm7 +; SSSE3-NEXT: psrld $1, %xmm7 +; SSSE3-NEXT: por %xmm7, %xmm6 +; SSSE3-NEXT: pand %xmm0, %xmm6 ; SSSE3-NEXT: pandn %xmm5, %xmm0 -; SSSE3-NEXT: por %xmm2, %xmm0 -; SSSE3-NEXT: movdqa %xmm1, %xmm2 -; SSSE3-NEXT: psubd %xmm3, %xmm2 +; SSSE3-NEXT: por %xmm6, %xmm0 +; SSSE3-NEXT: movdqa %xmm1, %xmm5 +; SSSE3-NEXT: psubd %xmm3, %xmm5 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3 -; SSSE3-NEXT: pcmpgtd %xmm2, %xmm1 +; SSSE3-NEXT: pcmpgtd %xmm5, %xmm1 ; SSSE3-NEXT: pxor %xmm3, %xmm1 -; SSSE3-NEXT: pcmpgtd %xmm2, %xmm4 -; SSSE3-NEXT: movdqa %xmm4, %xmm3 -; SSSE3-NEXT: pandn %xmm6, %xmm3 +; SSSE3-NEXT: movdqa %xmm5, %xmm3 +; SSSE3-NEXT: pandn %xmm2, %xmm3 +; SSSE3-NEXT: pcmpgtd %xmm5, %xmm4 ; SSSE3-NEXT: psrld $1, %xmm4 -; SSSE3-NEXT: por %xmm3, %xmm4 -; SSSE3-NEXT: pand %xmm1, %xmm4 -; SSSE3-NEXT: pandn %xmm2, %xmm1 -; SSSE3-NEXT: por %xmm4, %xmm1 +; SSSE3-NEXT: por %xmm4, %xmm3 +; SSSE3-NEXT: pand %xmm1, %xmm3 +; SSSE3-NEXT: pandn %xmm5, %xmm1 +; SSSE3-NEXT: por %xmm3, %xmm1 ; SSSE3-NEXT: retq ; ; SSE41-LABEL: v8i32: @@ -909,40 +909,40 @@ ; SSE2-NEXT: pcmpgtd %xmm8, %xmm4 ; SSE2-NEXT: pcmpgtd %xmm9, %xmm0 ; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtd %xmm9, %xmm4 ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm4, %xmm11 +; SSE2-NEXT: movdqa %xmm9, %xmm11 ; SSE2-NEXT: pandn %xmm10, %xmm11 +; SSE2-NEXT: pxor %xmm4, %xmm4 +; SSE2-NEXT: pcmpgtd %xmm9, %xmm4 ; SSE2-NEXT: psrld $1, %xmm4 -; SSE2-NEXT: por %xmm11, %xmm4 -; SSE2-NEXT: pand %xmm0, %xmm4 +; SSE2-NEXT: por %xmm4, %xmm11 +; SSE2-NEXT: pand %xmm0, %xmm11 ; SSE2-NEXT: pandn %xmm9, %xmm0 -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: movdqa %xmm1, %xmm4 -; SSE2-NEXT: psubd %xmm5, %xmm4 +; SSE2-NEXT: por %xmm11, %xmm0 +; SSE2-NEXT: movdqa %xmm1, %xmm9 +; SSE2-NEXT: psubd %xmm5, %xmm9 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm9, %xmm1 ; SSE2-NEXT: pxor %xmm5, %xmm1 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE2-NEXT: movdqa %xmm5, %xmm9 -; SSE2-NEXT: pandn %xmm10, %xmm9 -; SSE2-NEXT: psrld $1, %xmm5 -; SSE2-NEXT: por %xmm9, %xmm5 +; SSE2-NEXT: movdqa %xmm9, %xmm5 +; SSE2-NEXT: pandn %xmm10, %xmm5 +; SSE2-NEXT: pxor %xmm4, %xmm4 +; SSE2-NEXT: pcmpgtd %xmm9, %xmm4 +; SSE2-NEXT: psrld $1, %xmm4 +; SSE2-NEXT: por %xmm4, %xmm5 ; SSE2-NEXT: pand %xmm1, %xmm5 -; SSE2-NEXT: pandn %xmm4, %xmm1 +; SSE2-NEXT: pandn %xmm9, %xmm1 ; SSE2-NEXT: por %xmm5, %xmm1 ; SSE2-NEXT: movdqa %xmm2, %xmm4 ; SSE2-NEXT: psubd %xmm6, %xmm4 ; SSE2-NEXT: pcmpgtd %xmm8, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 ; SSE2-NEXT: pxor %xmm6, %xmm2 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE2-NEXT: movdqa %xmm5, %xmm6 -; SSE2-NEXT: pandn %xmm10, %xmm6 -; SSE2-NEXT: psrld $1, %xmm5 +; SSE2-NEXT: movdqa %xmm4, %xmm5 +; SSE2-NEXT: pandn %xmm10, %xmm5 +; SSE2-NEXT: pxor %xmm6, %xmm6 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 +; SSE2-NEXT: psrld $1, %xmm6 ; SSE2-NEXT: por %xmm6, %xmm5 ; SSE2-NEXT: pand %xmm2, %xmm5 ; SSE2-NEXT: pandn %xmm4, %xmm2 @@ -952,14 +952,14 @@ ; SSE2-NEXT: pcmpgtd %xmm8, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm4, %xmm3 ; SSE2-NEXT: pxor %xmm7, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm8 -; SSE2-NEXT: movdqa %xmm8, %xmm5 +; SSE2-NEXT: movdqa %xmm4, %xmm5 ; SSE2-NEXT: pandn %xmm10, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm8 ; SSE2-NEXT: psrld $1, %xmm8 -; SSE2-NEXT: por %xmm5, %xmm8 -; SSE2-NEXT: pand %xmm3, %xmm8 +; SSE2-NEXT: por %xmm8, %xmm5 +; SSE2-NEXT: pand %xmm3, %xmm5 ; SSE2-NEXT: pandn %xmm4, %xmm3 -; SSE2-NEXT: por %xmm8, %xmm3 +; SSE2-NEXT: por %xmm5, %xmm3 ; SSE2-NEXT: retq ; ; SSSE3-LABEL: v16i32: @@ -970,40 +970,40 @@ ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm4 ; SSSE3-NEXT: pcmpgtd %xmm9, %xmm0 ; SSSE3-NEXT: pxor %xmm4, %xmm0 -; SSSE3-NEXT: pxor %xmm4, %xmm4 -; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4 ; SSSE3-NEXT: movdqa {{.*#+}} xmm10 = [2147483648,2147483648,2147483648,2147483648] -; SSSE3-NEXT: movdqa %xmm4, %xmm11 +; SSSE3-NEXT: movdqa %xmm9, %xmm11 ; SSSE3-NEXT: pandn %xmm10, %xmm11 +; SSSE3-NEXT: pxor %xmm4, %xmm4 +; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4 ; SSSE3-NEXT: psrld $1, %xmm4 -; SSSE3-NEXT: por %xmm11, %xmm4 -; SSSE3-NEXT: pand %xmm0, %xmm4 +; SSSE3-NEXT: por %xmm4, %xmm11 +; SSSE3-NEXT: pand %xmm0, %xmm11 ; SSSE3-NEXT: pandn %xmm9, %xmm0 -; SSSE3-NEXT: por %xmm4, %xmm0 -; SSSE3-NEXT: movdqa %xmm1, %xmm4 -; SSSE3-NEXT: psubd %xmm5, %xmm4 +; SSSE3-NEXT: por %xmm11, %xmm0 +; SSSE3-NEXT: movdqa %xmm1, %xmm9 +; SSSE3-NEXT: psubd %xmm5, %xmm9 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm5 -; SSSE3-NEXT: pcmpgtd %xmm4, %xmm1 +; SSSE3-NEXT: pcmpgtd %xmm9, %xmm1 ; SSSE3-NEXT: pxor %xmm5, %xmm1 -; SSSE3-NEXT: pxor %xmm5, %xmm5 -; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5 -; SSSE3-NEXT: movdqa %xmm5, %xmm9 -; SSSE3-NEXT: pandn %xmm10, %xmm9 -; SSSE3-NEXT: psrld $1, %xmm5 -; SSSE3-NEXT: por %xmm9, %xmm5 +; SSSE3-NEXT: movdqa %xmm9, %xmm5 +; SSSE3-NEXT: pandn %xmm10, %xmm5 +; SSSE3-NEXT: pxor %xmm4, %xmm4 +; SSSE3-NEXT: pcmpgtd %xmm9, %xmm4 +; SSSE3-NEXT: psrld $1, %xmm4 +; SSSE3-NEXT: por %xmm4, %xmm5 ; SSSE3-NEXT: pand %xmm1, %xmm5 -; SSSE3-NEXT: pandn %xmm4, %xmm1 +; SSSE3-NEXT: pandn %xmm9, %xmm1 ; SSSE3-NEXT: por %xmm5, %xmm1 ; SSSE3-NEXT: movdqa %xmm2, %xmm4 ; SSSE3-NEXT: psubd %xmm6, %xmm4 ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm6 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm2 ; SSSE3-NEXT: pxor %xmm6, %xmm2 -; SSSE3-NEXT: pxor %xmm5, %xmm5 -; SSSE3-NEXT: pcmpgtd %xmm4, %xmm5 -; SSSE3-NEXT: movdqa %xmm5, %xmm6 -; SSSE3-NEXT: pandn %xmm10, %xmm6 -; SSSE3-NEXT: psrld $1, %xmm5 +; SSSE3-NEXT: movdqa %xmm4, %xmm5 +; SSSE3-NEXT: pandn %xmm10, %xmm5 +; SSSE3-NEXT: pxor %xmm6, %xmm6 +; SSSE3-NEXT: pcmpgtd %xmm4, %xmm6 +; SSSE3-NEXT: psrld $1, %xmm6 ; SSSE3-NEXT: por %xmm6, %xmm5 ; SSSE3-NEXT: pand %xmm2, %xmm5 ; SSSE3-NEXT: pandn %xmm4, %xmm2 @@ -1013,14 +1013,14 @@ ; SSSE3-NEXT: pcmpgtd %xmm8, %xmm7 ; SSSE3-NEXT: pcmpgtd %xmm4, %xmm3 ; SSSE3-NEXT: pxor %xmm7, %xmm3 -; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8 -; SSSE3-NEXT: movdqa %xmm8, %xmm5 +; SSSE3-NEXT: movdqa %xmm4, %xmm5 ; SSSE3-NEXT: pandn %xmm10, %xmm5 +; SSSE3-NEXT: pcmpgtd %xmm4, %xmm8 ; SSSE3-NEXT: psrld $1, %xmm8 -; SSSE3-NEXT: por %xmm5, %xmm8 -; SSSE3-NEXT: pand %xmm3, %xmm8 +; SSSE3-NEXT: por %xmm8, %xmm5 +; SSSE3-NEXT: pand %xmm3, %xmm5 ; SSSE3-NEXT: pandn %xmm4, %xmm3 -; SSSE3-NEXT: por %xmm8, %xmm3 +; SSSE3-NEXT: por %xmm5, %xmm3 ; SSSE3-NEXT: retq ; ; SSE41-LABEL: v16i32: