[llvm] [X86] combineShiftRightLogical - fold srl(vecreduce_umax(x),bw-1) as MOVMSK signbit reduction (PR #210281)

Simon Pilgrim via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 20 01:59:21 PDT 2026


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

>From 271b3389e87de1a1057fb73332e8b324d78d66fb Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Fri, 17 Jul 2026 09:21:31 +0100
Subject: [PATCH 1/3] [X86] Add test coverage for #209714

---
 llvm/test/CodeGen/X86/pr209714.ll | 1360 +++++++++++++++++++++++++++++
 1 file changed, 1360 insertions(+)
 create mode 100644 llvm/test/CodeGen/X86/pr209714.ll

diff --git a/llvm/test/CodeGen/X86/pr209714.ll b/llvm/test/CodeGen/X86/pr209714.ll
new file mode 100644
index 0000000000000..9e05a05ea4616
--- /dev/null
+++ b/llvm/test/CodeGen/X86/pr209714.ll
@@ -0,0 +1,1360 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
+; RUN: llc < %s -mtriple=i686--   -mattr=+sse2     | FileCheck %s --check-prefixes=SSE,SSE2,X86-SSE,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2     | FileCheck %s --check-prefixes=SSE,SSE2,X64-SSE,X64-SSE2
+; RUN: llc < %s -mtriple=i686--   -mattr=+sse4.1   | FileCheck %s --check-prefixes=SSE,SSE4,X86-SSE,X86-SSE4,X86-SSE41
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1   | FileCheck %s --check-prefixes=SSE,SSE4,X64-SSE,X64-SSE4,X64-SSE41
+; RUN: llc < %s -mtriple=i686--   -mattr=+sse4.2   | FileCheck %s --check-prefixes=SSE,SSE4,X86-SSE,X86-SSE4,X86-SSE42
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2   | FileCheck %s --check-prefixes=SSE,SSE4,X64-SSE,X64-SSE4,X64-SSE42
+; RUN: llc < %s -mtriple=i686--   -mattr=+avx      | FileCheck %s --check-prefixes=AVX,AVX1,X86-AVX,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx      | FileCheck %s --check-prefixes=AVX,AVX1,X64-AVX,X64-AVX1
+; RUN: llc < %s -mtriple=i686--   -mattr=+avx2     | FileCheck %s --check-prefixes=AVX,AVX2,X86-AVX,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2     | FileCheck %s --check-prefixes=AVX,AVX2,X64-AVX,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL
+
+; TODO: Ensure umax reductions which only demand the signbit correctly fold to MOVSMSK/TESTP style patterns.
+
+define i8 @reduce_umax_v16i8_signbit(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v16i8_signbit:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE2-NEXT:    pand (%eax), %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrld $16, %xmm1
+; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    por %xmm1, %xmm0
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    notb %al
+; X86-SSE2-NEXT:    shrb $7, %al
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v16i8_signbit:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE2-NEXT:    pand (%rdi), %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrld $16, %xmm1
+; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    por %xmm1, %xmm0
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    notb %al
+; X64-SSE2-NEXT:    shrb $7, %al
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v16i8_signbit:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE4-NEXT:    pand (%eax), %xmm0
+; X86-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE4-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE4-NEXT:    psrlw $8, %xmm0
+; X86-SSE4-NEXT:    pminub %xmm1, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    shrb $7, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v16i8_signbit:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE4-NEXT:    pand (%rdi), %xmm0
+; X64-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE4-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE4-NEXT:    psrlw $8, %xmm0
+; X64-SSE4-NEXT:    pminub %xmm1, %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    shrb $7, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: reduce_umax_v16i8_signbit:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX-NEXT:    vmovdqa (%ecx), %xmm0
+; X86-AVX-NEXT:    vpand (%eax), %xmm0, %xmm0
+; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    shrb $7, %al
+; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: reduce_umax_v16i8_signbit:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovdqa (%rsi), %xmm0
+; X64-AVX-NEXT:    vpand (%rdi), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    shrb $7, %al
+; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: reduce_umax_v16i8_signbit:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa (%rsi), %xmm0
+; AVX512BW-NEXT:    vpand (%rdi), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    shrb $7, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: reduce_umax_v16i8_signbit:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vmovdqa (%rsi), %xmm0
+; AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm1 = xmm1 ^ (xmm0 & mem)
+; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm0
+; AVX512VL-NEXT:    vpminub %xmm0, %xmm1, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    shrb $7, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    retq
+  %a = load <16 x i8>, ptr %pa
+  %b = load <16 x i8>, ptr %pb
+  %a.not = xor <16 x i8> %a, splat (i8 -1)
+  %and = and <16 x i8> %b, %a
+  %rdx = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> %and)
+  %cmp = icmp sgt i8 %rdx, -1
+  %res = zext i1 %cmp to i8
+  ret i8 %res
+}
+
+define i16 @reduce_umax_v8i16_signbit_not(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v8i16_signbit_not:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE2-NEXT:    pandn (%eax), %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    psubusw %xmm0, %xmm1
+; X86-SSE2-NEXT:    paddw %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm0
+; X86-SSE2-NEXT:    paddw %xmm1, %xmm0
+; X86-SSE2-NEXT:    pextrw $1, %xmm0, %eax
+; X86-SSE2-NEXT:    movd %xmm0, %ecx
+; X86-SSE2-NEXT:    orl %eax, %ecx
+; X86-SSE2-NEXT:    notl %ecx
+; X86-SSE2-NEXT:    movzwl %cx, %eax
+; X86-SSE2-NEXT:    shrl $15, %eax
+; X86-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v8i16_signbit_not:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    psubusw %xmm0, %xmm1
+; X64-SSE2-NEXT:    paddw %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm0
+; X64-SSE2-NEXT:    paddw %xmm1, %xmm0
+; X64-SSE2-NEXT:    pextrw $1, %xmm0, %eax
+; X64-SSE2-NEXT:    movd %xmm0, %ecx
+; X64-SSE2-NEXT:    orl %eax, %ecx
+; X64-SSE2-NEXT:    notl %ecx
+; X64-SSE2-NEXT:    movzwl %cx, %eax
+; X64-SSE2-NEXT:    shrl $15, %eax
+; X64-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v8i16_signbit_not:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT:    pandn (%eax), %xmm0
+; X86-SSE4-NEXT:    pxor %xmm1, %xmm0
+; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X86-SSE4-NEXT:    pextrw $0, %xmm0, %eax
+; X86-SSE4-NEXT:    shrl $15, %eax
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v8i16_signbit_not:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE4-NEXT:    pxor %xmm1, %xmm0
+; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
+; X64-SSE4-NEXT:    pextrw $0, %xmm0, %eax
+; X64-SSE4-NEXT:    shrl $15, %eax
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: reduce_umax_v8i16_signbit_not:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX-NEXT:    vmovdqa (%ecx), %xmm0
+; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX-NEXT:    vpandn (%eax), %xmm0, %xmm0
+; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX-NEXT:    vpextrw $0, %xmm0, %eax
+; X86-AVX-NEXT:    shrl $15, %eax
+; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: reduce_umax_v8i16_signbit_not:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovdqa (%rdi), %xmm0
+; X64-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX-NEXT:    vpandn (%rsi), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX-NEXT:    vpextrw $0, %xmm0, %eax
+; X64-AVX-NEXT:    shrl $15, %eax
+; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512BW-LABEL: reduce_umax_v8i16_signbit_not:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
+; AVX512BW-NEXT:    vpandn (%rsi), %xmm0, %xmm0
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX512BW-NEXT:    shrl $15, %eax
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: reduce_umax_v8i16_signbit_not:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
+; AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm1 = xmm1 ^ (mem & ~xmm0)
+; AVX512VL-NEXT:    vphminposuw %xmm1, %xmm0
+; AVX512VL-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX512VL-NEXT:    shrl $15, %eax
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    retq
+  %a = load <8 x i16>, ptr %pa
+  %b = load <8 x i16>, ptr %pb
+  %a.not = xor <8 x i16> %a, splat (i16 -1)
+  %and = and <8 x i16> %b, %a.not
+  %rdx = call i16 @llvm.vector.reduce.umax.v8i16(<8 x i16> %and)
+  %cmp = icmp sgt i16 %rdx, -1
+  %res = zext i1 %cmp to i16
+  ret i16 %res
+}
+
+define i32 @reduce_umax_v4i32_signbit(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v4i32_signbit:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE2-NEXT:    pand (%eax), %xmm0
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    orl %ecx, %eax
+; X86-SSE2-NEXT:    notl %eax
+; X86-SSE2-NEXT:    shrl $31, %eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v4i32_signbit:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE2-NEXT:    pand (%rdi), %xmm0
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    pxor %xmm3, %xmm1
+; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X64-SSE2-NEXT:    pand %xmm2, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X64-SSE2-NEXT:    por %xmm0, %xmm2
+; X64-SSE2-NEXT:    movd %xmm2, %ecx
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    orl %ecx, %eax
+; X64-SSE2-NEXT:    notl %eax
+; X64-SSE2-NEXT:    shrl $31, %eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v4i32_signbit:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE4-NEXT:    pand (%eax), %xmm0
+; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT:    pmaxud %xmm0, %xmm1
+; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE4-NEXT:    por %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    notl %eax
+; X86-SSE4-NEXT:    shrl $31, %eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v4i32_signbit:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE4-NEXT:    pand (%rdi), %xmm0
+; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE4-NEXT:    pmaxud %xmm0, %xmm1
+; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE4-NEXT:    por %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    notl %eax
+; X64-SSE4-NEXT:    shrl $31, %eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: reduce_umax_v4i32_signbit:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX-NEXT:    vmovdqa (%ecx), %xmm0
+; X86-AVX-NEXT:    vpand (%eax), %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; X86-AVX-NEXT:    vmovd %xmm0, %eax
+; X86-AVX-NEXT:    notl %eax
+; X86-AVX-NEXT:    shrl $31, %eax
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: reduce_umax_v4i32_signbit:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovdqa (%rsi), %xmm0
+; X64-AVX-NEXT:    vpand (%rdi), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; X64-AVX-NEXT:    vmovd %xmm0, %eax
+; X64-AVX-NEXT:    notl %eax
+; X64-AVX-NEXT:    shrl $31, %eax
+; X64-AVX-NEXT:    retq
+;
+; AVX512-LABEL: reduce_umax_v4i32_signbit:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa (%rsi), %xmm0
+; AVX512-NEXT:    vpand (%rdi), %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    notl %eax
+; AVX512-NEXT:    shrl $31, %eax
+; AVX512-NEXT:    retq
+  %a = load <4 x i32>, ptr %pa
+  %b = load <4 x i32>, ptr %pb
+  %a.not = xor <4 x i32> %a, splat (i32 -1)
+  %and = and <4 x i32> %b, %a
+  %rdx = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %and)
+  %cmp = icmp sgt i32 %rdx, -1
+  %res = zext i1 %cmp to i32
+  ret i32 %res
+}
+
+define i64 @reduce_umax_v2i64_signbit_not(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v2i64_signbit_not:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE2-NEXT:    pandn (%eax), %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    por %xmm1, %xmm0
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    notl %eax
+; X86-SSE2-NEXT:    shrl $31, %eax
+; X86-SSE2-NEXT:    xorl %edx, %edx
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v2i64_signbit_not:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE2-NEXT:    movq %xmm0, %rcx
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    movq %xmm0, %rax
+; X64-SSE2-NEXT:    orq %rcx, %rax
+; X64-SSE2-NEXT:    notq %rax
+; X64-SSE2-NEXT:    shrq $63, %rax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v2i64_signbit_not:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE4-NEXT:    pandn (%eax), %xmm0
+; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT:    por %xmm0, %xmm1
+; X86-SSE4-NEXT:    pextrd $1, %xmm1, %eax
+; X86-SSE4-NEXT:    notl %eax
+; X86-SSE4-NEXT:    shrl $31, %eax
+; X86-SSE4-NEXT:    xorl %edx, %edx
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v2i64_signbit_not:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE4-NEXT:    pextrq $1, %xmm0, %rcx
+; X64-SSE4-NEXT:    movq %xmm0, %rax
+; X64-SSE4-NEXT:    orq %rcx, %rax
+; X64-SSE4-NEXT:    notq %rax
+; X64-SSE4-NEXT:    shrq $63, %rax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX-LABEL: reduce_umax_v2i64_signbit_not:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX-NEXT:    vmovaps (%ecx), %xmm0
+; X86-AVX-NEXT:    vandnps (%eax), %xmm0, %xmm0
+; X86-AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX-NEXT:    vorps %xmm0, %xmm1, %xmm0
+; X86-AVX-NEXT:    vextractps $1, %xmm0, %eax
+; X86-AVX-NEXT:    notl %eax
+; X86-AVX-NEXT:    shrl $31, %eax
+; X86-AVX-NEXT:    xorl %edx, %edx
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: reduce_umax_v2i64_signbit_not:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovdqa (%rdi), %xmm0
+; X64-AVX-NEXT:    vpandn (%rsi), %xmm0, %xmm0
+; X64-AVX-NEXT:    vpextrq $1, %xmm0, %rcx
+; X64-AVX-NEXT:    vmovq %xmm0, %rax
+; X64-AVX-NEXT:    orq %rcx, %rax
+; X64-AVX-NEXT:    notq %rax
+; X64-AVX-NEXT:    shrq $63, %rax
+; X64-AVX-NEXT:    retq
+;
+; AVX512-LABEL: reduce_umax_v2i64_signbit_not:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
+; AVX512-NEXT:    vpandn (%rsi), %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vmovq %xmm0, %rax
+; AVX512-NEXT:    notq %rax
+; AVX512-NEXT:    shrq $63, %rax
+; AVX512-NEXT:    retq
+  %a = load <2 x i64>, ptr %pa
+  %b = load <2 x i64>, ptr %pb
+  %a.not = xor <2 x i64> %a, splat (i64 -1)
+  %and = and <2 x i64> %b, %a.not
+  %rdx = call i64 @llvm.vector.reduce.umax.v2i64(<2 x i64> %and)
+  %cmp = icmp sgt i64 %rdx, -1
+  %res = zext i1 %cmp to i64
+  ret i64 %res
+}
+
+define i8 @reduce_umax_v32i8_signbit_not(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v32i8_signbit_not:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE2-NEXT:    pandn 16(%eax), %xmm1
+; X86-SSE2-NEXT:    pandn (%eax), %xmm0
+; X86-SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE2-NEXT:    psrld $16, %xmm1
+; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE2-NEXT:    psrlw $8, %xmm0
+; X86-SSE2-NEXT:    por %xmm1, %xmm0
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    notb %al
+; X86-SSE2-NEXT:    shrb $7, %al
+; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v32i8_signbit_not:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT:    movdqa 16(%rdi), %xmm1
+; X64-SSE2-NEXT:    pandn 16(%rsi), %xmm1
+; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE2-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE2-NEXT:    psrld $16, %xmm1
+; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
+; X64-SSE2-NEXT:    psrlw $8, %xmm0
+; X64-SSE2-NEXT:    por %xmm1, %xmm0
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    notb %al
+; X64-SSE2-NEXT:    shrb $7, %al
+; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v32i8_signbit_not:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE4-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE4-NEXT:    pcmpeqd %xmm2, %xmm2
+; X86-SSE4-NEXT:    pandn 16(%eax), %xmm1
+; X86-SSE4-NEXT:    pandn (%eax), %xmm0
+; X86-SSE4-NEXT:    pmaxub %xmm1, %xmm0
+; X86-SSE4-NEXT:    pxor %xmm2, %xmm0
+; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X86-SSE4-NEXT:    psrlw $8, %xmm1
+; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    shrb $7, %al
+; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v32i8_signbit_not:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT:    movdqa 16(%rdi), %xmm1
+; X64-SSE4-NEXT:    pcmpeqd %xmm2, %xmm2
+; X64-SSE4-NEXT:    pandn 16(%rsi), %xmm1
+; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE4-NEXT:    pmaxub %xmm1, %xmm0
+; X64-SSE4-NEXT:    pxor %xmm2, %xmm0
+; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
+; X64-SSE4-NEXT:    psrlw $8, %xmm1
+; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    shrb $7, %al
+; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: reduce_umax_v32i8_signbit_not:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX1-NEXT:    vandnps (%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    shrb $7, %al
+; X86-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: reduce_umax_v32i8_signbit_not:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vmovaps (%rdi), %ymm0
+; X64-AVX1-NEXT:    vandnps (%rsi), %ymm0, %ymm0
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    shrb $7, %al
+; X64-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT:    vzeroupper
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: reduce_umax_v32i8_signbit_not:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
+; X86-AVX2-NEXT:    vpandn (%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    shrb $7, %al
+; X86-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT:    vzeroupper
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: reduce_umax_v32i8_signbit_not:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT:    vpandn (%rsi), %ymm0, %ymm0
+; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    shrb $7, %al
+; X64-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT:    vzeroupper
+; X64-AVX2-NEXT:    retq
+;
+; AVX512BW-LABEL: reduce_umax_v32i8_signbit_not:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
+; AVX512BW-NEXT:    vpandn (%rsi), %ymm0, %ymm0
+; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    shrb $7, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: reduce_umax_v32i8_signbit_not:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
+; AVX512VL-NEXT:    vpandn (%rsi), %ymm0, %ymm0
+; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovd %xmm0, %eax
+; AVX512VL-NEXT:    shrb $7, %al
+; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512VL-NEXT:    vzeroupper
+; AVX512VL-NEXT:    retq
+  %a = load <32 x i8>, ptr %pa
+  %b = load <32 x i8>, ptr %pb
+  %a.not = xor <32 x i8> %a, splat (i8 -1)
+  %and = and <32 x i8> %b, %a.not
+  %rdx = call i8 @llvm.vector.reduce.umax.v32i8(<32 x i8> %and)
+  %cmp = icmp sgt i8 %rdx, -1
+  %res = zext i1 %cmp to i8
+  ret i8 %res
+}
+
+define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v16i16_signbit:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE2-NEXT:    pand (%eax), %xmm0
+; X86-SSE2-NEXT:    pand 16(%eax), %xmm1
+; X86-SSE2-NEXT:    psubusw %xmm0, %xmm1
+; X86-SSE2-NEXT:    paddw %xmm0, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm0
+; X86-SSE2-NEXT:    paddw %xmm1, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT:    psubusw %xmm0, %xmm1
+; X86-SSE2-NEXT:    paddw %xmm0, %xmm1
+; X86-SSE2-NEXT:    pextrw $1, %xmm1, %eax
+; X86-SSE2-NEXT:    movd %xmm1, %ecx
+; X86-SSE2-NEXT:    orl %eax, %ecx
+; X86-SSE2-NEXT:    notl %ecx
+; X86-SSE2-NEXT:    movzwl %cx, %eax
+; X86-SSE2-NEXT:    shrl $15, %eax
+; X86-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v16i16_signbit:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE2-NEXT:    movdqa 16(%rsi), %xmm1
+; X64-SSE2-NEXT:    pand (%rdi), %xmm0
+; X64-SSE2-NEXT:    pand 16(%rdi), %xmm1
+; X64-SSE2-NEXT:    psubusw %xmm0, %xmm1
+; X64-SSE2-NEXT:    paddw %xmm0, %xmm1
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm0
+; X64-SSE2-NEXT:    paddw %xmm1, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-SSE2-NEXT:    psubusw %xmm0, %xmm1
+; X64-SSE2-NEXT:    paddw %xmm0, %xmm1
+; X64-SSE2-NEXT:    pextrw $1, %xmm1, %eax
+; X64-SSE2-NEXT:    movd %xmm1, %ecx
+; X64-SSE2-NEXT:    orl %eax, %ecx
+; X64-SSE2-NEXT:    notl %ecx
+; X64-SSE2-NEXT:    movzwl %cx, %eax
+; X64-SSE2-NEXT:    shrl $15, %eax
+; X64-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v16i16_signbit:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE4-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE4-NEXT:    pand 16(%eax), %xmm1
+; X86-SSE4-NEXT:    pand (%eax), %xmm0
+; X86-SSE4-NEXT:    pmaxuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    pextrw $0, %xmm0, %eax
+; X86-SSE4-NEXT:    shrl $15, %eax
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v16i16_signbit:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE4-NEXT:    movdqa 16(%rsi), %xmm1
+; X64-SSE4-NEXT:    pand 16(%rdi), %xmm1
+; X64-SSE4-NEXT:    pand (%rdi), %xmm0
+; X64-SSE4-NEXT:    pmaxuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT:    pxor %xmm0, %xmm1
+; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
+; X64-SSE4-NEXT:    pextrw $0, %xmm0, %eax
+; X64-SSE4-NEXT:    shrl $15, %eax
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: reduce_umax_v16i16_signbit:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX1-NEXT:    vandps (%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpextrw $0, %xmm0, %eax
+; X86-AVX1-NEXT:    shrl $15, %eax
+; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: reduce_umax_v16i16_signbit:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vmovaps (%rsi), %ymm0
+; X64-AVX1-NEXT:    vandps (%rdi), %ymm0, %ymm0
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpextrw $0, %xmm0, %eax
+; X64-AVX1-NEXT:    shrl $15, %eax
+; X64-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT:    vzeroupper
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: reduce_umax_v16i16_signbit:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
+; X86-AVX2-NEXT:    vpand (%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpextrw $0, %xmm0, %eax
+; X86-AVX2-NEXT:    shrl $15, %eax
+; X86-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX2-NEXT:    vzeroupper
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: reduce_umax_v16i16_signbit:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vmovdqa (%rsi), %ymm0
+; X64-AVX2-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpextrw $0, %xmm0, %eax
+; X64-AVX2-NEXT:    shrl $15, %eax
+; X64-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX2-NEXT:    vzeroupper
+; X64-AVX2-NEXT:    retq
+;
+; AVX512BW-LABEL: reduce_umax_v16i16_signbit:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa (%rsi), %ymm0
+; AVX512BW-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX512BW-NEXT:    shrl $15, %eax
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: reduce_umax_v16i16_signbit:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vmovdqa (%rsi), %ymm0
+; AVX512VL-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512VL-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX512VL-NEXT:    shrl $15, %eax
+; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512VL-NEXT:    vzeroupper
+; AVX512VL-NEXT:    retq
+  %a = load <16 x i16>, ptr %pa
+  %b = load <16 x i16>, ptr %pb
+  %a.not = xor <16 x i16> %a, splat (i16 -1)
+  %and = and <16 x i16> %b, %a
+  %rdx = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> %and)
+  %cmp = icmp sgt i16 %rdx, -1
+  %res = zext i1 %cmp to i16
+  ret i16 %res
+}
+
+define i32 @reduce_umax_v8i32_signbit_not(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v8i32_signbit_not:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm2
+; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm3
+; X86-SSE2-NEXT:    pandn (%eax), %xmm2
+; X86-SSE2-NEXT:    pandn 16(%eax), %xmm3
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm4
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm0
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
+; X86-SSE2-NEXT:    pand %xmm0, %xmm2
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm0
+; X86-SSE2-NEXT:    por %xmm2, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
+; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
+; X86-SSE2-NEXT:    por %xmm0, %xmm2
+; X86-SSE2-NEXT:    movd %xmm2, %ecx
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
+; X86-SSE2-NEXT:    movd %xmm0, %eax
+; X86-SSE2-NEXT:    orl %ecx, %eax
+; X86-SSE2-NEXT:    notl %eax
+; X86-SSE2-NEXT:    shrl $31, %eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v8i32_signbit_not:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT:    movdqa 16(%rdi), %xmm1
+; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE2-NEXT:    pandn 16(%rsi), %xmm1
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
+; 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:    pcmpgtd %xmm3, %xmm4
+; X64-SSE2-NEXT:    pand %xmm4, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
+; X64-SSE2-NEXT:    por %xmm0, %xmm4
+; X64-SSE2-NEXT:    movdqa %xmm4, %xmm0
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
+; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
+; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
+; X64-SSE2-NEXT:    pand %xmm0, %xmm4
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm0
+; X64-SSE2-NEXT:    por %xmm4, %xmm0
+; X64-SSE2-NEXT:    movd %xmm0, %ecx
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X64-SSE2-NEXT:    movd %xmm0, %eax
+; X64-SSE2-NEXT:    orl %ecx, %eax
+; X64-SSE2-NEXT:    notl %eax
+; X64-SSE2-NEXT:    shrl $31, %eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v8i32_signbit_not:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE4-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE4-NEXT:    pandn 16(%eax), %xmm1
+; X86-SSE4-NEXT:    pandn (%eax), %xmm0
+; X86-SSE4-NEXT:    pmaxud %xmm1, %xmm0
+; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT:    pmaxud %xmm0, %xmm1
+; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE4-NEXT:    por %xmm1, %xmm0
+; X86-SSE4-NEXT:    movd %xmm0, %eax
+; X86-SSE4-NEXT:    notl %eax
+; X86-SSE4-NEXT:    shrl $31, %eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v8i32_signbit_not:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT:    movdqa 16(%rdi), %xmm1
+; X64-SSE4-NEXT:    pandn 16(%rsi), %xmm1
+; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE4-NEXT:    pmaxud %xmm1, %xmm0
+; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE4-NEXT:    pmaxud %xmm0, %xmm1
+; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X64-SSE4-NEXT:    por %xmm1, %xmm0
+; X64-SSE4-NEXT:    movd %xmm0, %eax
+; X64-SSE4-NEXT:    notl %eax
+; X64-SSE4-NEXT:    shrl $31, %eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: reduce_umax_v8i32_signbit_not:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX1-NEXT:    vandnps (%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vmovd %xmm0, %eax
+; X86-AVX1-NEXT:    notl %eax
+; X86-AVX1-NEXT:    shrl $31, %eax
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: reduce_umax_v8i32_signbit_not:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vmovaps (%rdi), %ymm0
+; X64-AVX1-NEXT:    vandnps (%rsi), %ymm0, %ymm0
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vmovd %xmm0, %eax
+; X64-AVX1-NEXT:    notl %eax
+; X64-AVX1-NEXT:    shrl $31, %eax
+; X64-AVX1-NEXT:    vzeroupper
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: reduce_umax_v8i32_signbit_not:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
+; X86-AVX2-NEXT:    vpandn (%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT:    vmovd %xmm0, %eax
+; X86-AVX2-NEXT:    notl %eax
+; X86-AVX2-NEXT:    shrl $31, %eax
+; X86-AVX2-NEXT:    vzeroupper
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: reduce_umax_v8i32_signbit_not:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT:    vpandn (%rsi), %ymm0, %ymm0
+; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT:    vmovd %xmm0, %eax
+; X64-AVX2-NEXT:    notl %eax
+; X64-AVX2-NEXT:    shrl $31, %eax
+; X64-AVX2-NEXT:    vzeroupper
+; X64-AVX2-NEXT:    retq
+;
+; AVX512-LABEL: reduce_umax_v8i32_signbit_not:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
+; AVX512-NEXT:    vpandn (%rsi), %ymm0, %ymm0
+; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    notl %eax
+; AVX512-NEXT:    shrl $31, %eax
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
+  %a = load <8 x i32>, ptr %pa
+  %b = load <8 x i32>, ptr %pb
+  %a.not = xor <8 x i32> %a, splat (i32 -1)
+  %and = and <8 x i32> %b, %a.not
+  %rdx = call i32 @llvm.vector.reduce.umax.v8i32(<8 x i32> %and)
+  %cmp = icmp sgt i32 %rdx, -1
+  %res = zext i1 %cmp to i32
+  ret i32 %res
+}
+
+define i64 @reduce_umax_v4i64_signbit(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v4i64_signbit:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE2-NEXT:    pand (%eax), %xmm0
+; X86-SSE2-NEXT:    pand 16(%eax), %xmm1
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X86-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm5, %xmm2
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm2, %xmm3
+; X86-SSE2-NEXT:    pand %xmm3, %xmm0
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X86-SSE2-NEXT:    por %xmm0, %xmm3
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[3,3,3,3]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,1,1]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
+; X86-SSE2-NEXT:    notl %eax
+; X86-SSE2-NEXT:    shrl $31, %eax
+; X86-SSE2-NEXT:    xorl %edx, %edx
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v4i64_signbit:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE2-NEXT:    movdqa 16(%rsi), %xmm1
+; X64-SSE2-NEXT:    pand (%rdi), %xmm0
+; X64-SSE2-NEXT:    pand 16(%rdi), %xmm1
+; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
+; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
+; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
+; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
+; X64-SSE2-NEXT:    pand %xmm5, %xmm2
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
+; X64-SSE2-NEXT:    por %xmm2, %xmm3
+; X64-SSE2-NEXT:    pand %xmm3, %xmm0
+; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
+; X64-SSE2-NEXT:    por %xmm0, %xmm3
+; X64-SSE2-NEXT:    movq %xmm3, %rcx
+; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
+; X64-SSE2-NEXT:    movq %xmm0, %rax
+; X64-SSE2-NEXT:    orq %rcx, %rax
+; X64-SSE2-NEXT:    notq %rax
+; X64-SSE2-NEXT:    shrq $63, %rax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE41-LABEL: reduce_umax_v4i64_signbit:
+; X86-SSE41:       # %bb.0:
+; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE41-NEXT:    movdqa (%ecx), %xmm2
+; X86-SSE41-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE41-NEXT:    pand (%eax), %xmm2
+; X86-SSE41-NEXT:    pand 16(%eax), %xmm1
+; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE41-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE41-NEXT:    pxor %xmm2, %xmm0
+; X86-SSE41-NEXT:    movdqa %xmm0, %xmm4
+; X86-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X86-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
+; X86-SSE41-NEXT:    pand %xmm5, %xmm3
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
+; X86-SSE41-NEXT:    por %xmm3, %xmm0
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE41-NEXT:    por %xmm1, %xmm0
+; X86-SSE41-NEXT:    pextrd $1, %xmm0, %eax
+; X86-SSE41-NEXT:    notl %eax
+; X86-SSE41-NEXT:    shrl $31, %eax
+; X86-SSE41-NEXT:    xorl %edx, %edx
+; X86-SSE41-NEXT:    retl
+;
+; X64-SSE41-LABEL: reduce_umax_v4i64_signbit:
+; X64-SSE41:       # %bb.0:
+; X64-SSE41-NEXT:    movdqa (%rsi), %xmm1
+; X64-SSE41-NEXT:    movdqa 16(%rsi), %xmm2
+; X64-SSE41-NEXT:    pand (%rdi), %xmm1
+; X64-SSE41-NEXT:    pand 16(%rdi), %xmm2
+; X64-SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
+; X64-SSE41-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE41-NEXT:    pxor %xmm0, %xmm3
+; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
+; X64-SSE41-NEXT:    movdqa %xmm0, %xmm4
+; X64-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
+; X64-SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
+; X64-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
+; X64-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
+; X64-SSE41-NEXT:    pand %xmm5, %xmm3
+; X64-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
+; X64-SSE41-NEXT:    por %xmm3, %xmm0
+; X64-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
+; X64-SSE41-NEXT:    pextrq $1, %xmm2, %rcx
+; X64-SSE41-NEXT:    movq %xmm2, %rax
+; X64-SSE41-NEXT:    orq %rcx, %rax
+; X64-SSE41-NEXT:    notq %rax
+; X64-SSE41-NEXT:    shrq $63, %rax
+; X64-SSE41-NEXT:    retq
+;
+; X86-SSE42-LABEL: reduce_umax_v4i64_signbit:
+; X86-SSE42:       # %bb.0:
+; X86-SSE42-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE42-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE42-NEXT:    movdqa (%ecx), %xmm2
+; X86-SSE42-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE42-NEXT:    pand (%eax), %xmm2
+; X86-SSE42-NEXT:    pand 16(%eax), %xmm1
+; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [0,2147483648,0,2147483648]
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm3
+; X86-SSE42-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE42-NEXT:    pxor %xmm2, %xmm0
+; X86-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
+; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE42-NEXT:    por %xmm1, %xmm0
+; X86-SSE42-NEXT:    pextrd $1, %xmm0, %eax
+; X86-SSE42-NEXT:    notl %eax
+; X86-SSE42-NEXT:    shrl $31, %eax
+; X86-SSE42-NEXT:    xorl %edx, %edx
+; X86-SSE42-NEXT:    retl
+;
+; X64-SSE42-LABEL: reduce_umax_v4i64_signbit:
+; X64-SSE42:       # %bb.0:
+; X64-SSE42-NEXT:    movdqa (%rsi), %xmm1
+; X64-SSE42-NEXT:    movdqa 16(%rsi), %xmm2
+; X64-SSE42-NEXT:    pand (%rdi), %xmm1
+; X64-SSE42-NEXT:    pand 16(%rdi), %xmm2
+; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
+; X64-SSE42-NEXT:    movdqa %xmm2, %xmm3
+; X64-SSE42-NEXT:    pxor %xmm0, %xmm3
+; X64-SSE42-NEXT:    pxor %xmm1, %xmm0
+; X64-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
+; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
+; X64-SSE42-NEXT:    pextrq $1, %xmm2, %rcx
+; X64-SSE42-NEXT:    movq %xmm2, %rax
+; X64-SSE42-NEXT:    orq %rcx, %rax
+; X64-SSE42-NEXT:    notq %rax
+; X64-SSE42-NEXT:    shrq $63, %rax
+; X64-SSE42-NEXT:    retq
+;
+; X86-AVX1-LABEL: reduce_umax_v4i64_signbit:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX1-NEXT:    vandps (%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
+; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
+; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm3
+; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm2
+; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vorpd %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %eax
+; X86-AVX1-NEXT:    notl %eax
+; X86-AVX1-NEXT:    shrl $31, %eax
+; X86-AVX1-NEXT:    xorl %edx, %edx
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: reduce_umax_v4i64_signbit:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vmovaps (%rsi), %ymm0
+; X64-AVX1-NEXT:    vandps (%rdi), %ymm0, %ymm0
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX1-NEXT:    # xmm2 = mem[0,0]
+; X64-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm3
+; X64-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm2
+; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
+; X64-AVX1-NEXT:    vmovq %xmm0, %rax
+; X64-AVX1-NEXT:    orq %rcx, %rax
+; X64-AVX1-NEXT:    notq %rax
+; X64-AVX1-NEXT:    shrq $63, %rax
+; X64-AVX1-NEXT:    vzeroupper
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: reduce_umax_v4i64_signbit:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
+; X86-AVX2-NEXT:    vpand (%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
+; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
+; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
+; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vorpd %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %eax
+; X86-AVX2-NEXT:    notl %eax
+; X86-AVX2-NEXT:    shrl $31, %eax
+; X86-AVX2-NEXT:    xorl %edx, %edx
+; X86-AVX2-NEXT:    vzeroupper
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: reduce_umax_v4i64_signbit:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vmovdqa (%rsi), %ymm0
+; X64-AVX2-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
+; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
+; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
+; X64-AVX2-NEXT:    vmovq %xmm0, %rax
+; X64-AVX2-NEXT:    orq %rcx, %rax
+; X64-AVX2-NEXT:    notq %rax
+; X64-AVX2-NEXT:    shrq $63, %rax
+; X64-AVX2-NEXT:    vzeroupper
+; X64-AVX2-NEXT:    retq
+;
+; AVX512BW-LABEL: reduce_umax_v4i64_signbit:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa (%rsi), %ymm0
+; AVX512BW-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
+; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovq %xmm0, %rax
+; AVX512BW-NEXT:    notq %rax
+; AVX512BW-NEXT:    shrq $63, %rax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512VL-LABEL: reduce_umax_v4i64_signbit:
+; AVX512VL:       # %bb.0:
+; AVX512VL-NEXT:    vmovdqa (%rsi), %ymm0
+; AVX512VL-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512VL-NEXT:    vmovq %xmm0, %rax
+; AVX512VL-NEXT:    notq %rax
+; AVX512VL-NEXT:    shrq $63, %rax
+; AVX512VL-NEXT:    vzeroupper
+; AVX512VL-NEXT:    retq
+  %a = load <4 x i64>, ptr %pa
+  %b = load <4 x i64>, ptr %pb
+  %a.not = xor <4 x i64> %a, splat (i64 -1)
+  %and = and <4 x i64> %b, %a
+  %rdx = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> %and)
+  %cmp = icmp sgt i64 %rdx, -1
+  %res = zext i1 %cmp to i64
+  ret i64 %res
+}
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; AVX: {{.*}}
+; AVX1: {{.*}}
+; AVX2: {{.*}}
+; SSE: {{.*}}
+; SSE2: {{.*}}
+; SSE4: {{.*}}
+; X64-SSE: {{.*}}
+; X86-SSE: {{.*}}

>From a3c796697e2ac001a86ba2139bff258a395ae3ca Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Fri, 17 Jul 2026 19:14:29 +0100
Subject: [PATCH 2/3] [X86] combineShiftRightLogical - fold
 srl(vecreduce_umax(x),bw-1) as MOVMSK signbit reduction

VectorCombine may have folded: icmp_eq(vecreduce_or(splatsign(x)),0) --> icmp_sgt(vecreduce_umax(x),-1) which DAG folds to: srl(vecreduce_umax(x),bw-1).

This match attempts to lower:
srl(vecreduce_umax(x),bw-1) --> icmp_ne(movmsk(x),z) "any_of negative"
srl(not(vecreduce_umax(x)),bw-1) --> icmp_eq(movmsk(x),z) "none_of negative"

The correct fix would be to improve vecreduce_or costs to prevent VectorCombine doing this, but that change is far too big to be merged into 23.x - so I've created a more narrow backend fix.

Fixes #209714
---
 llvm/lib/Target/X86/X86ISelLowering.cpp |   27 +
 llvm/test/CodeGen/X86/pr209714.ll       | 1347 ++++++-----------------
 2 files changed, 374 insertions(+), 1000 deletions(-)

diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 97e783c09f0f2..c543d97f62262 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -50910,6 +50910,33 @@ static SDValue combineShiftRightLogical(SDNode *N, SelectionDAG &DAG,
     }
   }
 
+  // VectorCombine may have folded:
+  // icmp_eq(vecreduce_or(splatsign(x)),0) --> icmp_sgt(vecreduce_umax(x),-1)
+  // which DAG folds to: srl(vecreduce_umax(x),bw-1).
+  // This attempts to reconstruct the signbit reduction.
+  if (sd_match(N1, m_SpecificInt(EltSizeInBits - 1))) {
+    SDValue X = N0;
+    ISD::CondCode CC = ISD::SETNE;
+    if (sd_match(N0, m_Not(m_Value(X))))
+      CC = ISD::SETEQ;
+    if (X.getOpcode() == ISD::VECREDUCE_UMAX) {
+      SDValue V = X.getOperand(0);
+      EVT VecVT = V.getValueType();
+      if (DAG.getTargetLoweringInfo().isTypeLegal(VecVT) &&
+          (VecVT.is128BitVector() || VecVT.is256BitVector())) {
+        if (VecVT == MVT::v16i16) {
+          auto [Lo, Hi] = DAG.SplitVector(V, DL);
+          V = DAG.getNode(X86ISD::PACKSS, DL, MVT::v16i8, Lo, Hi);
+        } else if (VecVT == MVT::v8i16) {
+          V = DAG.getNode(X86ISD::PACKSS, DL, MVT::v16i8, V, V);
+        }
+        V = getPMOVMSKB(DL, V, DAG, Subtarget);
+        V = DAG.getSetCC(DL, MVT::i8, V, DAG.getConstant(0, DL, MVT::i32), CC);
+        return DAG.getZExtOrTrunc(V, DL, VT);
+      }
+    }
+  }
+
   // Only do this on the last DAG combine as it can interfere with other
   // combines.
   if (!DCI.isAfterLegalizeDAG())
diff --git a/llvm/test/CodeGen/X86/pr209714.ll b/llvm/test/CodeGen/X86/pr209714.ll
index 9e05a05ea4616..1c3b0b2149c21 100644
--- a/llvm/test/CodeGen/X86/pr209714.ll
+++ b/llvm/test/CodeGen/X86/pr209714.ll
@@ -1,93 +1,39 @@
 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686--   -mattr=+sse2     | FileCheck %s --check-prefixes=SSE,SSE2,X86-SSE,X86-SSE2
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2     | FileCheck %s --check-prefixes=SSE,SSE2,X64-SSE,X64-SSE2
-; RUN: llc < %s -mtriple=i686--   -mattr=+sse4.1   | FileCheck %s --check-prefixes=SSE,SSE4,X86-SSE,X86-SSE4,X86-SSE41
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1   | FileCheck %s --check-prefixes=SSE,SSE4,X64-SSE,X64-SSE4,X64-SSE41
-; RUN: llc < %s -mtriple=i686--   -mattr=+sse4.2   | FileCheck %s --check-prefixes=SSE,SSE4,X86-SSE,X86-SSE4,X86-SSE42
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2   | FileCheck %s --check-prefixes=SSE,SSE4,X64-SSE,X64-SSE4,X64-SSE42
-; RUN: llc < %s -mtriple=i686--   -mattr=+avx      | FileCheck %s --check-prefixes=AVX,AVX1,X86-AVX,X86-AVX1
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx      | FileCheck %s --check-prefixes=AVX,AVX1,X64-AVX,X64-AVX1
-; RUN: llc < %s -mtriple=i686--   -mattr=+avx2     | FileCheck %s --check-prefixes=AVX,AVX2,X86-AVX,X86-AVX2
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2     | FileCheck %s --check-prefixes=AVX,AVX2,X64-AVX,X64-AVX2
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL
+; RUN: llc < %s -mtriple=i686--   -mattr=+sse2     | FileCheck %s --check-prefixes=X86-SSE,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2     | FileCheck %s --check-prefixes=X64-SSE,X64-SSE2
+; RUN: llc < %s -mtriple=i686--   -mattr=+sse4.1   | FileCheck %s --check-prefixes=X86-SSE,X86-SSE4,X86-SSE41
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1   | FileCheck %s --check-prefixes=X64-SSE,X64-SSE4
+; RUN: llc < %s -mtriple=i686--   -mattr=+sse4.2   | FileCheck %s --check-prefixes=X86-SSE,X86-SSE4,X86-SSE42
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2   | FileCheck %s --check-prefixes=X64-SSE,X64-SSE4
+; RUN: llc < %s -mtriple=i686--   -mattr=+avx      | FileCheck %s --check-prefixes=X86-AVX,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx      | FileCheck %s --check-prefixes=X64-AVX,X64-AVX1
+; RUN: llc < %s -mtriple=i686--   -mattr=+avx2     | FileCheck %s --check-prefixes=X86-AVX,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2     | FileCheck %s --check-prefixes=X64-AVX,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512
 
-; TODO: Ensure umax reductions which only demand the signbit correctly fold to MOVSMSK/TESTP style patterns.
+; Ensure umax reductions which only demand the signbit correctly fold to MOVSMSK/TESTP style patterns.
 
 define i8 @reduce_umax_v16i8_signbit(ptr %pa, ptr %pb) {
-; X86-SSE2-LABEL: reduce_umax_v16i8_signbit:
-; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE2-NEXT:    pand (%eax), %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE2-NEXT:    pmaxub %xmm1, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    psrld $16, %xmm1
-; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    psrlw $8, %xmm0
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    notb %al
-; X86-SSE2-NEXT:    shrb $7, %al
-; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
-; X86-SSE2-NEXT:    retl
-;
-; X64-SSE2-LABEL: reduce_umax_v16i8_signbit:
-; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa (%rsi), %xmm0
-; X64-SSE2-NEXT:    pand (%rdi), %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE2-NEXT:    pmaxub %xmm1, %xmm0
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE2-NEXT:    psrld $16, %xmm1
-; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X64-SSE2-NEXT:    psrlw $8, %xmm0
-; X64-SSE2-NEXT:    por %xmm1, %xmm0
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    notb %al
-; X64-SSE2-NEXT:    shrb $7, %al
-; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
-; X64-SSE2-NEXT:    retq
-;
-; X86-SSE4-LABEL: reduce_umax_v16i8_signbit:
-; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE4-NEXT:    pand (%eax), %xmm0
-; X86-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE4-NEXT:    pxor %xmm0, %xmm1
-; X86-SSE4-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE4-NEXT:    psrlw $8, %xmm0
-; X86-SSE4-NEXT:    pminub %xmm1, %xmm0
-; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE4-NEXT:    movd %xmm0, %eax
-; X86-SSE4-NEXT:    shrb $7, %al
-; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; X86-SSE4-NEXT:    retl
-;
-; X64-SSE4-LABEL: reduce_umax_v16i8_signbit:
-; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    movdqa (%rsi), %xmm0
-; X64-SSE4-NEXT:    pand (%rdi), %xmm0
-; X64-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE4-NEXT:    pxor %xmm0, %xmm1
-; X64-SSE4-NEXT:    movdqa %xmm1, %xmm0
-; X64-SSE4-NEXT:    psrlw $8, %xmm0
-; X64-SSE4-NEXT:    pminub %xmm1, %xmm0
-; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE4-NEXT:    movd %xmm0, %eax
-; X64-SSE4-NEXT:    shrb $7, %al
-; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; X64-SSE4-NEXT:    retq
+; X86-SSE-LABEL: reduce_umax_v16i8_signbit:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE-NEXT:    pand (%eax), %xmm0
+; X86-SSE-NEXT:    pmovmskb %xmm0, %eax
+; X86-SSE-NEXT:    testl %eax, %eax
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v16i8_signbit:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE-NEXT:    pand (%rdi), %xmm0
+; X64-SSE-NEXT:    pmovmskb %xmm0, %eax
+; X64-SSE-NEXT:    testl %eax, %eax
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
 ;
 ; X86-AVX-LABEL: reduce_umax_v16i8_signbit:
 ; X86-AVX:       # %bb.0:
@@ -95,56 +41,28 @@ define i8 @reduce_umax_v16i8_signbit(ptr %pa, ptr %pb) {
 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; X86-AVX-NEXT:    vmovdqa (%ecx), %xmm0
 ; X86-AVX-NEXT:    vpand (%eax), %xmm0, %xmm0
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    shrb $7, %al
-; X86-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX-NEXT:    vpmovmskb %xmm0, %eax
+; X86-AVX-NEXT:    testl %eax, %eax
+; X86-AVX-NEXT:    sete %al
 ; X86-AVX-NEXT:    retl
 ;
 ; X64-AVX-LABEL: reduce_umax_v16i8_signbit:
 ; X64-AVX:       # %bb.0:
 ; X64-AVX-NEXT:    vmovdqa (%rsi), %xmm0
 ; X64-AVX-NEXT:    vpand (%rdi), %xmm0, %xmm0
-; X64-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX-NEXT:    vmovd %xmm0, %eax
-; X64-AVX-NEXT:    shrb $7, %al
-; X64-AVX-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX-NEXT:    vpmovmskb %xmm0, %eax
+; X64-AVX-NEXT:    testl %eax, %eax
+; X64-AVX-NEXT:    sete %al
 ; X64-AVX-NEXT:    retq
 ;
-; AVX512BW-LABEL: reduce_umax_v16i8_signbit:
-; AVX512BW:       # %bb.0:
-; AVX512BW-NEXT:    vmovdqa (%rsi), %xmm0
-; AVX512BW-NEXT:    vpand (%rdi), %xmm0, %xmm0
-; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
-; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
-; AVX512BW-NEXT:    vmovd %xmm0, %eax
-; AVX512BW-NEXT:    shrb $7, %al
-; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
-; AVX512BW-NEXT:    vzeroupper
-; AVX512BW-NEXT:    retq
-;
-; AVX512VL-LABEL: reduce_umax_v16i8_signbit:
-; AVX512VL:       # %bb.0:
-; AVX512VL-NEXT:    vmovdqa (%rsi), %xmm0
-; AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm1 = xmm1 ^ (xmm0 & mem)
-; AVX512VL-NEXT:    vpsrlw $8, %xmm1, %xmm0
-; AVX512VL-NEXT:    vpminub %xmm0, %xmm1, %xmm0
-; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
-; AVX512VL-NEXT:    vmovd %xmm0, %eax
-; AVX512VL-NEXT:    shrb $7, %al
-; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
-; AVX512VL-NEXT:    retq
+; AVX512-LABEL: reduce_umax_v16i8_signbit:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa (%rsi), %xmm0
+; AVX512-NEXT:    vpand (%rdi), %xmm0, %xmm0
+; AVX512-NEXT:    vpmovmskb %xmm0, %eax
+; AVX512-NEXT:    testl %eax, %eax
+; AVX512-NEXT:    sete %al
+; AVX512-NEXT:    retq
   %a = load <16 x i8>, ptr %pa
   %b = load <16 x i8>, ptr %pb
   %a.not = xor <16 x i8> %a, splat (i8 -1)
@@ -156,120 +74,69 @@ define i8 @reduce_umax_v16i8_signbit(ptr %pa, ptr %pb) {
 }
 
 define i16 @reduce_umax_v8i16_signbit_not(ptr %pa, ptr %pb) {
-; X86-SSE2-LABEL: reduce_umax_v8i16_signbit_not:
-; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE2-NEXT:    pandn (%eax), %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    psubusw %xmm0, %xmm1
-; X86-SSE2-NEXT:    paddw %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE2-NEXT:    psubusw %xmm1, %xmm0
-; X86-SSE2-NEXT:    paddw %xmm1, %xmm0
-; X86-SSE2-NEXT:    pextrw $1, %xmm0, %eax
-; X86-SSE2-NEXT:    movd %xmm0, %ecx
-; X86-SSE2-NEXT:    orl %eax, %ecx
-; X86-SSE2-NEXT:    notl %ecx
-; X86-SSE2-NEXT:    movzwl %cx, %eax
-; X86-SSE2-NEXT:    shrl $15, %eax
-; X86-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
-; X86-SSE2-NEXT:    retl
-;
-; X64-SSE2-LABEL: reduce_umax_v8i16_signbit_not:
-; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    psubusw %xmm0, %xmm1
-; X64-SSE2-NEXT:    paddw %xmm0, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE2-NEXT:    psubusw %xmm1, %xmm0
-; X64-SSE2-NEXT:    paddw %xmm1, %xmm0
-; X64-SSE2-NEXT:    pextrw $1, %xmm0, %eax
-; X64-SSE2-NEXT:    movd %xmm0, %ecx
-; X64-SSE2-NEXT:    orl %eax, %ecx
-; X64-SSE2-NEXT:    notl %ecx
-; X64-SSE2-NEXT:    movzwl %cx, %eax
-; X64-SSE2-NEXT:    shrl $15, %eax
-; X64-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
-; X64-SSE2-NEXT:    retq
-;
-; X86-SSE4-LABEL: reduce_umax_v8i16_signbit_not:
-; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE4-NEXT:    pandn (%eax), %xmm0
-; X86-SSE4-NEXT:    pxor %xmm1, %xmm0
-; X86-SSE4-NEXT:    phminposuw %xmm0, %xmm0
-; X86-SSE4-NEXT:    pextrw $0, %xmm0, %eax
-; X86-SSE4-NEXT:    shrl $15, %eax
-; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
-; X86-SSE4-NEXT:    retl
-;
-; X64-SSE4-LABEL: reduce_umax_v8i16_signbit_not:
-; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE4-NEXT:    pxor %xmm1, %xmm0
-; X64-SSE4-NEXT:    phminposuw %xmm0, %xmm0
-; X64-SSE4-NEXT:    pextrw $0, %xmm0, %eax
-; X64-SSE4-NEXT:    shrl $15, %eax
-; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
-; X64-SSE4-NEXT:    retq
+; X86-SSE-LABEL: reduce_umax_v8i16_signbit_not:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE-NEXT:    pandn (%eax), %xmm0
+; X86-SSE-NEXT:    packsswb %xmm0, %xmm0
+; X86-SSE-NEXT:    pmovmskb %xmm0, %ecx
+; X86-SSE-NEXT:    xorl %eax, %eax
+; X86-SSE-NEXT:    testl %ecx, %ecx
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v8i16_signbit_not:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE-NEXT:    packsswb %xmm0, %xmm0
+; X64-SSE-NEXT:    pmovmskb %xmm0, %ecx
+; X64-SSE-NEXT:    xorl %eax, %eax
+; X64-SSE-NEXT:    testl %ecx, %ecx
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE-NEXT:    retq
 ;
 ; X86-AVX-LABEL: reduce_umax_v8i16_signbit_not:
 ; X86-AVX:       # %bb.0:
 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; X86-AVX-NEXT:    vmovdqa (%ecx), %xmm0
-; X86-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
 ; X86-AVX-NEXT:    vpandn (%eax), %xmm0, %xmm0
-; X86-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX-NEXT:    vpextrw $0, %xmm0, %eax
-; X86-AVX-NEXT:    shrl $15, %eax
+; X86-AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
+; X86-AVX-NEXT:    vpmovmskb %xmm0, %ecx
+; X86-AVX-NEXT:    xorl %eax, %eax
+; X86-AVX-NEXT:    testl %ecx, %ecx
+; X86-AVX-NEXT:    sete %al
 ; X86-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-AVX-NEXT:    retl
 ;
 ; X64-AVX-LABEL: reduce_umax_v8i16_signbit_not:
 ; X64-AVX:       # %bb.0:
 ; X64-AVX-NEXT:    vmovdqa (%rdi), %xmm0
-; X64-AVX-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
 ; X64-AVX-NEXT:    vpandn (%rsi), %xmm0, %xmm0
-; X64-AVX-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX-NEXT:    vpextrw $0, %xmm0, %eax
-; X64-AVX-NEXT:    shrl $15, %eax
+; X64-AVX-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
+; X64-AVX-NEXT:    vpmovmskb %xmm0, %ecx
+; X64-AVX-NEXT:    xorl %eax, %eax
+; X64-AVX-NEXT:    testl %ecx, %ecx
+; X64-AVX-NEXT:    sete %al
 ; X64-AVX-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-AVX-NEXT:    retq
 ;
-; AVX512BW-LABEL: reduce_umax_v8i16_signbit_not:
-; AVX512BW:       # %bb.0:
-; AVX512BW-NEXT:    vmovdqa (%rdi), %xmm0
-; AVX512BW-NEXT:    vpandn (%rsi), %xmm0, %xmm0
-; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
-; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
-; AVX512BW-NEXT:    vpextrw $0, %xmm0, %eax
-; AVX512BW-NEXT:    shrl $15, %eax
-; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX512BW-NEXT:    vzeroupper
-; AVX512BW-NEXT:    retq
-;
-; AVX512VL-LABEL: reduce_umax_v8i16_signbit_not:
-; AVX512VL:       # %bb.0:
-; AVX512VL-NEXT:    vmovdqa (%rdi), %xmm0
-; AVX512VL-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm1 = xmm1 ^ (mem & ~xmm0)
-; AVX512VL-NEXT:    vphminposuw %xmm1, %xmm0
-; AVX512VL-NEXT:    vpextrw $0, %xmm0, %eax
-; AVX512VL-NEXT:    shrl $15, %eax
-; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX512VL-NEXT:    retq
+; AVX512-LABEL: reduce_umax_v8i16_signbit_not:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
+; AVX512-NEXT:    vpandn (%rsi), %xmm0, %xmm0
+; AVX512-NEXT:    vpacksswb %xmm0, %xmm0, %xmm0
+; AVX512-NEXT:    vpmovmskb %xmm0, %ecx
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    testl %ecx, %ecx
+; AVX512-NEXT:    sete %al
+; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512-NEXT:    retq
   %a = load <8 x i16>, ptr %pa
   %b = load <8 x i16>, ptr %pb
   %a.not = xor <8 x i16> %a, splat (i16 -1)
@@ -281,117 +148,52 @@ define i16 @reduce_umax_v8i16_signbit_not(ptr %pa, ptr %pb) {
 }
 
 define i32 @reduce_umax_v4i32_signbit(ptr %pa, ptr %pb) {
-; X86-SSE2-LABEL: reduce_umax_v4i32_signbit:
-; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE2-NEXT:    pand (%eax), %xmm0
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    orl %ecx, %eax
-; X86-SSE2-NEXT:    notl %eax
-; X86-SSE2-NEXT:    shrl $31, %eax
-; X86-SSE2-NEXT:    retl
-;
-; X64-SSE2-LABEL: reduce_umax_v4i32_signbit:
-; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa (%rsi), %xmm0
-; X64-SSE2-NEXT:    pand (%rdi), %xmm0
-; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X64-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
-; X64-SSE2-NEXT:    pand %xmm2, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm3, %xmm2
-; X64-SSE2-NEXT:    por %xmm0, %xmm2
-; X64-SSE2-NEXT:    movd %xmm2, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    orl %ecx, %eax
-; X64-SSE2-NEXT:    notl %eax
-; X64-SSE2-NEXT:    shrl $31, %eax
-; X64-SSE2-NEXT:    retq
-;
-; X86-SSE4-LABEL: reduce_umax_v4i32_signbit:
-; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE4-NEXT:    pand (%eax), %xmm0
-; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE4-NEXT:    pmaxud %xmm0, %xmm1
-; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE4-NEXT:    por %xmm1, %xmm0
-; X86-SSE4-NEXT:    movd %xmm0, %eax
-; X86-SSE4-NEXT:    notl %eax
-; X86-SSE4-NEXT:    shrl $31, %eax
-; X86-SSE4-NEXT:    retl
-;
-; X64-SSE4-LABEL: reduce_umax_v4i32_signbit:
-; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    movdqa (%rsi), %xmm0
-; X64-SSE4-NEXT:    pand (%rdi), %xmm0
-; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-SSE4-NEXT:    pmaxud %xmm0, %xmm1
-; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE4-NEXT:    por %xmm1, %xmm0
-; X64-SSE4-NEXT:    movd %xmm0, %eax
-; X64-SSE4-NEXT:    notl %eax
-; X64-SSE4-NEXT:    shrl $31, %eax
-; X64-SSE4-NEXT:    retq
+; X86-SSE-LABEL: reduce_umax_v4i32_signbit:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movaps (%ecx), %xmm0
+; X86-SSE-NEXT:    andps (%eax), %xmm0
+; X86-SSE-NEXT:    movmskps %xmm0, %ecx
+; X86-SSE-NEXT:    xorl %eax, %eax
+; X86-SSE-NEXT:    testl %ecx, %ecx
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v4i32_signbit:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movaps (%rsi), %xmm0
+; X64-SSE-NEXT:    andps (%rdi), %xmm0
+; X64-SSE-NEXT:    movmskps %xmm0, %ecx
+; X64-SSE-NEXT:    xorl %eax, %eax
+; X64-SSE-NEXT:    testl %ecx, %ecx
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
 ;
 ; X86-AVX-LABEL: reduce_umax_v4i32_signbit:
 ; X86-AVX:       # %bb.0:
-; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-AVX-NEXT:    vmovdqa (%ecx), %xmm0
-; X86-AVX-NEXT:    vpand (%eax), %xmm0, %xmm0
-; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X86-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; X86-AVX-NEXT:    vmovd %xmm0, %eax
-; X86-AVX-NEXT:    notl %eax
-; X86-AVX-NEXT:    shrl $31, %eax
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    vmovaps (%eax), %xmm0
+; X86-AVX-NEXT:    xorl %eax, %eax
+; X86-AVX-NEXT:    vtestps (%ecx), %xmm0
+; X86-AVX-NEXT:    sete %al
 ; X86-AVX-NEXT:    retl
 ;
 ; X64-AVX-LABEL: reduce_umax_v4i32_signbit:
 ; X64-AVX:       # %bb.0:
-; X64-AVX-NEXT:    vmovdqa (%rsi), %xmm0
-; X64-AVX-NEXT:    vpand (%rdi), %xmm0, %xmm0
-; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-AVX-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X64-AVX-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; X64-AVX-NEXT:    vmovd %xmm0, %eax
-; X64-AVX-NEXT:    notl %eax
-; X64-AVX-NEXT:    shrl $31, %eax
+; X64-AVX-NEXT:    vmovaps (%rdi), %xmm0
+; X64-AVX-NEXT:    xorl %eax, %eax
+; X64-AVX-NEXT:    vtestps (%rsi), %xmm0
+; X64-AVX-NEXT:    sete %al
 ; X64-AVX-NEXT:    retq
 ;
 ; AVX512-LABEL: reduce_umax_v4i32_signbit:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vmovdqa (%rsi), %xmm0
-; AVX512-NEXT:    vpand (%rdi), %xmm0, %xmm0
-; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; AVX512-NEXT:    vmovd %xmm0, %eax
-; AVX512-NEXT:    notl %eax
-; AVX512-NEXT:    shrl $31, %eax
+; AVX512-NEXT:    vmovaps (%rdi), %xmm0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    vtestps (%rsi), %xmm0
+; AVX512-NEXT:    sete %al
 ; AVX512-NEXT:    retq
   %a = load <4 x i32>, ptr %pa
   %b = load <4 x i32>, ptr %pb
@@ -404,92 +206,54 @@ define i32 @reduce_umax_v4i32_signbit(ptr %pa, ptr %pb) {
 }
 
 define i64 @reduce_umax_v2i64_signbit_not(ptr %pa, ptr %pb) {
-; X86-SSE2-LABEL: reduce_umax_v2i64_signbit_not:
-; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE2-NEXT:    pandn (%eax), %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    notl %eax
-; X86-SSE2-NEXT:    shrl $31, %eax
-; X86-SSE2-NEXT:    xorl %edx, %edx
-; X86-SSE2-NEXT:    retl
-;
-; X64-SSE2-LABEL: reduce_umax_v2i64_signbit_not:
-; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE2-NEXT:    movq %xmm0, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    orq %rcx, %rax
-; X64-SSE2-NEXT:    notq %rax
-; X64-SSE2-NEXT:    shrq $63, %rax
-; X64-SSE2-NEXT:    retq
-;
-; X86-SSE4-LABEL: reduce_umax_v2i64_signbit_not:
-; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE4-NEXT:    pandn (%eax), %xmm0
-; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE4-NEXT:    por %xmm0, %xmm1
-; X86-SSE4-NEXT:    pextrd $1, %xmm1, %eax
-; X86-SSE4-NEXT:    notl %eax
-; X86-SSE4-NEXT:    shrl $31, %eax
-; X86-SSE4-NEXT:    xorl %edx, %edx
-; X86-SSE4-NEXT:    retl
-;
-; X64-SSE4-LABEL: reduce_umax_v2i64_signbit_not:
-; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE4-NEXT:    pextrq $1, %xmm0, %rcx
-; X64-SSE4-NEXT:    movq %xmm0, %rax
-; X64-SSE4-NEXT:    orq %rcx, %rax
-; X64-SSE4-NEXT:    notq %rax
-; X64-SSE4-NEXT:    shrq $63, %rax
-; X64-SSE4-NEXT:    retq
+; X86-SSE-LABEL: reduce_umax_v2i64_signbit_not:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movapd (%ecx), %xmm0
+; X86-SSE-NEXT:    andnpd (%eax), %xmm0
+; X86-SSE-NEXT:    movmskpd %xmm0, %ecx
+; X86-SSE-NEXT:    xorl %eax, %eax
+; X86-SSE-NEXT:    testl %ecx, %ecx
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    xorl %edx, %edx
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v2i64_signbit_not:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movapd (%rdi), %xmm0
+; X64-SSE-NEXT:    andnpd (%rsi), %xmm0
+; X64-SSE-NEXT:    movmskpd %xmm0, %ecx
+; X64-SSE-NEXT:    xorl %eax, %eax
+; X64-SSE-NEXT:    testl %ecx, %ecx
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
 ;
 ; X86-AVX-LABEL: reduce_umax_v2i64_signbit_not:
 ; X86-AVX:       # %bb.0:
-; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
 ; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-AVX-NEXT:    vmovaps (%ecx), %xmm0
-; X86-AVX-NEXT:    vandnps (%eax), %xmm0, %xmm0
-; X86-AVX-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX-NEXT:    vorps %xmm0, %xmm1, %xmm0
-; X86-AVX-NEXT:    vextractps $1, %xmm0, %eax
-; X86-AVX-NEXT:    notl %eax
-; X86-AVX-NEXT:    shrl $31, %eax
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    vmovapd (%eax), %xmm0
+; X86-AVX-NEXT:    xorl %eax, %eax
+; X86-AVX-NEXT:    vtestpd (%ecx), %xmm0
+; X86-AVX-NEXT:    setb %al
 ; X86-AVX-NEXT:    xorl %edx, %edx
 ; X86-AVX-NEXT:    retl
 ;
 ; X64-AVX-LABEL: reduce_umax_v2i64_signbit_not:
 ; X64-AVX:       # %bb.0:
-; X64-AVX-NEXT:    vmovdqa (%rdi), %xmm0
-; X64-AVX-NEXT:    vpandn (%rsi), %xmm0, %xmm0
-; X64-AVX-NEXT:    vpextrq $1, %xmm0, %rcx
-; X64-AVX-NEXT:    vmovq %xmm0, %rax
-; X64-AVX-NEXT:    orq %rcx, %rax
-; X64-AVX-NEXT:    notq %rax
-; X64-AVX-NEXT:    shrq $63, %rax
+; X64-AVX-NEXT:    vmovapd (%rdi), %xmm0
+; X64-AVX-NEXT:    xorl %eax, %eax
+; X64-AVX-NEXT:    vtestpd (%rsi), %xmm0
+; X64-AVX-NEXT:    setb %al
 ; X64-AVX-NEXT:    retq
 ;
 ; AVX512-LABEL: reduce_umax_v2i64_signbit_not:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vmovdqa (%rdi), %xmm0
-; AVX512-NEXT:    vpandn (%rsi), %xmm0, %xmm0
-; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; AVX512-NEXT:    vmovq %xmm0, %rax
-; AVX512-NEXT:    notq %rax
-; AVX512-NEXT:    shrq $63, %rax
+; AVX512-NEXT:    vmovapd (%rdi), %xmm0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    vtestpd (%rsi), %xmm0
+; AVX512-NEXT:    setb %al
 ; AVX512-NEXT:    retq
   %a = load <2 x i64>, ptr %pa
   %b = load <2 x i64>, ptr %pb
@@ -502,91 +266,31 @@ define i64 @reduce_umax_v2i64_signbit_not(ptr %pa, ptr %pb) {
 }
 
 define i8 @reduce_umax_v32i8_signbit_not(ptr %pa, ptr %pb) {
-; X86-SSE2-LABEL: reduce_umax_v32i8_signbit_not:
-; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE2-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm1
-; X86-SSE2-NEXT:    pandn 16(%eax), %xmm1
-; X86-SSE2-NEXT:    pandn (%eax), %xmm0
-; X86-SSE2-NEXT:    pmaxub %xmm1, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE2-NEXT:    pmaxub %xmm1, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE2-NEXT:    psrld $16, %xmm1
-; X86-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X86-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X86-SSE2-NEXT:    psrlw $8, %xmm0
-; X86-SSE2-NEXT:    por %xmm1, %xmm0
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    notb %al
-; X86-SSE2-NEXT:    shrb $7, %al
-; X86-SSE2-NEXT:    # kill: def $al killed $al killed $eax
-; X86-SSE2-NEXT:    retl
-;
-; X64-SSE2-LABEL: reduce_umax_v32i8_signbit_not:
-; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE2-NEXT:    movdqa 16(%rdi), %xmm1
-; X64-SSE2-NEXT:    pandn 16(%rsi), %xmm1
-; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE2-NEXT:    pmaxub %xmm1, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE2-NEXT:    pmaxub %xmm1, %xmm0
-; X64-SSE2-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE2-NEXT:    psrld $16, %xmm1
-; X64-SSE2-NEXT:    pmaxub %xmm0, %xmm1
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm0
-; X64-SSE2-NEXT:    psrlw $8, %xmm0
-; X64-SSE2-NEXT:    por %xmm1, %xmm0
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    notb %al
-; X64-SSE2-NEXT:    shrb $7, %al
-; X64-SSE2-NEXT:    # kill: def $al killed $al killed $eax
-; X64-SSE2-NEXT:    retq
-;
-; X86-SSE4-LABEL: reduce_umax_v32i8_signbit_not:
-; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE4-NEXT:    movdqa 16(%ecx), %xmm1
-; X86-SSE4-NEXT:    pcmpeqd %xmm2, %xmm2
-; X86-SSE4-NEXT:    pandn 16(%eax), %xmm1
-; X86-SSE4-NEXT:    pandn (%eax), %xmm0
-; X86-SSE4-NEXT:    pmaxub %xmm1, %xmm0
-; X86-SSE4-NEXT:    pxor %xmm2, %xmm0
-; X86-SSE4-NEXT:    movdqa %xmm0, %xmm1
-; X86-SSE4-NEXT:    psrlw $8, %xmm1
-; X86-SSE4-NEXT:    pminub %xmm0, %xmm1
-; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
-; X86-SSE4-NEXT:    movd %xmm0, %eax
-; X86-SSE4-NEXT:    shrb $7, %al
-; X86-SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; X86-SSE4-NEXT:    retl
-;
-; X64-SSE4-LABEL: reduce_umax_v32i8_signbit_not:
-; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE4-NEXT:    movdqa 16(%rdi), %xmm1
-; X64-SSE4-NEXT:    pcmpeqd %xmm2, %xmm2
-; X64-SSE4-NEXT:    pandn 16(%rsi), %xmm1
-; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE4-NEXT:    pmaxub %xmm1, %xmm0
-; X64-SSE4-NEXT:    pxor %xmm2, %xmm0
-; X64-SSE4-NEXT:    movdqa %xmm0, %xmm1
-; X64-SSE4-NEXT:    psrlw $8, %xmm1
-; X64-SSE4-NEXT:    pminub %xmm0, %xmm1
-; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
-; X64-SSE4-NEXT:    movd %xmm0, %eax
-; X64-SSE4-NEXT:    shrb $7, %al
-; X64-SSE4-NEXT:    # kill: def $al killed $al killed $eax
-; X64-SSE4-NEXT:    retq
+; X86-SSE-LABEL: reduce_umax_v32i8_signbit_not:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movdqa (%ecx), %xmm0
+; X86-SSE-NEXT:    movdqa 16(%ecx), %xmm1
+; X86-SSE-NEXT:    pandn 16(%eax), %xmm1
+; X86-SSE-NEXT:    pandn (%eax), %xmm0
+; X86-SSE-NEXT:    por %xmm1, %xmm0
+; X86-SSE-NEXT:    pmovmskb %xmm0, %eax
+; X86-SSE-NEXT:    testl %eax, %eax
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v32i8_signbit_not:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE-NEXT:    movdqa 16(%rdi), %xmm1
+; X64-SSE-NEXT:    pandn 16(%rsi), %xmm1
+; X64-SSE-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE-NEXT:    por %xmm1, %xmm0
+; X64-SSE-NEXT:    pmovmskb %xmm0, %eax
+; X64-SSE-NEXT:    testl %eax, %eax
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
 ;
 ; X86-AVX1-LABEL: reduce_umax_v32i8_signbit_not:
 ; X86-AVX1:       # %bb.0:
@@ -595,15 +299,10 @@ define i8 @reduce_umax_v32i8_signbit_not(ptr %pa, ptr %pb) {
 ; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
 ; X86-AVX1-NEXT:    vandnps (%eax), %ymm0, %ymm0
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    shrb $7, %al
-; X86-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT:    testl %eax, %eax
+; X86-AVX1-NEXT:    sete %al
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
 ;
@@ -612,15 +311,10 @@ define i8 @reduce_umax_v32i8_signbit_not(ptr %pa, ptr %pb) {
 ; X64-AVX1-NEXT:    vmovaps (%rdi), %ymm0
 ; X64-AVX1-NEXT:    vandnps (%rsi), %ymm0, %ymm0
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X64-AVX1-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX1-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    shrb $7, %al
-; X64-AVX1-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT:    testl %eax, %eax
+; X64-AVX1-NEXT:    sete %al
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
 ;
@@ -630,16 +324,9 @@ define i8 @reduce_umax_v32i8_signbit_not(ptr %pa, ptr %pb) {
 ; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
 ; X86-AVX2-NEXT:    vpandn (%eax), %ymm0, %ymm0
-; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X86-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    shrb $7, %al
-; X86-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT:    vpmovmskb %ymm0, %eax
+; X86-AVX2-NEXT:    testl %eax, %eax
+; X86-AVX2-NEXT:    sete %al
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
 ;
@@ -647,50 +334,21 @@ define i8 @reduce_umax_v32i8_signbit_not(ptr %pa, ptr %pb) {
 ; X64-AVX2:       # %bb.0:
 ; X64-AVX2-NEXT:    vmovdqa (%rdi), %ymm0
 ; X64-AVX2-NEXT:    vpandn (%rsi), %ymm0, %ymm0
-; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X64-AVX2-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; X64-AVX2-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    shrb $7, %al
-; X64-AVX2-NEXT:    # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT:    vpmovmskb %ymm0, %eax
+; X64-AVX2-NEXT:    testl %eax, %eax
+; X64-AVX2-NEXT:    sete %al
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
 ;
-; AVX512BW-LABEL: reduce_umax_v32i8_signbit_not:
-; AVX512BW:       # %bb.0:
-; AVX512BW-NEXT:    vmovdqa (%rdi), %ymm0
-; AVX512BW-NEXT:    vpandn (%rsi), %ymm0, %ymm0
-; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
-; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
-; AVX512BW-NEXT:    vmovd %xmm0, %eax
-; AVX512BW-NEXT:    shrb $7, %al
-; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
-; AVX512BW-NEXT:    vzeroupper
-; AVX512BW-NEXT:    retq
-;
-; AVX512VL-LABEL: reduce_umax_v32i8_signbit_not:
-; AVX512VL:       # %bb.0:
-; AVX512VL-NEXT:    vmovdqa (%rdi), %ymm0
-; AVX512VL-NEXT:    vpandn (%rsi), %ymm0, %ymm0
-; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX512VL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
-; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; AVX512VL-NEXT:    vpsrlw $8, %xmm0, %xmm1
-; AVX512VL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
-; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
-; AVX512VL-NEXT:    vmovd %xmm0, %eax
-; AVX512VL-NEXT:    shrb $7, %al
-; AVX512VL-NEXT:    # kill: def $al killed $al killed $eax
-; AVX512VL-NEXT:    vzeroupper
-; AVX512VL-NEXT:    retq
+; AVX512-LABEL: reduce_umax_v32i8_signbit_not:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
+; AVX512-NEXT:    vpandn (%rsi), %ymm0, %ymm0
+; AVX512-NEXT:    vpmovmskb %ymm0, %eax
+; AVX512-NEXT:    testl %eax, %eax
+; AVX512-NEXT:    sete %al
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
   %a = load <32 x i8>, ptr %pa
   %b = load <32 x i8>, ptr %pb
   %a.not = xor <32 x i8> %a, splat (i8 -1)
@@ -712,18 +370,11 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X86-SSE2-NEXT:    pand 16(%eax), %xmm1
 ; X86-SSE2-NEXT:    psubusw %xmm0, %xmm1
 ; X86-SSE2-NEXT:    paddw %xmm0, %xmm1
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE2-NEXT:    psubusw %xmm1, %xmm0
-; X86-SSE2-NEXT:    paddw %xmm1, %xmm0
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X86-SSE2-NEXT:    psubusw %xmm0, %xmm1
-; X86-SSE2-NEXT:    paddw %xmm0, %xmm1
-; X86-SSE2-NEXT:    pextrw $1, %xmm1, %eax
-; X86-SSE2-NEXT:    movd %xmm1, %ecx
-; X86-SSE2-NEXT:    orl %eax, %ecx
-; X86-SSE2-NEXT:    notl %ecx
-; X86-SSE2-NEXT:    movzwl %cx, %eax
-; X86-SSE2-NEXT:    shrl $15, %eax
+; X86-SSE2-NEXT:    packsswb %xmm1, %xmm1
+; X86-SSE2-NEXT:    pmovmskb %xmm1, %ecx
+; X86-SSE2-NEXT:    xorl %eax, %eax
+; X86-SSE2-NEXT:    testl %ecx, %ecx
+; X86-SSE2-NEXT:    sete %al
 ; X86-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-SSE2-NEXT:    retl
 ;
@@ -735,18 +386,11 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X64-SSE2-NEXT:    pand 16(%rdi), %xmm1
 ; X64-SSE2-NEXT:    psubusw %xmm0, %xmm1
 ; X64-SSE2-NEXT:    paddw %xmm0, %xmm1
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X64-SSE2-NEXT:    psubusw %xmm1, %xmm0
-; X64-SSE2-NEXT:    paddw %xmm1, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X64-SSE2-NEXT:    psubusw %xmm0, %xmm1
-; X64-SSE2-NEXT:    paddw %xmm0, %xmm1
-; X64-SSE2-NEXT:    pextrw $1, %xmm1, %eax
-; X64-SSE2-NEXT:    movd %xmm1, %ecx
-; X64-SSE2-NEXT:    orl %eax, %ecx
-; X64-SSE2-NEXT:    notl %ecx
-; X64-SSE2-NEXT:    movzwl %cx, %eax
-; X64-SSE2-NEXT:    shrl $15, %eax
+; X64-SSE2-NEXT:    packsswb %xmm1, %xmm1
+; X64-SSE2-NEXT:    pmovmskb %xmm1, %ecx
+; X64-SSE2-NEXT:    xorl %eax, %eax
+; X64-SSE2-NEXT:    testl %ecx, %ecx
+; X64-SSE2-NEXT:    sete %al
 ; X64-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-SSE2-NEXT:    retq
 ;
@@ -759,11 +403,11 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X86-SSE4-NEXT:    pand 16(%eax), %xmm1
 ; X86-SSE4-NEXT:    pand (%eax), %xmm0
 ; X86-SSE4-NEXT:    pmaxuw %xmm1, %xmm0
-; X86-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
-; X86-SSE4-NEXT:    pxor %xmm0, %xmm1
-; X86-SSE4-NEXT:    phminposuw %xmm1, %xmm0
-; X86-SSE4-NEXT:    pextrw $0, %xmm0, %eax
-; X86-SSE4-NEXT:    shrl $15, %eax
+; X86-SSE4-NEXT:    packsswb %xmm0, %xmm0
+; X86-SSE4-NEXT:    pmovmskb %xmm0, %ecx
+; X86-SSE4-NEXT:    xorl %eax, %eax
+; X86-SSE4-NEXT:    testl %ecx, %ecx
+; X86-SSE4-NEXT:    sete %al
 ; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-SSE4-NEXT:    retl
 ;
@@ -774,11 +418,11 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X64-SSE4-NEXT:    pand 16(%rdi), %xmm1
 ; X64-SSE4-NEXT:    pand (%rdi), %xmm0
 ; X64-SSE4-NEXT:    pmaxuw %xmm1, %xmm0
-; X64-SSE4-NEXT:    pcmpeqd %xmm1, %xmm1
-; X64-SSE4-NEXT:    pxor %xmm0, %xmm1
-; X64-SSE4-NEXT:    phminposuw %xmm1, %xmm0
-; X64-SSE4-NEXT:    pextrw $0, %xmm0, %eax
-; X64-SSE4-NEXT:    shrl $15, %eax
+; X64-SSE4-NEXT:    packsswb %xmm0, %xmm0
+; X64-SSE4-NEXT:    pmovmskb %xmm0, %ecx
+; X64-SSE4-NEXT:    xorl %eax, %eax
+; X64-SSE4-NEXT:    testl %ecx, %ecx
+; X64-SSE4-NEXT:    sete %al
 ; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-SSE4-NEXT:    retq
 ;
@@ -789,12 +433,11 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
 ; X86-AVX1-NEXT:    vandps (%eax), %ymm0, %ymm0
 ; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpextrw $0, %xmm0, %eax
-; X86-AVX1-NEXT:    shrl $15, %eax
+; X86-AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmovmskb %xmm0, %ecx
+; X86-AVX1-NEXT:    xorl %eax, %eax
+; X86-AVX1-NEXT:    testl %ecx, %ecx
+; X86-AVX1-NEXT:    sete %al
 ; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-AVX1-NEXT:    vzeroupper
 ; X86-AVX1-NEXT:    retl
@@ -804,12 +447,11 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X64-AVX1-NEXT:    vmovaps (%rsi), %ymm0
 ; X64-AVX1-NEXT:    vandps (%rdi), %ymm0, %ymm0
 ; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X64-AVX1-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX1-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpextrw $0, %xmm0, %eax
-; X64-AVX1-NEXT:    shrl $15, %eax
+; X64-AVX1-NEXT:    vpacksswb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmovmskb %xmm0, %ecx
+; X64-AVX1-NEXT:    xorl %eax, %eax
+; X64-AVX1-NEXT:    testl %ecx, %ecx
+; X64-AVX1-NEXT:    sete %al
 ; X64-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-AVX1-NEXT:    vzeroupper
 ; X64-AVX1-NEXT:    retq
@@ -820,13 +462,10 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
 ; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
 ; X86-AVX2-NEXT:    vpand (%eax), %ymm0, %ymm0
-; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X86-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpextrw $0, %xmm0, %eax
-; X86-AVX2-NEXT:    shrl $15, %eax
+; X86-AVX2-NEXT:    vpmovmskb %ymm0, %ecx
+; X86-AVX2-NEXT:    xorl %eax, %eax
+; X86-AVX2-NEXT:    testl $-1431655766, %ecx # imm = 0xAAAAAAAA
+; X86-AVX2-NEXT:    sete %al
 ; X86-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X86-AVX2-NEXT:    vzeroupper
 ; X86-AVX2-NEXT:    retl
@@ -835,44 +474,25 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; X64-AVX2:       # %bb.0:
 ; X64-AVX2-NEXT:    vmovdqa (%rsi), %ymm0
 ; X64-AVX2-NEXT:    vpand (%rdi), %ymm0, %ymm0
-; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X64-AVX2-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpcmpeqd %xmm1, %xmm1, %xmm1
-; X64-AVX2-NEXT:    vpxor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vphminposuw %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpextrw $0, %xmm0, %eax
-; X64-AVX2-NEXT:    shrl $15, %eax
+; X64-AVX2-NEXT:    vpmovmskb %ymm0, %ecx
+; X64-AVX2-NEXT:    xorl %eax, %eax
+; X64-AVX2-NEXT:    testl $-1431655766, %ecx # imm = 0xAAAAAAAA
+; X64-AVX2-NEXT:    sete %al
 ; X64-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
 ; X64-AVX2-NEXT:    vzeroupper
 ; X64-AVX2-NEXT:    retq
 ;
-; AVX512BW-LABEL: reduce_umax_v16i16_signbit:
-; AVX512BW:       # %bb.0:
-; AVX512BW-NEXT:    vmovdqa (%rsi), %ymm0
-; AVX512BW-NEXT:    vpand (%rdi), %ymm0, %ymm0
-; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
-; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
-; AVX512BW-NEXT:    vpextrw $0, %xmm0, %eax
-; AVX512BW-NEXT:    shrl $15, %eax
-; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX512BW-NEXT:    vzeroupper
-; AVX512BW-NEXT:    retq
-;
-; AVX512VL-LABEL: reduce_umax_v16i16_signbit:
-; AVX512VL:       # %bb.0:
-; AVX512VL-NEXT:    vmovdqa (%rsi), %ymm0
-; AVX512VL-NEXT:    vpand (%rdi), %ymm0, %ymm0
-; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX512VL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
-; AVX512VL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
-; AVX512VL-NEXT:    vphminposuw %xmm0, %xmm0
-; AVX512VL-NEXT:    vpextrw $0, %xmm0, %eax
-; AVX512VL-NEXT:    shrl $15, %eax
-; AVX512VL-NEXT:    # kill: def $ax killed $ax killed $eax
-; AVX512VL-NEXT:    vzeroupper
-; AVX512VL-NEXT:    retq
+; AVX512-LABEL: reduce_umax_v16i16_signbit:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa (%rsi), %ymm0
+; AVX512-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; AVX512-NEXT:    vpmovmskb %ymm0, %ecx
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    testl $-1431655766, %ecx # imm = 0xAAAAAAAA
+; AVX512-NEXT:    sete %al
+; AVX512-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
   %a = load <16 x i16>, ptr %pa
   %b = load <16 x i16>, ptr %pb
   %a.not = xor <16 x i16> %a, splat (i16 -1)
@@ -884,185 +504,60 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 }
 
 define i32 @reduce_umax_v8i32_signbit_not(ptr %pa, ptr %pb) {
-; X86-SSE2-LABEL: reduce_umax_v8i32_signbit_not:
-; X86-SSE2:       # %bb.0:
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE2-NEXT:    movdqa (%ecx), %xmm2
-; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm3
-; X86-SSE2-NEXT:    pandn (%eax), %xmm2
-; X86-SSE2-NEXT:    pandn 16(%eax), %xmm3
-; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm1 = [2147483648,2147483648,2147483648,2147483648]
-; X86-SSE2-NEXT:    movdqa %xmm3, %xmm4
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm4
-; X86-SSE2-NEXT:    movdqa %xmm2, %xmm0
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm0
-; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm0
-; X86-SSE2-NEXT:    pand %xmm0, %xmm2
-; X86-SSE2-NEXT:    pandn %xmm3, %xmm0
-; X86-SSE2-NEXT:    por %xmm2, %xmm0
-; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2
-; X86-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[2,3,2,3]
-; X86-SSE2-NEXT:    pxor %xmm3, %xmm1
-; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm2
-; X86-SSE2-NEXT:    pand %xmm2, %xmm0
-; X86-SSE2-NEXT:    pandn %xmm3, %xmm2
-; X86-SSE2-NEXT:    por %xmm0, %xmm2
-; X86-SSE2-NEXT:    movd %xmm2, %ecx
-; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1]
-; X86-SSE2-NEXT:    movd %xmm0, %eax
-; X86-SSE2-NEXT:    orl %ecx, %eax
-; X86-SSE2-NEXT:    notl %eax
-; X86-SSE2-NEXT:    shrl $31, %eax
-; X86-SSE2-NEXT:    retl
-;
-; X64-SSE2-LABEL: reduce_umax_v8i32_signbit_not:
-; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE2-NEXT:    movdqa 16(%rdi), %xmm1
-; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE2-NEXT:    pandn 16(%rsi), %xmm1
-; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648]
-; 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:    pcmpgtd %xmm3, %xmm4
-; X64-SSE2-NEXT:    pand %xmm4, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm4
-; X64-SSE2-NEXT:    por %xmm0, %xmm4
-; X64-SSE2-NEXT:    movdqa %xmm4, %xmm0
-; X64-SSE2-NEXT:    pxor %xmm2, %xmm0
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm4[2,3,2,3]
-; X64-SSE2-NEXT:    pxor %xmm1, %xmm2
-; X64-SSE2-NEXT:    pcmpgtd %xmm2, %xmm0
-; X64-SSE2-NEXT:    pand %xmm0, %xmm4
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm0
-; X64-SSE2-NEXT:    por %xmm4, %xmm0
-; X64-SSE2-NEXT:    movd %xmm0, %ecx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X64-SSE2-NEXT:    movd %xmm0, %eax
-; X64-SSE2-NEXT:    orl %ecx, %eax
-; X64-SSE2-NEXT:    notl %eax
-; X64-SSE2-NEXT:    shrl $31, %eax
-; X64-SSE2-NEXT:    retq
-;
-; X86-SSE4-LABEL: reduce_umax_v8i32_signbit_not:
-; X86-SSE4:       # %bb.0:
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-SSE4-NEXT:    movdqa (%ecx), %xmm0
-; X86-SSE4-NEXT:    movdqa 16(%ecx), %xmm1
-; X86-SSE4-NEXT:    pandn 16(%eax), %xmm1
-; X86-SSE4-NEXT:    pandn (%eax), %xmm0
-; X86-SSE4-NEXT:    pmaxud %xmm1, %xmm0
-; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE4-NEXT:    pmaxud %xmm0, %xmm1
-; X86-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE4-NEXT:    por %xmm1, %xmm0
-; X86-SSE4-NEXT:    movd %xmm0, %eax
-; X86-SSE4-NEXT:    notl %eax
-; X86-SSE4-NEXT:    shrl $31, %eax
-; X86-SSE4-NEXT:    retl
-;
-; X64-SSE4-LABEL: reduce_umax_v8i32_signbit_not:
-; X64-SSE4:       # %bb.0:
-; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
-; X64-SSE4-NEXT:    movdqa 16(%rdi), %xmm1
-; X64-SSE4-NEXT:    pandn 16(%rsi), %xmm1
-; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
-; X64-SSE4-NEXT:    pmaxud %xmm1, %xmm0
-; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-SSE4-NEXT:    pmaxud %xmm0, %xmm1
-; X64-SSE4-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X64-SSE4-NEXT:    por %xmm1, %xmm0
-; X64-SSE4-NEXT:    movd %xmm0, %eax
-; X64-SSE4-NEXT:    notl %eax
-; X64-SSE4-NEXT:    shrl $31, %eax
-; X64-SSE4-NEXT:    retq
-;
-; X86-AVX1-LABEL: reduce_umax_v8i32_signbit_not:
-; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
-; X86-AVX1-NEXT:    vandnps (%eax), %ymm0, %ymm0
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X86-AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; X86-AVX1-NEXT:    vmovd %xmm0, %eax
-; X86-AVX1-NEXT:    notl %eax
-; X86-AVX1-NEXT:    shrl $31, %eax
-; X86-AVX1-NEXT:    vzeroupper
-; X86-AVX1-NEXT:    retl
-;
-; X64-AVX1-LABEL: reduce_umax_v8i32_signbit_not:
-; X64-AVX1:       # %bb.0:
-; X64-AVX1-NEXT:    vmovaps (%rdi), %ymm0
-; X64-AVX1-NEXT:    vandnps (%rsi), %ymm0, %ymm0
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X64-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-AVX1-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X64-AVX1-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; X64-AVX1-NEXT:    vmovd %xmm0, %eax
-; X64-AVX1-NEXT:    notl %eax
-; X64-AVX1-NEXT:    shrl $31, %eax
-; X64-AVX1-NEXT:    vzeroupper
-; X64-AVX1-NEXT:    retq
-;
-; X86-AVX2-LABEL: reduce_umax_v8i32_signbit_not:
-; X86-AVX2:       # %bb.0:
-; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
-; X86-AVX2-NEXT:    vpandn (%eax), %ymm0, %ymm0
-; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X86-AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; X86-AVX2-NEXT:    vmovd %xmm0, %eax
-; X86-AVX2-NEXT:    notl %eax
-; X86-AVX2-NEXT:    shrl $31, %eax
-; X86-AVX2-NEXT:    vzeroupper
-; X86-AVX2-NEXT:    retl
+; X86-SSE-LABEL: reduce_umax_v8i32_signbit_not:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movaps (%ecx), %xmm0
+; X86-SSE-NEXT:    movaps 16(%ecx), %xmm1
+; X86-SSE-NEXT:    andnps 16(%eax), %xmm1
+; X86-SSE-NEXT:    andnps (%eax), %xmm0
+; X86-SSE-NEXT:    orps %xmm1, %xmm0
+; X86-SSE-NEXT:    movmskps %xmm0, %ecx
+; X86-SSE-NEXT:    xorl %eax, %eax
+; X86-SSE-NEXT:    testl %ecx, %ecx
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v8i32_signbit_not:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movaps (%rdi), %xmm0
+; X64-SSE-NEXT:    movaps 16(%rdi), %xmm1
+; X64-SSE-NEXT:    andnps 16(%rsi), %xmm1
+; X64-SSE-NEXT:    andnps (%rsi), %xmm0
+; X64-SSE-NEXT:    orps %xmm1, %xmm0
+; X64-SSE-NEXT:    movmskps %xmm0, %ecx
+; X64-SSE-NEXT:    xorl %eax, %eax
+; X64-SSE-NEXT:    testl %ecx, %ecx
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
+;
+; X86-AVX-LABEL: reduce_umax_v8i32_signbit_not:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    vmovaps (%eax), %ymm0
+; X86-AVX-NEXT:    xorl %eax, %eax
+; X86-AVX-NEXT:    vtestps (%ecx), %ymm0
+; X86-AVX-NEXT:    setb %al
+; X86-AVX-NEXT:    vzeroupper
+; X86-AVX-NEXT:    retl
 ;
-; X64-AVX2-LABEL: reduce_umax_v8i32_signbit_not:
-; X64-AVX2:       # %bb.0:
-; X64-AVX2-NEXT:    vmovdqa (%rdi), %ymm0
-; X64-AVX2-NEXT:    vpandn (%rsi), %ymm0, %ymm0
-; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X64-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X64-AVX2-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; X64-AVX2-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; X64-AVX2-NEXT:    vmovd %xmm0, %eax
-; X64-AVX2-NEXT:    notl %eax
-; X64-AVX2-NEXT:    shrl $31, %eax
-; X64-AVX2-NEXT:    vzeroupper
-; X64-AVX2-NEXT:    retq
+; X64-AVX-LABEL: reduce_umax_v8i32_signbit_not:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovaps (%rdi), %ymm0
+; X64-AVX-NEXT:    xorl %eax, %eax
+; X64-AVX-NEXT:    vtestps (%rsi), %ymm0
+; X64-AVX-NEXT:    setb %al
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
 ;
 ; AVX512-LABEL: reduce_umax_v8i32_signbit_not:
 ; AVX512:       # %bb.0:
-; AVX512-NEXT:    vmovdqa (%rdi), %ymm0
-; AVX512-NEXT:    vpandn (%rsi), %ymm0, %ymm0
-; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
-; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; AVX512-NEXT:    vmovd %xmm0, %eax
-; AVX512-NEXT:    notl %eax
-; AVX512-NEXT:    shrl $31, %eax
+; AVX512-NEXT:    vmovaps (%rdi), %ymm0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    vtestps (%rsi), %ymm0
+; AVX512-NEXT:    setb %al
 ; AVX512-NEXT:    vzeroupper
 ; AVX512-NEXT:    retq
   %a = load <8 x i32>, ptr %pa
@@ -1108,34 +603,18 @@ define i64 @reduce_umax_v4i64_signbit(ptr %pa, ptr %pb) {
 ; X86-SSE2-NEXT:    xorl %edx, %edx
 ; X86-SSE2-NEXT:    retl
 ;
-; X64-SSE2-LABEL: reduce_umax_v4i64_signbit:
-; X64-SSE2:       # %bb.0:
-; X64-SSE2-NEXT:    movdqa (%rsi), %xmm0
-; X64-SSE2-NEXT:    movdqa 16(%rsi), %xmm1
-; X64-SSE2-NEXT:    pand (%rdi), %xmm0
-; X64-SSE2-NEXT:    pand 16(%rdi), %xmm1
-; X64-SSE2-NEXT:    movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456]
-; X64-SSE2-NEXT:    movdqa %xmm1, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm2, %xmm3
-; X64-SSE2-NEXT:    pxor %xmm0, %xmm2
-; X64-SSE2-NEXT:    movdqa %xmm2, %xmm4
-; X64-SSE2-NEXT:    pcmpgtd %xmm3, %xmm4
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X64-SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3]
-; X64-SSE2-NEXT:    pand %xmm5, %xmm2
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3]
-; X64-SSE2-NEXT:    por %xmm2, %xmm3
-; X64-SSE2-NEXT:    pand %xmm3, %xmm0
-; X64-SSE2-NEXT:    pandn %xmm1, %xmm3
-; X64-SSE2-NEXT:    por %xmm0, %xmm3
-; X64-SSE2-NEXT:    movq %xmm3, %rcx
-; X64-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3]
-; X64-SSE2-NEXT:    movq %xmm0, %rax
-; X64-SSE2-NEXT:    orq %rcx, %rax
-; X64-SSE2-NEXT:    notq %rax
-; X64-SSE2-NEXT:    shrq $63, %rax
-; X64-SSE2-NEXT:    retq
+; X64-SSE-LABEL: reduce_umax_v4i64_signbit:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movapd (%rsi), %xmm0
+; X64-SSE-NEXT:    movapd 16(%rsi), %xmm1
+; X64-SSE-NEXT:    andpd 16(%rdi), %xmm1
+; X64-SSE-NEXT:    andpd (%rdi), %xmm0
+; X64-SSE-NEXT:    orpd %xmm1, %xmm0
+; X64-SSE-NEXT:    movmskpd %xmm0, %ecx
+; X64-SSE-NEXT:    xorl %eax, %eax
+; X64-SSE-NEXT:    testl %ecx, %ecx
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
 ;
 ; X86-SSE41-LABEL: reduce_umax_v4i64_signbit:
 ; X86-SSE41:       # %bb.0:
@@ -1166,32 +645,6 @@ define i64 @reduce_umax_v4i64_signbit(ptr %pa, ptr %pb) {
 ; X86-SSE41-NEXT:    xorl %edx, %edx
 ; X86-SSE41-NEXT:    retl
 ;
-; X64-SSE41-LABEL: reduce_umax_v4i64_signbit:
-; X64-SSE41:       # %bb.0:
-; X64-SSE41-NEXT:    movdqa (%rsi), %xmm1
-; X64-SSE41-NEXT:    movdqa 16(%rsi), %xmm2
-; X64-SSE41-NEXT:    pand (%rdi), %xmm1
-; X64-SSE41-NEXT:    pand 16(%rdi), %xmm2
-; X64-SSE41-NEXT:    movdqa {{.*#+}} xmm0 = [9223372039002259456,9223372039002259456]
-; X64-SSE41-NEXT:    movdqa %xmm2, %xmm3
-; X64-SSE41-NEXT:    pxor %xmm0, %xmm3
-; X64-SSE41-NEXT:    pxor %xmm1, %xmm0
-; X64-SSE41-NEXT:    movdqa %xmm0, %xmm4
-; X64-SSE41-NEXT:    pcmpgtd %xmm3, %xmm4
-; X64-SSE41-NEXT:    pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2]
-; X64-SSE41-NEXT:    pcmpeqd %xmm3, %xmm0
-; X64-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3]
-; X64-SSE41-NEXT:    pand %xmm5, %xmm3
-; X64-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
-; X64-SSE41-NEXT:    por %xmm3, %xmm0
-; X64-SSE41-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X64-SSE41-NEXT:    pextrq $1, %xmm2, %rcx
-; X64-SSE41-NEXT:    movq %xmm2, %rax
-; X64-SSE41-NEXT:    orq %rcx, %rax
-; X64-SSE41-NEXT:    notq %rax
-; X64-SSE41-NEXT:    shrq $63, %rax
-; X64-SSE41-NEXT:    retq
-;
 ; X86-SSE42-LABEL: reduce_umax_v4i64_signbit:
 ; X86-SSE42:       # %bb.0:
 ; X86-SSE42-NEXT:    movl {{[0-9]+}}(%esp), %eax
@@ -1214,132 +667,35 @@ define i64 @reduce_umax_v4i64_signbit(ptr %pa, ptr %pb) {
 ; X86-SSE42-NEXT:    xorl %edx, %edx
 ; X86-SSE42-NEXT:    retl
 ;
-; X64-SSE42-LABEL: reduce_umax_v4i64_signbit:
-; X64-SSE42:       # %bb.0:
-; X64-SSE42-NEXT:    movdqa (%rsi), %xmm1
-; X64-SSE42-NEXT:    movdqa 16(%rsi), %xmm2
-; X64-SSE42-NEXT:    pand (%rdi), %xmm1
-; X64-SSE42-NEXT:    pand 16(%rdi), %xmm2
-; X64-SSE42-NEXT:    movdqa {{.*#+}} xmm0 = [9223372036854775808,9223372036854775808]
-; X64-SSE42-NEXT:    movdqa %xmm2, %xmm3
-; X64-SSE42-NEXT:    pxor %xmm0, %xmm3
-; X64-SSE42-NEXT:    pxor %xmm1, %xmm0
-; X64-SSE42-NEXT:    pcmpgtq %xmm3, %xmm0
-; X64-SSE42-NEXT:    blendvpd %xmm0, %xmm1, %xmm2
-; X64-SSE42-NEXT:    pextrq $1, %xmm2, %rcx
-; X64-SSE42-NEXT:    movq %xmm2, %rax
-; X64-SSE42-NEXT:    orq %rcx, %rax
-; X64-SSE42-NEXT:    notq %rax
-; X64-SSE42-NEXT:    shrq $63, %rax
-; X64-SSE42-NEXT:    retq
-;
-; X86-AVX1-LABEL: reduce_umax_v4i64_signbit:
-; X86-AVX1:       # %bb.0:
-; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
-; X86-AVX1-NEXT:    vandps (%eax), %ymm0, %ymm0
-; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX1-NEXT:    # xmm2 = mem[0,0]
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm3
-; X86-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm2
-; X86-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX1-NEXT:    vorpd %xmm0, %xmm1, %xmm0
-; X86-AVX1-NEXT:    vextractps $1, %xmm0, %eax
-; X86-AVX1-NEXT:    notl %eax
-; X86-AVX1-NEXT:    shrl $31, %eax
-; X86-AVX1-NEXT:    xorl %edx, %edx
-; X86-AVX1-NEXT:    vzeroupper
-; X86-AVX1-NEXT:    retl
-;
-; X64-AVX1-LABEL: reduce_umax_v4i64_signbit:
-; X64-AVX1:       # %bb.0:
-; X64-AVX1-NEXT:    vmovaps (%rsi), %ymm0
-; X64-AVX1-NEXT:    vandps (%rdi), %ymm0, %ymm0
-; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
-; X64-AVX1-NEXT:    vmovddup {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; X64-AVX1-NEXT:    # xmm2 = mem[0,0]
-; X64-AVX1-NEXT:    vxorps %xmm2, %xmm1, %xmm3
-; X64-AVX1-NEXT:    vxorps %xmm2, %xmm0, %xmm2
-; X64-AVX1-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X64-AVX1-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X64-AVX1-NEXT:    vpextrq $1, %xmm0, %rcx
-; X64-AVX1-NEXT:    vmovq %xmm0, %rax
-; X64-AVX1-NEXT:    orq %rcx, %rax
-; X64-AVX1-NEXT:    notq %rax
-; X64-AVX1-NEXT:    shrq $63, %rax
-; X64-AVX1-NEXT:    vzeroupper
-; X64-AVX1-NEXT:    retq
-;
-; X86-AVX2-LABEL: reduce_umax_v4i64_signbit:
-; X86-AVX2:       # %bb.0:
-; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
-; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
-; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
-; X86-AVX2-NEXT:    vpand (%eax), %ymm0, %ymm0
-; X86-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [0,2147483648,0,2147483648]
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
-; X86-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
-; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-AVX2-NEXT:    vorpd %xmm0, %xmm1, %xmm0
-; X86-AVX2-NEXT:    vextractps $1, %xmm0, %eax
-; X86-AVX2-NEXT:    notl %eax
-; X86-AVX2-NEXT:    shrl $31, %eax
-; X86-AVX2-NEXT:    xorl %edx, %edx
-; X86-AVX2-NEXT:    vzeroupper
-; X86-AVX2-NEXT:    retl
-;
-; X64-AVX2-LABEL: reduce_umax_v4i64_signbit:
-; X64-AVX2:       # %bb.0:
-; X64-AVX2-NEXT:    vmovdqa (%rsi), %ymm0
-; X64-AVX2-NEXT:    vpand (%rdi), %ymm0, %ymm0
-; X64-AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; X64-AVX2-NEXT:    vpbroadcastq {{.*#+}} xmm2 = [9223372036854775808,9223372036854775808]
-; X64-AVX2-NEXT:    vpxor %xmm2, %xmm1, %xmm3
-; X64-AVX2-NEXT:    vpxor %xmm2, %xmm0, %xmm2
-; X64-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
-; X64-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
-; X64-AVX2-NEXT:    vpextrq $1, %xmm0, %rcx
-; X64-AVX2-NEXT:    vmovq %xmm0, %rax
-; X64-AVX2-NEXT:    orq %rcx, %rax
-; X64-AVX2-NEXT:    notq %rax
-; X64-AVX2-NEXT:    shrq $63, %rax
-; X64-AVX2-NEXT:    vzeroupper
-; X64-AVX2-NEXT:    retq
+; X86-AVX-LABEL: reduce_umax_v4i64_signbit:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    vmovapd (%eax), %ymm0
+; X86-AVX-NEXT:    xorl %eax, %eax
+; X86-AVX-NEXT:    vtestpd (%ecx), %ymm0
+; X86-AVX-NEXT:    sete %al
+; X86-AVX-NEXT:    xorl %edx, %edx
+; X86-AVX-NEXT:    vzeroupper
+; X86-AVX-NEXT:    retl
 ;
-; AVX512BW-LABEL: reduce_umax_v4i64_signbit:
-; AVX512BW:       # %bb.0:
-; AVX512BW-NEXT:    vmovdqa (%rsi), %ymm0
-; AVX512BW-NEXT:    vpand (%rdi), %ymm0, %ymm0
-; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
-; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; AVX512BW-NEXT:    vmovq %xmm0, %rax
-; AVX512BW-NEXT:    notq %rax
-; AVX512BW-NEXT:    shrq $63, %rax
-; AVX512BW-NEXT:    vzeroupper
-; AVX512BW-NEXT:    retq
+; X64-AVX-LABEL: reduce_umax_v4i64_signbit:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovapd (%rdi), %ymm0
+; X64-AVX-NEXT:    xorl %eax, %eax
+; X64-AVX-NEXT:    vtestpd (%rsi), %ymm0
+; X64-AVX-NEXT:    sete %al
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
 ;
-; AVX512VL-LABEL: reduce_umax_v4i64_signbit:
-; AVX512VL:       # %bb.0:
-; AVX512VL-NEXT:    vmovdqa (%rsi), %ymm0
-; AVX512VL-NEXT:    vpand (%rdi), %ymm0, %ymm0
-; AVX512VL-NEXT:    vextracti128 $1, %ymm0, %xmm1
-; AVX512VL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
-; AVX512VL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX512VL-NEXT:    vpor %xmm1, %xmm0, %xmm0
-; AVX512VL-NEXT:    vmovq %xmm0, %rax
-; AVX512VL-NEXT:    notq %rax
-; AVX512VL-NEXT:    shrq $63, %rax
-; AVX512VL-NEXT:    vzeroupper
-; AVX512VL-NEXT:    retq
+; AVX512-LABEL: reduce_umax_v4i64_signbit:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovapd (%rdi), %ymm0
+; AVX512-NEXT:    xorl %eax, %eax
+; AVX512-NEXT:    vtestpd (%rsi), %ymm0
+; AVX512-NEXT:    sete %al
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
   %a = load <4 x i64>, ptr %pa
   %b = load <4 x i64>, ptr %pb
   %a.not = xor <4 x i64> %a, splat (i64 -1)
@@ -1349,12 +705,3 @@ define i64 @reduce_umax_v4i64_signbit(ptr %pa, ptr %pb) {
   %res = zext i1 %cmp to i64
   ret i64 %res
 }
-;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
-; AVX: {{.*}}
-; AVX1: {{.*}}
-; AVX2: {{.*}}
-; SSE: {{.*}}
-; SSE2: {{.*}}
-; SSE4: {{.*}}
-; X64-SSE: {{.*}}
-; X86-SSE: {{.*}}

>From 9d94d0b51e43610668038ddb79bff44d16ed5049 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Mon, 20 Jul 2026 09:38:07 +0100
Subject: [PATCH 3/3] Add 512-bit test coverage (and removed some unused NOT
 copy+pasta)

---
 llvm/test/CodeGen/X86/pr209714.ll | 756 +++++++++++++++++++++++++++++-
 1 file changed, 750 insertions(+), 6 deletions(-)

diff --git a/llvm/test/CodeGen/X86/pr209714.ll b/llvm/test/CodeGen/X86/pr209714.ll
index 1c3b0b2149c21..e181a88571e1a 100644
--- a/llvm/test/CodeGen/X86/pr209714.ll
+++ b/llvm/test/CodeGen/X86/pr209714.ll
@@ -9,8 +9,8 @@
 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx      | FileCheck %s --check-prefixes=X64-AVX,X64-AVX1
 ; RUN: llc < %s -mtriple=i686--   -mattr=+avx2     | FileCheck %s --check-prefixes=X86-AVX,X86-AVX2
 ; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2     | FileCheck %s --check-prefixes=X64-AVX,X64-AVX2
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512
-; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512bw,+avx512dq,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512BWVL
 
 ; Ensure umax reductions which only demand the signbit correctly fold to MOVSMSK/TESTP style patterns.
 
@@ -65,7 +65,6 @@ define i8 @reduce_umax_v16i8_signbit(ptr %pa, ptr %pb) {
 ; AVX512-NEXT:    retq
   %a = load <16 x i8>, ptr %pa
   %b = load <16 x i8>, ptr %pb
-  %a.not = xor <16 x i8> %a, splat (i8 -1)
   %and = and <16 x i8> %b, %a
   %rdx = call i8 @llvm.vector.reduce.umax.v16i8(<16 x i8> %and)
   %cmp = icmp sgt i8 %rdx, -1
@@ -197,7 +196,6 @@ define i32 @reduce_umax_v4i32_signbit(ptr %pa, ptr %pb) {
 ; AVX512-NEXT:    retq
   %a = load <4 x i32>, ptr %pa
   %b = load <4 x i32>, ptr %pb
-  %a.not = xor <4 x i32> %a, splat (i32 -1)
   %and = and <4 x i32> %b, %a
   %rdx = call i32 @llvm.vector.reduce.umax.v4i32(<4 x i32> %and)
   %cmp = icmp sgt i32 %rdx, -1
@@ -495,7 +493,6 @@ define i16 @reduce_umax_v16i16_signbit(ptr %pa, ptr %pb) {
 ; AVX512-NEXT:    retq
   %a = load <16 x i16>, ptr %pa
   %b = load <16 x i16>, ptr %pb
-  %a.not = xor <16 x i16> %a, splat (i16 -1)
   %and = and <16 x i16> %b, %a
   %rdx = call i16 @llvm.vector.reduce.umax.v16i16(<16 x i16> %and)
   %cmp = icmp sgt i16 %rdx, -1
@@ -698,10 +695,757 @@ define i64 @reduce_umax_v4i64_signbit(ptr %pa, ptr %pb) {
 ; AVX512-NEXT:    retq
   %a = load <4 x i64>, ptr %pa
   %b = load <4 x i64>, ptr %pb
-  %a.not = xor <4 x i64> %a, splat (i64 -1)
   %and = and <4 x i64> %b, %a
   %rdx = call i64 @llvm.vector.reduce.umax.v4i64(<4 x i64> %and)
   %cmp = icmp sgt i64 %rdx, -1
   %res = zext i1 %cmp to i64
   ret i64 %res
 }
+
+define i8 @reduce_umax_v64i8_signbit(ptr %pa, ptr %pb) {
+; X86-SSE-LABEL: reduce_umax_v64i8_signbit:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movdqa 48(%ecx), %xmm0
+; X86-SSE-NEXT:    movdqa (%ecx), %xmm1
+; X86-SSE-NEXT:    movdqa 16(%ecx), %xmm2
+; X86-SSE-NEXT:    movdqa 32(%ecx), %xmm3
+; X86-SSE-NEXT:    pand 32(%eax), %xmm3
+; X86-SSE-NEXT:    pand (%eax), %xmm1
+; X86-SSE-NEXT:    por %xmm3, %xmm1
+; X86-SSE-NEXT:    pand 48(%eax), %xmm0
+; X86-SSE-NEXT:    pand 16(%eax), %xmm2
+; X86-SSE-NEXT:    por %xmm0, %xmm2
+; X86-SSE-NEXT:    por %xmm1, %xmm2
+; X86-SSE-NEXT:    pmovmskb %xmm2, %eax
+; X86-SSE-NEXT:    testl %eax, %eax
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v64i8_signbit:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movdqa (%rsi), %xmm0
+; X64-SSE-NEXT:    movdqa 16(%rsi), %xmm1
+; X64-SSE-NEXT:    movdqa 32(%rsi), %xmm2
+; X64-SSE-NEXT:    movdqa 48(%rsi), %xmm3
+; X64-SSE-NEXT:    pand 32(%rdi), %xmm2
+; X64-SSE-NEXT:    pand (%rdi), %xmm0
+; X64-SSE-NEXT:    por %xmm2, %xmm0
+; X64-SSE-NEXT:    pand 48(%rdi), %xmm3
+; X64-SSE-NEXT:    pand 16(%rdi), %xmm1
+; X64-SSE-NEXT:    por %xmm3, %xmm1
+; X64-SSE-NEXT:    por %xmm0, %xmm1
+; X64-SSE-NEXT:    pmovmskb %xmm1, %eax
+; X64-SSE-NEXT:    testl %eax, %eax
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
+;
+; X86-AVX1-LABEL: reduce_umax_v64i8_signbit:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX1-NEXT:    vmovaps 32(%ecx), %ymm1
+; X86-AVX1-NEXT:    vandps (%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT:    vandps 32(%eax), %ymm1, %ymm1
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
+; X86-AVX1-NEXT:    vorps %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vorps %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT:    testl %eax, %eax
+; X86-AVX1-NEXT:    sete %al
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: reduce_umax_v64i8_signbit:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vmovaps (%rsi), %ymm0
+; X64-AVX1-NEXT:    vmovaps 32(%rsi), %ymm1
+; X64-AVX1-NEXT:    vandps (%rdi), %ymm0, %ymm0
+; X64-AVX1-NEXT:    vandps 32(%rdi), %ymm1, %ymm1
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
+; X64-AVX1-NEXT:    vorps %xmm2, %xmm3, %xmm2
+; X64-AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vorps %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT:    testl %eax, %eax
+; X64-AVX1-NEXT:    sete %al
+; X64-AVX1-NEXT:    vzeroupper
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: reduce_umax_v64i8_signbit:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
+; X86-AVX2-NEXT:    vmovdqa 32(%ecx), %ymm1
+; X86-AVX2-NEXT:    vpand 32(%eax), %ymm1, %ymm1
+; X86-AVX2-NEXT:    vpand (%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT:    vpmovmskb %ymm0, %eax
+; X86-AVX2-NEXT:    testl %eax, %eax
+; X86-AVX2-NEXT:    sete %al
+; X86-AVX2-NEXT:    vzeroupper
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: reduce_umax_v64i8_signbit:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vmovdqa (%rsi), %ymm0
+; X64-AVX2-NEXT:    vmovdqa 32(%rsi), %ymm1
+; X64-AVX2-NEXT:    vpand 32(%rdi), %ymm1, %ymm1
+; X64-AVX2-NEXT:    vpand (%rdi), %ymm0, %ymm0
+; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT:    vpmovmskb %ymm0, %eax
+; X64-AVX2-NEXT:    testl %eax, %eax
+; X64-AVX2-NEXT:    sete %al
+; X64-AVX2-NEXT:    vzeroupper
+; X64-AVX2-NEXT:    retq
+;
+; AVX512BW-LABEL: reduce_umax_v64i8_signbit:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa64 (%rsi), %zmm0
+; AVX512BW-NEXT:    vpandq (%rdi), %zmm0, %zmm0
+; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
+; AVX512BW-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
+; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BW-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BW-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovd %xmm0, %eax
+; AVX512BW-NEXT:    shrb $7, %al
+; AVX512BW-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512BWVL-LABEL: reduce_umax_v64i8_signbit:
+; AVX512BWVL:       # %bb.0:
+; AVX512BWVL-NEXT:    vmovdqa64 (%rsi), %zmm0
+; AVX512BWVL-NEXT:    vpandq (%rdi), %zmm0, %zmm0
+; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
+; AVX512BWVL-NEXT:    vpmaxub %ymm1, %ymm0, %ymm0
+; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BWVL-NEXT:    vpmaxub %xmm1, %xmm0, %xmm0
+; AVX512BWVL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512BWVL-NEXT:    vpsrlw $8, %xmm0, %xmm1
+; AVX512BWVL-NEXT:    vpminub %xmm1, %xmm0, %xmm0
+; AVX512BWVL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BWVL-NEXT:    vmovd %xmm0, %eax
+; AVX512BWVL-NEXT:    shrb $7, %al
+; AVX512BWVL-NEXT:    # kill: def $al killed $al killed $eax
+; AVX512BWVL-NEXT:    vzeroupper
+; AVX512BWVL-NEXT:    retq
+  %a = load <64 x i8>, ptr %pa
+  %b = load <64 x i8>, ptr %pb
+  %and = and <64 x i8> %b, %a
+  %rdx = call i8 @llvm.vector.reduce.umax.v64i8(<64 x i8> %and)
+  %cmp = icmp sgt i8 %rdx, -1
+  %res = zext i1 %cmp to i8
+  ret i8 %res
+}
+
+define i16 @reduce_umax_v32i16_signbit_not(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v32i16_signbit_not:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa 32(%ecx), %xmm1
+; X86-SSE2-NEXT:    movdqa 48(%ecx), %xmm0
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm2
+; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm3
+; X86-SSE2-NEXT:    pandn 16(%eax), %xmm3
+; X86-SSE2-NEXT:    pandn 48(%eax), %xmm0
+; X86-SSE2-NEXT:    pandn (%eax), %xmm2
+; X86-SSE2-NEXT:    pandn 32(%eax), %xmm1
+; X86-SSE2-NEXT:    psubusw %xmm2, %xmm1
+; X86-SSE2-NEXT:    paddw %xmm2, %xmm1
+; X86-SSE2-NEXT:    psubusw %xmm3, %xmm0
+; X86-SSE2-NEXT:    paddw %xmm3, %xmm0
+; X86-SSE2-NEXT:    psubusw %xmm1, %xmm0
+; X86-SSE2-NEXT:    paddw %xmm1, %xmm0
+; X86-SSE2-NEXT:    packsswb %xmm0, %xmm0
+; X86-SSE2-NEXT:    pmovmskb %xmm0, %ecx
+; X86-SSE2-NEXT:    xorl %eax, %eax
+; X86-SSE2-NEXT:    testl %ecx, %ecx
+; X86-SSE2-NEXT:    sete %al
+; X86-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE2-LABEL: reduce_umax_v32i16_signbit_not:
+; X64-SSE2:       # %bb.0:
+; X64-SSE2-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT:    movdqa 16(%rdi), %xmm1
+; X64-SSE2-NEXT:    movdqa 32(%rdi), %xmm2
+; X64-SSE2-NEXT:    movdqa 48(%rdi), %xmm3
+; X64-SSE2-NEXT:    pandn 16(%rsi), %xmm1
+; X64-SSE2-NEXT:    pandn 48(%rsi), %xmm3
+; X64-SSE2-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE2-NEXT:    pandn 32(%rsi), %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm0, %xmm2
+; X64-SSE2-NEXT:    paddw %xmm0, %xmm2
+; X64-SSE2-NEXT:    psubusw %xmm1, %xmm3
+; X64-SSE2-NEXT:    paddw %xmm1, %xmm3
+; X64-SSE2-NEXT:    psubusw %xmm2, %xmm3
+; X64-SSE2-NEXT:    paddw %xmm2, %xmm3
+; X64-SSE2-NEXT:    packsswb %xmm3, %xmm3
+; X64-SSE2-NEXT:    pmovmskb %xmm3, %ecx
+; X64-SSE2-NEXT:    xorl %eax, %eax
+; X64-SSE2-NEXT:    testl %ecx, %ecx
+; X64-SSE2-NEXT:    sete %al
+; X64-SSE2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE2-NEXT:    retq
+;
+; X86-SSE4-LABEL: reduce_umax_v32i16_signbit_not:
+; X86-SSE4:       # %bb.0:
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE4-NEXT:    movdqa 48(%ecx), %xmm1
+; X86-SSE4-NEXT:    movdqa (%ecx), %xmm2
+; X86-SSE4-NEXT:    movdqa 16(%ecx), %xmm0
+; X86-SSE4-NEXT:    movdqa 32(%ecx), %xmm3
+; X86-SSE4-NEXT:    pandn 32(%eax), %xmm3
+; X86-SSE4-NEXT:    pandn (%eax), %xmm2
+; X86-SSE4-NEXT:    pmaxuw %xmm3, %xmm2
+; X86-SSE4-NEXT:    pandn 48(%eax), %xmm1
+; X86-SSE4-NEXT:    pandn 16(%eax), %xmm0
+; X86-SSE4-NEXT:    pmaxuw %xmm1, %xmm0
+; X86-SSE4-NEXT:    pmaxuw %xmm2, %xmm0
+; X86-SSE4-NEXT:    packsswb %xmm0, %xmm0
+; X86-SSE4-NEXT:    pmovmskb %xmm0, %ecx
+; X86-SSE4-NEXT:    xorl %eax, %eax
+; X86-SSE4-NEXT:    testl %ecx, %ecx
+; X86-SSE4-NEXT:    sete %al
+; X86-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-SSE4-NEXT:    retl
+;
+; X64-SSE4-LABEL: reduce_umax_v32i16_signbit_not:
+; X64-SSE4:       # %bb.0:
+; X64-SSE4-NEXT:    movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT:    movdqa 16(%rdi), %xmm1
+; X64-SSE4-NEXT:    movdqa 32(%rdi), %xmm2
+; X64-SSE4-NEXT:    movdqa 48(%rdi), %xmm3
+; X64-SSE4-NEXT:    pandn 32(%rsi), %xmm2
+; X64-SSE4-NEXT:    pandn (%rsi), %xmm0
+; X64-SSE4-NEXT:    pmaxuw %xmm2, %xmm0
+; X64-SSE4-NEXT:    pandn 48(%rsi), %xmm3
+; X64-SSE4-NEXT:    pandn 16(%rsi), %xmm1
+; X64-SSE4-NEXT:    pmaxuw %xmm3, %xmm1
+; X64-SSE4-NEXT:    pmaxuw %xmm0, %xmm1
+; X64-SSE4-NEXT:    packsswb %xmm1, %xmm1
+; X64-SSE4-NEXT:    pmovmskb %xmm1, %ecx
+; X64-SSE4-NEXT:    xorl %eax, %eax
+; X64-SSE4-NEXT:    testl %ecx, %ecx
+; X64-SSE4-NEXT:    sete %al
+; X64-SSE4-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-SSE4-NEXT:    retq
+;
+; X86-AVX1-LABEL: reduce_umax_v32i16_signbit_not:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX1-NEXT:    vmovaps 32(%ecx), %ymm1
+; X86-AVX1-NEXT:    vandnps (%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT:    vandnps 32(%eax), %ymm1, %ymm1
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
+; X86-AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT:    vpmovmskb %xmm0, %ecx
+; X86-AVX1-NEXT:    xorl %eax, %eax
+; X86-AVX1-NEXT:    testl %ecx, %ecx
+; X86-AVX1-NEXT:    sete %al
+; X86-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX1-LABEL: reduce_umax_v32i16_signbit_not:
+; X64-AVX1:       # %bb.0:
+; X64-AVX1-NEXT:    vmovaps (%rdi), %ymm0
+; X64-AVX1-NEXT:    vmovaps 32(%rdi), %ymm1
+; X64-AVX1-NEXT:    vandnps (%rsi), %ymm0, %ymm0
+; X64-AVX1-NEXT:    vandnps 32(%rsi), %ymm1, %ymm1
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
+; X64-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm3
+; X64-AVX1-NEXT:    vpor %xmm2, %xmm3, %xmm2
+; X64-AVX1-NEXT:    vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpacksswb %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT:    vpmovmskb %xmm0, %ecx
+; X64-AVX1-NEXT:    xorl %eax, %eax
+; X64-AVX1-NEXT:    testl %ecx, %ecx
+; X64-AVX1-NEXT:    sete %al
+; X64-AVX1-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT:    vzeroupper
+; X64-AVX1-NEXT:    retq
+;
+; X86-AVX2-LABEL: reduce_umax_v32i16_signbit_not:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
+; X86-AVX2-NEXT:    vmovdqa 32(%ecx), %ymm1
+; X86-AVX2-NEXT:    vpandn 32(%eax), %ymm1, %ymm1
+; X86-AVX2-NEXT:    vpandn (%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT:    vpmovmskb %ymm0, %ecx
+; X86-AVX2-NEXT:    xorl %eax, %eax
+; X86-AVX2-NEXT:    testl $-1431655766, %ecx # imm = 0xAAAAAAAA
+; X86-AVX2-NEXT:    sete %al
+; X86-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X86-AVX2-NEXT:    vzeroupper
+; X86-AVX2-NEXT:    retl
+;
+; X64-AVX2-LABEL: reduce_umax_v32i16_signbit_not:
+; X64-AVX2:       # %bb.0:
+; X64-AVX2-NEXT:    vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT:    vmovdqa 32(%rdi), %ymm1
+; X64-AVX2-NEXT:    vpandn 32(%rsi), %ymm1, %ymm1
+; X64-AVX2-NEXT:    vpandn (%rsi), %ymm0, %ymm0
+; X64-AVX2-NEXT:    vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT:    vpmovmskb %ymm0, %ecx
+; X64-AVX2-NEXT:    xorl %eax, %eax
+; X64-AVX2-NEXT:    testl $-1431655766, %ecx # imm = 0xAAAAAAAA
+; X64-AVX2-NEXT:    sete %al
+; X64-AVX2-NEXT:    # kill: def $ax killed $ax killed $eax
+; X64-AVX2-NEXT:    vzeroupper
+; X64-AVX2-NEXT:    retq
+;
+; AVX512BW-LABEL: reduce_umax_v32i16_signbit_not:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
+; AVX512BW-NEXT:    vpandnq (%rsi), %zmm0, %zmm0
+; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
+; AVX512BW-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
+; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BW-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vpternlogq {{.*#+}} zmm0 = ~zmm0
+; AVX512BW-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BW-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX512BW-NEXT:    shrl $15, %eax
+; AVX512BW-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512BWVL-LABEL: reduce_umax_v32i16_signbit_not:
+; AVX512BWVL:       # %bb.0:
+; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
+; AVX512BWVL-NEXT:    vpandnq (%rsi), %zmm0, %zmm0
+; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
+; AVX512BWVL-NEXT:    vpmaxuw %ymm1, %ymm0, %ymm0
+; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BWVL-NEXT:    vpmaxuw %xmm1, %xmm0, %xmm0
+; AVX512BWVL-NEXT:    vpternlogq {{.*#+}} xmm0 = ~xmm0
+; AVX512BWVL-NEXT:    vphminposuw %xmm0, %xmm0
+; AVX512BWVL-NEXT:    vpextrw $0, %xmm0, %eax
+; AVX512BWVL-NEXT:    shrl $15, %eax
+; AVX512BWVL-NEXT:    # kill: def $ax killed $ax killed $eax
+; AVX512BWVL-NEXT:    vzeroupper
+; AVX512BWVL-NEXT:    retq
+  %a = load <32 x i16>, ptr %pa
+  %b = load <32 x i16>, ptr %pb
+  %a.not = xor <32 x i16> %a, splat (i16 -1)
+  %and = and <32 x i16> %b, %a.not
+  %rdx = call i16 @llvm.vector.reduce.umax.v32i16(<32 x i16> %and)
+  %cmp = icmp sgt i16 %rdx, -1
+  %res = zext i1 %cmp to i16
+  ret i16 %res
+}
+
+define i32 @reduce_umax_v16i32_signbit(ptr %pa, ptr %pb) {
+; X86-SSE-LABEL: reduce_umax_v16i32_signbit:
+; X86-SSE:       # %bb.0:
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE-NEXT:    movaps 48(%ecx), %xmm0
+; X86-SSE-NEXT:    movaps (%ecx), %xmm1
+; X86-SSE-NEXT:    movaps 16(%ecx), %xmm2
+; X86-SSE-NEXT:    movaps 32(%ecx), %xmm3
+; X86-SSE-NEXT:    andps 32(%eax), %xmm3
+; X86-SSE-NEXT:    andps (%eax), %xmm1
+; X86-SSE-NEXT:    orps %xmm3, %xmm1
+; X86-SSE-NEXT:    andps 48(%eax), %xmm0
+; X86-SSE-NEXT:    andps 16(%eax), %xmm2
+; X86-SSE-NEXT:    orps %xmm0, %xmm2
+; X86-SSE-NEXT:    orps %xmm1, %xmm2
+; X86-SSE-NEXT:    movmskps %xmm2, %ecx
+; X86-SSE-NEXT:    xorl %eax, %eax
+; X86-SSE-NEXT:    testl %ecx, %ecx
+; X86-SSE-NEXT:    sete %al
+; X86-SSE-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v16i32_signbit:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movaps (%rsi), %xmm0
+; X64-SSE-NEXT:    movaps 16(%rsi), %xmm1
+; X64-SSE-NEXT:    movaps 32(%rsi), %xmm2
+; X64-SSE-NEXT:    movaps 48(%rsi), %xmm3
+; X64-SSE-NEXT:    andps 32(%rdi), %xmm2
+; X64-SSE-NEXT:    andps (%rdi), %xmm0
+; X64-SSE-NEXT:    orps %xmm2, %xmm0
+; X64-SSE-NEXT:    andps 48(%rdi), %xmm3
+; X64-SSE-NEXT:    andps 16(%rdi), %xmm1
+; X64-SSE-NEXT:    orps %xmm3, %xmm1
+; X64-SSE-NEXT:    orps %xmm0, %xmm1
+; X64-SSE-NEXT:    movmskps %xmm1, %ecx
+; X64-SSE-NEXT:    xorl %eax, %eax
+; X64-SSE-NEXT:    testl %ecx, %ecx
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
+;
+; X86-AVX-LABEL: reduce_umax_v16i32_signbit:
+; X86-AVX:       # %bb.0:
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX-NEXT:    vmovaps 32(%ecx), %ymm1
+; X86-AVX-NEXT:    vandps 32(%eax), %ymm1, %ymm1
+; X86-AVX-NEXT:    vandps (%eax), %ymm0, %ymm0
+; X86-AVX-NEXT:    vorps %ymm1, %ymm0, %ymm0
+; X86-AVX-NEXT:    xorl %eax, %eax
+; X86-AVX-NEXT:    vtestps %ymm0, %ymm0
+; X86-AVX-NEXT:    sete %al
+; X86-AVX-NEXT:    vzeroupper
+; X86-AVX-NEXT:    retl
+;
+; X64-AVX-LABEL: reduce_umax_v16i32_signbit:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovaps (%rsi), %ymm0
+; X64-AVX-NEXT:    vmovaps 32(%rsi), %ymm1
+; X64-AVX-NEXT:    vandps 32(%rdi), %ymm1, %ymm1
+; X64-AVX-NEXT:    vandps (%rdi), %ymm0, %ymm0
+; X64-AVX-NEXT:    vorps %ymm1, %ymm0, %ymm0
+; X64-AVX-NEXT:    xorl %eax, %eax
+; X64-AVX-NEXT:    vtestps %ymm0, %ymm0
+; X64-AVX-NEXT:    sete %al
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
+;
+; AVX512-LABEL: reduce_umax_v16i32_signbit:
+; AVX512:       # %bb.0:
+; AVX512-NEXT:    vmovdqa64 (%rsi), %zmm0
+; AVX512-NEXT:    vpandd (%rdi), %zmm0, %zmm0
+; AVX512-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
+; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0
+; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512-NEXT:    vpmaxud %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; AVX512-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512-NEXT:    vmovd %xmm0, %eax
+; AVX512-NEXT:    notl %eax
+; AVX512-NEXT:    shrl $31, %eax
+; AVX512-NEXT:    vzeroupper
+; AVX512-NEXT:    retq
+  %a = load <16 x i32>, ptr %pa
+  %b = load <16 x i32>, ptr %pb
+  %and = and <16 x i32> %b, %a
+  %rdx = call i32 @llvm.vector.reduce.umax.v16i32(<16 x i32> %and)
+  %cmp = icmp sgt i32 %rdx, -1
+  %res = zext i1 %cmp to i32
+  ret i32 %res
+}
+
+define i64 @reduce_umax_v8i64_signbit_not(ptr %pa, ptr %pb) {
+; X86-SSE2-LABEL: reduce_umax_v8i64_signbit_not:
+; X86-SSE2:       # %bb.0:
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE2-NEXT:    movdqa 48(%ecx), %xmm4
+; X86-SSE2-NEXT:    movdqa 32(%ecx), %xmm1
+; X86-SSE2-NEXT:    movdqa 16(%ecx), %xmm5
+; X86-SSE2-NEXT:    pandn 16(%eax), %xmm5
+; X86-SSE2-NEXT:    pandn 48(%eax), %xmm4
+; X86-SSE2-NEXT:    movdqa {{.*#+}} xmm0 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE2-NEXT:    movdqa %xmm4, %xmm2
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm5, %xmm3
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm3
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm6
+; X86-SSE2-NEXT:    pcmpgtd %xmm2, %xmm6
+; X86-SSE2-NEXT:    pcmpeqd %xmm2, %xmm3
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[0,0,2,2]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm2, %xmm7
+; X86-SSE2-NEXT:    movdqa (%ecx), %xmm3
+; X86-SSE2-NEXT:    pandn (%eax), %xmm3
+; X86-SSE2-NEXT:    pandn 32(%eax), %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm7, %xmm2
+; X86-SSE2-NEXT:    pand %xmm2, %xmm5
+; X86-SSE2-NEXT:    pandn %xmm4, %xmm2
+; X86-SSE2-NEXT:    por %xmm5, %xmm2
+; X86-SSE2-NEXT:    movdqa %xmm1, %xmm4
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm4
+; X86-SSE2-NEXT:    movdqa %xmm3, %xmm5
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm5
+; X86-SSE2-NEXT:    movdqa %xmm5, %xmm6
+; X86-SSE2-NEXT:    pcmpgtd %xmm4, %xmm6
+; X86-SSE2-NEXT:    pcmpeqd %xmm4, %xmm5
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[0,0,2,2]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm4, %xmm5
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm4 = xmm6[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm5, %xmm4
+; X86-SSE2-NEXT:    pand %xmm4, %xmm3
+; X86-SSE2-NEXT:    pandn %xmm1, %xmm4
+; X86-SSE2-NEXT:    movdqa %xmm2, %xmm1
+; X86-SSE2-NEXT:    pxor %xmm0, %xmm1
+; X86-SSE2-NEXT:    por %xmm3, %xmm4
+; X86-SSE2-NEXT:    pxor %xmm4, %xmm0
+; X86-SSE2-NEXT:    movdqa %xmm0, %xmm3
+; X86-SSE2-NEXT:    pcmpgtd %xmm1, %xmm3
+; X86-SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[0,0,2,2]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3]
+; X86-SSE2-NEXT:    pand %xmm1, %xmm0
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    pand %xmm1, %xmm4
+; X86-SSE2-NEXT:    pandn %xmm2, %xmm1
+; X86-SSE2-NEXT:    por %xmm4, %xmm1
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3]
+; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT:    por %xmm0, %xmm1
+; X86-SSE2-NEXT:    movd %xmm1, %eax
+; X86-SSE2-NEXT:    notl %eax
+; X86-SSE2-NEXT:    shrl $31, %eax
+; X86-SSE2-NEXT:    xorl %edx, %edx
+; X86-SSE2-NEXT:    retl
+;
+; X64-SSE-LABEL: reduce_umax_v8i64_signbit_not:
+; X64-SSE:       # %bb.0:
+; X64-SSE-NEXT:    movapd (%rdi), %xmm0
+; X64-SSE-NEXT:    movapd 16(%rdi), %xmm1
+; X64-SSE-NEXT:    movapd 32(%rdi), %xmm2
+; X64-SSE-NEXT:    movapd 48(%rdi), %xmm3
+; X64-SSE-NEXT:    andnpd 32(%rsi), %xmm2
+; X64-SSE-NEXT:    andnpd (%rsi), %xmm0
+; X64-SSE-NEXT:    orpd %xmm2, %xmm0
+; X64-SSE-NEXT:    andnpd 48(%rsi), %xmm3
+; X64-SSE-NEXT:    andnpd 16(%rsi), %xmm1
+; X64-SSE-NEXT:    orpd %xmm3, %xmm1
+; X64-SSE-NEXT:    orpd %xmm0, %xmm1
+; X64-SSE-NEXT:    movmskpd %xmm1, %ecx
+; X64-SSE-NEXT:    xorl %eax, %eax
+; X64-SSE-NEXT:    testl %ecx, %ecx
+; X64-SSE-NEXT:    sete %al
+; X64-SSE-NEXT:    retq
+;
+; X86-SSE41-LABEL: reduce_umax_v8i64_signbit_not:
+; X86-SSE41:       # %bb.0:
+; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE41-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE41-NEXT:    movdqa 48(%ecx), %xmm1
+; X86-SSE41-NEXT:    movdqa 32(%ecx), %xmm2
+; X86-SSE41-NEXT:    movdqa 16(%ecx), %xmm4
+; X86-SSE41-NEXT:    pandn 16(%eax), %xmm4
+; X86-SSE41-NEXT:    pandn 48(%eax), %xmm1
+; X86-SSE41-NEXT:    movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648]
+; X86-SSE41-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
+; X86-SSE41-NEXT:    movdqa %xmm4, %xmm5
+; X86-SSE41-NEXT:    pxor %xmm3, %xmm5
+; X86-SSE41-NEXT:    movdqa %xmm5, %xmm6
+; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
+; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm5
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm7 = xmm5[1,1,3,3]
+; X86-SSE41-NEXT:    pand %xmm0, %xmm7
+; X86-SSE41-NEXT:    movdqa (%ecx), %xmm5
+; X86-SSE41-NEXT:    pandn (%eax), %xmm5
+; X86-SSE41-NEXT:    pandn 32(%eax), %xmm2
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
+; X86-SSE41-NEXT:    por %xmm7, %xmm0
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm4, %xmm1
+; X86-SSE41-NEXT:    movdqa %xmm2, %xmm0
+; X86-SSE41-NEXT:    pxor %xmm3, %xmm0
+; X86-SSE41-NEXT:    movdqa %xmm5, %xmm4
+; X86-SSE41-NEXT:    pxor %xmm3, %xmm4
+; X86-SSE41-NEXT:    movdqa %xmm4, %xmm6
+; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm6
+; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm4
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[0,0,2,2]
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3]
+; X86-SSE41-NEXT:    pand %xmm0, %xmm4
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3]
+; X86-SSE41-NEXT:    por %xmm4, %xmm0
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
+; X86-SSE41-NEXT:    movapd %xmm1, %xmm0
+; X86-SSE41-NEXT:    xorpd %xmm3, %xmm0
+; X86-SSE41-NEXT:    xorpd %xmm2, %xmm3
+; X86-SSE41-NEXT:    movapd %xmm3, %xmm4
+; X86-SSE41-NEXT:    pcmpgtd %xmm0, %xmm4
+; X86-SSE41-NEXT:    pcmpeqd %xmm0, %xmm3
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[0,0,2,2]
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3]
+; X86-SSE41-NEXT:    pand %xmm0, %xmm3
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm4[1,1,3,3]
+; X86-SSE41-NEXT:    por %xmm3, %xmm0
+; X86-SSE41-NEXT:    blendvpd %xmm0, %xmm2, %xmm1
+; X86-SSE41-NEXT:    pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE41-NEXT:    por %xmm1, %xmm0
+; X86-SSE41-NEXT:    pextrd $1, %xmm0, %eax
+; X86-SSE41-NEXT:    notl %eax
+; X86-SSE41-NEXT:    shrl $31, %eax
+; X86-SSE41-NEXT:    xorl %edx, %edx
+; X86-SSE41-NEXT:    retl
+;
+; X86-SSE42-LABEL: reduce_umax_v8i64_signbit_not:
+; X86-SSE42:       # %bb.0:
+; X86-SSE42-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-SSE42-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-SSE42-NEXT:    movdqa 48(%ecx), %xmm2
+; X86-SSE42-NEXT:    movdqa 32(%ecx), %xmm3
+; X86-SSE42-NEXT:    movdqa (%ecx), %xmm4
+; X86-SSE42-NEXT:    movdqa 16(%ecx), %xmm5
+; X86-SSE42-NEXT:    pandn (%eax), %xmm4
+; X86-SSE42-NEXT:    pandn 32(%eax), %xmm3
+; X86-SSE42-NEXT:    pandn 16(%eax), %xmm5
+; X86-SSE42-NEXT:    pandn 48(%eax), %xmm2
+; X86-SSE42-NEXT:    movdqa {{.*#+}} xmm1 = [0,2147483648,0,2147483648]
+; X86-SSE42-NEXT:    movdqa %xmm2, %xmm6
+; X86-SSE42-NEXT:    pxor %xmm1, %xmm6
+; X86-SSE42-NEXT:    movdqa %xmm5, %xmm0
+; X86-SSE42-NEXT:    pxor %xmm1, %xmm0
+; X86-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
+; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm5, %xmm2
+; X86-SSE42-NEXT:    movapd %xmm2, %xmm5
+; X86-SSE42-NEXT:    xorpd %xmm1, %xmm5
+; X86-SSE42-NEXT:    movdqa %xmm3, %xmm6
+; X86-SSE42-NEXT:    pxor %xmm1, %xmm6
+; X86-SSE42-NEXT:    movdqa %xmm4, %xmm0
+; X86-SSE42-NEXT:    pxor %xmm1, %xmm0
+; X86-SSE42-NEXT:    pcmpgtq %xmm6, %xmm0
+; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm4, %xmm3
+; X86-SSE42-NEXT:    xorpd %xmm3, %xmm1
+; X86-SSE42-NEXT:    pcmpgtq %xmm5, %xmm1
+; X86-SSE42-NEXT:    movdqa %xmm1, %xmm0
+; X86-SSE42-NEXT:    blendvpd %xmm0, %xmm3, %xmm2
+; X86-SSE42-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3]
+; X86-SSE42-NEXT:    por %xmm2, %xmm0
+; X86-SSE42-NEXT:    pextrd $1, %xmm0, %eax
+; X86-SSE42-NEXT:    notl %eax
+; X86-SSE42-NEXT:    shrl $31, %eax
+; X86-SSE42-NEXT:    xorl %edx, %edx
+; X86-SSE42-NEXT:    retl
+;
+; X86-AVX1-LABEL: reduce_umax_v8i64_signbit_not:
+; X86-AVX1:       # %bb.0:
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX1-NEXT:    vmovaps (%ecx), %ymm0
+; X86-AVX1-NEXT:    vmovaps 32(%ecx), %ymm1
+; X86-AVX1-NEXT:    vandnps (%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT:    vandnps 32(%eax), %ymm1, %ymm1
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm1, %xmm2
+; X86-AVX1-NEXT:    vmovddup {{.*#+}} xmm3 = [0,2147483648,0,2147483648]
+; X86-AVX1-NEXT:    # xmm3 = mem[0,0]
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm2, %xmm4
+; X86-AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm5
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm5, %xmm6
+; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm6, %xmm4
+; X86-AVX1-NEXT:    vblendvpd %xmm4, %xmm5, %xmm2, %xmm2
+; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm2, %xmm4
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm1, %xmm5
+; X86-AVX1-NEXT:    vxorps %xmm3, %xmm0, %xmm6
+; X86-AVX1-NEXT:    vpcmpgtq %xmm5, %xmm6, %xmm5
+; X86-AVX1-NEXT:    vblendvpd %xmm5, %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT:    vxorpd %xmm3, %xmm0, %xmm1
+; X86-AVX1-NEXT:    vpcmpgtq %xmm4, %xmm1, %xmm1
+; X86-AVX1-NEXT:    vblendvpd %xmm1, %xmm0, %xmm2, %xmm0
+; X86-AVX1-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT:    vorpd %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT:    vextractps $1, %xmm0, %eax
+; X86-AVX1-NEXT:    notl %eax
+; X86-AVX1-NEXT:    shrl $31, %eax
+; X86-AVX1-NEXT:    xorl %edx, %edx
+; X86-AVX1-NEXT:    vzeroupper
+; X86-AVX1-NEXT:    retl
+;
+; X64-AVX-LABEL: reduce_umax_v8i64_signbit_not:
+; X64-AVX:       # %bb.0:
+; X64-AVX-NEXT:    vmovapd (%rdi), %ymm0
+; X64-AVX-NEXT:    vmovapd 32(%rdi), %ymm1
+; X64-AVX-NEXT:    vandnpd 32(%rsi), %ymm1, %ymm1
+; X64-AVX-NEXT:    vandnpd (%rsi), %ymm0, %ymm0
+; X64-AVX-NEXT:    vorpd %ymm1, %ymm0, %ymm0
+; X64-AVX-NEXT:    xorl %eax, %eax
+; X64-AVX-NEXT:    vtestpd %ymm0, %ymm0
+; X64-AVX-NEXT:    sete %al
+; X64-AVX-NEXT:    vzeroupper
+; X64-AVX-NEXT:    retq
+;
+; X86-AVX2-LABEL: reduce_umax_v8i64_signbit_not:
+; X86-AVX2:       # %bb.0:
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT:    movl {{[0-9]+}}(%esp), %ecx
+; X86-AVX2-NEXT:    vmovdqa (%ecx), %ymm0
+; X86-AVX2-NEXT:    vmovdqa 32(%ecx), %ymm1
+; X86-AVX2-NEXT:    vpandn (%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT:    vpandn 32(%eax), %ymm1, %ymm1
+; X86-AVX2-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [0,2147483648,0,2147483648,0,2147483648,0,2147483648]
+; X86-AVX2-NEXT:    vpxor %ymm2, %ymm1, %ymm3
+; X86-AVX2-NEXT:    vpxor %ymm2, %ymm0, %ymm4
+; X86-AVX2-NEXT:    vpcmpgtq %ymm3, %ymm4, %ymm3
+; X86-AVX2-NEXT:    vblendvpd %ymm3, %ymm0, %ymm1, %ymm0
+; X86-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm1, %xmm3
+; X86-AVX2-NEXT:    vxorpd %xmm2, %xmm0, %xmm2
+; X86-AVX2-NEXT:    vpcmpgtq %xmm3, %xmm2, %xmm2
+; X86-AVX2-NEXT:    vblendvpd %xmm2, %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT:    vorpd %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT:    vextractps $1, %xmm0, %eax
+; X86-AVX2-NEXT:    notl %eax
+; X86-AVX2-NEXT:    shrl $31, %eax
+; X86-AVX2-NEXT:    xorl %edx, %edx
+; X86-AVX2-NEXT:    vzeroupper
+; X86-AVX2-NEXT:    retl
+;
+; AVX512BW-LABEL: reduce_umax_v8i64_signbit_not:
+; AVX512BW:       # %bb.0:
+; AVX512BW-NEXT:    vmovdqa64 (%rdi), %zmm0
+; AVX512BW-NEXT:    vpandnq (%rsi), %zmm0, %zmm0
+; AVX512BW-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
+; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
+; AVX512BW-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BW-NEXT:    vpmaxuq %zmm1, %zmm0, %zmm0
+; AVX512BW-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512BW-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512BW-NEXT:    vmovq %xmm0, %rax
+; AVX512BW-NEXT:    notq %rax
+; AVX512BW-NEXT:    shrq $63, %rax
+; AVX512BW-NEXT:    vzeroupper
+; AVX512BW-NEXT:    retq
+;
+; AVX512BWVL-LABEL: reduce_umax_v8i64_signbit_not:
+; AVX512BWVL:       # %bb.0:
+; AVX512BWVL-NEXT:    vmovdqa64 (%rdi), %zmm0
+; AVX512BWVL-NEXT:    vpandnq (%rsi), %zmm0, %zmm0
+; AVX512BWVL-NEXT:    vextracti64x4 $1, %zmm0, %ymm1
+; AVX512BWVL-NEXT:    vpmaxuq %ymm1, %ymm0, %ymm0
+; AVX512BWVL-NEXT:    vextracti128 $1, %ymm0, %xmm1
+; AVX512BWVL-NEXT:    vpmaxuq %xmm1, %xmm0, %xmm0
+; AVX512BWVL-NEXT:    vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512BWVL-NEXT:    vpor %xmm1, %xmm0, %xmm0
+; AVX512BWVL-NEXT:    vmovq %xmm0, %rax
+; AVX512BWVL-NEXT:    notq %rax
+; AVX512BWVL-NEXT:    shrq $63, %rax
+; AVX512BWVL-NEXT:    vzeroupper
+; AVX512BWVL-NEXT:    retq
+  %a = load <8 x i64>, ptr %pa
+  %b = load <8 x i64>, ptr %pb
+  %a.not = xor <8 x i64> %a, splat (i64 -1)
+  %and = and <8 x i64> %b, %a.not
+  %rdx = call i64 @llvm.vector.reduce.umax.v8i64(<8 x i64> %and)
+  %cmp = icmp sgt i64 %rdx, -1
+  %res = zext i1 %cmp to i64
+  ret i64 %res
+}



More information about the llvm-commits mailing list