[llvm] [X86] vector-reduce-* - add 32-bit test coverage to the logic tests (PR #195627)
Simon Pilgrim via llvm-commits
llvm-commits at lists.llvm.org
Mon May 4 03:13:42 PDT 2026
https://github.com/RKSimon created https://github.com/llvm/llvm-project/pull/195627
None
>From 2ea246193a6854378821bbdd8740d16d097824e9 Mon Sep 17 00:00:00 2001
From: Simon Pilgrim <llvm-dev at redking.me.uk>
Date: Mon, 4 May 2026 11:12:56 +0100
Subject: [PATCH] [X86] vector-reduce-* - add 32-bit test coverage to the logic
tests
---
.../CodeGen/X86/vector-reduce-and-bool.ll | 2013 +++++++++++-----
.../test/CodeGen/X86/vector-reduce-and-cmp.ll | 1570 ++++++++----
.../CodeGen/X86/vector-reduce-and-scalar.ll | 1636 +++++++++----
llvm/test/CodeGen/X86/vector-reduce-and.ll | 845 +++++--
.../test/CodeGen/X86/vector-reduce-or-bool.ll | 1792 +++++++++-----
llvm/test/CodeGen/X86/vector-reduce-or-cmp.ll | 2124 ++++++++++++-----
llvm/test/CodeGen/X86/vector-reduce-or.ll | 845 +++++--
.../CodeGen/X86/vector-reduce-xor-bool.ll | 1592 +++++++-----
llvm/test/CodeGen/X86/vector-reduce-xor.ll | 845 +++++--
9 files changed, 9113 insertions(+), 4149 deletions(-)
diff --git a/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll b/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll
index 116dcdc8c5907..a9232e1341a22 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-and-bool.ll
@@ -1,12 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X86-SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X64-SSE,X64-SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE41
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; Truncate
@@ -21,17 +26,41 @@ define i1 @trunc_v2i64_v2i1(<2 x i64>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v2i64_v2i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setb %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v2i64_v2i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v2i64_v2i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v2i64_v2i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v2i64_v2i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v2i64_v2i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v2i64_v2i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v2i64_v2i1:
; AVX512F: # %bb.0:
@@ -65,17 +94,42 @@ define i1 @trunc_v4i32_v4i1(<4 x i32>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v4i32_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v4i32_v4i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setb %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v4i32_v4i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v4i32_v4i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v4i32_v4i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v4i32_v4i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v4i32_v4i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v4i32_v4i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v4i32_v4i1:
; AVX512F: # %bb.0:
@@ -110,17 +164,42 @@ define i1 @trunc_v8i16_v8i1(<8 x i16>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v8i16_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v8i16_v8i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setb %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v8i16_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v8i16_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v8i16_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v8i16_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v8i16_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [65537,65537,65537,65537]
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v8i16_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v8i16_v8i1:
; AVX512F: # %bb.0:
@@ -154,17 +233,42 @@ define i1 @trunc_v16i8_v16i1(<16 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v16i8_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v16i8_v16i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setb %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v16i8_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i8_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v16i8_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i8_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i8_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [16843009,16843009,16843009,16843009]
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i8_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v16i8_v16i1:
; AVX512F: # %bb.0:
@@ -199,27 +303,48 @@ define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v4i64_v4i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v4i64_v4i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v4i64_v4i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v4i64_v4i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v4i64_v4i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v4i64_v4i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v4i64_v4i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v4i64_v4i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v4i64_v4i1:
; AVX512: # %bb.0:
@@ -243,27 +368,49 @@ define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v8i32_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v8i32_v8i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v8i32_v8i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v8i32_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v8i32_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v8i32_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v8i32_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v8i32_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v8i32_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v8i32_v8i1:
; AVX512: # %bb.0:
@@ -288,27 +435,49 @@ define i1 @trunc_v16i16_v16i1(<16 x i16>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v16i16_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v16i16_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v16i16_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v16i16_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i16_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v16i16_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i16_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i16_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65537,65537,65537,65537,65537,65537,65537,65537]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i16_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v16i16_v16i1:
; AVX512: # %bb.0:
@@ -332,27 +501,49 @@ define i1 @trunc_v32i8_v32i1(<32 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v32i8_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v32i8_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v32i8_v32i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v32i8_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v32i8_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v32i8_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v32i8_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v32i8_v32i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [16843009,16843009,16843009,16843009,16843009,16843009,16843009,16843009]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v32i8_v32i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v32i8_v32i1:
; AVX512: # %bb.0:
@@ -405,31 +596,62 @@ define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v8i64_v8i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v8i64_v8i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v8i64_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v8i64_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v8i64_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v8i64_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v8i64_v8i1:
; AVX512: # %bb.0:
@@ -474,31 +696,63 @@ define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v16i32_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v16i32_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v16i32_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v16i32_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i32_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v16i32_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i32_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i32_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i32_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v16i32_v16i1:
; AVX512: # %bb.0:
@@ -543,31 +797,63 @@ define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v32i16_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v32i16_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v32i16_v32i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v32i16_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v32i16_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v32i16_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v32i16_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v32i16_v32i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65537,65537,65537,65537,65537,65537,65537,65537]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v32i16_v32i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v32i16_v32i1:
; AVX512F: # %bb.0:
@@ -632,31 +918,63 @@ define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v64i8_v64i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v64i8_v64i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v64i8_v64i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v64i8_v64i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v64i8_v64i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v64i8_v64i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v64i8_v64i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v64i8_v64i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [16843009,16843009,16843009,16843009,16843009,16843009,16843009,16843009]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v64i8_v64i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v64i8_v64i1:
; AVX512F: # %bb.0:
@@ -706,17 +1024,17 @@ define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v2i64_v2i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v2i64_v2i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <2 x i64> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %a)
ret i1 %b
@@ -732,17 +1050,17 @@ define i1 @icmp0_v4i32_v4i1(<4 x i32>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v4i32_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v4i32_v4i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v4i32_v4i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <4 x i32> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
ret i1 %b
@@ -758,17 +1076,17 @@ define i1 @icmp0_v8i16_v8i1(<8 x i16>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v8i16_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v8i16_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v8i16_v8i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <8 x i16> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
ret i1 %b
@@ -784,17 +1102,17 @@ define i1 @icmp0_v16i8_v16i1(<16 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v16i8_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v16i8_v16i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v16i8_v16i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <16 x i8> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
ret i1 %b
@@ -811,19 +1129,19 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v4i64_v4i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v4i64_v4i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <4 x i64> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
ret i1 %b
@@ -840,19 +1158,19 @@ define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v8i32_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v8i32_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v8i32_v8i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <8 x i32> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
ret i1 %b
@@ -869,19 +1187,19 @@ define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v16i16_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v16i16_v16i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v16i16_v16i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <16 x i16> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
ret i1 %b
@@ -898,19 +1216,19 @@ define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v32i8_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v32i8_v32i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp0_v32i8_v32i1:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <32 x i8> %0, zeroinitializer
%b = call i1 @llvm.vector.reduce.and.v32i1(<32 x i1> %a)
ret i1 %b
@@ -947,14 +1265,29 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp0_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp0_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp0_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp0_v8i64_v8i1:
; AVX1: # %bb.0:
@@ -962,7 +1295,7 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v8i64_v8i1:
; AVX2: # %bb.0:
@@ -970,7 +1303,7 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp0_v8i64_v8i1:
; AVX512: # %bb.0:
@@ -1015,14 +1348,29 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp0_v16i32_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp0_v16i32_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp0_v16i32_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp0_v16i32_v16i1:
; AVX1: # %bb.0:
@@ -1030,7 +1378,7 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v16i32_v16i1:
; AVX2: # %bb.0:
@@ -1038,7 +1386,7 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp0_v16i32_v16i1:
; AVX512: # %bb.0:
@@ -1083,14 +1431,29 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp0_v32i16_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp0_v32i16_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp0_v32i16_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp0_v32i16_v32i1:
; AVX1: # %bb.0:
@@ -1098,7 +1461,7 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v32i16_v32i1:
; AVX2: # %bb.0:
@@ -1106,7 +1469,7 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp0_v32i16_v32i1:
; AVX512: # %bb.0:
@@ -1151,14 +1514,29 @@ define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp0_v64i8_v64i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp0_v64i8_v64i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp0_v64i8_v64i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp0_v64i8_v64i1:
; AVX1: # %bb.0:
@@ -1166,7 +1544,7 @@ define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v64i8_v64i1:
; AVX2: # %bb.0:
@@ -1174,7 +1552,7 @@ define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp0_v64i8_v64i1:
; AVX512: # %bb.0:
@@ -1198,14 +1576,14 @@ define i8 @icmp0_v8i1(<8 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
-; SSE41-NEXT: psllw $15, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: testl $43690, %eax # imm = 0xAAAA
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE4-NEXT: psllw $15, %xmm0
+; SSE4-NEXT: pmovmskb %xmm0, %eax
+; SSE4-NEXT: testl $43690, %eax # imm = 0xAAAA
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1OR2-LABEL: icmp0_v8i1:
; AVX1OR2: # %bb.0:
@@ -1214,7 +1592,7 @@ define i8 @icmp0_v8i1(<8 x i8>) nounwind {
; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
; AVX1OR2-NEXT: testl $43690, %eax # imm = 0xAAAA
; AVX1OR2-NEXT: sete %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v8i1:
; AVX512F: # %bb.0:
@@ -1265,19 +1643,19 @@ define i1 @icmp1_v2i64_v2i1(<2 x i64>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v2i64_v2i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp1_v2i64_v2i1:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <2 x i64> %0, <i64 -1, i64 -1>
%b = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %a)
ret i1 %b
@@ -1293,19 +1671,19 @@ define i1 @icmp1_v4i32_v4i1(<4 x i32>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v4i32_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v4i32_v4i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp1_v4i32_v4i1:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <4 x i32> %0, <i32 -1, i32 -1, i32 -1, i32 -1>
%b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
ret i1 %b
@@ -1321,19 +1699,19 @@ define i1 @icmp1_v8i16_v8i1(<8 x i16>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v8i16_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v8i16_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp1_v8i16_v8i1:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <8 x i16> %0, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>
%b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
ret i1 %b
@@ -1349,19 +1727,19 @@ define i1 @icmp1_v16i8_v16i1(<16 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v16i8_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v16i8_v16i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp1_v16i8_v16i1:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <16 x i8> %0, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1>
%b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
ret i1 %b
@@ -1378,13 +1756,13 @@ define i1 @icmp1_v4i64_v4i1(<4 x i64>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v4i64_v4i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: icmp1_v4i64_v4i1:
; AVX1: # %bb.0:
@@ -1393,7 +1771,7 @@ define i1 @icmp1_v4i64_v4i1(<4 x i64>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v4i64_v4i1:
; AVX2: # %bb.0:
@@ -1401,7 +1779,7 @@ define i1 @icmp1_v4i64_v4i1(<4 x i64>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v4i64_v4i1:
; AVX512: # %bb.0:
@@ -1426,13 +1804,13 @@ define i1 @icmp1_v8i32_v8i1(<8 x i32>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v8i32_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v8i32_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: icmp1_v8i32_v8i1:
; AVX1: # %bb.0:
@@ -1441,7 +1819,7 @@ define i1 @icmp1_v8i32_v8i1(<8 x i32>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v8i32_v8i1:
; AVX2: # %bb.0:
@@ -1449,7 +1827,7 @@ define i1 @icmp1_v8i32_v8i1(<8 x i32>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v8i32_v8i1:
; AVX512: # %bb.0:
@@ -1474,13 +1852,13 @@ define i1 @icmp1_v16i16_v16i1(<16 x i16>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v16i16_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v16i16_v16i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: icmp1_v16i16_v16i1:
; AVX1: # %bb.0:
@@ -1489,7 +1867,7 @@ define i1 @icmp1_v16i16_v16i1(<16 x i16>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v16i16_v16i1:
; AVX2: # %bb.0:
@@ -1497,7 +1875,7 @@ define i1 @icmp1_v16i16_v16i1(<16 x i16>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v16i16_v16i1:
; AVX512: # %bb.0:
@@ -1522,13 +1900,13 @@ define i1 @icmp1_v32i8_v32i1(<32 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v32i8_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v32i8_v32i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: icmp1_v32i8_v32i1:
; AVX1: # %bb.0:
@@ -1537,7 +1915,7 @@ define i1 @icmp1_v32i8_v32i1(<32 x i8>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v32i8_v32i1:
; AVX2: # %bb.0:
@@ -1545,7 +1923,7 @@ define i1 @icmp1_v32i8_v32i1(<32 x i8>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v32i8_v32i1:
; AVX512: # %bb.0:
@@ -1590,15 +1968,31 @@ define i1 @icmp1_v8i64_v8i1(<8 x i64>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp1_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp1_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp1_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp1_v8i64_v8i1:
; AVX1: # %bb.0:
@@ -1608,7 +2002,7 @@ define i1 @icmp1_v8i64_v8i1(<8 x i64>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v8i64_v8i1:
; AVX2: # %bb.0:
@@ -1617,7 +2011,7 @@ define i1 @icmp1_v8i64_v8i1(<8 x i64>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v8i64_v8i1:
; AVX512: # %bb.0:
@@ -1663,15 +2057,31 @@ define i1 @icmp1_v16i32_v16i1(<16 x i32>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp1_v16i32_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp1_v16i32_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp1_v16i32_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp1_v16i32_v16i1:
; AVX1: # %bb.0:
@@ -1681,7 +2091,7 @@ define i1 @icmp1_v16i32_v16i1(<16 x i32>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v16i32_v16i1:
; AVX2: # %bb.0:
@@ -1690,7 +2100,7 @@ define i1 @icmp1_v16i32_v16i1(<16 x i32>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v16i32_v16i1:
; AVX512: # %bb.0:
@@ -1736,15 +2146,31 @@ define i1 @icmp1_v32i16_v32i1(<32 x i16>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp1_v32i16_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp1_v32i16_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp1_v32i16_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp1_v32i16_v32i1:
; AVX1: # %bb.0:
@@ -1754,7 +2180,7 @@ define i1 @icmp1_v32i16_v32i1(<32 x i16>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v32i16_v32i1:
; AVX2: # %bb.0:
@@ -1763,7 +2189,7 @@ define i1 @icmp1_v32i16_v32i1(<32 x i16>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v32i16_v32i1:
; AVX512: # %bb.0:
@@ -1809,15 +2235,31 @@ define i1 @icmp1_v64i8_v64i1(<64 x i8>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp1_v64i8_v64i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp1_v64i8_v64i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp1_v64i8_v64i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp1_v64i8_v64i1:
; AVX1: # %bb.0:
@@ -1827,7 +2269,7 @@ define i1 @icmp1_v64i8_v64i1(<64 x i8>) nounwind {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp1_v64i8_v64i1:
; AVX2: # %bb.0:
@@ -1836,7 +2278,7 @@ define i1 @icmp1_v64i8_v64i1(<64 x i8>) nounwind {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp1_v64i8_v64i1:
; AVX512: # %bb.0:
@@ -1862,15 +2304,15 @@ define i8 @icmp1_v8i1(<8 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp1_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
-; SSE41-NEXT: psllw $15, %xmm0
-; SSE41-NEXT: packsswb %xmm0, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: cmpb $-1, %al
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp1_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pmovzxbw {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
+; SSE4-NEXT: psllw $15, %xmm0
+; SSE4-NEXT: packsswb %xmm0, %xmm0
+; SSE4-NEXT: pmovmskb %xmm0, %eax
+; SSE4-NEXT: cmpb $-1, %al
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1OR2-LABEL: icmp1_v8i1:
; AVX1OR2: # %bb.0:
@@ -1880,7 +2322,7 @@ define i8 @icmp1_v8i1(<8 x i8>) nounwind {
; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
; AVX1OR2-NEXT: cmpb $-1, %al
; AVX1OR2-NEXT: sete %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp1_v8i1:
; AVX512F: # %bb.0:
@@ -1930,19 +2372,19 @@ define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp_v2i64_v2i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp_v2i64_v2i1:
; AVX: # %bb.0:
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <2 x i64> %0, %1
%b = call i1 @llvm.vector.reduce.and.v2i1(<2 x i1> %a)
ret i1 %b
@@ -1957,19 +2399,19 @@ define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp_v4i32_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp_v4i32_v4i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp_v4i32_v4i1:
; AVX: # %bb.0:
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <4 x i32> %0, %1
%b = call i1 @llvm.vector.reduce.and.v4i1(<4 x i1> %a)
ret i1 %b
@@ -1984,19 +2426,19 @@ define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp_v8i16_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp_v8i16_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp_v8i16_v8i1:
; AVX: # %bb.0:
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <8 x i16> %0, %1
%b = call i1 @llvm.vector.reduce.and.v8i1(<8 x i1> %a)
ret i1 %b
@@ -2011,19 +2453,19 @@ define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) nounwind {
; SSE2-NEXT: sete %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp_v16i8_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp_v16i8_v16i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: icmp_v16i8_v16i1:
; AVX: # %bb.0:
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = icmp eq <16 x i8> %0, %1
%b = call i1 @llvm.vector.reduce.and.v16i1(<16 x i1> %a)
ret i1 %b
@@ -2056,14 +2498,29 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp_v4i64_v4i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm2, %xmm0
+; X86-SSE4-NEXT: pxor 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v4i64_v4i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp_v4i64_v4i1:
; AVX1: # %bb.0:
@@ -2071,7 +2528,7 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v4i64_v4i1:
; AVX2: # %bb.0:
@@ -2079,7 +2536,7 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp_v4i64_v4i1:
; AVX512: # %bb.0:
@@ -2120,14 +2577,29 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v8i32_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp_v8i32_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm2, %xmm0
+; X86-SSE4-NEXT: pxor 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v8i32_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp_v8i32_v8i1:
; AVX1: # %bb.0:
@@ -2135,7 +2607,7 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v8i32_v8i1:
; AVX2: # %bb.0:
@@ -2143,7 +2615,7 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp_v8i32_v8i1:
; AVX512: # %bb.0:
@@ -2184,14 +2656,29 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v16i16_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp_v16i16_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm2, %xmm0
+; X86-SSE4-NEXT: pxor 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v16i16_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp_v16i16_v16i1:
; AVX1: # %bb.0:
@@ -2199,7 +2686,7 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v16i16_v16i1:
; AVX2: # %bb.0:
@@ -2207,7 +2694,7 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp_v16i16_v16i1:
; AVX512: # %bb.0:
@@ -2248,14 +2735,29 @@ define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v32i8_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp_v32i8_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm2, %xmm0
+; X86-SSE4-NEXT: pxor 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v32i8_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp_v32i8_v32i1:
; AVX1: # %bb.0:
@@ -2263,7 +2765,7 @@ define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v32i8_v32i1:
; AVX2: # %bb.0:
@@ -2271,7 +2773,7 @@ define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp_v32i8_v32i1:
; AVX512: # %bb.0:
@@ -2321,38 +2823,90 @@ define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm7, %xmm3
-; SSE41-NEXT: pxor %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm6, %xmm2
-; SSE41-NEXT: pxor %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: icmp_v8i64_v8i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v8i64_v8i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: icmp_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: pxor 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pxor 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm7, %xmm3
+; X64-SSE4-NEXT: pxor %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm6, %xmm2
+; X64-SSE4-NEXT: pxor %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: icmp_v8i64_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v8i64_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v8i64_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v8i64_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: icmp_v8i64_v8i1:
; AVX512: # %bb.0:
@@ -2402,38 +2956,90 @@ define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v16i32_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm7, %xmm3
-; SSE41-NEXT: pxor %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm6, %xmm2
-; SSE41-NEXT: pxor %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: icmp_v16i32_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v16i32_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: icmp_v16i32_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: pxor 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pxor 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v16i32_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm7, %xmm3
+; X64-SSE4-NEXT: pxor %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm6, %xmm2
+; X64-SSE4-NEXT: pxor %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: icmp_v16i32_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v16i32_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v16i32_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v16i32_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: icmp_v16i32_v16i1:
; AVX512: # %bb.0:
@@ -2483,38 +3089,90 @@ define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v32i16_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm7, %xmm3
-; SSE41-NEXT: pxor %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm6, %xmm2
-; SSE41-NEXT: pxor %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: icmp_v32i16_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v32i16_v32i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: icmp_v32i16_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: pxor 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pxor 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v32i16_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm7, %xmm3
+; X64-SSE4-NEXT: pxor %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm6, %xmm2
+; X64-SSE4-NEXT: pxor %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: icmp_v32i16_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v32i16_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v32i16_v32i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v32i16_v32i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: icmp_v32i16_v32i1:
; AVX512: # %bb.0:
@@ -2564,38 +3222,90 @@ define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {
; X64-SSE2-NEXT: sete %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v64i8_v64i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm7, %xmm3
-; SSE41-NEXT: pxor %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: pxor %xmm6, %xmm2
-; SSE41-NEXT: pxor %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: icmp_v64i8_v64i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v64i8_v64i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: icmp_v64i8_v64i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: pxor 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pxor 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v64i8_v64i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm7, %xmm3
+; X64-SSE4-NEXT: pxor %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: pxor %xmm6, %xmm2
+; X64-SSE4-NEXT: pxor %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: icmp_v64i8_v64i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v64i8_v64i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v64i8_v64i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v64i8_v64i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: icmp_v64i8_v64i1:
; AVX512: # %bb.0:
@@ -2618,3 +3328,4 @@ declare i1 @llvm.vector.reduce.and.v64i1(<64 x i1>)
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; SSE: {{.*}}
; X64-SSE: {{.*}}
+; X86-SSE: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll b/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll
index 57ab56b6494b5..486c58044daad 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-and-cmp.ll
@@ -1,11 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; vXi64
@@ -19,21 +25,21 @@ define i1 @test_v2i64(<2 x i64> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v2i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v2i64:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v2i64:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a0)
%2 = icmp eq i64 %1, -1
ret i1 %2
@@ -48,15 +54,15 @@ define i1 @test_v4i64(<4 x i64> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v4i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v4i64:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setae %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: test_v4i64:
; AVX1: # %bb.0:
@@ -65,7 +71,7 @@ define i1 @test_v4i64(<4 x i64> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setae %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v4i64:
; AVX2: # %bb.0:
@@ -73,7 +79,7 @@ define i1 @test_v4i64(<4 x i64> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setae %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v4i64:
; AVX512: # %bb.0:
@@ -88,27 +94,69 @@ define i1 @test_v4i64(<4 x i64> %a0) {
}
define i1 @test_v8i64(<8 x i64> %a0) {
-; SSE2-LABEL: test_v8i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v8i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v8i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
+; X86-SSE2-NEXT: movmskps %xmm0, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v8i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v8i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v8i64:
; AVX1: # %bb.0:
@@ -118,7 +166,7 @@ define i1 @test_v8i64(<8 x i64> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v8i64:
; AVX2: # %bb.0:
@@ -127,7 +175,7 @@ define i1 @test_v8i64(<8 x i64> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v8i64:
; AVX512: # %bb.0:
@@ -143,58 +191,153 @@ define i1 @test_v8i64(<8 x i64> %a0) {
}
define i1 @test_v16i64(<16 x i64> %a0) {
-; SSE2-LABEL: test_v16i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm7, %xmm3
-; SSE2-NEXT: pand %xmm5, %xmm1
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm6, %xmm2
-; SSE2-NEXT: pand %xmm4, %xmm0
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm7, %xmm3
-; SSE41-NEXT: pand %xmm5, %xmm1
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm6, %xmm2
-; SSE41-NEXT: pand %xmm4, %xmm0
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v16i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setae %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setae %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v16i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm3, %xmm1
+; X86-SSE2-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE2-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm7, %xmm3
+; X64-SSE2-NEXT: pand %xmm5, %xmm1
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm6, %xmm2
+; X64-SSE2-NEXT: pand %xmm4, %xmm0
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm3, %xmm1
+; X86-SSE4-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setae %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm7, %xmm3
+; X64-SSE4-NEXT: pand %xmm5, %xmm1
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm6, %xmm2
+; X64-SSE4-NEXT: pand %xmm4, %xmm0
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setae %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v16i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setae %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setae %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setae %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setae %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i64:
; AVX512: # %bb.0:
@@ -215,19 +358,74 @@ define i1 @test_v16i64(<16 x i64> %a0) {
;
define i1 @test_v2i32(<2 x i32> %a0) {
-; SSE-LABEL: test_v2i32:
-; SSE: # %bb.0:
-; SSE-NEXT: movq %xmm0, %rax
-; SSE-NEXT: cmpq $-1, %rax
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v2i32:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: cmpq $-1, %rax
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v2i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: movd %xmm0, %ecx
+; X86-SSE2-NEXT: notl %ecx
+; X86-SSE2-NEXT: notl %eax
+; X86-SSE2-NEXT: orl %ecx, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE-LABEL: test_v2i32:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: movq %xmm0, %rax
+; X64-SSE-NEXT: cmpq $-1, %rax
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v2i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %ecx
+; X86-SSE4-NEXT: notl %ecx
+; X86-SSE4-NEXT: notl %eax
+; X86-SSE4-NEXT: orl %ecx, %eax
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v2i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT: notl %ecx
+; X86-AVX1-NEXT: notl %eax
+; X86-AVX1-NEXT: orl %ecx, %eax
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: cmpq $-1, %rax
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT: notl %ecx
+; X86-AVX2-NEXT: notl %eax
+; X86-AVX2-NEXT: orl %ecx, %eax
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: cmpq $-1, %rax
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: cmpq $-1, %rax
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%1 = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %a0)
%2 = icmp eq i32 %1, -1
ret i1 %2
@@ -241,21 +439,21 @@ define i1 @test_v4i32(<4 x i32> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v4i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v4i32:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setae %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v4i32:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setae %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a0)
%2 = icmp ne i32 %1, -1
ret i1 %2
@@ -270,15 +468,15 @@ define i1 @test_v8i32(<8 x i32> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v8i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v8i32:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: test_v8i32:
; AVX1: # %bb.0:
@@ -287,7 +485,7 @@ define i1 @test_v8i32(<8 x i32> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v8i32:
; AVX2: # %bb.0:
@@ -295,7 +493,7 @@ define i1 @test_v8i32(<8 x i32> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v8i32:
; AVX512: # %bb.0:
@@ -310,27 +508,69 @@ define i1 @test_v8i32(<8 x i32> %a0) {
}
define i1 @test_v16i32(<16 x i32> %a0) {
-; SSE2-LABEL: test_v16i32:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v16i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
+; X86-SSE2-NEXT: movmskps %xmm0, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i32:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setae %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setae %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v16i32:
; AVX1: # %bb.0:
@@ -340,7 +580,7 @@ define i1 @test_v16i32(<16 x i32> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setae %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i32:
; AVX2: # %bb.0:
@@ -349,7 +589,7 @@ define i1 @test_v16i32(<16 x i32> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setae %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i32:
; AVX512: # %bb.0:
@@ -365,58 +605,153 @@ define i1 @test_v16i32(<16 x i32> %a0) {
}
define i1 @test_v32i32(<32 x i32> %a0) {
-; SSE2-LABEL: test_v32i32:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm7, %xmm3
-; SSE2-NEXT: pand %xmm5, %xmm1
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm6, %xmm2
-; SSE2-NEXT: pand %xmm4, %xmm0
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v32i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm7, %xmm3
-; SSE41-NEXT: pand %xmm5, %xmm1
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm6, %xmm2
-; SSE41-NEXT: pand %xmm4, %xmm0
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v32i32:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v32i32:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v32i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm3, %xmm1
+; X86-SSE2-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE2-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v32i32:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm7, %xmm3
+; X64-SSE2-NEXT: pand %xmm5, %xmm1
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm6, %xmm2
+; X64-SSE2-NEXT: pand %xmm4, %xmm0
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v32i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm3, %xmm1
+; X86-SSE4-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v32i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm7, %xmm3
+; X64-SSE4-NEXT: pand %xmm5, %xmm1
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm6, %xmm2
+; X64-SSE4-NEXT: pand %xmm4, %xmm0
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v32i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v32i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v32i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v32i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v32i32:
; AVX512: # %bb.0:
@@ -442,33 +777,88 @@ define i1 @test_v2i16(<2 x i16> %a0) {
; SSE-NEXT: movd %xmm0, %eax
; SSE-NEXT: cmpl $-1, %eax
; SSE-NEXT: sete %al
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v2i16:
; AVX: # %bb.0:
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: cmpl $-1, %eax
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %a0)
%2 = icmp eq i16 %1, -1
ret i1 %2
}
define i1 @test_v4i16(<4 x i16> %a0) {
-; SSE-LABEL: test_v4i16:
-; SSE: # %bb.0:
-; SSE-NEXT: movq %xmm0, %rax
-; SSE-NEXT: cmpq $-1, %rax
-; SSE-NEXT: setne %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v4i16:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: cmpq $-1, %rax
-; AVX-NEXT: setne %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v4i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: movd %xmm0, %ecx
+; X86-SSE2-NEXT: notl %ecx
+; X86-SSE2-NEXT: notl %eax
+; X86-SSE2-NEXT: orl %ecx, %eax
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE-LABEL: test_v4i16:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: movq %xmm0, %rax
+; X64-SSE-NEXT: cmpq $-1, %rax
+; X64-SSE-NEXT: setne %al
+; X64-SSE-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v4i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %ecx
+; X86-SSE4-NEXT: notl %ecx
+; X86-SSE4-NEXT: notl %eax
+; X86-SSE4-NEXT: orl %ecx, %eax
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v4i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT: notl %ecx
+; X86-AVX1-NEXT: notl %eax
+; X86-AVX1-NEXT: orl %ecx, %eax
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: cmpq $-1, %rax
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT: notl %ecx
+; X86-AVX2-NEXT: notl %eax
+; X86-AVX2-NEXT: orl %ecx, %eax
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: cmpq $-1, %rax
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v4i16:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: cmpq $-1, %rax
+; AVX512-NEXT: setne %al
+; AVX512-NEXT: retq
%1 = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %a0)
%2 = icmp ne i16 %1, -1
ret i1 %2
@@ -482,21 +872,21 @@ define i1 @test_v8i16(<8 x i16> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v8i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v8i16:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v8i16:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a0)
%2 = icmp eq i16 %1, -1
ret i1 %2
@@ -511,15 +901,15 @@ define i1 @test_v16i16(<16 x i16> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v16i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v16i16:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setae %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: test_v16i16:
; AVX1: # %bb.0:
@@ -528,7 +918,7 @@ define i1 @test_v16i16(<16 x i16> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setae %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i16:
; AVX2: # %bb.0:
@@ -536,7 +926,7 @@ define i1 @test_v16i16(<16 x i16> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setae %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i16:
; AVX512: # %bb.0:
@@ -551,27 +941,69 @@ define i1 @test_v16i16(<16 x i16> %a0) {
}
define i1 @test_v32i16(<32 x i16> %a0) {
-; SSE2-LABEL: test_v32i16:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v32i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v32i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
+; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v32i16:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v32i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v32i16:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v32i16:
; AVX1: # %bb.0:
@@ -581,7 +1013,7 @@ define i1 @test_v32i16(<32 x i16> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i16:
; AVX2: # %bb.0:
@@ -590,7 +1022,7 @@ define i1 @test_v32i16(<32 x i16> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i16:
; AVX512: # %bb.0:
@@ -606,58 +1038,153 @@ define i1 @test_v32i16(<32 x i16> %a0) {
}
define i1 @test_v64i16(<64 x i16> %a0) {
-; SSE2-LABEL: test_v64i16:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm7, %xmm3
-; SSE2-NEXT: pand %xmm5, %xmm1
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm6, %xmm2
-; SSE2-NEXT: pand %xmm4, %xmm0
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v64i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm7, %xmm3
-; SSE41-NEXT: pand %xmm5, %xmm1
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm6, %xmm2
-; SSE41-NEXT: pand %xmm4, %xmm0
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v64i16:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setae %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v64i16:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setae %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v64i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm3, %xmm1
+; X86-SSE2-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE2-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v64i16:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm7, %xmm3
+; X64-SSE2-NEXT: pand %xmm5, %xmm1
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm6, %xmm2
+; X64-SSE2-NEXT: pand %xmm4, %xmm0
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v64i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm3, %xmm1
+; X86-SSE4-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setae %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v64i16:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm7, %xmm3
+; X64-SSE4-NEXT: pand %xmm5, %xmm1
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm6, %xmm2
+; X64-SSE4-NEXT: pand %xmm4, %xmm0
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setae %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v64i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setae %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v64i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setae %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v64i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setae %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v64i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setae %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v64i16:
; AVX512: # %bb.0:
@@ -683,14 +1210,14 @@ define i1 @test_v2i8(<2 x i8> %a0) {
; SSE-NEXT: movd %xmm0, %eax
; SSE-NEXT: cmpw $-1, %ax
; SSE-NEXT: sete %al
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v2i8:
; AVX: # %bb.0:
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: cmpw $-1, %ax
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %a0)
%2 = icmp eq i8 %1, -1
ret i1 %2
@@ -702,33 +1229,88 @@ define i1 @test_v4i8(<4 x i8> %a0) {
; SSE-NEXT: movd %xmm0, %eax
; SSE-NEXT: cmpl $-1, %eax
; SSE-NEXT: setne %al
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v4i8:
; AVX: # %bb.0:
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: cmpl $-1, %eax
; AVX-NEXT: setne %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %a0)
%2 = icmp ne i8 %1, -1
ret i1 %2
}
define i1 @test_v8i8(<8 x i8> %a0) {
-; SSE-LABEL: test_v8i8:
-; SSE: # %bb.0:
-; SSE-NEXT: movq %xmm0, %rax
-; SSE-NEXT: cmpq $-1, %rax
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v8i8:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: cmpq $-1, %rax
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v8i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: movd %xmm0, %ecx
+; X86-SSE2-NEXT: notl %ecx
+; X86-SSE2-NEXT: notl %eax
+; X86-SSE2-NEXT: orl %ecx, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE-LABEL: test_v8i8:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: movq %xmm0, %rax
+; X64-SSE-NEXT: cmpq $-1, %rax
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v8i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %ecx
+; X86-SSE4-NEXT: notl %ecx
+; X86-SSE4-NEXT: notl %eax
+; X86-SSE4-NEXT: orl %ecx, %eax
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v8i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %ecx
+; X86-AVX1-NEXT: notl %ecx
+; X86-AVX1-NEXT: notl %eax
+; X86-AVX1-NEXT: orl %ecx, %eax
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: cmpq $-1, %rax
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %ecx
+; X86-AVX2-NEXT: notl %ecx
+; X86-AVX2-NEXT: notl %eax
+; X86-AVX2-NEXT: orl %ecx, %eax
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: cmpq $-1, %rax
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v8i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: cmpq $-1, %rax
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%1 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %a0)
%2 = icmp eq i8 %1, -1
ret i1 %2
@@ -742,21 +1324,21 @@ define i1 @test_v16i8(<16 x i8> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v16i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v16i8:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setae %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v16i8:
; AVX: # %bb.0:
; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; AVX-NEXT: vptest %xmm1, %xmm0
; AVX-NEXT: setae %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a0)
%2 = icmp ne i8 %1, -1
ret i1 %2
@@ -771,15 +1353,15 @@ define i1 @test_v32i8(<32 x i8> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v32i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v32i8:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pand %xmm1, %xmm0
+; SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; SSE4-NEXT: ptest %xmm1, %xmm0
+; SSE4-NEXT: setb %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: test_v32i8:
; AVX1: # %bb.0:
@@ -788,7 +1370,7 @@ define i1 @test_v32i8(<32 x i8> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setb %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i8:
; AVX2: # %bb.0:
@@ -796,7 +1378,7 @@ define i1 @test_v32i8(<32 x i8> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setb %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i8:
; AVX512: # %bb.0:
@@ -811,27 +1393,69 @@ define i1 @test_v32i8(<32 x i8> %a0) {
}
define i1 @test_v64i8(<64 x i8> %a0) {
-; SSE2-LABEL: test_v64i8:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v64i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setae %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v64i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
+; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v64i8:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v64i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm1
+; X86-SSE4-NEXT: setae %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v64i8:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setae %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v64i8:
; AVX1: # %bb.0:
@@ -841,7 +1465,7 @@ define i1 @test_v64i8(<64 x i8> %a0) {
; AVX1-NEXT: vptest %ymm1, %ymm0
; AVX1-NEXT: setae %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v64i8:
; AVX2: # %bb.0:
@@ -850,7 +1474,7 @@ define i1 @test_v64i8(<64 x i8> %a0) {
; AVX2-NEXT: vptest %ymm1, %ymm0
; AVX2-NEXT: setae %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v64i8:
; AVX512: # %bb.0:
@@ -866,58 +1490,153 @@ define i1 @test_v64i8(<64 x i8> %a0) {
}
define i1 @test_v128i8(<128 x i8> %a0) {
-; SSE2-LABEL: test_v128i8:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pand %xmm7, %xmm3
-; SSE2-NEXT: pand %xmm5, %xmm1
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand %xmm6, %xmm2
-; SSE2-NEXT: pand %xmm4, %xmm0
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v128i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pand %xmm7, %xmm3
-; SSE41-NEXT: pand %xmm5, %xmm1
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand %xmm6, %xmm2
-; SSE41-NEXT: pand %xmm4, %xmm0
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v128i8:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v128i8:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v128i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm3, %xmm1
+; X86-SSE2-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE2-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v128i8:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pand %xmm7, %xmm3
+; X64-SSE2-NEXT: pand %xmm5, %xmm1
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand %xmm6, %xmm2
+; X64-SSE2-NEXT: pand %xmm4, %xmm0
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v128i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm3, %xmm1
+; X86-SSE4-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v128i8:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pand %xmm7, %xmm3
+; X64-SSE4-NEXT: pand %xmm5, %xmm1
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand %xmm6, %xmm2
+; X64-SSE4-NEXT: pand %xmm4, %xmm0
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v128i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v128i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v128i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v128i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v128i8:
; AVX512: # %bb.0:
@@ -961,5 +1680,6 @@ declare i8 @llvm.vector.reduce.and.v128i8(<128 x i8>)
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; AVX1OR2: {{.*}}
; AVX512BW: {{.*}}
-; AVX512BWVL: {{.*}}
; AVX512F: {{.*}}
+; AVX512VL: {{.*}}
+; X86-SSE: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll b/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll
index 5317f7ccc588b..f412f719f9e6f 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-and-scalar.ll
@@ -1,41 +1,100 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; vXi64
;
define i1 @test_v2i64(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v2i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
-; SSE2-NEXT: pcmpeqd (%rdi), %xmm0
-; SSE2-NEXT: movmskps %xmm0, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v2i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX-LABEL: test_v2i64:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovdqa (%rdi), %xmm0
-; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vptest %xmm1, %xmm0
-; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v2i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqd (%eax), %xmm0
+; X86-SSE2-NEXT: movmskps %xmm0, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v2i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X64-SSE2-NEXT: pcmpeqd (%rdi), %xmm0
+; X64-SSE2-NEXT: movmskps %xmm0, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v2i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v2i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vptest %xmm1, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vptest %xmm1, %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX2-NEXT: vptest %xmm1, %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovdqa (%rdi), %xmm0
+; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vptest %xmm1, %xmm0
+; AVX512-NEXT: setb %al
+; AVX512-NEXT: retq
%vload = load <2 x i64>, ptr %ptr
%v0 = extractelement <2 x i64> %vload, i32 0
%v1 = extractelement <2 x i64> %vload, i32 1
@@ -45,44 +104,87 @@ define i1 @test_v2i64(ptr %ptr) nounwind {
}
define i1 @test_v4i64(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v4i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movdqa (%rdi), %xmm0
-; SSE2-NEXT: pand 16(%rdi), %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v4i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: pand 16(%rdi), %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v4i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vmovdqa (%rdi), %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v4i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vmovdqa (%rdi), %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v4i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: movdqa (%eax), %xmm0
+; X86-SSE2-NEXT: pand 16(%eax), %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v4i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT: pand 16(%rdi), %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v4i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: pand 16(%eax), %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v4i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: pand 16(%rdi), %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v4i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v4i64:
; AVX512: # %bb.0:
@@ -105,52 +207,103 @@ define i1 @test_v4i64(ptr %ptr) nounwind {
}
define i1 @test_v8i64(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v8i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movdqa (%rdi), %xmm0
-; SSE2-NEXT: movdqa 16(%rdi), %xmm1
-; SSE2-NEXT: pand 48(%rdi), %xmm1
-; SSE2-NEXT: pand 32(%rdi), %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v8i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: movdqa 16(%rdi), %xmm1
-; SSE41-NEXT: pand 48(%rdi), %xmm1
-; SSE41-NEXT: pand 32(%rdi), %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v8i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vmovaps (%rdi), %ymm0
-; AVX1-NEXT: vandps 32(%rdi), %ymm0, %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v8i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vmovdqa (%rdi), %ymm0
-; AVX2-NEXT: vpand 32(%rdi), %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v8i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: movdqa (%eax), %xmm0
+; X86-SSE2-NEXT: movdqa 16(%eax), %xmm1
+; X86-SSE2-NEXT: pand 48(%eax), %xmm1
+; X86-SSE2-NEXT: pand 32(%eax), %xmm0
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v8i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT: movdqa 16(%rdi), %xmm1
+; X64-SSE2-NEXT: pand 48(%rdi), %xmm1
+; X64-SSE2-NEXT: pand 32(%rdi), %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: movdqa 16(%eax), %xmm1
+; X86-SSE4-NEXT: pand 48(%eax), %xmm1
+; X86-SSE4-NEXT: pand 32(%eax), %xmm0
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v8i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: movdqa 16(%rdi), %xmm1
+; X64-SSE4-NEXT: pand 48(%rdi), %xmm1
+; X64-SSE4-NEXT: pand 32(%rdi), %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v8i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovaps (%eax), %ymm0
+; X86-AVX1-NEXT: vandps 32(%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovaps (%rdi), %ymm0
+; X64-AVX1-NEXT: vandps 32(%rdi), %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX2-NEXT: vpand 32(%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT: vpand 32(%rdi), %ymm0, %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v8i64:
; AVX512: # %bb.0:
@@ -181,70 +334,139 @@ define i1 @test_v8i64(ptr %ptr) nounwind {
}
define i1 @test_v16i64(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v16i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movdqa (%rdi), %xmm0
-; SSE2-NEXT: movdqa 16(%rdi), %xmm1
-; SSE2-NEXT: movdqa 32(%rdi), %xmm2
-; SSE2-NEXT: movdqa 48(%rdi), %xmm3
-; SSE2-NEXT: pand 112(%rdi), %xmm3
-; SSE2-NEXT: pand 80(%rdi), %xmm1
-; SSE2-NEXT: pand %xmm3, %xmm1
-; SSE2-NEXT: pand 96(%rdi), %xmm2
-; SSE2-NEXT: pand 64(%rdi), %xmm0
-; SSE2-NEXT: pand %xmm2, %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: movdqa 16(%rdi), %xmm1
-; SSE41-NEXT: movdqa 32(%rdi), %xmm2
-; SSE41-NEXT: movdqa 48(%rdi), %xmm3
-; SSE41-NEXT: pand 112(%rdi), %xmm3
-; SSE41-NEXT: pand 80(%rdi), %xmm1
-; SSE41-NEXT: pand %xmm3, %xmm1
-; SSE41-NEXT: pand 96(%rdi), %xmm2
-; SSE41-NEXT: pand 64(%rdi), %xmm0
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v16i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vmovaps (%rdi), %ymm0
-; AVX1-NEXT: vmovaps 32(%rdi), %ymm1
-; AVX1-NEXT: vandps 96(%rdi), %ymm1, %ymm1
-; AVX1-NEXT: vandps 64(%rdi), %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vmovdqa (%rdi), %ymm0
-; AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
-; AVX2-NEXT: vpand 96(%rdi), %ymm1, %ymm1
-; AVX2-NEXT: vpand 64(%rdi), %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v16i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: movdqa 32(%eax), %xmm1
+; X86-SSE2-NEXT: movdqa (%eax), %xmm0
+; X86-SSE2-NEXT: movdqa 16(%eax), %xmm2
+; X86-SSE2-NEXT: movdqa 48(%eax), %xmm3
+; X86-SSE2-NEXT: pand 112(%eax), %xmm3
+; X86-SSE2-NEXT: pand 80(%eax), %xmm2
+; X86-SSE2-NEXT: pand %xmm3, %xmm2
+; X86-SSE2-NEXT: pand 96(%eax), %xmm1
+; X86-SSE2-NEXT: pand 64(%eax), %xmm0
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i64:
+; 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: pand 112(%rdi), %xmm3
+; X64-SSE2-NEXT: pand 80(%rdi), %xmm1
+; X64-SSE2-NEXT: pand %xmm3, %xmm1
+; X64-SSE2-NEXT: pand 96(%rdi), %xmm2
+; X64-SSE2-NEXT: pand 64(%rdi), %xmm0
+; X64-SSE2-NEXT: pand %xmm2, %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa 32(%eax), %xmm1
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: movdqa 16(%eax), %xmm2
+; X86-SSE4-NEXT: movdqa 48(%eax), %xmm3
+; X86-SSE4-NEXT: pand 112(%eax), %xmm3
+; X86-SSE4-NEXT: pand 80(%eax), %xmm2
+; X86-SSE4-NEXT: pand %xmm3, %xmm2
+; X86-SSE4-NEXT: pand 96(%eax), %xmm1
+; X86-SSE4-NEXT: pand 64(%eax), %xmm0
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i64:
+; 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: pand 112(%rdi), %xmm3
+; X64-SSE4-NEXT: pand 80(%rdi), %xmm1
+; X64-SSE4-NEXT: pand %xmm3, %xmm1
+; X64-SSE4-NEXT: pand 96(%rdi), %xmm2
+; X64-SSE4-NEXT: pand 64(%rdi), %xmm0
+; X64-SSE4-NEXT: pand %xmm2, %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v16i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovaps (%eax), %ymm0
+; X86-AVX1-NEXT: vmovaps 32(%eax), %ymm1
+; X86-AVX1-NEXT: vandps 96(%eax), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps 64(%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovaps (%rdi), %ymm0
+; X64-AVX1-NEXT: vmovaps 32(%rdi), %ymm1
+; X64-AVX1-NEXT: vandps 96(%rdi), %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps 64(%rdi), %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX2-NEXT: vmovdqa 32(%eax), %ymm1
+; X86-AVX2-NEXT: vpand 96(%eax), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand 64(%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT: vmovdqa 32(%rdi), %ymm1
+; X64-AVX2-NEXT: vpand 96(%rdi), %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand 64(%rdi), %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i64:
; AVX512: # %bb.0:
@@ -297,17 +519,62 @@ define i1 @test_v16i64(ptr %ptr) nounwind {
;
define i1 @test_v2i32(ptr %ptr) nounwind {
-; SSE-LABEL: test_v2i32:
-; SSE: # %bb.0:
-; SSE-NEXT: cmpq $-1, (%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v2i32:
-; AVX: # %bb.0:
-; AVX-NEXT: cmpq $-1, (%rdi)
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE-LABEL: test_v2i32:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT: movl (%eax), %ecx
+; X86-SSE-NEXT: movl 4(%eax), %eax
+; X86-SSE-NEXT: notl %eax
+; X86-SSE-NEXT: notl %ecx
+; X86-SSE-NEXT: orl %eax, %ecx
+; X86-SSE-NEXT: sete %al
+; X86-SSE-NEXT: retl
+;
+; X64-SSE-LABEL: test_v2i32:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: cmpq $-1, (%rdi)
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v2i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: movl (%eax), %ecx
+; X86-AVX1-NEXT: movl 4(%eax), %eax
+; X86-AVX1-NEXT: notl %eax
+; X86-AVX1-NEXT: notl %ecx
+; X86-AVX1-NEXT: orl %eax, %ecx
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: cmpq $-1, (%rdi)
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: movl (%eax), %ecx
+; X86-AVX2-NEXT: movl 4(%eax), %eax
+; X86-AVX2-NEXT: notl %eax
+; X86-AVX2-NEXT: notl %ecx
+; X86-AVX2-NEXT: orl %eax, %ecx
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: cmpq $-1, (%rdi)
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: cmpq $-1, (%rdi)
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%vload = load <2 x i32>, ptr %ptr
%v0 = extractelement <2 x i32> %vload, i32 0
%v1 = extractelement <2 x i32> %vload, i32 1
@@ -317,30 +584,83 @@ define i1 @test_v2i32(ptr %ptr) nounwind {
}
define i1 @test_v4i32(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v4i32:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
-; SSE2-NEXT: pcmpeqd (%rdi), %xmm0
-; SSE2-NEXT: movmskps %xmm0, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v4i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX-LABEL: test_v4i32:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovdqa (%rdi), %xmm0
-; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vptest %xmm1, %xmm0
-; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v4i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqd (%eax), %xmm0
+; X86-SSE2-NEXT: movmskps %xmm0, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v4i32:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X64-SSE2-NEXT: pcmpeqd (%rdi), %xmm0
+; X64-SSE2-NEXT: movmskps %xmm0, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v4i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v4i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v4i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vptest %xmm1, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vptest %xmm1, %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX2-NEXT: vptest %xmm1, %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v4i32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovdqa (%rdi), %xmm0
+; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vptest %xmm1, %xmm0
+; AVX512-NEXT: setb %al
+; AVX512-NEXT: retq
%vload = load <4 x i32>, ptr %ptr
%v0 = extractelement <4 x i32> %vload, i32 0
%v1 = extractelement <4 x i32> %vload, i32 1
@@ -354,44 +674,87 @@ define i1 @test_v4i32(ptr %ptr) nounwind {
}
define i1 @test_v8i32(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v8i32:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movdqa (%rdi), %xmm0
-; SSE2-NEXT: pand 16(%rdi), %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v8i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: pand 16(%rdi), %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v8i32:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vmovdqa (%rdi), %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v8i32:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vmovdqa (%rdi), %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v8i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: movdqa (%eax), %xmm0
+; X86-SSE2-NEXT: pand 16(%eax), %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v8i32:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT: pand 16(%rdi), %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v8i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: pand 16(%eax), %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v8i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: pand 16(%rdi), %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v8i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v8i32:
; AVX512: # %bb.0:
@@ -422,52 +785,103 @@ define i1 @test_v8i32(ptr %ptr) nounwind {
}
define i1 @test_v16i32(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v16i32:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movdqa (%rdi), %xmm0
-; SSE2-NEXT: movdqa 16(%rdi), %xmm1
-; SSE2-NEXT: pand 48(%rdi), %xmm1
-; SSE2-NEXT: pand 32(%rdi), %xmm0
-; SSE2-NEXT: pand %xmm1, %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: movdqa 16(%rdi), %xmm1
-; SSE41-NEXT: pand 48(%rdi), %xmm1
-; SSE41-NEXT: pand 32(%rdi), %xmm0
-; SSE41-NEXT: pand %xmm1, %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v16i32:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vmovaps (%rdi), %ymm0
-; AVX1-NEXT: vandps 32(%rdi), %ymm0, %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i32:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vmovdqa (%rdi), %ymm0
-; AVX2-NEXT: vpand 32(%rdi), %ymm0, %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v16i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: movdqa (%eax), %xmm0
+; X86-SSE2-NEXT: movdqa 16(%eax), %xmm1
+; X86-SSE2-NEXT: pand 48(%eax), %xmm1
+; X86-SSE2-NEXT: pand 32(%eax), %xmm0
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i32:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT: movdqa 16(%rdi), %xmm1
+; X64-SSE2-NEXT: pand 48(%rdi), %xmm1
+; X64-SSE2-NEXT: pand 32(%rdi), %xmm0
+; X64-SSE2-NEXT: pand %xmm1, %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: movdqa 16(%eax), %xmm1
+; X86-SSE4-NEXT: pand 48(%eax), %xmm1
+; X86-SSE4-NEXT: pand 32(%eax), %xmm0
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: movdqa 16(%rdi), %xmm1
+; X64-SSE4-NEXT: pand 48(%rdi), %xmm1
+; X64-SSE4-NEXT: pand 32(%rdi), %xmm0
+; X64-SSE4-NEXT: pand %xmm1, %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v16i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovaps (%eax), %ymm0
+; X86-AVX1-NEXT: vandps 32(%eax), %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovaps (%rdi), %ymm0
+; X64-AVX1-NEXT: vandps 32(%rdi), %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX2-NEXT: vpand 32(%eax), %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT: vpand 32(%rdi), %ymm0, %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i32:
; AVX512: # %bb.0:
@@ -518,17 +932,50 @@ define i1 @test_v16i32(ptr %ptr) nounwind {
;
define i1 @test_v2i16(ptr %ptr) nounwind {
-; SSE-LABEL: test_v2i16:
-; SSE: # %bb.0:
-; SSE-NEXT: cmpl $-1, (%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v2i16:
-; AVX: # %bb.0:
-; AVX-NEXT: cmpl $-1, (%rdi)
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE-LABEL: test_v2i16:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT: cmpl $-1, (%eax)
+; X86-SSE-NEXT: sete %al
+; X86-SSE-NEXT: retl
+;
+; X64-SSE-LABEL: test_v2i16:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: cmpl $-1, (%rdi)
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v2i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: cmpl $-1, (%eax)
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: cmpl $-1, (%rdi)
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: cmpl $-1, (%eax)
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: cmpl $-1, (%rdi)
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i16:
+; AVX512: # %bb.0:
+; AVX512-NEXT: cmpl $-1, (%rdi)
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%vload = load <2 x i16>, ptr %ptr
%v0 = extractelement <2 x i16> %vload, i32 0
%v1 = extractelement <2 x i16> %vload, i32 1
@@ -538,17 +985,62 @@ define i1 @test_v2i16(ptr %ptr) nounwind {
}
define i1 @test_v4i16(ptr %ptr) nounwind {
-; SSE-LABEL: test_v4i16:
-; SSE: # %bb.0:
-; SSE-NEXT: cmpq $-1, (%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v4i16:
-; AVX: # %bb.0:
-; AVX-NEXT: cmpq $-1, (%rdi)
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE-LABEL: test_v4i16:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT: movl (%eax), %ecx
+; X86-SSE-NEXT: movl 4(%eax), %eax
+; X86-SSE-NEXT: notl %eax
+; X86-SSE-NEXT: notl %ecx
+; X86-SSE-NEXT: orl %eax, %ecx
+; X86-SSE-NEXT: sete %al
+; X86-SSE-NEXT: retl
+;
+; X64-SSE-LABEL: test_v4i16:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: cmpq $-1, (%rdi)
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v4i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: movl (%eax), %ecx
+; X86-AVX1-NEXT: movl 4(%eax), %eax
+; X86-AVX1-NEXT: notl %eax
+; X86-AVX1-NEXT: notl %ecx
+; X86-AVX1-NEXT: orl %eax, %ecx
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: cmpq $-1, (%rdi)
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: movl (%eax), %ecx
+; X86-AVX2-NEXT: movl 4(%eax), %eax
+; X86-AVX2-NEXT: notl %eax
+; X86-AVX2-NEXT: notl %ecx
+; X86-AVX2-NEXT: orl %eax, %ecx
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: cmpq $-1, (%rdi)
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v4i16:
+; AVX512: # %bb.0:
+; AVX512-NEXT: cmpq $-1, (%rdi)
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%vload = load <4 x i16>, ptr %ptr
%v0 = extractelement <4 x i16> %vload, i32 0
%v1 = extractelement <4 x i16> %vload, i32 1
@@ -562,30 +1054,83 @@ define i1 @test_v4i16(ptr %ptr) nounwind {
}
define i1 @test_v8i16(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v8i16:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
-; SSE2-NEXT: pcmpeqb (%rdi), %xmm0
-; SSE2-NEXT: pmovmskb %xmm0, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v8i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX-LABEL: test_v8i16:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovdqa (%rdi), %xmm0
-; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vptest %xmm1, %xmm0
-; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v8i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqb (%eax), %xmm0
+; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v8i16:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X64-SSE2-NEXT: pcmpeqb (%rdi), %xmm0
+; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v8i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v8i16:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v8i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vptest %xmm1, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vptest %xmm1, %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX2-NEXT: vptest %xmm1, %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v8i16:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovdqa (%rdi), %xmm0
+; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vptest %xmm1, %xmm0
+; AVX512-NEXT: setb %al
+; AVX512-NEXT: retq
%vload = load <8 x i16>, ptr %ptr
%v0 = extractelement <8 x i16> %vload, i32 0
%v1 = extractelement <8 x i16> %vload, i32 1
@@ -607,44 +1152,87 @@ define i1 @test_v8i16(ptr %ptr) nounwind {
}
define i1 @test_v16i16(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v16i16:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movdqa (%rdi), %xmm0
-; SSE2-NEXT: pand 16(%rdi), %xmm0
-; SSE2-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: pand 16(%rdi), %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v16i16:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vmovdqa (%rdi), %ymm0
-; AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
-; AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
-; AVX1-NEXT: vptest %ymm1, %ymm0
-; AVX1-NEXT: setb %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i16:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vmovdqa (%rdi), %ymm0
-; AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setb %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v16i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: movdqa (%eax), %xmm0
+; X86-SSE2-NEXT: pand 16(%eax), %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i16:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE2-NEXT: pand 16(%rdi), %xmm0
+; X64-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: pand 16(%eax), %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i16:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: pand 16(%rdi), %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v16i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X86-AVX1-NEXT: vptest %ymm1, %ymm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vcmptrueps %ymm1, %ymm1, %ymm1
+; X64-AVX1-NEXT: vptest %ymm1, %ymm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %ymm0
+; X86-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %ymm0
+; X64-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i16:
; AVX512: # %bb.0:
@@ -695,17 +1283,50 @@ define i1 @test_v16i16(ptr %ptr) nounwind {
;
define i1 @test_v2i8(ptr %ptr) nounwind {
-; SSE-LABEL: test_v2i8:
-; SSE: # %bb.0:
-; SSE-NEXT: cmpw $-1, (%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v2i8:
-; AVX: # %bb.0:
-; AVX-NEXT: cmpw $-1, (%rdi)
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE-LABEL: test_v2i8:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT: cmpw $-1, (%eax)
+; X86-SSE-NEXT: sete %al
+; X86-SSE-NEXT: retl
+;
+; X64-SSE-LABEL: test_v2i8:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: cmpw $-1, (%rdi)
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v2i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: cmpw $-1, (%eax)
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: cmpw $-1, (%rdi)
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: cmpw $-1, (%eax)
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: cmpw $-1, (%rdi)
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: cmpw $-1, (%rdi)
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%vload = load <2 x i8>, ptr %ptr
%v0 = extractelement <2 x i8> %vload, i32 0
%v1 = extractelement <2 x i8> %vload, i32 1
@@ -715,17 +1336,50 @@ define i1 @test_v2i8(ptr %ptr) nounwind {
}
define i1 @test_v4i8(ptr %ptr) nounwind {
-; SSE-LABEL: test_v4i8:
-; SSE: # %bb.0:
-; SSE-NEXT: cmpl $-1, (%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v4i8:
-; AVX: # %bb.0:
-; AVX-NEXT: cmpl $-1, (%rdi)
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE-LABEL: test_v4i8:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT: cmpl $-1, (%eax)
+; X86-SSE-NEXT: sete %al
+; X86-SSE-NEXT: retl
+;
+; X64-SSE-LABEL: test_v4i8:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: cmpl $-1, (%rdi)
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v4i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: cmpl $-1, (%eax)
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: cmpl $-1, (%rdi)
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: cmpl $-1, (%eax)
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: cmpl $-1, (%rdi)
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v4i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: cmpl $-1, (%rdi)
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%vload = load <4 x i8>, ptr %ptr
%v0 = extractelement <4 x i8> %vload, i32 0
%v1 = extractelement <4 x i8> %vload, i32 1
@@ -739,17 +1393,62 @@ define i1 @test_v4i8(ptr %ptr) nounwind {
}
define i1 @test_v8i8(ptr %ptr) nounwind {
-; SSE-LABEL: test_v8i8:
-; SSE: # %bb.0:
-; SSE-NEXT: cmpq $-1, (%rdi)
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v8i8:
-; AVX: # %bb.0:
-; AVX-NEXT: cmpq $-1, (%rdi)
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE-LABEL: test_v8i8:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE-NEXT: movl (%eax), %ecx
+; X86-SSE-NEXT: movl 4(%eax), %eax
+; X86-SSE-NEXT: notl %eax
+; X86-SSE-NEXT: notl %ecx
+; X86-SSE-NEXT: orl %eax, %ecx
+; X86-SSE-NEXT: sete %al
+; X86-SSE-NEXT: retl
+;
+; X64-SSE-LABEL: test_v8i8:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: cmpq $-1, (%rdi)
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v8i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: movl (%eax), %ecx
+; X86-AVX1-NEXT: movl 4(%eax), %eax
+; X86-AVX1-NEXT: notl %eax
+; X86-AVX1-NEXT: notl %ecx
+; X86-AVX1-NEXT: orl %eax, %ecx
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: cmpq $-1, (%rdi)
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: movl (%eax), %ecx
+; X86-AVX2-NEXT: movl 4(%eax), %eax
+; X86-AVX2-NEXT: notl %eax
+; X86-AVX2-NEXT: notl %ecx
+; X86-AVX2-NEXT: orl %eax, %ecx
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: cmpq $-1, (%rdi)
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v8i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: cmpq $-1, (%rdi)
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%vload = load <8 x i8>, ptr %ptr
%v0 = extractelement <8 x i8> %vload, i32 0
%v1 = extractelement <8 x i8> %vload, i32 1
@@ -771,30 +1470,83 @@ define i1 @test_v8i8(ptr %ptr) nounwind {
}
define i1 @test_v16i8(ptr %ptr) nounwind {
-; SSE2-LABEL: test_v16i8:
-; SSE2: # %bb.0:
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm0
-; SSE2-NEXT: pcmpeqb (%rdi), %xmm0
-; SSE2-NEXT: pmovmskb %xmm0, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqa (%rdi), %xmm0
-; SSE41-NEXT: pcmpeqd %xmm1, %xmm1
-; SSE41-NEXT: ptest %xmm1, %xmm0
-; SSE41-NEXT: setb %al
-; SSE41-NEXT: retq
-;
-; AVX-LABEL: test_v16i8:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovdqa (%rdi), %xmm0
-; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vptest %xmm1, %xmm0
-; AVX-NEXT: setb %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v16i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqb (%eax), %xmm0
+; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i8:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm0
+; X64-SSE2-NEXT: pcmpeqb (%rdi), %xmm0
+; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqa (%eax), %xmm0
+; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm0
+; X86-SSE4-NEXT: setb %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i8:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqa (%rdi), %xmm0
+; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
+; X64-SSE4-NEXT: ptest %xmm1, %xmm0
+; X64-SSE4-NEXT: setb %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v16i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX1-NEXT: vptest %xmm1, %xmm0
+; X86-AVX1-NEXT: setb %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX1-NEXT: vptest %xmm1, %xmm0
+; X64-AVX1-NEXT: setb %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vmovdqa (%eax), %xmm0
+; X86-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setb %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovdqa (%rdi), %xmm0
+; X64-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; X64-AVX2-NEXT: vptest %xmm1, %xmm0
+; X64-AVX2-NEXT: setb %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v16i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovdqa (%rdi), %xmm0
+; AVX512-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
+; AVX512-NEXT: vptest %xmm1, %xmm0
+; AVX512-NEXT: setb %al
+; AVX512-NEXT: retq
%vload = load <16 x i8>, ptr %ptr
%v0 = extractelement <16 x i8> %vload, i32 0
%v1 = extractelement <16 x i8> %vload, i32 1
@@ -832,7 +1584,13 @@ define i1 @test_v16i8(ptr %ptr) nounwind {
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; AVX: {{.*}}
+; AVX1: {{.*}}
; AVX1OR2: {{.*}}
+; AVX2: {{.*}}
; AVX512BW: {{.*}}
; AVX512F: {{.*}}
; AVX512VL: {{.*}}
+; SSE: {{.*}}
+; SSE2: {{.*}}
+; SSE4: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-and.ll b/llvm/test/CodeGen/X86/vector-reduce-and.ll
index df6e079785568..415939107e931 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-and.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-and.ll
@@ -1,25 +1,31 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; vXi64
;
define i64 @test_v2i64(<2 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v2i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE-NEXT: pand %xmm0, %xmm1
-; X86-SSE-NEXT: movd %xmm1, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v2i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v2i64:
; X64-SSE: # %bb.0:
@@ -28,26 +34,64 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX-LABEL: test_v2i64:
-; AVX: # %bb.0:
-; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: retq
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: movd %xmm1, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm1, %edx
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v2i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512-NEXT: vpand %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: retq
%1 = call i64 @llvm.vector.reduce.and.v2i64(<2 x i64> %a0)
ret i64 %1
}
define i64 @test_v4i64(<4 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v4i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pand %xmm1, %xmm0
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE-NEXT: pand %xmm0, %xmm1
-; X86-SSE-NEXT: movd %xmm1, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v4i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v4i64:
; X64-SSE: # %bb.0:
@@ -57,25 +101,56 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v4i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v4i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v4i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: movd %xmm1, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm1, %edx
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v4i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v4i64:
; AVX512: # %bb.0:
@@ -91,23 +166,23 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
}
define i64 @test_v8i64(<8 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v8i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pushl %ebp
-; X86-SSE-NEXT: movl %esp, %ebp
-; X86-SSE-NEXT: andl $-16, %esp
-; X86-SSE-NEXT: subl $16, %esp
-; X86-SSE-NEXT: pand %xmm2, %xmm0
-; X86-SSE-NEXT: pand 8(%ebp), %xmm1
-; X86-SSE-NEXT: pand %xmm0, %xmm1
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE-NEXT: pand %xmm1, %xmm0
-; X86-SSE-NEXT: movd %xmm0, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: movl %ebp, %esp
-; X86-SSE-NEXT: popl %ebp
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v8i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v8i64:
; X64-SSE: # %bb.0:
@@ -119,27 +194,68 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v8i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v8i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %edx
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v8i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v8i64:
; AVX512: # %bb.0:
@@ -157,28 +273,28 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
}
define i64 @test_v16i64(<16 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v16i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pushl %ebp
-; X86-SSE-NEXT: movl %esp, %ebp
-; X86-SSE-NEXT: andl $-16, %esp
-; X86-SSE-NEXT: subl $16, %esp
-; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE-NEXT: pand 56(%ebp), %xmm2
-; X86-SSE-NEXT: pand 24(%ebp), %xmm0
-; X86-SSE-NEXT: pand %xmm2, %xmm0
-; X86-SSE-NEXT: pand 72(%ebp), %xmm3
-; X86-SSE-NEXT: pand 40(%ebp), %xmm1
-; X86-SSE-NEXT: pand %xmm3, %xmm1
-; X86-SSE-NEXT: pand %xmm0, %xmm1
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE-NEXT: pand %xmm1, %xmm0
-; X86-SSE-NEXT: movd %xmm0, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: movl %ebp, %esp
-; X86-SSE-NEXT: popl %ebp
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v16i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE2-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE2-NEXT: pand %xmm2, %xmm0
+; X86-SSE2-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE2-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE2-NEXT: pand %xmm3, %xmm1
+; X86-SSE2-NEXT: pand %xmm0, %xmm1
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT: pand %xmm1, %xmm0
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v16i64:
; X64-SSE: # %bb.0:
@@ -194,31 +310,93 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm0, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v16i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pand 24(%ebp), %xmm0
+; X86-SSE4-NEXT: pand %xmm2, %xmm0
+; X86-SSE4-NEXT: pand 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pand 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pand %xmm3, %xmm1
+; X86-SSE4-NEXT: pand %xmm0, %xmm1
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE4-NEXT: pand %xmm1, %xmm0
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %edx
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v16i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i64:
; AVX512: # %bb.0:
@@ -253,7 +431,7 @@ define i32 @test_v2i32(<2 x i32> %a0) nounwind {
; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.and.v2i32(<2 x i32> %a0)
ret i32 %1
}
@@ -275,7 +453,7 @@ define i32 @test_v4i32(<4 x i32> %a0) nounwind {
; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.and.v4i32(<4 x i32> %a0)
ret i32 %1
}
@@ -301,7 +479,7 @@ define i32 @test_v8i32(<8 x i32> %a0) nounwind {
; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v8i32:
; AVX2: # %bb.0:
@@ -313,7 +491,7 @@ define i32 @test_v8i32(<8 x i32> %a0) nounwind {
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v8i32:
; AVX512: # %bb.0:
@@ -372,7 +550,7 @@ define i32 @test_v16i32(<16 x i32> %a0) nounwind {
; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i32:
; AVX2: # %bb.0:
@@ -385,7 +563,7 @@ define i32 @test_v16i32(<16 x i32> %a0) nounwind {
; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i32:
; AVX512: # %bb.0:
@@ -444,35 +622,77 @@ define i32 @test_v32i32(<32 x i32> %a0) nounwind {
; X64-SSE-NEXT: movd %xmm1, %eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v32i32:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v32i32:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v32i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v32i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v32i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v32i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v32i32:
; AVX512: # %bb.0:
@@ -512,7 +732,7 @@ define i16 @test_v2i16(<2 x i16> %a0) nounwind {
; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.and.v2i16(<2 x i16> %a0)
ret i16 %1
}
@@ -537,7 +757,7 @@ define i16 @test_v4i16(<4 x i16> %a0) nounwind {
; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.and.v4i16(<4 x i16> %a0)
ret i16 %1
}
@@ -566,7 +786,7 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
; AVX-NEXT: vpand %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.and.v8i16(<8 x i16> %a0)
ret i16 %1
}
@@ -599,7 +819,7 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i16:
; AVX2: # %bb.0:
@@ -614,7 +834,7 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i16:
; AVX512: # %bb.0:
@@ -687,7 +907,7 @@ define i16 @test_v32i16(<32 x i16> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i16:
; AVX2: # %bb.0:
@@ -703,7 +923,7 @@ define i16 @test_v32i16(<32 x i16> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i16:
; AVX512: # %bb.0:
@@ -773,41 +993,89 @@ define i16 @test_v64i16(<64 x i16> %a0) nounwind {
; X64-SSE-NEXT: # kill: def $ax killed $ax killed $eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v64i16:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v64i16:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v64i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v64i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vandps %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v64i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v64i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v64i16:
; AVX512: # %bb.0:
@@ -850,7 +1118,7 @@ define i8 @test_v2i8(<2 x i8> %a0) nounwind {
; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.and.v2i8(<2 x i8> %a0)
ret i8 %1
}
@@ -876,7 +1144,7 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.and.v4i8(<4 x i8> %a0)
ret i8 %1
}
@@ -906,7 +1174,7 @@ define i8 @test_v8i8(<8 x i8> %a0) nounwind {
; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.and.v8i8(<8 x i8> %a0)
ret i8 %1
}
@@ -940,7 +1208,7 @@ define i8 @test_v16i8(<16 x i8> %a0) nounwind {
; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.and.v16i8(<16 x i8> %a0)
ret i8 %1
}
@@ -978,7 +1246,7 @@ define i8 @test_v32i8(<32 x i8> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i8:
; AVX2: # %bb.0:
@@ -995,7 +1263,7 @@ define i8 @test_v32i8(<32 x i8> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i8:
; AVX512: # %bb.0:
@@ -1078,7 +1346,7 @@ define i8 @test_v64i8(<64 x i8> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v64i8:
; AVX2: # %bb.0:
@@ -1096,7 +1364,7 @@ define i8 @test_v64i8(<64 x i8> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v64i8:
; AVX512: # %bb.0:
@@ -1174,45 +1442,97 @@ define i8 @test_v128i8(<128 x i8> %a0) nounwind {
; X64-SSE-NEXT: # kill: def $al killed $al killed $eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v128i8:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
-; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: # kill: def $al killed $al killed $eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v128i8:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
-; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: # kill: def $al killed $al killed $eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v128i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v128i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vandps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vandps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v128i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpand 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v128i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpand %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpand %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v128i8:
; AVX512: # %bb.0:
@@ -1262,3 +1582,12 @@ declare i8 @llvm.vector.reduce.and.v16i8(<16 x i8>)
declare i8 @llvm.vector.reduce.and.v32i8(<32 x i8>)
declare i8 @llvm.vector.reduce.and.v64i8(<64 x i8>)
declare i8 @llvm.vector.reduce.and.v128i8(<128 x i8>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; AVX1OR2: {{.*}}
+; AVX512BW: {{.*}}
+; AVX512F: {{.*}}
+; AVX512VL: {{.*}}
+; SSE2: {{.*}}
+; SSE4: {{.*}}
+; X64-SSE2: {{.*}}
+; X64-SSE4: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-or-bool.ll b/llvm/test/CodeGen/X86/vector-reduce-or-bool.ll
index f80544fdef7e6..e038419fae246 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-or-bool.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-or-bool.ll
@@ -1,12 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X86-SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X64-SSE,X64-SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE41
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VL
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; Truncate
@@ -21,17 +26,41 @@ define i1 @trunc_v2i64_v2i1(<2 x i64>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v2i64_v2i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v2i64_v2i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v2i64_v2i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v2i64_v2i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v2i64_v2i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v2i64_v2i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v2i64_v2i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v2i64_v2i1:
; AVX512F: # %bb.0:
@@ -65,17 +94,42 @@ define i1 @trunc_v4i32_v4i1(<4 x i32>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v4i32_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v4i32_v4i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v4i32_v4i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v4i32_v4i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v4i32_v4i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v4i32_v4i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v4i32_v4i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1]
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v4i32_v4i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v4i32_v4i1:
; AVX512F: # %bb.0:
@@ -109,17 +163,42 @@ define i1 @trunc_v8i16_v8i1(<8 x i16>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v8i16_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v8i16_v8i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v8i16_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v8i16_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v8i16_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v8i16_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v8i16_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [65537,65537,65537,65537]
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v8i16_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v8i16_v8i1:
; AVX512F: # %bb.0:
@@ -153,17 +232,42 @@ define i1 @trunc_v16i8_v16i1(<16 x i8>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v16i8_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v16i8_v16i1:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v16i8_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i8_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v16i8_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i8_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i8_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [16843009,16843009,16843009,16843009]
+; X86-AVX2-NEXT: vptest %xmm1, %xmm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i8_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v16i8_v16i1:
; AVX512F: # %bb.0:
@@ -198,27 +302,48 @@ define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v4i64_v4i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v4i64_v4i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v4i64_v4i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v4i64_v4i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v4i64_v4i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v4i64_v4i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v4i64_v4i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v4i64_v4i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v4i64_v4i1:
; AVX512: # %bb.0:
@@ -242,27 +367,49 @@ define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v8i32_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v8i32_v8i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v8i32_v8i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v8i32_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v8i32_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v8i32_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v8i32_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v8i32_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v8i32_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v8i32_v8i1:
; AVX512: # %bb.0:
@@ -286,27 +433,49 @@ define i1 @trunc_v16i16_v16i1(<16 x i16>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v16i16_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v16i16_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v16i16_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v16i16_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i16_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v16i16_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i16_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i16_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65537,65537,65537,65537,65537,65537,65537,65537]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i16_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v16i16_v16i1:
; AVX512: # %bb.0:
@@ -330,27 +499,49 @@ define i1 @trunc_v32i8_v32i1(<32 x i8>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v32i8_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v32i8_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v32i8_v32i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v32i8_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v32i8_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v32i8_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v32i8_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v32i8_v32i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [16843009,16843009,16843009,16843009,16843009,16843009,16843009,16843009]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v32i8_v32i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v32i8_v32i1:
; AVX512: # %bb.0:
@@ -401,31 +592,62 @@ define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v8i64_v8i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v8i64_v8i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v8i64_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v8i64_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v8i64_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v8i64_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [1,1,1,1]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v8i64_v8i1:
; AVX512: # %bb.0:
@@ -469,31 +691,63 @@ define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v16i32_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v16i32_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v16i32_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v16i32_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i32_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v16i32_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i32_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i32_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i32_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4294967297,4294967297,4294967297,4294967297]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v16i32_v16i1:
; AVX512: # %bb.0:
@@ -536,31 +790,63 @@ define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v32i16_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v32i16_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v32i16_v32i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v32i16_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v32i16_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v32i16_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v32i16_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v32i16_v32i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [65537,65537,65537,65537,65537,65537,65537,65537]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v32i16_v32i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [281479271743489,281479271743489,281479271743489,281479271743489]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v32i16_v32i1:
; AVX512: # %bb.0:
@@ -603,31 +889,63 @@ define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v64i8_v64i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v64i8_v64i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v64i8_v64i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: trunc_v64i8_v64i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v64i8_v64i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v64i8_v64i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v64i8_v64i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v64i8_v64i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [16843009,16843009,16843009,16843009,16843009,16843009,16843009,16843009]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v64i8_v64i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: trunc_v64i8_v64i1:
; AVX512: # %bb.0:
@@ -657,14 +975,14 @@ define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm1, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
-; SSE41-NEXT: movmskpd %xmm1, %eax
-; SSE41-NEXT: testl %eax, %eax
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v2i64_v2i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm1, %xmm1
+; SSE4-NEXT: pcmpeqq %xmm0, %xmm1
+; SSE4-NEXT: movmskpd %xmm1, %eax
+; SSE4-NEXT: testl %eax, %eax
+; SSE4-NEXT: setne %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1OR2-LABEL: icmp0_v2i64_v2i1:
; AVX1OR2: # %bb.0:
@@ -672,7 +990,7 @@ define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {
; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v2i64_v2i1:
; AVX512F: # %bb.0:
@@ -697,8 +1015,7 @@ define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {
; AVX512VL-LABEL: icmp0_v2i64_v2i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vptestnmq %xmm0, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: retq
%a = icmp eq <2 x i64> %0, zeroinitializer
@@ -722,7 +1039,7 @@ define i1 @icmp0_v4i32_v4i1(<4 x i32>) nounwind {
; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
; AVX1OR2-NEXT: vtestps %xmm0, %xmm0
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v4i32_v4i1:
; AVX512F: # %bb.0:
@@ -747,8 +1064,7 @@ define i1 @icmp0_v4i32_v4i1(<4 x i32>) nounwind {
; AVX512VL-LABEL: icmp0_v4i32_v4i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vptestnmd %xmm0, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: retq
%a = icmp eq <4 x i32> %0, zeroinitializer
@@ -773,7 +1089,7 @@ define i1 @icmp0_v8i16_v8i1(<8 x i16>) nounwind {
; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
; AVX1OR2-NEXT: testl %eax, %eax
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v8i16_v8i1:
; AVX512F: # %bb.0:
@@ -799,8 +1115,7 @@ define i1 @icmp0_v8i16_v8i1(<8 x i16>) nounwind {
; AVX512VL-LABEL: icmp0_v8i16_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vptestnmw %xmm0, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: retq
%a = icmp eq <8 x i16> %0, zeroinitializer
@@ -825,7 +1140,7 @@ define i1 @icmp0_v16i8_v16i1(<16 x i8>) nounwind {
; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
; AVX1OR2-NEXT: testl %eax, %eax
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v16i8_v16i1:
; AVX512F: # %bb.0:
@@ -871,16 +1186,16 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm2, %xmm2
-; SSE41-NEXT: pcmpeqq %xmm2, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm2, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: movmskps %xmm0, %eax
-; SSE41-NEXT: testl %eax, %eax
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v4i64_v4i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm2, %xmm2
+; SSE4-NEXT: pcmpeqq %xmm2, %xmm1
+; SSE4-NEXT: pcmpeqq %xmm2, %xmm0
+; SSE4-NEXT: packssdw %xmm1, %xmm0
+; SSE4-NEXT: movmskps %xmm0, %eax
+; SSE4-NEXT: testl %eax, %eax
+; SSE4-NEXT: setne %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: icmp0_v4i64_v4i1:
; AVX1: # %bb.0:
@@ -892,7 +1207,7 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; AVX1-NEXT: vtestpd %xmm0, %xmm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v4i64_v4i1:
; AVX2: # %bb.0:
@@ -901,7 +1216,7 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; AVX2-NEXT: vtestpd %ymm0, %ymm0
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v4i64_v4i1:
; AVX512F: # %bb.0:
@@ -926,8 +1241,7 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; AVX512VL-LABEL: icmp0_v4i64_v4i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vptestnmq %ymm0, %ymm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
@@ -958,7 +1272,7 @@ define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {
; AVX1-NEXT: vtestps %xmm0, %xmm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v8i32_v8i1:
; AVX2: # %bb.0:
@@ -967,7 +1281,7 @@ define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {
; AVX2-NEXT: vtestps %ymm0, %ymm0
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v8i32_v8i1:
; AVX512F: # %bb.0:
@@ -992,8 +1306,7 @@ define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {
; AVX512VL-LABEL: icmp0_v8i32_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vptestnmd %ymm0, %ymm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
@@ -1025,7 +1338,7 @@ define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v16i16_v16i1:
; AVX2: # %bb.0:
@@ -1035,7 +1348,7 @@ define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v16i16_v16i1:
; AVX512F: # %bb.0:
@@ -1092,7 +1405,7 @@ define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v32i8_v32i1:
; AVX2: # %bb.0:
@@ -1102,7 +1415,7 @@ define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v32i8_v32i1:
; AVX512F: # %bb.0:
@@ -1188,20 +1501,41 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp0_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm3
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm2
-; SSE41-NEXT: packssdw %xmm3, %xmm2
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: packssdw %xmm2, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: testl %eax, %eax
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp0_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm3, %xmm3
+; X86-SSE4-NEXT: pcmpeqq %xmm3, %xmm1
+; X86-SSE4-NEXT: pcmpeqq %xmm3, %xmm0
+; X86-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqq %xmm3, %xmm2
+; X86-SSE4-NEXT: pcmpeqq 8(%ebp), %xmm3
+; X86-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X86-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE4-NEXT: testl %eax, %eax
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp0_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm4, %xmm4
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm3
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm2
+; X64-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm1
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X64-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE4-NEXT: testl %eax, %eax
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp0_v8i64_v8i1:
; AVX1: # %bb.0:
@@ -1218,7 +1552,7 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; AVX1-NEXT: vtestps %xmm0, %xmm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v8i64_v8i1:
; AVX2: # %bb.0:
@@ -1229,7 +1563,7 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; AVX2-NEXT: vtestps %ymm0, %ymm0
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v8i64_v8i1:
; AVX512F: # %bb.0:
@@ -1252,8 +1586,7 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; AVX512VL-LABEL: icmp0_v8i64_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vptestnmq %zmm0, %zmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
@@ -1263,26 +1596,26 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
}
define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
-; X86-SSE2-LABEL: icmp0_v16i32_v16i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pxor %xmm3, %xmm3
-; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm1
-; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm0
-; X86-SSE2-NEXT: packssdw %xmm1, %xmm0
-; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm3
-; X86-SSE2-NEXT: packssdw %xmm3, %xmm2
-; X86-SSE2-NEXT: packsswb %xmm2, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp0_v16i32_v16i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pxor %xmm3, %xmm3
+; X86-SSE-NEXT: pcmpeqd %xmm3, %xmm1
+; X86-SSE-NEXT: pcmpeqd %xmm3, %xmm0
+; X86-SSE-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE-NEXT: pcmpeqd %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqd 8(%ebp), %xmm3
+; X86-SSE-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE-NEXT: packsswb %xmm2, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp0_v16i32_v16i1:
; X64-SSE: # %bb.0:
@@ -1315,7 +1648,7 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v16i32_v16i1:
; AVX2: # %bb.0:
@@ -1327,7 +1660,7 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: icmp0_v16i32_v16i1:
; AVX512: # %bb.0:
@@ -1342,26 +1675,26 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
}
define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
-; X86-SSE2-LABEL: icmp0_v32i16_v32i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pxor %xmm3, %xmm3
-; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm1
-; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm0
-; X86-SSE2-NEXT: por %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm3
-; X86-SSE2-NEXT: por %xmm1, %xmm3
-; X86-SSE2-NEXT: packsswb %xmm3, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp0_v32i16_v32i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pxor %xmm3, %xmm3
+; X86-SSE-NEXT: pcmpeqw %xmm3, %xmm1
+; X86-SSE-NEXT: pcmpeqw %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqw %xmm3, %xmm0
+; X86-SSE-NEXT: por %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqw 8(%ebp), %xmm3
+; X86-SSE-NEXT: por %xmm1, %xmm3
+; X86-SSE-NEXT: packsswb %xmm3, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp0_v32i16_v32i1:
; X64-SSE: # %bb.0:
@@ -1394,7 +1727,7 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v32i16_v32i1:
; AVX2: # %bb.0:
@@ -1406,7 +1739,7 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v32i16_v32i1:
; AVX512F: # %bb.0:
@@ -1443,26 +1776,26 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
}
define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
-; X86-SSE2-LABEL: icmp0_v64i8_v64i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pxor %xmm3, %xmm3
-; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm1
-; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm0
-; X86-SSE2-NEXT: por %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm3
-; X86-SSE2-NEXT: por %xmm1, %xmm3
-; X86-SSE2-NEXT: por %xmm0, %xmm3
-; X86-SSE2-NEXT: pmovmskb %xmm3, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp0_v64i8_v64i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pxor %xmm3, %xmm3
+; X86-SSE-NEXT: pcmpeqb %xmm3, %xmm1
+; X86-SSE-NEXT: pcmpeqb %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqb %xmm3, %xmm0
+; X86-SSE-NEXT: por %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqb 8(%ebp), %xmm3
+; X86-SSE-NEXT: por %xmm1, %xmm3
+; X86-SSE-NEXT: por %xmm0, %xmm3
+; X86-SSE-NEXT: pmovmskb %xmm3, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp0_v64i8_v64i1:
; X64-SSE: # %bb.0:
@@ -1495,7 +1828,7 @@ define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v64i8_v64i1:
; AVX2: # %bb.0:
@@ -1507,7 +1840,7 @@ define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v64i8_v64i1:
; AVX512F: # %bb.0:
@@ -1556,20 +1889,20 @@ define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) nounwind {
; SSE2-NEXT: setne %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
-; SSE41-NEXT: movmskpd %xmm0, %eax
-; SSE41-NEXT: testl %eax, %eax
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp_v2i64_v2i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqq %xmm1, %xmm0
+; SSE4-NEXT: movmskpd %xmm0, %eax
+; SSE4-NEXT: testl %eax, %eax
+; SSE4-NEXT: setne %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1OR2-LABEL: icmp_v2i64_v2i1:
; AVX1OR2: # %bb.0:
; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
; AVX1OR2-NEXT: vtestpd %xmm0, %xmm0
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v2i64_v2i1:
; AVX512F: # %bb.0:
@@ -1596,8 +1929,7 @@ define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) nounwind {
; AVX512VL-LABEL: icmp_v2i64_v2i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpcmpeqq %xmm1, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: retq
%a = icmp eq <2 x i64> %0, %1
@@ -1619,7 +1951,7 @@ define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) nounwind {
; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
; AVX1OR2-NEXT: vtestps %xmm0, %xmm0
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v4i32_v4i1:
; AVX512F: # %bb.0:
@@ -1646,8 +1978,7 @@ define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) nounwind {
; AVX512VL-LABEL: icmp_v4i32_v4i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpcmpeqd %xmm1, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: retq
%a = icmp eq <4 x i32> %0, %1
@@ -1670,7 +2001,7 @@ define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) nounwind {
; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
; AVX1OR2-NEXT: testl %eax, %eax
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v8i16_v8i1:
; AVX512F: # %bb.0:
@@ -1696,8 +2027,7 @@ define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) nounwind {
; AVX512VL-LABEL: icmp_v8i16_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpcmpeqw %xmm1, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: retq
%a = icmp eq <8 x i16> %0, %1
@@ -1720,7 +2050,7 @@ define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) nounwind {
; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
; AVX1OR2-NEXT: testl %eax, %eax
; AVX1OR2-NEXT: setne %al
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v16i8_v16i1:
; AVX512F: # %bb.0:
@@ -1784,15 +2114,31 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqq %xmm3, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm2, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: movmskps %xmm0, %eax
-; SSE41-NEXT: testl %eax, %eax
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp_v4i64_v4i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pcmpeqq %xmm2, %xmm0
+; X86-SSE4-NEXT: pcmpeqq 8(%ebp), %xmm1
+; X86-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE4-NEXT: movmskps %xmm0, %eax
+; X86-SSE4-NEXT: testl %eax, %eax
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v4i64_v4i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pcmpeqq %xmm3, %xmm1
+; X64-SSE4-NEXT: pcmpeqq %xmm2, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X64-SSE4-NEXT: movmskps %xmm0, %eax
+; X64-SSE4-NEXT: testl %eax, %eax
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp_v4i64_v4i1:
; AVX1: # %bb.0:
@@ -1804,7 +2150,7 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; AVX1-NEXT: vtestpd %xmm0, %xmm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v4i64_v4i1:
; AVX2: # %bb.0:
@@ -1812,7 +2158,7 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; AVX2-NEXT: vtestpd %ymm0, %ymm0
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v4i64_v4i1:
; AVX512F: # %bb.0:
@@ -1839,8 +2185,7 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; AVX512VL-LABEL: icmp_v4i64_v4i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpcmpeqq %ymm1, %ymm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
@@ -1850,21 +2195,21 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
}
define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
-; X86-SSE2-LABEL: icmp_v8i32_v8i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm1
-; X86-SSE2-NEXT: packssdw %xmm1, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v8i32_v8i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqd 8(%ebp), %xmm1
+; X86-SSE-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v8i32_v8i1:
; X64-SSE: # %bb.0:
@@ -1886,7 +2231,7 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; AVX1-NEXT: vtestps %xmm0, %xmm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v8i32_v8i1:
; AVX2: # %bb.0:
@@ -1894,7 +2239,7 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; AVX2-NEXT: vtestps %ymm0, %ymm0
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v8i32_v8i1:
; AVX512F: # %bb.0:
@@ -1921,8 +2266,7 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; AVX512VL-LABEL: icmp_v8i32_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpcmpeqd %ymm1, %ymm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
@@ -1932,21 +2276,21 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
}
define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
-; X86-SSE2-LABEL: icmp_v16i16_v16i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pcmpeqw %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm1
-; X86-SSE2-NEXT: packsswb %xmm1, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v16i16_v16i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pcmpeqw %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqw 8(%ebp), %xmm1
+; X86-SSE-NEXT: packsswb %xmm1, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v16i16_v16i1:
; X64-SSE: # %bb.0:
@@ -1969,7 +2313,7 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v16i16_v16i1:
; AVX2: # %bb.0:
@@ -1978,7 +2322,7 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v16i16_v16i1:
; AVX512F: # %bb.0:
@@ -2013,21 +2357,21 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
}
define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
-; X86-SSE2-LABEL: icmp_v32i8_v32i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pcmpeqb %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm1
-; X86-SSE2-NEXT: por %xmm0, %xmm1
-; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v32i8_v32i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pcmpeqb %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqb 8(%ebp), %xmm1
+; X86-SSE-NEXT: por %xmm0, %xmm1
+; X86-SSE-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v32i8_v32i1:
; X64-SSE: # %bb.0:
@@ -2050,7 +2394,7 @@ define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
; AVX1-NEXT: testl %eax, %eax
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v32i8_v32i1:
; AVX2: # %bb.0:
@@ -2059,7 +2403,7 @@ define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
; AVX2-NEXT: testl %eax, %eax
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v32i8_v32i1:
; AVX512F: # %bb.0:
@@ -2144,47 +2488,107 @@ define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {
; X64-SSE2-NEXT: setne %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqq %xmm7, %xmm3
-; SSE41-NEXT: pcmpeqq %xmm6, %xmm2
-; SSE41-NEXT: packssdw %xmm3, %xmm2
-; SSE41-NEXT: pcmpeqq %xmm5, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: packssdw %xmm2, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: testl %eax, %eax
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: icmp_v8i64_v8i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm4
-; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm5
-; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
-; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm0
-; AVX1-NEXT: vtestps %xmm0, %xmm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v8i64_v8i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqq %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vtestps %ymm0, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: icmp_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pcmpeqq 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pcmpeqq 56(%ebp), %xmm2
+; X86-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE4-NEXT: pcmpeqq 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pcmpeqq 24(%ebp), %xmm0
+; X86-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X86-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE4-NEXT: testl %eax, %eax
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pcmpeqq %xmm7, %xmm3
+; X64-SSE4-NEXT: pcmpeqq %xmm6, %xmm2
+; X64-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X64-SSE4-NEXT: pcmpeqq %xmm5, %xmm1
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X64-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE4-NEXT: testl %eax, %eax
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: icmp_v8i64_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqq 8(%ebp), %xmm1, %xmm2
+; X86-AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X86-AVX1-NEXT: vpcmpeqq 24(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpackssdw %xmm0, %xmm2, %xmm0
+; X86-AVX1-NEXT: vtestps %xmm0, %xmm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v8i64_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm4
+; X64-AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm5
+; X64-AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X64-AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X64-AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm0
+; X64-AVX1-NEXT: vtestps %xmm0, %xmm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v8i64_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqq 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vtestps %ymm0, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v8i64_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqq %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vtestps %ymm0, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: icmp_v8i64_v8i1:
; AVX512F: # %bb.0:
@@ -2207,8 +2611,7 @@ define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {
; AVX512VL-LABEL: icmp_v8i64_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpcmpeqq %zmm1, %zmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
-; AVX512VL-NEXT: testb %al, %al
+; AVX512VL-NEXT: kortestb %k0, %k0
; AVX512VL-NEXT: setne %al
; AVX512VL-NEXT: vzeroupper
; AVX512VL-NEXT: retq
@@ -2218,26 +2621,26 @@ define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {
}
define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
-; X86-SSE2-LABEL: icmp_v16i32_v16i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm2
-; X86-SSE2-NEXT: packssdw %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm1
-; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm0
-; X86-SSE2-NEXT: packssdw %xmm1, %xmm0
-; X86-SSE2-NEXT: packsswb %xmm2, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v16i32_v16i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqd 72(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqd 56(%ebp), %xmm2
+; X86-SSE-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqd 40(%ebp), %xmm1
+; X86-SSE-NEXT: pcmpeqd 24(%ebp), %xmm0
+; X86-SSE-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE-NEXT: packsswb %xmm2, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v16i32_v16i1:
; X64-SSE: # %bb.0:
@@ -2253,35 +2656,76 @@ define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
; X64-SSE-NEXT: setne %al
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: icmp_v16i32_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
-; AVX1-NEXT: vpcmpeqd %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
-; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
-; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: testl %eax, %eax
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v16i32_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpmovmskb %ymm0, %eax
-; AVX2-NEXT: testl %eax, %eax
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: icmp_v16i32_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
+; X86-AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
+; X86-AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
+; X86-AVX1-NEXT: vpcmpeqd 24(%ebp), %xmm2, %xmm2
+; X86-AVX1-NEXT: vpcmpeqd 8(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
+; X86-AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: testl %eax, %eax
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v16i32_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
+; X64-AVX1-NEXT: vpcmpeqd %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
+; X64-AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
+; X64-AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: testl %eax, %eax
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v16i32_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X86-AVX2-NEXT: testl %eax, %eax
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v16i32_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X64-AVX2-NEXT: testl %eax, %eax
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: icmp_v16i32_v16i1:
; AVX512: # %bb.0:
@@ -2296,26 +2740,26 @@ define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
}
define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
-; X86-SSE2-LABEL: icmp_v32i16_v32i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqw 56(%ebp), %xmm2
-; X86-SSE2-NEXT: pcmpeqw 24(%ebp), %xmm0
-; X86-SSE2-NEXT: por %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqw 72(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqw 40(%ebp), %xmm1
-; X86-SSE2-NEXT: por %xmm3, %xmm1
-; X86-SSE2-NEXT: packsswb %xmm1, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v32i16_v32i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqw 56(%ebp), %xmm2
+; X86-SSE-NEXT: pcmpeqw 24(%ebp), %xmm0
+; X86-SSE-NEXT: por %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqw 72(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqw 40(%ebp), %xmm1
+; X86-SSE-NEXT: por %xmm3, %xmm1
+; X86-SSE-NEXT: packsswb %xmm1, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v32i16_v32i1:
; X64-SSE: # %bb.0:
@@ -2331,35 +2775,76 @@ define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
; X64-SSE-NEXT: setne %al
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: icmp_v32i16_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm4
-; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm5
-; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
-; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: testl %eax, %eax
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v32i16_v32i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpmovmskb %ymm0, %eax
-; AVX2-NEXT: testl %eax, %eax
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: icmp_v32i16_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqw 8(%ebp), %xmm1, %xmm2
+; X86-AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X86-AVX1-NEXT: vpcmpeqw 24(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: testl %eax, %eax
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v32i16_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm4
+; X64-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm5
+; X64-AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X64-AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X64-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: testl %eax, %eax
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v32i16_v32i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqw 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X86-AVX2-NEXT: testl %eax, %eax
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v32i16_v32i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X64-AVX2-NEXT: testl %eax, %eax
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: icmp_v32i16_v32i1:
; AVX512F: # %bb.0:
@@ -2396,26 +2881,26 @@ define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
}
define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {
-; X86-SSE2-LABEL: icmp_v64i8_v64i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqb 56(%ebp), %xmm2
-; X86-SSE2-NEXT: pcmpeqb 24(%ebp), %xmm0
-; X86-SSE2-NEXT: por %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqb 72(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqb 40(%ebp), %xmm1
-; X86-SSE2-NEXT: por %xmm3, %xmm1
-; X86-SSE2-NEXT: por %xmm0, %xmm1
-; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
-; X86-SSE2-NEXT: testl %eax, %eax
-; X86-SSE2-NEXT: setne %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v64i8_v64i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqb 56(%ebp), %xmm2
+; X86-SSE-NEXT: pcmpeqb 24(%ebp), %xmm0
+; X86-SSE-NEXT: por %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqb 72(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqb 40(%ebp), %xmm1
+; X86-SSE-NEXT: por %xmm3, %xmm1
+; X86-SSE-NEXT: por %xmm0, %xmm1
+; X86-SSE-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE-NEXT: testl %eax, %eax
+; X86-SSE-NEXT: setne %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v64i8_v64i1:
; X64-SSE: # %bb.0:
@@ -2431,35 +2916,76 @@ define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {
; X64-SSE-NEXT: setne %al
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: icmp_v64i8_v64i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm4
-; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm5
-; AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
-; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpor %xmm0, %xmm4, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: testl %eax, %eax
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v64i8_v64i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpmovmskb %ymm0, %eax
-; AVX2-NEXT: testl %eax, %eax
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: icmp_v64i8_v64i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqb 8(%ebp), %xmm1, %xmm2
+; X86-AVX1-NEXT: vpor %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X86-AVX1-NEXT: vpcmpeqb 24(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpor %xmm0, %xmm2, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: testl %eax, %eax
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v64i8_v64i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm4
+; X64-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm5
+; X64-AVX1-NEXT: vpor %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X64-AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X64-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpor %xmm0, %xmm4, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: testl %eax, %eax
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v64i8_v64i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqb 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X86-AVX2-NEXT: testl %eax, %eax
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v64i8_v64i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X64-AVX2-NEXT: testl %eax, %eax
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: icmp_v64i8_v64i1:
; AVX512F: # %bb.0:
diff --git a/llvm/test/CodeGen/X86/vector-reduce-or-cmp.ll b/llvm/test/CodeGen/X86/vector-reduce-or-cmp.ll
index f82fa90f78e8c..acc90d2b4488d 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-or-cmp.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-or-cmp.ll
@@ -1,11 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,SSE41
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BW
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512BWVL
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; vXi64
@@ -19,19 +25,19 @@ define i1 @test_v2i64(<2 x i64> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v2i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v2i64:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v2i64:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
%2 = icmp eq i64 %1, 0
ret i1 %2
@@ -46,47 +52,88 @@ define i1 @test_v4i64(<4 x i64> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v4i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v4i64:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: setne %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v4i64:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: setne %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)
%2 = icmp ne i64 %1, 0
ret i1 %2
}
define i1 @test_v8i64(<8 x i64> %a0) {
-; SSE2-LABEL: test_v8i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v8i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v8i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por 8(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: pxor %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
+; X86-SSE2-NEXT: movmskps %xmm0, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v8i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v8i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v8i64:
; AVX1: # %bb.0:
@@ -94,7 +141,7 @@ define i1 @test_v8i64(<8 x i64> %a0) {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v8i64:
; AVX2: # %bb.0:
@@ -102,7 +149,7 @@ define i1 @test_v8i64(<8 x i64> %a0) {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v8i64:
; AVX512: # %bb.0:
@@ -117,54 +164,145 @@ define i1 @test_v8i64(<8 x i64> %a0) {
}
define i1 @test_v16i64(<16 x i64> %a0) {
-; SSE2-LABEL: test_v16i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm7, %xmm3
-; SSE2-NEXT: por %xmm5, %xmm1
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm6, %xmm2
-; SSE2-NEXT: por %xmm4, %xmm0
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm7, %xmm3
-; SSE41-NEXT: por %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm6, %xmm2
-; SSE41-NEXT: por %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v16i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v16i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: por 72(%ebp), %xmm3
+; X86-SSE2-NEXT: por 40(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm3, %xmm1
+; X86-SSE2-NEXT: por 56(%ebp), %xmm2
+; X86-SSE2-NEXT: por 24(%ebp), %xmm0
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: pxor %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm7, %xmm3
+; X64-SSE2-NEXT: por %xmm5, %xmm1
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm6, %xmm2
+; X64-SSE2-NEXT: por %xmm4, %xmm0
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: por 72(%ebp), %xmm3
+; X86-SSE4-NEXT: por 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: por 56(%ebp), %xmm2
+; X86-SSE4-NEXT: por 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm7, %xmm3
+; X64-SSE4-NEXT: por %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm6, %xmm2
+; X64-SSE4-NEXT: por %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v16i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i64:
; AVX512: # %bb.0:
@@ -184,19 +322,66 @@ define i1 @test_v16i64(<16 x i64> %a0) {
;
define i1 @test_v2i32(<2 x i32> %a0) {
-; SSE-LABEL: test_v2i32:
-; SSE: # %bb.0:
-; SSE-NEXT: movq %xmm0, %rax
-; SSE-NEXT: testq %rax, %rax
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v2i32:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: testq %rax, %rax
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v2i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %ecx
+; X86-SSE2-NEXT: orl %eax, %ecx
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE-LABEL: test_v2i32:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: movq %xmm0, %rax
+; X64-SSE-NEXT: testq %rax, %rax
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v2i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %eax
+; X86-SSE4-NEXT: movd %xmm0, %ecx
+; X86-SSE4-NEXT: orl %eax, %ecx
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v2i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %eax
+; X86-AVX1-NEXT: vmovd %xmm0, %ecx
+; X86-AVX1-NEXT: orl %eax, %ecx
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: testq %rax, %rax
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %eax
+; X86-AVX2-NEXT: vmovd %xmm0, %ecx
+; X86-AVX2-NEXT: orl %eax, %ecx
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: testq %rax, %rax
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i32:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: testq %rax, %rax
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0)
%2 = icmp eq i32 %1, 0
ret i1 %2
@@ -210,19 +395,19 @@ define i1 @test_v4i32(<4 x i32> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v4i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v4i32:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: setne %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v4i32:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: setne %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0)
%2 = icmp ne i32 %1, 0
ret i1 %2
@@ -237,47 +422,88 @@ define i1 @test_v8i32(<8 x i32> %a0) {
; SSE2-NEXT: movmskps %xmm1, %eax
; SSE2-NEXT: xorl $15, %eax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v8i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v8i32:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v8i32:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
%2 = icmp eq i32 %1, 0
ret i1 %2
}
define i1 @test_v16i32(<16 x i32> %a0) {
-; SSE2-LABEL: test_v16i32:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v16i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v16i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por 8(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: pxor %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
+; X86-SSE2-NEXT: movmskps %xmm0, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v16i32:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v16i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v16i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v16i32:
; AVX1: # %bb.0:
@@ -285,7 +511,7 @@ define i1 @test_v16i32(<16 x i32> %a0) {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i32:
; AVX2: # %bb.0:
@@ -293,7 +519,7 @@ define i1 @test_v16i32(<16 x i32> %a0) {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i32:
; AVX512: # %bb.0:
@@ -308,54 +534,145 @@ define i1 @test_v16i32(<16 x i32> %a0) {
}
define i1 @test_v32i32(<32 x i32> %a0) {
-; SSE2-LABEL: test_v32i32:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm7, %xmm3
-; SSE2-NEXT: por %xmm5, %xmm1
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm6, %xmm2
-; SSE2-NEXT: por %xmm4, %xmm0
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v32i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm7, %xmm3
-; SSE41-NEXT: por %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm6, %xmm2
-; SSE41-NEXT: por %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v32i32:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v32i32:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v32i32:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: por 72(%ebp), %xmm3
+; X86-SSE2-NEXT: por 40(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm3, %xmm1
+; X86-SSE2-NEXT: por 56(%ebp), %xmm2
+; X86-SSE2-NEXT: por 24(%ebp), %xmm0
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: pxor %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v32i32:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm7, %xmm3
+; X64-SSE2-NEXT: por %xmm5, %xmm1
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm6, %xmm2
+; X64-SSE2-NEXT: por %xmm4, %xmm0
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v32i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: por 72(%ebp), %xmm3
+; X86-SSE4-NEXT: por 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: por 56(%ebp), %xmm2
+; X86-SSE4-NEXT: por 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v32i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm7, %xmm3
+; X64-SSE4-NEXT: por %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm6, %xmm2
+; X64-SSE4-NEXT: por %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v32i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v32i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v32i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v32i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v32i32:
; AVX512: # %bb.0:
@@ -380,33 +697,80 @@ define i1 @test_v2i16(<2 x i16> %a0) {
; SSE-NEXT: movd %xmm0, %eax
; SSE-NEXT: testl %eax, %eax
; SSE-NEXT: sete %al
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v2i16:
; AVX: # %bb.0:
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: testl %eax, %eax
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0)
%2 = icmp eq i16 %1, 0
ret i1 %2
}
define i1 @test_v4i16(<4 x i16> %a0) {
-; SSE-LABEL: test_v4i16:
-; SSE: # %bb.0:
-; SSE-NEXT: movq %xmm0, %rax
-; SSE-NEXT: testq %rax, %rax
-; SSE-NEXT: setne %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v4i16:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: testq %rax, %rax
-; AVX-NEXT: setne %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v4i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %ecx
+; X86-SSE2-NEXT: orl %eax, %ecx
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE-LABEL: test_v4i16:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: movq %xmm0, %rax
+; X64-SSE-NEXT: testq %rax, %rax
+; X64-SSE-NEXT: setne %al
+; X64-SSE-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v4i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %eax
+; X86-SSE4-NEXT: movd %xmm0, %ecx
+; X86-SSE4-NEXT: orl %eax, %ecx
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v4i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %eax
+; X86-AVX1-NEXT: vmovd %xmm0, %ecx
+; X86-AVX1-NEXT: orl %eax, %ecx
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: testq %rax, %rax
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %eax
+; X86-AVX2-NEXT: vmovd %xmm0, %ecx
+; X86-AVX2-NEXT: orl %eax, %ecx
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: testq %rax, %rax
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v4i16:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: testq %rax, %rax
+; AVX512-NEXT: setne %al
+; AVX512-NEXT: retq
%1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0)
%2 = icmp ne i16 %1, 0
ret i1 %2
@@ -420,19 +784,19 @@ define i1 @test_v8i16(<8 x i16> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v8i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v8i16:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v8i16:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0)
%2 = icmp eq i16 %1, 0
ret i1 %2
@@ -447,47 +811,88 @@ define i1 @test_v16i16(<16 x i16> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v16i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v16i16:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: setne %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v16i16:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: setne %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
%2 = icmp ne i16 %1, 0
ret i1 %2
}
define i1 @test_v32i16(<32 x i16> %a0) {
-; SSE2-LABEL: test_v32i16:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v32i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v32i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por 8(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: pxor %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
+; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v32i16:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v32i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v32i16:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v32i16:
; AVX1: # %bb.0:
@@ -495,7 +900,7 @@ define i1 @test_v32i16(<32 x i16> %a0) {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: sete %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i16:
; AVX2: # %bb.0:
@@ -503,7 +908,7 @@ define i1 @test_v32i16(<32 x i16> %a0) {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: sete %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i16:
; AVX512: # %bb.0:
@@ -518,54 +923,145 @@ define i1 @test_v32i16(<32 x i16> %a0) {
}
define i1 @test_v64i16(<64 x i16> %a0) {
-; SSE2-LABEL: test_v64i16:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm7, %xmm3
-; SSE2-NEXT: por %xmm5, %xmm1
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm6, %xmm2
-; SSE2-NEXT: por %xmm4, %xmm0
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v64i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm7, %xmm3
-; SSE41-NEXT: por %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm6, %xmm2
-; SSE41-NEXT: por %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v64i16:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: setne %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v64i16:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: setne %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v64i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: por 72(%ebp), %xmm3
+; X86-SSE2-NEXT: por 40(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm3, %xmm1
+; X86-SSE2-NEXT: por 56(%ebp), %xmm2
+; X86-SSE2-NEXT: por 24(%ebp), %xmm0
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: pxor %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v64i16:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm7, %xmm3
+; X64-SSE2-NEXT: por %xmm5, %xmm1
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm6, %xmm2
+; X64-SSE2-NEXT: por %xmm4, %xmm0
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v64i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: por 72(%ebp), %xmm3
+; X86-SSE4-NEXT: por 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: por 56(%ebp), %xmm2
+; X86-SSE4-NEXT: por 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v64i16:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm7, %xmm3
+; X64-SSE4-NEXT: por %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm6, %xmm2
+; X64-SSE4-NEXT: por %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v64i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v64i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v64i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v64i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v64i16:
; AVX512: # %bb.0:
@@ -590,14 +1086,14 @@ define i1 @test_v2i8(<2 x i8> %a0) {
; SSE-NEXT: movd %xmm0, %eax
; SSE-NEXT: testw %ax, %ax
; SSE-NEXT: sete %al
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v2i8:
; AVX: # %bb.0:
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: testw %ax, %ax
; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0)
%2 = icmp eq i8 %1, 0
ret i1 %2
@@ -609,33 +1105,80 @@ define i1 @test_v4i8(<4 x i8> %a0) {
; SSE-NEXT: movd %xmm0, %eax
; SSE-NEXT: testl %eax, %eax
; SSE-NEXT: setne %al
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v4i8:
; AVX: # %bb.0:
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: testl %eax, %eax
; AVX-NEXT: setne %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0)
%2 = icmp ne i8 %1, 0
ret i1 %2
}
define i1 @test_v8i8(<8 x i8> %a0) {
-; SSE-LABEL: test_v8i8:
-; SSE: # %bb.0:
-; SSE-NEXT: movq %xmm0, %rax
-; SSE-NEXT: testq %rax, %rax
-; SSE-NEXT: sete %al
-; SSE-NEXT: retq
-;
-; AVX-LABEL: test_v8i8:
-; AVX: # %bb.0:
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: testq %rax, %rax
-; AVX-NEXT: sete %al
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: test_v8i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %ecx
+; X86-SSE2-NEXT: orl %eax, %ecx
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE-LABEL: test_v8i8:
+; X64-SSE: # %bb.0:
+; X64-SSE-NEXT: movq %xmm0, %rax
+; X64-SSE-NEXT: testq %rax, %rax
+; X64-SSE-NEXT: sete %al
+; X64-SSE-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v8i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %eax
+; X86-SSE4-NEXT: movd %xmm0, %ecx
+; X86-SSE4-NEXT: orl %eax, %ecx
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v8i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %eax
+; X86-AVX1-NEXT: vmovd %xmm0, %ecx
+; X86-AVX1-NEXT: orl %eax, %ecx
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: testq %rax, %rax
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %eax
+; X86-AVX2-NEXT: vmovd %xmm0, %ecx
+; X86-AVX2-NEXT: orl %eax, %ecx
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: testq %rax, %rax
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v8i8:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: testq %rax, %rax
+; AVX512-NEXT: sete %al
+; AVX512-NEXT: retq
%1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0)
%2 = icmp eq i8 %1, 0
ret i1 %2
@@ -649,19 +1192,19 @@ define i1 @test_v16i8(<16 x i8> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v16i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v16i8:
+; SSE4: # %bb.0:
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: setne %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v16i8:
; AVX: # %bb.0:
; AVX-NEXT: vptest %xmm0, %xmm0
; AVX-NEXT: setne %al
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0)
%2 = icmp ne i8 %1, 0
ret i1 %2
@@ -676,47 +1219,88 @@ define i1 @test_v32i8(<32 x i8> %a0) {
; SSE2-NEXT: pmovmskb %xmm1, %eax
; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: test_v32i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: test_v32i8:
+; SSE4: # %bb.0:
+; SSE4-NEXT: por %xmm1, %xmm0
+; SSE4-NEXT: ptest %xmm0, %xmm0
+; SSE4-NEXT: sete %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX-LABEL: test_v32i8:
; AVX: # %bb.0:
; AVX-NEXT: vptest %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v32i8(<32 x i8> %a0)
%2 = icmp eq i8 %1, 0
ret i1 %2
}
define i1 @test_v64i8(<64 x i8> %a0) {
-; SSE2-LABEL: test_v64i8:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v64i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: test_v64i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por 8(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: pxor %xmm0, %xmm0
+; X86-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
+; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v64i8:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v64i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: ptest %xmm1, %xmm1
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v64i8:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: test_v64i8:
; AVX1: # %bb.0:
@@ -724,7 +1308,7 @@ define i1 @test_v64i8(<64 x i8> %a0) {
; AVX1-NEXT: vptest %ymm0, %ymm0
; AVX1-NEXT: setne %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v64i8:
; AVX2: # %bb.0:
@@ -732,7 +1316,7 @@ define i1 @test_v64i8(<64 x i8> %a0) {
; AVX2-NEXT: vptest %ymm0, %ymm0
; AVX2-NEXT: setne %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v64i8:
; AVX512: # %bb.0:
@@ -747,54 +1331,145 @@ define i1 @test_v64i8(<64 x i8> %a0) {
}
define i1 @test_v128i8(<128 x i8> %a0) {
-; SSE2-LABEL: test_v128i8:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm7, %xmm3
-; SSE2-NEXT: por %xmm5, %xmm1
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm6, %xmm2
-; SSE2-NEXT: por %xmm4, %xmm0
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: test_v128i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm7, %xmm3
-; SSE41-NEXT: por %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm6, %xmm2
-; SSE41-NEXT: por %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest %xmm0, %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: test_v128i8:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest %ymm0, %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v128i8:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vptest %ymm0, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: test_v128i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: por 72(%ebp), %xmm3
+; X86-SSE2-NEXT: por 40(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm3, %xmm1
+; X86-SSE2-NEXT: por 56(%ebp), %xmm2
+; X86-SSE2-NEXT: por 24(%ebp), %xmm0
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: pxor %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: test_v128i8:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm7, %xmm3
+; X64-SSE2-NEXT: por %xmm5, %xmm1
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm6, %xmm2
+; X64-SSE2-NEXT: por %xmm4, %xmm0
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: test_v128i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: por 72(%ebp), %xmm3
+; X86-SSE4-NEXT: por 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: por 56(%ebp), %xmm2
+; X86-SSE4-NEXT: por 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest %xmm0, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: test_v128i8:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm7, %xmm3
+; X64-SSE4-NEXT: por %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm6, %xmm2
+; X64-SSE4-NEXT: por %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest %xmm0, %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: test_v128i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest %ymm0, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v128i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest %ymm0, %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v128i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vptest %ymm0, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v128i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vptest %ymm0, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v128i8:
; AVX512: # %bb.0:
@@ -821,19 +1496,43 @@ define i1 @trunc_v2i64(<2 x i64> %a0) {
; SSE2-NEXT: movd %xmm1, %eax
; SSE2-NEXT: testw %ax, %ax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: trunc_v2i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1OR2-LABEL: trunc_v2i64:
-; AVX1OR2: # %bb.0:
-; AVX1OR2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; AVX1OR2-NEXT: sete %al
-; AVX1OR2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: trunc_v2i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v2i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v2i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v2i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v2i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v2i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v2i64:
; AVX512F: # %bb.0:
@@ -847,12 +1546,12 @@ define i1 @trunc_v2i64(<2 x i64> %a0) {
; AVX512BW-NEXT: sete %al
; AVX512BW-NEXT: retq
;
-; AVX512BWVL-LABEL: trunc_v2i64:
-; AVX512BWVL: # %bb.0:
-; AVX512BWVL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535]
-; AVX512BWVL-NEXT: vptest %xmm1, %xmm0
-; AVX512BWVL-NEXT: sete %al
-; AVX512BWVL-NEXT: retq
+; AVX512VL-LABEL: trunc_v2i64:
+; AVX512VL: # %bb.0:
+; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm1 = [65535,65535]
+; AVX512VL-NEXT: vptest %xmm1, %xmm0
+; AVX512VL-NEXT: sete %al
+; AVX512VL-NEXT: retq
%1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
%2 = trunc i64 %1 to i16
%3 = icmp eq i16 %2, 0
@@ -866,21 +1565,28 @@ define i1 @mask_v8i32(<8 x i32> %a0) {
; SSE2-NEXT: movmskps %xmm0, %eax
; SSE2-NEXT: testl %eax, %eax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: mask_v8i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: mask_v8i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: mask_v8i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX-LABEL: mask_v8i32:
; AVX: # %bb.0:
; AVX-NEXT: vtestps %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
%2 = and i32 %1, 2147483648
%3 = icmp eq i32 %2, 0
@@ -895,29 +1601,51 @@ define i1 @mask_v8i32_2(<8 x i32> %a0) {
; SSE2-NEXT: movmskps %xmm0, %eax
; SSE2-NEXT: testl %eax, %eax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: mask_v8i32_2:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: mask_v8i32_2:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: mask_v8i32_2:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4611686019501129728,4611686019501129728,4611686019501129728,4611686019501129728]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: mask_v8i32_2:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: mask_v8i32_2:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: mask_v8i32_2:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: mask_v8i32_2:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: mask_v8i32_2:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824,1073741824]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: mask_v8i32_2:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [4611686019501129728,4611686019501129728,4611686019501129728,4611686019501129728]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: mask_v8i32_2:
; AVX512: # %bb.0:
@@ -940,80 +1668,151 @@ define i1 @signtest_v8i32(<8 x i32> %a0) {
; SSE2-NEXT: movmskps %xmm0, %eax
; SSE2-NEXT: testl %eax, %eax
; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: signtest_v8i32:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; SSE2-NEXT: ret{{[l|q]}}
+;
+; X86-SSE4-LABEL: signtest_v8i32:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: signtest_v8i32:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX-LABEL: signtest_v8i32:
; AVX: # %bb.0:
; AVX-NEXT: vtestps %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.or.v8i32(<8 x i32> %a0)
%2 = icmp sgt i32 %1, -1
ret i1 %2
}
define i1 @signtest_v4i64(<4 x i64> %a0) {
-; SSE2-LABEL: signtest_v4i64:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; SSE2-NEXT: por %xmm0, %xmm1
-; SSE2-NEXT: movq %xmm1, %rax
-; SSE2-NEXT: testq %rax, %rax
-; SSE2-NEXT: setns %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: signtest_v4i64:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
+; X86-SSE2-LABEL: signtest_v4i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: por %xmm1, %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: testl %eax, %eax
+; X86-SSE2-NEXT: setns %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: signtest_v4i64:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-SSE2-NEXT: por %xmm0, %xmm1
+; X64-SSE2-NEXT: movq %xmm1, %rax
+; X64-SSE2-NEXT: testq %rax, %rax
+; X64-SSE2-NEXT: setns %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: signtest_v4i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: signtest_v4i64:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
;
; AVX-LABEL: signtest_v4i64:
; AVX: # %bb.0:
; AVX-NEXT: vtestpd %ymm0, %ymm0
; AVX-NEXT: sete %al
; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i64 @llvm.vector.reduce.or.v4i64(<4 x i64> %a0)
%2 = icmp sgt i64 %1, -1
ret i1 %2
}
define i1 @trunc_v16i16(<16 x i16> %a0) {
-; SSE2-LABEL: trunc_v16i16:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqb %xmm0, %xmm1
-; SSE2-NEXT: pmovmskb %xmm1, %eax
-; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
-; SSE2-NEXT: setne %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: trunc_v16i16:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: setne %al
-; SSE41-NEXT: retq
-;
-; AVX-LABEL: trunc_v16i16:
-; AVX: # %bb.0:
-; AVX-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX-NEXT: setne %al
-; AVX-NEXT: vzeroupper
-; AVX-NEXT: retq
+; X86-SSE2-LABEL: trunc_v16i16:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT: pxor %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X86-SSE2-NEXT: setne %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: trunc_v16i16:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqb %xmm0, %xmm1
+; X64-SSE2-NEXT: pmovmskb %xmm1, %eax
+; X64-SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF
+; X64-SSE2-NEXT: setne %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: trunc_v16i16:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: setne %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i16:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: setne %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v16i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: setne %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: setne %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX2-NEXT: setne %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX2-NEXT: setne %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: trunc_v16i16:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; AVX512-NEXT: setne %al
+; AVX512-NEXT: vzeroupper
+; AVX512-NEXT: retq
%1 = call i16 @llvm.vector.reduce.or.v16i16(<16 x i16> %a0)
%2 = trunc i16 %1 to i8
%3 = icmp ne i8 %2, 0
@@ -1021,54 +1820,145 @@ define i1 @trunc_v16i16(<16 x i16> %a0) {
}
define i1 @mask_v128i8(<128 x i8> %a0) {
-; SSE2-LABEL: mask_v128i8:
-; SSE2: # %bb.0:
-; SSE2-NEXT: por %xmm7, %xmm3
-; SSE2-NEXT: por %xmm5, %xmm1
-; SSE2-NEXT: por %xmm3, %xmm1
-; SSE2-NEXT: por %xmm6, %xmm2
-; SSE2-NEXT: por %xmm4, %xmm0
-; SSE2-NEXT: por %xmm2, %xmm0
-; SSE2-NEXT: por %xmm1, %xmm0
-; SSE2-NEXT: psllw $7, %xmm0
-; SSE2-NEXT: pmovmskb %xmm0, %eax
-; SSE2-NEXT: testl %eax, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: mask_v128i8:
-; SSE41: # %bb.0:
-; SSE41-NEXT: por %xmm7, %xmm3
-; SSE41-NEXT: por %xmm5, %xmm1
-; SSE41-NEXT: por %xmm3, %xmm1
-; SSE41-NEXT: por %xmm6, %xmm2
-; SSE41-NEXT: por %xmm4, %xmm0
-; SSE41-NEXT: por %xmm2, %xmm0
-; SSE41-NEXT: por %xmm1, %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: mask_v128i8:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: mask_v128i8:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
-; AVX2-NEXT: vptest %ymm1, %ymm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: mask_v128i8:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE2-NEXT: .cfi_offset %ebp, -8
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: por 72(%ebp), %xmm3
+; X86-SSE2-NEXT: por 40(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm3, %xmm1
+; X86-SSE2-NEXT: por 56(%ebp), %xmm2
+; X86-SSE2-NEXT: por 24(%ebp), %xmm0
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: psllw $7, %xmm0
+; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE2-NEXT: testl %eax, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: mask_v128i8:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: por %xmm7, %xmm3
+; X64-SSE2-NEXT: por %xmm5, %xmm1
+; X64-SSE2-NEXT: por %xmm3, %xmm1
+; X64-SSE2-NEXT: por %xmm6, %xmm2
+; X64-SSE2-NEXT: por %xmm4, %xmm0
+; X64-SSE2-NEXT: por %xmm2, %xmm0
+; X64-SSE2-NEXT: por %xmm1, %xmm0
+; X64-SSE2-NEXT: psllw $7, %xmm0
+; X64-SSE2-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE2-NEXT: testl %eax, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: mask_v128i8:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_offset 8
+; X86-SSE4-NEXT: .cfi_offset %ebp, -8
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa_register %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: por 72(%ebp), %xmm3
+; X86-SSE4-NEXT: por 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: por 56(%ebp), %xmm2
+; X86-SSE4-NEXT: por 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: .cfi_def_cfa %esp, 4
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: mask_v128i8:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: por %xmm7, %xmm3
+; X64-SSE4-NEXT: por %xmm5, %xmm1
+; X64-SSE4-NEXT: por %xmm3, %xmm1
+; X64-SSE4-NEXT: por %xmm6, %xmm2
+; X64-SSE4-NEXT: por %xmm4, %xmm0
+; X64-SSE4-NEXT: por %xmm2, %xmm0
+; X64-SSE4-NEXT: por %xmm1, %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: mask_v128i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX1-NEXT: .cfi_offset %ebp, -8
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: mask_v128i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: mask_v128i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_offset 8
+; X86-AVX2-NEXT: .cfi_offset %ebp, -8
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa_register %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} ymm1 = [16843009,16843009,16843009,16843009,16843009,16843009,16843009,16843009]
+; X86-AVX2-NEXT: vptest %ymm1, %ymm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: .cfi_def_cfa %esp, 4
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: mask_v128i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpbroadcastq {{.*#+}} ymm1 = [72340172838076673,72340172838076673,72340172838076673,72340172838076673]
+; X64-AVX2-NEXT: vptest %ymm1, %ymm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: mask_v128i8:
; AVX512: # %bb.0:
@@ -1086,37 +1976,73 @@ define i1 @mask_v128i8(<128 x i8> %a0) {
%struct.Box = type { i32, i32, i32, i32 }
define zeroext i1 @PR44781(ptr %0) {
-; SSE2-LABEL: PR44781:
-; SSE2: # %bb.0:
-; SSE2-NEXT: movdqu (%rdi), %xmm0
-; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE2-NEXT: pxor %xmm1, %xmm1
-; SSE2-NEXT: pcmpeqd %xmm0, %xmm1
-; SSE2-NEXT: movmskps %xmm1, %eax
-; SSE2-NEXT: xorl $15, %eax
-; SSE2-NEXT: sete %al
-; SSE2-NEXT: retq
-;
-; SSE41-LABEL: PR44781:
-; SSE41: # %bb.0:
-; SSE41-NEXT: movdqu (%rdi), %xmm0
-; SSE41-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
-; SSE41-NEXT: sete %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: PR44781:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [15,15,15,15]
-; AVX1-NEXT: vptest (%rdi), %xmm0
-; AVX1-NEXT: sete %al
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: PR44781:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]
-; AVX2-NEXT: vptest (%rdi), %xmm0
-; AVX2-NEXT: sete %al
-; AVX2-NEXT: retq
+; X86-SSE2-LABEL: PR44781:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE2-NEXT: movdqu (%eax), %xmm0
+; X86-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE2-NEXT: pxor %xmm1, %xmm1
+; X86-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X86-SSE2-NEXT: movmskps %xmm1, %eax
+; X86-SSE2-NEXT: xorl $15, %eax
+; X86-SSE2-NEXT: sete %al
+; X86-SSE2-NEXT: retl
+;
+; X64-SSE2-LABEL: PR44781:
+; X64-SSE2: # %bb.0:
+; X64-SSE2-NEXT: movdqu (%rdi), %xmm0
+; X64-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE2-NEXT: pxor %xmm1, %xmm1
+; X64-SSE2-NEXT: pcmpeqd %xmm0, %xmm1
+; X64-SSE2-NEXT: movmskps %xmm1, %eax
+; X64-SSE2-NEXT: xorl $15, %eax
+; X64-SSE2-NEXT: sete %al
+; X64-SSE2-NEXT: retq
+;
+; X86-SSE4-LABEL: PR44781:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-SSE4-NEXT: movdqu (%eax), %xmm0
+; X86-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
+; X86-SSE4-NEXT: sete %al
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: PR44781:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: movdqu (%rdi), %xmm0
+; X64-SSE4-NEXT: ptest {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
+; X64-SSE4-NEXT: sete %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: PR44781:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [15,15,15,15]
+; X86-AVX1-NEXT: vptest (%eax), %xmm0
+; X86-AVX1-NEXT: sete %al
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: PR44781:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vbroadcastss {{.*#+}} xmm0 = [15,15,15,15]
+; X64-AVX1-NEXT: vptest (%rdi), %xmm0
+; X64-AVX1-NEXT: sete %al
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: PR44781:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
+; X86-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]
+; X86-AVX2-NEXT: vptest (%eax), %xmm0
+; X86-AVX2-NEXT: sete %al
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: PR44781:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm0 = [15,15,15,15]
+; X64-AVX2-NEXT: vptest (%rdi), %xmm0
+; X64-AVX2-NEXT: sete %al
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: PR44781:
; AVX512F: # %bb.0:
@@ -1132,12 +2058,12 @@ define zeroext i1 @PR44781(ptr %0) {
; AVX512BW-NEXT: sete %al
; AVX512BW-NEXT: retq
;
-; AVX512BWVL-LABEL: PR44781:
-; AVX512BWVL: # %bb.0:
-; AVX512BWVL-NEXT: vpbroadcastq {{.*#+}} xmm0 = [64424509455,64424509455]
-; AVX512BWVL-NEXT: vptest (%rdi), %xmm0
-; AVX512BWVL-NEXT: sete %al
-; AVX512BWVL-NEXT: retq
+; AVX512VL-LABEL: PR44781:
+; AVX512VL: # %bb.0:
+; AVX512VL-NEXT: vpbroadcastq {{.*#+}} xmm0 = [64424509455,64424509455]
+; AVX512VL-NEXT: vptest (%rdi), %xmm0
+; AVX512VL-NEXT: sete %al
+; AVX512VL-NEXT: retq
%2 = load <4 x i32>, ptr %0, align 4
%3 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %2)
%4 = and i32 %3, 15
@@ -1160,10 +2086,10 @@ define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
; SSE-NEXT: je .LBB30_2
; SSE-NEXT: # %bb.1:
; SSE-NEXT: xorl %eax, %eax
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
; SSE-NEXT: .LBB30_2:
; SSE-NEXT: movl $1, %eax
-; SSE-NEXT: retq
+; SSE-NEXT: ret{{[l|q]}}
;
; AVX1OR2-LABEL: mask_v3i1:
; AVX1OR2: # %bb.0:
@@ -1179,10 +2105,10 @@ define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
; AVX1OR2-NEXT: je .LBB30_2
; AVX1OR2-NEXT: # %bb.1:
; AVX1OR2-NEXT: xorl %eax, %eax
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
; AVX1OR2-NEXT: .LBB30_2:
; AVX1OR2-NEXT: movl $1, %eax
-; AVX1OR2-NEXT: retq
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: mask_v3i1:
; AVX512F: # %bb.0:
@@ -1226,22 +2152,22 @@ define i32 @mask_v3i1(<3 x i32> %a, <3 x i32> %b) {
; AVX512BW-NEXT: vzeroupper
; AVX512BW-NEXT: retq
;
-; AVX512BWVL-LABEL: mask_v3i1:
-; AVX512BWVL: # %bb.0:
-; AVX512BWVL-NEXT: vpcmpneqd %xmm1, %xmm0, %k0
-; AVX512BWVL-NEXT: kshiftrw $2, %k0, %k1
-; AVX512BWVL-NEXT: korw %k1, %k0, %k1
-; AVX512BWVL-NEXT: kshiftrw $1, %k0, %k0
-; AVX512BWVL-NEXT: korw %k0, %k1, %k0
-; AVX512BWVL-NEXT: kmovd %k0, %eax
-; AVX512BWVL-NEXT: testb $1, %al
-; AVX512BWVL-NEXT: je .LBB30_2
-; AVX512BWVL-NEXT: # %bb.1:
-; AVX512BWVL-NEXT: xorl %eax, %eax
-; AVX512BWVL-NEXT: retq
-; AVX512BWVL-NEXT: .LBB30_2:
-; AVX512BWVL-NEXT: movl $1, %eax
-; AVX512BWVL-NEXT: retq
+; AVX512VL-LABEL: mask_v3i1:
+; AVX512VL: # %bb.0:
+; AVX512VL-NEXT: vpcmpneqd %xmm1, %xmm0, %k0
+; AVX512VL-NEXT: kshiftrb $2, %k0, %k1
+; AVX512VL-NEXT: korw %k1, %k0, %k1
+; AVX512VL-NEXT: kshiftrb $1, %k0, %k0
+; AVX512VL-NEXT: korw %k0, %k1, %k0
+; AVX512VL-NEXT: kmovd %k0, %eax
+; AVX512VL-NEXT: testb $1, %al
+; AVX512VL-NEXT: je .LBB30_2
+; AVX512VL-NEXT: # %bb.1:
+; AVX512VL-NEXT: xorl %eax, %eax
+; AVX512VL-NEXT: retq
+; AVX512VL-NEXT: .LBB30_2:
+; AVX512VL-NEXT: movl $1, %eax
+; AVX512VL-NEXT: retq
%1 = icmp ne <3 x i32> %a, %b
%2 = call i1 @llvm.vector.reduce.or.v3i1(<3 x i1> %1)
br i1 %2, label %3, label %4
@@ -1278,3 +2204,5 @@ declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>)
declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>)
declare i1 @llvm.vector.reduce.or.v3i1(<3 x i1>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; X86-SSE: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-or.ll b/llvm/test/CodeGen/X86/vector-reduce-or.ll
index 3c960f255046c..fed059d7a3974 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-or.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-or.ll
@@ -1,25 +1,31 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; vXi64
;
define i64 @test_v2i64(<2 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v2i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE-NEXT: por %xmm0, %xmm1
-; X86-SSE-NEXT: movd %xmm1, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v2i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v2i64:
; X64-SSE: # %bb.0:
@@ -28,26 +34,64 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX-LABEL: test_v2i64:
-; AVX: # %bb.0:
-; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: retq
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: movd %xmm1, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm1, %edx
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v2i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512-NEXT: vpor %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: retq
%1 = call i64 @llvm.vector.reduce.or.v2i64(<2 x i64> %a0)
ret i64 %1
}
define i64 @test_v4i64(<4 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v4i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: por %xmm1, %xmm0
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE-NEXT: por %xmm0, %xmm1
-; X86-SSE-NEXT: movd %xmm1, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v4i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v4i64:
; X64-SSE: # %bb.0:
@@ -57,25 +101,56 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v4i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v4i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v4i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: movd %xmm1, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm1, %edx
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v4i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v4i64:
; AVX512: # %bb.0:
@@ -91,23 +166,23 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
}
define i64 @test_v8i64(<8 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v8i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pushl %ebp
-; X86-SSE-NEXT: movl %esp, %ebp
-; X86-SSE-NEXT: andl $-16, %esp
-; X86-SSE-NEXT: subl $16, %esp
-; X86-SSE-NEXT: por %xmm2, %xmm0
-; X86-SSE-NEXT: por 8(%ebp), %xmm1
-; X86-SSE-NEXT: por %xmm0, %xmm1
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE-NEXT: por %xmm1, %xmm0
-; X86-SSE-NEXT: movd %xmm0, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: movl %ebp, %esp
-; X86-SSE-NEXT: popl %ebp
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v8i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por 8(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v8i64:
; X64-SSE: # %bb.0:
@@ -119,27 +194,68 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v8i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v8i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 8(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %edx
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v8i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v8i64:
; AVX512: # %bb.0:
@@ -157,28 +273,28 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
}
define i64 @test_v16i64(<16 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v16i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pushl %ebp
-; X86-SSE-NEXT: movl %esp, %ebp
-; X86-SSE-NEXT: andl $-16, %esp
-; X86-SSE-NEXT: subl $16, %esp
-; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE-NEXT: por 56(%ebp), %xmm2
-; X86-SSE-NEXT: por 24(%ebp), %xmm0
-; X86-SSE-NEXT: por %xmm2, %xmm0
-; X86-SSE-NEXT: por 72(%ebp), %xmm3
-; X86-SSE-NEXT: por 40(%ebp), %xmm1
-; X86-SSE-NEXT: por %xmm3, %xmm1
-; X86-SSE-NEXT: por %xmm0, %xmm1
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE-NEXT: por %xmm1, %xmm0
-; X86-SSE-NEXT: movd %xmm0, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: movl %ebp, %esp
-; X86-SSE-NEXT: popl %ebp
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v16i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: por 56(%ebp), %xmm2
+; X86-SSE2-NEXT: por 24(%ebp), %xmm0
+; X86-SSE2-NEXT: por %xmm2, %xmm0
+; X86-SSE2-NEXT: por 72(%ebp), %xmm3
+; X86-SSE2-NEXT: por 40(%ebp), %xmm1
+; X86-SSE2-NEXT: por %xmm3, %xmm1
+; X86-SSE2-NEXT: por %xmm0, %xmm1
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT: por %xmm1, %xmm0
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v16i64:
; X64-SSE: # %bb.0:
@@ -194,31 +310,93 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm0, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v16i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: por 56(%ebp), %xmm2
+; X86-SSE4-NEXT: por 24(%ebp), %xmm0
+; X86-SSE4-NEXT: por %xmm2, %xmm0
+; X86-SSE4-NEXT: por 72(%ebp), %xmm3
+; X86-SSE4-NEXT: por 40(%ebp), %xmm1
+; X86-SSE4-NEXT: por %xmm3, %xmm1
+; X86-SSE4-NEXT: por %xmm0, %xmm1
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE4-NEXT: por %xmm1, %xmm0
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %edx
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v16i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i64:
; AVX512: # %bb.0:
@@ -253,7 +431,7 @@ define i32 @test_v2i32(<2 x i32> %a0) nounwind {
; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.or.v2i32(<2 x i32> %a0)
ret i32 %1
}
@@ -275,7 +453,7 @@ define i32 @test_v4i32(<4 x i32> %a0) nounwind {
; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.or.v4i32(<4 x i32> %a0)
ret i32 %1
}
@@ -301,7 +479,7 @@ define i32 @test_v8i32(<8 x i32> %a0) nounwind {
; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v8i32:
; AVX2: # %bb.0:
@@ -313,7 +491,7 @@ define i32 @test_v8i32(<8 x i32> %a0) nounwind {
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v8i32:
; AVX512: # %bb.0:
@@ -372,7 +550,7 @@ define i32 @test_v16i32(<16 x i32> %a0) nounwind {
; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i32:
; AVX2: # %bb.0:
@@ -385,7 +563,7 @@ define i32 @test_v16i32(<16 x i32> %a0) nounwind {
; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i32:
; AVX512: # %bb.0:
@@ -444,35 +622,77 @@ define i32 @test_v32i32(<32 x i32> %a0) nounwind {
; X64-SSE-NEXT: movd %xmm1, %eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v32i32:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v32i32:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v32i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v32i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v32i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpor %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: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v32i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpor %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: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v32i32:
; AVX512: # %bb.0:
@@ -512,7 +732,7 @@ define i16 @test_v2i16(<2 x i16> %a0) nounwind {
; AVX-NEXT: vpor %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.or.v2i16(<2 x i16> %a0)
ret i16 %1
}
@@ -537,7 +757,7 @@ define i16 @test_v4i16(<4 x i16> %a0) nounwind {
; AVX-NEXT: vpor %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.or.v4i16(<4 x i16> %a0)
ret i16 %1
}
@@ -566,7 +786,7 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
; AVX-NEXT: vpor %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.or.v8i16(<8 x i16> %a0)
ret i16 %1
}
@@ -599,7 +819,7 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i16:
; AVX2: # %bb.0:
@@ -614,7 +834,7 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i16:
; AVX512: # %bb.0:
@@ -687,7 +907,7 @@ define i16 @test_v32i16(<32 x i16> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i16:
; AVX2: # %bb.0:
@@ -703,7 +923,7 @@ define i16 @test_v32i16(<32 x i16> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i16:
; AVX512: # %bb.0:
@@ -773,41 +993,89 @@ define i16 @test_v64i16(<64 x i16> %a0) nounwind {
; X64-SSE-NEXT: # kill: def $ax killed $ax killed $eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v64i16:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v64i16:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v64i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v64i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vorps %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v64i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v64i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v64i16:
; AVX512: # %bb.0:
@@ -850,7 +1118,7 @@ define i8 @test_v2i8(<2 x i8> %a0) nounwind {
; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v2i8(<2 x i8> %a0)
ret i8 %1
}
@@ -876,7 +1144,7 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v4i8(<4 x i8> %a0)
ret i8 %1
}
@@ -906,7 +1174,7 @@ define i8 @test_v8i8(<8 x i8> %a0) nounwind {
; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v8i8(<8 x i8> %a0)
ret i8 %1
}
@@ -940,7 +1208,7 @@ define i8 @test_v16i8(<16 x i8> %a0) nounwind {
; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.or.v16i8(<16 x i8> %a0)
ret i8 %1
}
@@ -978,7 +1246,7 @@ define i8 @test_v32i8(<32 x i8> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i8:
; AVX2: # %bb.0:
@@ -995,7 +1263,7 @@ define i8 @test_v32i8(<32 x i8> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i8:
; AVX512: # %bb.0:
@@ -1078,7 +1346,7 @@ define i8 @test_v64i8(<64 x i8> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v64i8:
; AVX2: # %bb.0:
@@ -1096,7 +1364,7 @@ define i8 @test_v64i8(<64 x i8> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v64i8:
; AVX512: # %bb.0:
@@ -1174,45 +1442,97 @@ define i8 @test_v128i8(<128 x i8> %a0) nounwind {
; X64-SSE-NEXT: # kill: def $al killed $al killed $eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v128i8:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
-; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: # kill: def $al killed $al killed $eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v128i8:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
-; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: # kill: def $al killed $al killed $eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v128i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v128i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v128i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v128i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v128i8:
; AVX512: # %bb.0:
@@ -1262,3 +1582,12 @@ declare i8 @llvm.vector.reduce.or.v16i8(<16 x i8>)
declare i8 @llvm.vector.reduce.or.v32i8(<32 x i8>)
declare i8 @llvm.vector.reduce.or.v64i8(<64 x i8>)
declare i8 @llvm.vector.reduce.or.v128i8(<128 x i8>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; AVX1OR2: {{.*}}
+; AVX512BW: {{.*}}
+; AVX512F: {{.*}}
+; AVX512VL: {{.*}}
+; SSE2: {{.*}}
+; SSE4: {{.*}}
+; X64-SSE2: {{.*}}
+; X64-SSE4: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-xor-bool.ll b/llvm/test/CodeGen/X86/vector-reduce-xor-bool.ll
index 6cb43234d713b..c9b1f2a5edaa0 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-xor-bool.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-xor-bool.ll
@@ -1,12 +1,17 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X86-SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,SSE2,X64-SSE,X64-SSE2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE41
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=AVX512,AVX512F
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX512,AVX512BW
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX512,AVX512VL
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; Truncate
@@ -21,13 +26,13 @@ define i1 @trunc_v2i64_v2i1(<2 x i64>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: trunc_v2i64_v2i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpsllq $63, %xmm0, %xmm0
-; AVX-NEXT: vmovmskpd %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: trunc_v2i64_v2i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpsllq $63, %xmm0, %xmm0
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v2i64_v2i1:
; AVX512F: # %bb.0:
@@ -52,8 +57,7 @@ define i1 @trunc_v2i64_v2i1(<2 x i64>) nounwind {
; AVX512VL-LABEL: trunc_v2i64_v2i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpsllq $63, %xmm0, %xmm0
-; AVX512VL-NEXT: vptestmq %xmm0, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
+; AVX512VL-NEXT: vmovmskpd %xmm0, %eax
; AVX512VL-NEXT: testb %al, %al
; AVX512VL-NEXT: setnp %al
; AVX512VL-NEXT: retq
@@ -71,13 +75,13 @@ define i1 @trunc_v4i32_v4i1(<4 x i32>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: trunc_v4i32_v4i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpslld $31, %xmm0, %xmm0
-; AVX-NEXT: vmovmskps %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: trunc_v4i32_v4i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpslld $31, %xmm0, %xmm0
+; AVX1OR2-NEXT: vmovmskps %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v4i32_v4i1:
; AVX512F: # %bb.0:
@@ -102,8 +106,7 @@ define i1 @trunc_v4i32_v4i1(<4 x i32>) nounwind {
; AVX512VL-LABEL: trunc_v4i32_v4i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpslld $31, %xmm0, %xmm0
-; AVX512VL-NEXT: vptestmd %xmm0, %xmm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
+; AVX512VL-NEXT: vmovmskps %xmm0, %eax
; AVX512VL-NEXT: testb %al, %al
; AVX512VL-NEXT: setnp %al
; AVX512VL-NEXT: retq
@@ -122,14 +125,14 @@ define i1 @trunc_v8i16_v8i1(<8 x i16>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: trunc_v8i16_v8i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpsllw $15, %xmm0, %xmm0
-; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vpmovmskb %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: trunc_v8i16_v8i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpsllw $15, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v8i16_v8i1:
; AVX512F: # %bb.0:
@@ -180,15 +183,7 @@ define i1 @trunc_v16i8_v16i1(<16 x i8>) nounwind {
; AVX-NEXT: vpmovmskb %xmm0, %eax
; AVX-NEXT: xorb %ah, %al
; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
-;
-; AVX512-LABEL: trunc_v16i8_v16i1:
-; AVX512: # %bb.0:
-; AVX512-NEXT: vpsllw $7, %xmm0, %xmm0
-; AVX512-NEXT: vpmovmskb %xmm0, %eax
-; AVX512-NEXT: xorb %ah, %al
-; AVX512-NEXT: setnp %al
-; AVX512-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%a = trunc <16 x i8> %0 to <16 x i1>
%b = call i1 @llvm.vector.reduce.xor.v16i1(<16 x i1> %a)
ret i1 %b
@@ -213,7 +208,7 @@ define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: trunc_v4i64_v4i1:
; AVX2: # %bb.0:
@@ -222,7 +217,7 @@ define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v4i64_v4i1:
; AVX512F: # %bb.0:
@@ -247,8 +242,7 @@ define i1 @trunc_v4i64_v4i1(<4 x i64>) nounwind {
; AVX512VL-LABEL: trunc_v4i64_v4i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpsllq $63, %ymm0, %ymm0
-; AVX512VL-NEXT: vptestmq %ymm0, %ymm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
+; AVX512VL-NEXT: vmovmskpd %ymm0, %eax
; AVX512VL-NEXT: testb %al, %al
; AVX512VL-NEXT: setnp %al
; AVX512VL-NEXT: vzeroupper
@@ -273,18 +267,18 @@ define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {
; SSE2-NEXT: setnp %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v8i32_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm2, %xmm2
-; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
-; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
-; SSE41-NEXT: packusdw %xmm1, %xmm0
-; SSE41-NEXT: psllw $15, %xmm0
-; SSE41-NEXT: packsswb %xmm0, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: trunc_v8i32_v8i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm2, %xmm2
+; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3],xmm1[4],xmm2[5],xmm1[6],xmm2[7]
+; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3],xmm0[4],xmm2[5],xmm0[6],xmm2[7]
+; SSE4-NEXT: packusdw %xmm1, %xmm0
+; SSE4-NEXT: psllw $15, %xmm0
+; SSE4-NEXT: packsswb %xmm0, %xmm0
+; SSE4-NEXT: pmovmskb %xmm0, %eax
+; SSE4-NEXT: testb %al, %al
+; SSE4-NEXT: setnp %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: trunc_v8i32_v8i1:
; AVX1: # %bb.0:
@@ -296,7 +290,7 @@ define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: trunc_v8i32_v8i1:
; AVX2: # %bb.0:
@@ -305,7 +299,7 @@ define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v8i32_v8i1:
; AVX512F: # %bb.0:
@@ -330,8 +324,7 @@ define i1 @trunc_v8i32_v8i1(<8 x i32>) nounwind {
; AVX512VL-LABEL: trunc_v8i32_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpslld $31, %ymm0, %ymm0
-; AVX512VL-NEXT: vptestmd %ymm0, %ymm0, %k0
-; AVX512VL-NEXT: kmovd %k0, %eax
+; AVX512VL-NEXT: vmovmskps %ymm0, %eax
; AVX512VL-NEXT: testb %al, %al
; AVX512VL-NEXT: setnp %al
; AVX512VL-NEXT: vzeroupper
@@ -354,41 +347,65 @@ define i1 @trunc_v16i16_v16i1(<16 x i16>) nounwind {
; SSE2-NEXT: setnp %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: trunc_v16i16_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
-; SSE41-NEXT: pand %xmm2, %xmm1
-; SSE41-NEXT: pand %xmm2, %xmm0
-; SSE41-NEXT: packuswb %xmm1, %xmm0
-; SSE41-NEXT: psllw $7, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: xorb %ah, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v16i16_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: xorb %ah, %al
-; AVX1-NEXT: setnp %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: trunc_v16i16_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpsllw $7, %xmm0, %xmm0
-; AVX2-NEXT: vpmovmskb %xmm0, %eax
-; AVX2-NEXT: xorb %ah, %al
-; AVX2-NEXT: setnp %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; SSE4-LABEL: trunc_v16i16_v16i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pmovzxbw {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255]
+; SSE4-NEXT: pand %xmm2, %xmm1
+; SSE4-NEXT: pand %xmm2, %xmm0
+; SSE4-NEXT: packuswb %xmm1, %xmm0
+; SSE4-NEXT: psllw $7, %xmm0
+; SSE4-NEXT: pmovmskb %xmm0, %eax
+; SSE4-NEXT: xorb %ah, %al
+; SSE4-NEXT: setnp %al
+; SSE4-NEXT: ret{{[l|q]}}
+;
+; X86-AVX1-LABEL: trunc_v16i16_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: xorb %ah, %al
+; X86-AVX1-NEXT: setnp %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v16i16_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: xorb %ah, %al
+; X64-AVX1-NEXT: setnp %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: trunc_v16i16_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpsllw $7, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX2-NEXT: xorb %ah, %al
+; X86-AVX2-NEXT: setnp %al
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: trunc_v16i16_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpsllw $7, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX2-NEXT: xorb %ah, %al
+; X64-AVX2-NEXT: setnp %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: trunc_v16i16_v16i1:
; AVX512F: # %bb.0:
@@ -450,7 +467,7 @@ define i1 @trunc_v32i8_v32i1(<32 x i8>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: trunc_v32i8_v32i1:
; AVX2: # %bb.0:
@@ -462,7 +479,7 @@ define i1 @trunc_v32i8_v32i1(<32 x i8>) nounwind {
; AVX2-NEXT: xorb %ch, %cl
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v32i8_v32i1:
; AVX512F: # %bb.0:
@@ -551,22 +568,45 @@ define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {
; X64-SSE2-NEXT: setnp %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]
-; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]
-; SSE41-NEXT: packusdw %xmm3, %xmm2
-; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]
-; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]
-; SSE41-NEXT: packusdw %xmm1, %xmm0
-; SSE41-NEXT: packusdw %xmm2, %xmm0
-; SSE41-NEXT: psllw $15, %xmm0
-; SSE41-NEXT: packsswb %xmm0, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: trunc_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm3, %xmm3
+; X86-SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7]
+; X86-SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7]
+; X86-SSE4-NEXT: packusdw %xmm1, %xmm0
+; X86-SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm3[1,2,3],xmm2[4],xmm3[5,6,7]
+; X86-SSE4-NEXT: pblendw {{.*#+}} xmm3 = mem[0],xmm3[1,2,3],mem[4],xmm3[5,6,7]
+; X86-SSE4-NEXT: packusdw %xmm3, %xmm2
+; X86-SSE4-NEXT: packusdw %xmm2, %xmm0
+; X86-SSE4-NEXT: psllw $15, %xmm0
+; X86-SSE4-NEXT: packsswb %xmm0, %xmm0
+; X86-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE4-NEXT: testb %al, %al
+; X86-SSE4-NEXT: setnp %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm4, %xmm4
+; X64-SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3],xmm3[4],xmm4[5,6,7]
+; X64-SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm4[1,2,3],xmm2[4],xmm4[5,6,7]
+; X64-SSE4-NEXT: packusdw %xmm3, %xmm2
+; X64-SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1,2,3],xmm1[4],xmm4[5,6,7]
+; X64-SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1,2,3],xmm0[4],xmm4[5,6,7]
+; X64-SSE4-NEXT: packusdw %xmm1, %xmm0
+; X64-SSE4-NEXT: packusdw %xmm2, %xmm0
+; X64-SSE4-NEXT: psllw $15, %xmm0
+; X64-SSE4-NEXT: packsswb %xmm0, %xmm0
+; X64-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE4-NEXT: testb %al, %al
+; X64-SSE4-NEXT: setnp %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: trunc_v8i64_v8i1:
; AVX1: # %bb.0:
@@ -581,7 +621,7 @@ define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: trunc_v8i64_v8i1:
; AVX2: # %bb.0:
@@ -592,7 +632,7 @@ define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v8i64_v8i1:
; AVX512F: # %bb.0:
@@ -617,7 +657,7 @@ define i1 @trunc_v8i64_v8i1(<8 x i64>) nounwind {
; AVX512VL-LABEL: trunc_v8i64_v8i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpsllq $63, %zmm0, %zmm0
-; AVX512VL-NEXT: vptestmq %zmm0, %zmm0, %k0
+; AVX512VL-NEXT: vpmovq2m %zmm0, %k0
; AVX512VL-NEXT: kmovd %k0, %eax
; AVX512VL-NEXT: testb %al, %al
; AVX512VL-NEXT: setnp %al
@@ -667,21 +707,43 @@ define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {
; X64-SSE2-NEXT: setnp %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v16i32_v16i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pmovzxbd {{.*#+}} xmm4 = [255,255,255,255]
-; SSE41-NEXT: pand %xmm4, %xmm3
-; SSE41-NEXT: pand %xmm4, %xmm2
-; SSE41-NEXT: packusdw %xmm3, %xmm2
-; SSE41-NEXT: pand %xmm4, %xmm1
-; SSE41-NEXT: pand %xmm4, %xmm0
-; SSE41-NEXT: packusdw %xmm1, %xmm0
-; SSE41-NEXT: packuswb %xmm2, %xmm0
-; SSE41-NEXT: psllw $7, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: xorb %ah, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: trunc_v16i32_v16i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pmovzxbd {{.*#+}} xmm3 = [255,255,255,255]
+; X86-SSE4-NEXT: pand %xmm3, %xmm1
+; X86-SSE4-NEXT: pand %xmm3, %xmm0
+; X86-SSE4-NEXT: packusdw %xmm1, %xmm0
+; X86-SSE4-NEXT: pand %xmm3, %xmm2
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm3
+; X86-SSE4-NEXT: packusdw %xmm3, %xmm2
+; X86-SSE4-NEXT: packuswb %xmm2, %xmm0
+; X86-SSE4-NEXT: psllw $7, %xmm0
+; X86-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE4-NEXT: xorb %ah, %al
+; X86-SSE4-NEXT: setnp %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v16i32_v16i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pmovzxbd {{.*#+}} xmm4 = [255,255,255,255]
+; X64-SSE4-NEXT: pand %xmm4, %xmm3
+; X64-SSE4-NEXT: pand %xmm4, %xmm2
+; X64-SSE4-NEXT: packusdw %xmm3, %xmm2
+; X64-SSE4-NEXT: pand %xmm4, %xmm1
+; X64-SSE4-NEXT: pand %xmm4, %xmm0
+; X64-SSE4-NEXT: packusdw %xmm1, %xmm0
+; X64-SSE4-NEXT: packuswb %xmm2, %xmm0
+; X64-SSE4-NEXT: psllw $7, %xmm0
+; X64-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE4-NEXT: xorb %ah, %al
+; X64-SSE4-NEXT: setnp %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: trunc_v16i32_v16i1:
; AVX1: # %bb.0:
@@ -698,7 +760,7 @@ define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: trunc_v16i32_v16i1:
; AVX2: # %bb.0:
@@ -714,7 +776,7 @@ define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {
; AVX2-NEXT: xorb %ah, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v16i32_v16i1:
; AVX512F: # %bb.0:
@@ -743,7 +805,7 @@ define i1 @trunc_v16i32_v16i1(<16 x i32>) nounwind {
; AVX512VL-LABEL: trunc_v16i32_v16i1:
; AVX512VL: # %bb.0:
; AVX512VL-NEXT: vpslld $31, %zmm0, %zmm0
-; AVX512VL-NEXT: vptestmd %zmm0, %zmm0, %k0
+; AVX512VL-NEXT: vpmovd2m %zmm0, %k0
; AVX512VL-NEXT: kmovd %k0, %eax
; AVX512VL-NEXT: movl %eax, %ecx
; AVX512VL-NEXT: shrl $8, %eax
@@ -795,34 +857,69 @@ define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {
; X64-SSE2-NEXT: setnp %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: trunc_v32i16_v32i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pmovzxbw {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
-; SSE41-NEXT: pand %xmm4, %xmm3
-; SSE41-NEXT: pand %xmm4, %xmm2
-; SSE41-NEXT: packuswb %xmm3, %xmm2
-; SSE41-NEXT: pand %xmm4, %xmm1
-; SSE41-NEXT: pand %xmm4, %xmm0
-; SSE41-NEXT: packuswb %xmm1, %xmm0
-; SSE41-NEXT: pxor %xmm2, %xmm0
-; SSE41-NEXT: psllw $7, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: xorb %ah, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: trunc_v32i16_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: xorb %ah, %al
-; AVX1-NEXT: setnp %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; X86-SSE4-LABEL: trunc_v32i16_v32i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pmovzxbw {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255]
+; X86-SSE4-NEXT: pand %xmm3, %xmm1
+; X86-SSE4-NEXT: pand %xmm3, %xmm0
+; X86-SSE4-NEXT: packuswb %xmm1, %xmm0
+; X86-SSE4-NEXT: pand %xmm3, %xmm2
+; X86-SSE4-NEXT: pand 8(%ebp), %xmm3
+; X86-SSE4-NEXT: packuswb %xmm3, %xmm2
+; X86-SSE4-NEXT: pxor %xmm0, %xmm2
+; X86-SSE4-NEXT: psllw $7, %xmm2
+; X86-SSE4-NEXT: pmovmskb %xmm2, %eax
+; X86-SSE4-NEXT: xorb %ah, %al
+; X86-SSE4-NEXT: setnp %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: trunc_v32i16_v32i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pmovzxbw {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255]
+; X64-SSE4-NEXT: pand %xmm4, %xmm3
+; X64-SSE4-NEXT: pand %xmm4, %xmm2
+; X64-SSE4-NEXT: packuswb %xmm3, %xmm2
+; X64-SSE4-NEXT: pand %xmm4, %xmm1
+; X64-SSE4-NEXT: pand %xmm4, %xmm0
+; X64-SSE4-NEXT: packuswb %xmm1, %xmm0
+; X64-SSE4-NEXT: pxor %xmm2, %xmm0
+; X64-SSE4-NEXT: psllw $7, %xmm0
+; X64-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE4-NEXT: xorb %ah, %al
+; X64-SSE4-NEXT: setnp %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: trunc_v32i16_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: xorb %ah, %al
+; X86-AVX1-NEXT: setnp %al
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: trunc_v32i16_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsllw $7, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: xorb %ah, %al
+; X64-AVX1-NEXT: setnp %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
;
; AVX2-LABEL: trunc_v32i16_v32i1:
; AVX2: # %bb.0:
@@ -839,7 +936,7 @@ define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {
; AVX2-NEXT: xorb %ch, %cl
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v32i16_v32i1:
; AVX512F: # %bb.0:
@@ -892,22 +989,22 @@ define i1 @trunc_v32i16_v32i1(<32 x i16>) nounwind {
}
define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {
-; X86-SSE2-LABEL: trunc_v64i8_v64i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pxor %xmm2, %xmm0
-; X86-SSE2-NEXT: pxor 8(%ebp), %xmm1
-; X86-SSE2-NEXT: pxor %xmm0, %xmm1
-; X86-SSE2-NEXT: psllw $7, %xmm1
-; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: trunc_v64i8_v64i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pxor %xmm2, %xmm0
+; X86-SSE-NEXT: pxor 8(%ebp), %xmm1
+; X86-SSE-NEXT: pxor %xmm0, %xmm1
+; X86-SSE-NEXT: psllw $7, %xmm1
+; X86-SSE-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: trunc_v64i8_v64i1:
; X64-SSE: # %bb.0:
@@ -930,7 +1027,7 @@ define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: trunc_v64i8_v64i1:
; AVX2: # %bb.0:
@@ -943,7 +1040,7 @@ define i1 @trunc_v64i8_v64i1(<64 x i8>) nounwind {
; AVX2-NEXT: xorb %ch, %cl
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: trunc_v64i8_v64i1:
; AVX512F: # %bb.0:
@@ -1021,23 +1118,23 @@ define i1 @icmp0_v2i64_v2i1(<2 x i64>) nounwind {
; SSE2-NEXT: setnp %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm1, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm0, %xmm1
-; SSE41-NEXT: movmskpd %xmm1, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
-;
-; AVX-LABEL: icmp0_v2i64_v2i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vmovmskpd %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; SSE4-LABEL: icmp0_v2i64_v2i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm1, %xmm1
+; SSE4-NEXT: pcmpeqq %xmm0, %xmm1
+; SSE4-NEXT: movmskpd %xmm1, %eax
+; SSE4-NEXT: testb %al, %al
+; SSE4-NEXT: setnp %al
+; SSE4-NEXT: ret{{[l|q]}}
+;
+; AVX1OR2-LABEL: icmp0_v2i64_v2i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v2i64_v2i1:
; AVX512F: # %bb.0:
@@ -1081,14 +1178,14 @@ define i1 @icmp0_v4i32_v4i1(<4 x i32>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: icmp0_v4i32_v4i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vmovmskps %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: icmp0_v4i32_v4i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vmovmskps %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v4i32_v4i1:
; AVX512F: # %bb.0:
@@ -1133,15 +1230,15 @@ define i1 @icmp0_v8i16_v8i1(<8 x i16>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: icmp0_v8i16_v8i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vpmovmskb %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: icmp0_v8i16_v8i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v8i16_v8i1:
; AVX512F: # %bb.0:
@@ -1187,14 +1284,14 @@ define i1 @icmp0_v16i8_v16i1(<16 x i8>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: icmp0_v16i8_v16i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpxor %xmm1, %xmm1, %xmm1
-; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vpmovmskb %xmm0, %eax
-; AVX-NEXT: xorb %ah, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: icmp0_v16i8_v16i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpxor %xmm1, %xmm1, %xmm1
+; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
+; AVX1OR2-NEXT: xorb %ah, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v16i8_v16i1:
; AVX512F: # %bb.0:
@@ -1246,16 +1343,16 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; SSE2-NEXT: setnp %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp0_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm2, %xmm2
-; SSE41-NEXT: pcmpeqq %xmm2, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm2, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: movmskps %xmm0, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
+; SSE4-LABEL: icmp0_v4i64_v4i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pxor %xmm2, %xmm2
+; SSE4-NEXT: pcmpeqq %xmm2, %xmm1
+; SSE4-NEXT: pcmpeqq %xmm2, %xmm0
+; SSE4-NEXT: packssdw %xmm1, %xmm0
+; SSE4-NEXT: movmskps %xmm0, %eax
+; SSE4-NEXT: testb %al, %al
+; SSE4-NEXT: setnp %al
+; SSE4-NEXT: ret{{[l|q]}}
;
; AVX1-LABEL: icmp0_v4i64_v4i1:
; AVX1: # %bb.0:
@@ -1268,7 +1365,7 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v4i64_v4i1:
; AVX2: # %bb.0:
@@ -1278,7 +1375,7 @@ define i1 @icmp0_v4i64_v4i1(<4 x i64>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v4i64_v4i1:
; AVX512F: # %bb.0:
@@ -1337,7 +1434,7 @@ define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v8i32_v8i1:
; AVX2: # %bb.0:
@@ -1347,7 +1444,7 @@ define i1 @icmp0_v8i32_v8i1(<8 x i32>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v8i32_v8i1:
; AVX512F: # %bb.0:
@@ -1405,7 +1502,7 @@ define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v16i16_v16i1:
; AVX2: # %bb.0:
@@ -1417,7 +1514,7 @@ define i1 @icmp0_v16i16_v16i1(<16 x i16>) nounwind {
; AVX2-NEXT: xorb %ah, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v16i16_v16i1:
; AVX512F: # %bb.0:
@@ -1483,7 +1580,7 @@ define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v32i8_v32i1:
; AVX2: # %bb.0:
@@ -1496,7 +1593,7 @@ define i1 @icmp0_v32i8_v32i1(<32 x i8>) nounwind {
; AVX2-NEXT: xorb %ch, %cl
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v32i8_v32i1:
; AVX512F: # %bb.0:
@@ -1603,21 +1700,43 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; X64-SSE2-NEXT: setnp %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp0_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pxor %xmm4, %xmm4
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm3
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm2
-; SSE41-NEXT: packssdw %xmm3, %xmm2
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: packssdw %xmm2, %xmm0
-; SSE41-NEXT: packsswb %xmm0, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp0_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm3, %xmm3
+; X86-SSE4-NEXT: pcmpeqq %xmm3, %xmm1
+; X86-SSE4-NEXT: pcmpeqq %xmm3, %xmm0
+; X86-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE4-NEXT: pcmpeqq %xmm3, %xmm2
+; X86-SSE4-NEXT: pcmpeqq 8(%ebp), %xmm3
+; X86-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X86-SSE4-NEXT: packsswb %xmm0, %xmm0
+; X86-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE4-NEXT: testb %al, %al
+; X86-SSE4-NEXT: setnp %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp0_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pxor %xmm4, %xmm4
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm3
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm2
+; X64-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm1
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X64-SSE4-NEXT: packsswb %xmm0, %xmm0
+; X64-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE4-NEXT: testb %al, %al
+; X64-SSE4-NEXT: setnp %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp0_v8i64_v8i1:
; AVX1: # %bb.0:
@@ -1635,7 +1754,7 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v8i64_v8i1:
; AVX2: # %bb.0:
@@ -1648,7 +1767,7 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v8i64_v8i1:
; AVX512F: # %bb.0:
@@ -1682,26 +1801,26 @@ define i1 @icmp0_v8i64_v8i1(<8 x i64>) nounwind {
}
define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
-; X86-SSE2-LABEL: icmp0_v16i32_v16i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pxor %xmm3, %xmm3
-; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm1
-; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm0
-; X86-SSE2-NEXT: packssdw %xmm1, %xmm0
-; X86-SSE2-NEXT: pcmpeqd %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm3
-; X86-SSE2-NEXT: packssdw %xmm3, %xmm2
-; X86-SSE2-NEXT: packsswb %xmm2, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp0_v16i32_v16i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pxor %xmm3, %xmm3
+; X86-SSE-NEXT: pcmpeqd %xmm3, %xmm1
+; X86-SSE-NEXT: pcmpeqd %xmm3, %xmm0
+; X86-SSE-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE-NEXT: pcmpeqd %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqd 8(%ebp), %xmm3
+; X86-SSE-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE-NEXT: packsswb %xmm2, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp0_v16i32_v16i1:
; X64-SSE: # %bb.0:
@@ -1734,7 +1853,7 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v16i32_v16i1:
; AVX2: # %bb.0:
@@ -1749,7 +1868,7 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
; AVX2-NEXT: xorb %ah, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v16i32_v16i1:
; AVX512F: # %bb.0:
@@ -1789,26 +1908,26 @@ define i1 @icmp0_v16i32_v16i1(<16 x i32>) nounwind {
}
define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
-; X86-SSE2-LABEL: icmp0_v32i16_v32i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pxor %xmm3, %xmm3
-; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm1
-; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqw %xmm3, %xmm0
-; X86-SSE2-NEXT: pxor %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pxor %xmm1, %xmm3
-; X86-SSE2-NEXT: packsswb %xmm3, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp0_v32i16_v32i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pxor %xmm3, %xmm3
+; X86-SSE-NEXT: pcmpeqw %xmm3, %xmm1
+; X86-SSE-NEXT: pcmpeqw %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqw %xmm3, %xmm0
+; X86-SSE-NEXT: pxor %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqw 8(%ebp), %xmm3
+; X86-SSE-NEXT: pxor %xmm1, %xmm3
+; X86-SSE-NEXT: packsswb %xmm3, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp0_v32i16_v32i1:
; X64-SSE: # %bb.0:
@@ -1841,7 +1960,7 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v32i16_v32i1:
; AVX2: # %bb.0:
@@ -1857,7 +1976,7 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
; AVX2-NEXT: xorb %ch, %cl
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v32i16_v32i1:
; AVX512F: # %bb.0:
@@ -1910,26 +2029,26 @@ define i1 @icmp0_v32i16_v32i1(<32 x i16>) nounwind {
}
define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
-; X86-SSE2-LABEL: icmp0_v64i8_v64i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pxor %xmm3, %xmm3
-; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm1
-; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqb %xmm3, %xmm0
-; X86-SSE2-NEXT: pxor %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pxor %xmm1, %xmm3
-; X86-SSE2-NEXT: pxor %xmm0, %xmm3
-; X86-SSE2-NEXT: pmovmskb %xmm3, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp0_v64i8_v64i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pxor %xmm3, %xmm3
+; X86-SSE-NEXT: pcmpeqb %xmm3, %xmm1
+; X86-SSE-NEXT: pcmpeqb %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqb %xmm3, %xmm0
+; X86-SSE-NEXT: pxor %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqb 8(%ebp), %xmm3
+; X86-SSE-NEXT: pxor %xmm1, %xmm3
+; X86-SSE-NEXT: pxor %xmm0, %xmm3
+; X86-SSE-NEXT: pmovmskb %xmm3, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp0_v64i8_v64i1:
; X64-SSE: # %bb.0:
@@ -1962,7 +2081,7 @@ define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp0_v64i8_v64i1:
; AVX2: # %bb.0:
@@ -1977,7 +2096,7 @@ define i1 @icmp0_v64i8_v64i1(<64 x i8>) nounwind {
; AVX2-NEXT: xorb %ch, %cl
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp0_v64i8_v64i1:
; AVX512F: # %bb.0:
@@ -2054,21 +2173,21 @@ define i1 @icmp_v2i64_v2i1(<2 x i64>, <2 x i64>) nounwind {
; SSE2-NEXT: setnp %al
; SSE2-NEXT: ret{{[l|q]}}
;
-; SSE41-LABEL: icmp_v2i64_v2i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqq %xmm1, %xmm0
-; SSE41-NEXT: movmskpd %xmm0, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
-;
-; AVX-LABEL: icmp_v2i64_v2i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vmovmskpd %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; SSE4-LABEL: icmp_v2i64_v2i1:
+; SSE4: # %bb.0:
+; SSE4-NEXT: pcmpeqq %xmm1, %xmm0
+; SSE4-NEXT: movmskpd %xmm0, %eax
+; SSE4-NEXT: testb %al, %al
+; SSE4-NEXT: setnp %al
+; SSE4-NEXT: ret{{[l|q]}}
+;
+; AVX1OR2-LABEL: icmp_v2i64_v2i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vmovmskpd %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v2i64_v2i1:
; AVX512F: # %bb.0:
@@ -2113,13 +2232,13 @@ define i1 @icmp_v4i32_v4i1(<4 x i32>, <4 x i32>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: icmp_v4i32_v4i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vmovmskps %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: icmp_v4i32_v4i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vmovmskps %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v4i32_v4i1:
; AVX512F: # %bb.0:
@@ -2165,14 +2284,14 @@ define i1 @icmp_v8i16_v8i1(<8 x i16>, <8 x i16>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: icmp_v8i16_v8i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
-; AVX-NEXT: vpmovmskb %xmm0, %eax
-; AVX-NEXT: testb %al, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: icmp_v8i16_v8i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
+; AVX1OR2-NEXT: testb %al, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v8i16_v8i1:
; AVX512F: # %bb.0:
@@ -2217,13 +2336,13 @@ define i1 @icmp_v16i8_v16i1(<16 x i8>, <16 x i8>) nounwind {
; SSE-NEXT: setnp %al
; SSE-NEXT: ret{{[l|q]}}
;
-; AVX-LABEL: icmp_v16i8_v16i1:
-; AVX: # %bb.0:
-; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vpmovmskb %xmm0, %eax
-; AVX-NEXT: xorb %ah, %al
-; AVX-NEXT: setnp %al
-; AVX-NEXT: retq
+; AVX1OR2-LABEL: icmp_v16i8_v16i1:
+; AVX1OR2: # %bb.0:
+; AVX1OR2-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
+; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax
+; AVX1OR2-NEXT: xorb %ah, %al
+; AVX1OR2-NEXT: setnp %al
+; AVX1OR2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v16i8_v16i1:
; AVX512F: # %bb.0:
@@ -2293,15 +2412,31 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; X64-SSE2-NEXT: setnp %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v4i64_v4i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqq %xmm3, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm2, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: movmskps %xmm0, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
+; X86-SSE4-LABEL: icmp_v4i64_v4i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pcmpeqq %xmm2, %xmm0
+; X86-SSE4-NEXT: pcmpeqq 8(%ebp), %xmm1
+; X86-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE4-NEXT: movmskps %xmm0, %eax
+; X86-SSE4-NEXT: testb %al, %al
+; X86-SSE4-NEXT: setnp %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v4i64_v4i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pcmpeqq %xmm3, %xmm1
+; X64-SSE4-NEXT: pcmpeqq %xmm2, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X64-SSE4-NEXT: movmskps %xmm0, %eax
+; X64-SSE4-NEXT: testb %al, %al
+; X64-SSE4-NEXT: setnp %al
+; X64-SSE4-NEXT: retq
;
; AVX1-LABEL: icmp_v4i64_v4i1:
; AVX1: # %bb.0:
@@ -2314,7 +2449,7 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v4i64_v4i1:
; AVX2: # %bb.0:
@@ -2323,7 +2458,7 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v4i64_v4i1:
; AVX512F: # %bb.0:
@@ -2361,22 +2496,22 @@ define i1 @icmp_v4i64_v4i1(<4 x i64>, <4 x i64>) nounwind {
}
define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
-; X86-SSE2-LABEL: icmp_v8i32_v8i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqd 8(%ebp), %xmm1
-; X86-SSE2-NEXT: packssdw %xmm1, %xmm0
-; X86-SSE2-NEXT: packsswb %xmm0, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: testb %al, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v8i32_v8i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pcmpeqd %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqd 8(%ebp), %xmm1
+; X86-SSE-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE-NEXT: packsswb %xmm0, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: testb %al, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v8i32_v8i1:
; X64-SSE: # %bb.0:
@@ -2400,7 +2535,7 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; AVX1-NEXT: testb %al, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v8i32_v8i1:
; AVX2: # %bb.0:
@@ -2409,7 +2544,7 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
; AVX2-NEXT: testb %al, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v8i32_v8i1:
; AVX512F: # %bb.0:
@@ -2447,21 +2582,21 @@ define i1 @icmp_v8i32_v8i1(<8 x i32>, <8 x i32>) nounwind {
}
define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
-; X86-SSE2-LABEL: icmp_v16i16_v16i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pcmpeqw %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqw 8(%ebp), %xmm1
-; X86-SSE2-NEXT: packsswb %xmm1, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v16i16_v16i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pcmpeqw %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqw 8(%ebp), %xmm1
+; X86-SSE-NEXT: packsswb %xmm1, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v16i16_v16i1:
; X64-SSE: # %bb.0:
@@ -2484,7 +2619,7 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v16i16_v16i1:
; AVX2: # %bb.0:
@@ -2495,7 +2630,7 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
; AVX2-NEXT: xorb %ah, %al
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v16i16_v16i1:
; AVX512F: # %bb.0:
@@ -2539,21 +2674,21 @@ define i1 @icmp_v16i16_v16i1(<16 x i16>, <16 x i16>) nounwind {
}
define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
-; X86-SSE2-LABEL: icmp_v32i8_v32i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: pcmpeqb %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqb 8(%ebp), %xmm1
-; X86-SSE2-NEXT: pxor %xmm0, %xmm1
-; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v32i8_v32i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: pcmpeqb %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqb 8(%ebp), %xmm1
+; X86-SSE-NEXT: pxor %xmm0, %xmm1
+; X86-SSE-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v32i8_v32i1:
; X64-SSE: # %bb.0:
@@ -2576,7 +2711,7 @@ define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
; AVX1-NEXT: xorb %ah, %al
; AVX1-NEXT: setnp %al
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: icmp_v32i8_v32i1:
; AVX2: # %bb.0:
@@ -2588,7 +2723,7 @@ define i1 @icmp_v32i8_v32i1(<32 x i8>, <32 x i8>) nounwind {
; AVX2-NEXT: xorb %ch, %cl
; AVX2-NEXT: setnp %al
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512F-LABEL: icmp_v32i8_v32i1:
; AVX512F: # %bb.0:
@@ -2694,51 +2829,115 @@ define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {
; X64-SSE2-NEXT: setnp %al
; X64-SSE2-NEXT: retq
;
-; SSE41-LABEL: icmp_v8i64_v8i1:
-; SSE41: # %bb.0:
-; SSE41-NEXT: pcmpeqq %xmm7, %xmm3
-; SSE41-NEXT: pcmpeqq %xmm6, %xmm2
-; SSE41-NEXT: packssdw %xmm3, %xmm2
-; SSE41-NEXT: pcmpeqq %xmm5, %xmm1
-; SSE41-NEXT: pcmpeqq %xmm4, %xmm0
-; SSE41-NEXT: packssdw %xmm1, %xmm0
-; SSE41-NEXT: packssdw %xmm2, %xmm0
-; SSE41-NEXT: packsswb %xmm0, %xmm0
-; SSE41-NEXT: pmovmskb %xmm0, %eax
-; SSE41-NEXT: testb %al, %al
-; SSE41-NEXT: setnp %al
-; SSE41-NEXT: retq
-;
-; AVX1-LABEL: icmp_v8i64_v8i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
-; AVX1-NEXT: vpcmpeqq %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
-; AVX1-NEXT: vpcmpeqq %xmm3, %xmm4, %xmm3
-; AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
-; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
-; AVX1-NEXT: vmovmskps %ymm0, %eax
-; AVX1-NEXT: testb %al, %al
-; AVX1-NEXT: setnp %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v8i64_v8i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqq %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT: vmovmskps %ymm0, %eax
-; AVX2-NEXT: testb %al, %al
-; AVX2-NEXT: setnp %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: icmp_v8i64_v8i1:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pcmpeqq 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pcmpeqq 56(%ebp), %xmm2
+; X86-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE4-NEXT: pcmpeqq 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pcmpeqq 24(%ebp), %xmm0
+; X86-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X86-SSE4-NEXT: packsswb %xmm0, %xmm0
+; X86-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE4-NEXT: testb %al, %al
+; X86-SSE4-NEXT: setnp %al
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X64-SSE4-LABEL: icmp_v8i64_v8i1:
+; X64-SSE4: # %bb.0:
+; X64-SSE4-NEXT: pcmpeqq %xmm7, %xmm3
+; X64-SSE4-NEXT: pcmpeqq %xmm6, %xmm2
+; X64-SSE4-NEXT: packssdw %xmm3, %xmm2
+; X64-SSE4-NEXT: pcmpeqq %xmm5, %xmm1
+; X64-SSE4-NEXT: pcmpeqq %xmm4, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm1, %xmm0
+; X64-SSE4-NEXT: packssdw %xmm2, %xmm0
+; X64-SSE4-NEXT: packsswb %xmm0, %xmm0
+; X64-SSE4-NEXT: pmovmskb %xmm0, %eax
+; X64-SSE4-NEXT: testb %al, %al
+; X64-SSE4-NEXT: setnp %al
+; X64-SSE4-NEXT: retq
+;
+; X86-AVX1-LABEL: icmp_v8i64_v8i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
+; X86-AVX1-NEXT: vpcmpeqq %xmm3, %xmm4, %xmm3
+; X86-AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
+; X86-AVX1-NEXT: vpcmpeqq 24(%ebp), %xmm2, %xmm2
+; X86-AVX1-NEXT: vpcmpeqq 8(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
+; X86-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vmovmskps %ymm0, %eax
+; X86-AVX1-NEXT: testb %al, %al
+; X86-AVX1-NEXT: setnp %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v8i64_v8i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
+; X64-AVX1-NEXT: vpcmpeqq %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vpcmpeqq %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
+; X64-AVX1-NEXT: vpcmpeqq %xmm3, %xmm4, %xmm3
+; X64-AVX1-NEXT: vpcmpeqq %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
+; X64-AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vmovmskps %ymm0, %eax
+; X64-AVX1-NEXT: testb %al, %al
+; X64-AVX1-NEXT: setnp %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v8i64_v8i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqq 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
+; X86-AVX2-NEXT: vmovmskps %ymm0, %eax
+; X86-AVX2-NEXT: testb %al, %al
+; X86-AVX2-NEXT: setnp %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v8i64_v8i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqq %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqq %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
+; X64-AVX2-NEXT: vmovmskps %ymm0, %eax
+; X64-AVX2-NEXT: testb %al, %al
+; X64-AVX2-NEXT: setnp %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: icmp_v8i64_v8i1:
; AVX512F: # %bb.0:
@@ -2772,26 +2971,26 @@ define i1 @icmp_v8i64_v8i1(<8 x i64>, <8 x i64>) nounwind {
}
define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
-; X86-SSE2-LABEL: icmp_v16i32_v16i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqd 72(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqd 56(%ebp), %xmm2
-; X86-SSE2-NEXT: packssdw %xmm3, %xmm2
-; X86-SSE2-NEXT: pcmpeqd 40(%ebp), %xmm1
-; X86-SSE2-NEXT: pcmpeqd 24(%ebp), %xmm0
-; X86-SSE2-NEXT: packssdw %xmm1, %xmm0
-; X86-SSE2-NEXT: packsswb %xmm2, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v16i32_v16i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqd 72(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqd 56(%ebp), %xmm2
+; X86-SSE-NEXT: packssdw %xmm3, %xmm2
+; X86-SSE-NEXT: pcmpeqd 40(%ebp), %xmm1
+; X86-SSE-NEXT: pcmpeqd 24(%ebp), %xmm0
+; X86-SSE-NEXT: packssdw %xmm1, %xmm0
+; X86-SSE-NEXT: packsswb %xmm2, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v16i32_v16i1:
; X64-SSE: # %bb.0:
@@ -2807,38 +3006,82 @@ define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
; X64-SSE-NEXT: setnp %al
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: icmp_v16i32_v16i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
-; AVX1-NEXT: vpcmpeqd %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
-; AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
-; AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
-; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: xorb %ah, %al
-; AVX1-NEXT: setnp %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v16i32_v16i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
-; AVX2-NEXT: vpmovmskb %xmm0, %eax
-; AVX2-NEXT: xorb %ah, %al
-; AVX2-NEXT: setnp %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: icmp_v16i32_v16i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
+; X86-AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
+; X86-AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
+; X86-AVX1-NEXT: vpcmpeqd 24(%ebp), %xmm2, %xmm2
+; X86-AVX1-NEXT: vpcmpeqd 8(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpackssdw %xmm2, %xmm1, %xmm1
+; X86-AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: xorb %ah, %al
+; X86-AVX1-NEXT: setnp %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v16i32_v16i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5
+; X64-AVX1-NEXT: vpcmpeqd %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4
+; X64-AVX1-NEXT: vpcmpeqd %xmm3, %xmm4, %xmm3
+; X64-AVX1-NEXT: vpcmpeqd %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: xorb %ah, %al
+; X64-AVX1-NEXT: setnp %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v16i32_v16i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqd 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
+; X86-AVX2-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX2-NEXT: xorb %ah, %al
+; X86-AVX2-NEXT: setnp %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v16i32_v16i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqd %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqd %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3]
+; X64-AVX2-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX2-NEXT: xorb %ah, %al
+; X64-AVX2-NEXT: setnp %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: icmp_v16i32_v16i1:
; AVX512F: # %bb.0:
@@ -2878,26 +3121,26 @@ define i1 @icmp_v16i32_v16i1(<16 x i32>, <16 x i32>) nounwind {
}
define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
-; X86-SSE2-LABEL: icmp_v32i16_v32i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqw 56(%ebp), %xmm2
-; X86-SSE2-NEXT: pcmpeqw 24(%ebp), %xmm0
-; X86-SSE2-NEXT: pxor %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqw 72(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqw 40(%ebp), %xmm1
-; X86-SSE2-NEXT: pxor %xmm3, %xmm1
-; X86-SSE2-NEXT: packsswb %xmm1, %xmm0
-; X86-SSE2-NEXT: pmovmskb %xmm0, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v32i16_v32i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqw 56(%ebp), %xmm2
+; X86-SSE-NEXT: pcmpeqw 24(%ebp), %xmm0
+; X86-SSE-NEXT: pxor %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqw 72(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqw 40(%ebp), %xmm1
+; X86-SSE-NEXT: pxor %xmm3, %xmm1
+; X86-SSE-NEXT: packsswb %xmm1, %xmm0
+; X86-SSE-NEXT: pmovmskb %xmm0, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v32i16_v32i1:
; X64-SSE: # %bb.0:
@@ -2913,39 +3156,84 @@ define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
; X64-SSE-NEXT: setnp %al
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: icmp_v32i16_v32i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm4
-; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm5
-; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
-; AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: xorb %ah, %al
-; AVX1-NEXT: setnp %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v32i16_v32i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
-; AVX2-NEXT: vpmovmskb %ymm0, %eax
-; AVX2-NEXT: movl %eax, %ecx
-; AVX2-NEXT: shrl $16, %ecx
-; AVX2-NEXT: xorl %eax, %ecx
-; AVX2-NEXT: xorb %ch, %cl
-; AVX2-NEXT: setnp %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: icmp_v32i16_v32i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqw 8(%ebp), %xmm1, %xmm2
+; X86-AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X86-AVX1-NEXT: vpcmpeqw 24(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: xorb %ah, %al
+; X86-AVX1-NEXT: setnp %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v32i16_v32i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm4
+; X64-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm5
+; X64-AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X64-AVX1-NEXT: vpcmpeqw %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X64-AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: xorb %ah, %al
+; X64-AVX1-NEXT: setnp %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v32i16_v32i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqw 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
+; X86-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X86-AVX2-NEXT: movl %eax, %ecx
+; X86-AVX2-NEXT: shrl $16, %ecx
+; X86-AVX2-NEXT: xorl %eax, %ecx
+; X86-AVX2-NEXT: xorb %ch, %cl
+; X86-AVX2-NEXT: setnp %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v32i16_v32i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqw %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3]
+; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X64-AVX2-NEXT: movl %eax, %ecx
+; X64-AVX2-NEXT: shrl $16, %ecx
+; X64-AVX2-NEXT: xorl %eax, %ecx
+; X64-AVX2-NEXT: xorb %ch, %cl
+; X64-AVX2-NEXT: setnp %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: icmp_v32i16_v32i1:
; AVX512F: # %bb.0:
@@ -2998,26 +3286,26 @@ define i1 @icmp_v32i16_v32i1(<32 x i16>, <32 x i16>) nounwind {
}
define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {
-; X86-SSE2-LABEL: icmp_v64i8_v64i1:
-; X86-SSE2: # %bb.0:
-; X86-SSE2-NEXT: pushl %ebp
-; X86-SSE2-NEXT: movl %esp, %ebp
-; X86-SSE2-NEXT: andl $-16, %esp
-; X86-SSE2-NEXT: subl $16, %esp
-; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqb 56(%ebp), %xmm2
-; X86-SSE2-NEXT: pcmpeqb 24(%ebp), %xmm0
-; X86-SSE2-NEXT: pxor %xmm2, %xmm0
-; X86-SSE2-NEXT: pcmpeqb 72(%ebp), %xmm3
-; X86-SSE2-NEXT: pcmpeqb 40(%ebp), %xmm1
-; X86-SSE2-NEXT: pxor %xmm3, %xmm1
-; X86-SSE2-NEXT: pxor %xmm0, %xmm1
-; X86-SSE2-NEXT: pmovmskb %xmm1, %eax
-; X86-SSE2-NEXT: xorb %ah, %al
-; X86-SSE2-NEXT: setnp %al
-; X86-SSE2-NEXT: movl %ebp, %esp
-; X86-SSE2-NEXT: popl %ebp
-; X86-SSE2-NEXT: retl
+; X86-SSE-LABEL: icmp_v64i8_v64i1:
+; X86-SSE: # %bb.0:
+; X86-SSE-NEXT: pushl %ebp
+; X86-SSE-NEXT: movl %esp, %ebp
+; X86-SSE-NEXT: andl $-16, %esp
+; X86-SSE-NEXT: subl $16, %esp
+; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqb 56(%ebp), %xmm2
+; X86-SSE-NEXT: pcmpeqb 24(%ebp), %xmm0
+; X86-SSE-NEXT: pxor %xmm2, %xmm0
+; X86-SSE-NEXT: pcmpeqb 72(%ebp), %xmm3
+; X86-SSE-NEXT: pcmpeqb 40(%ebp), %xmm1
+; X86-SSE-NEXT: pxor %xmm3, %xmm1
+; X86-SSE-NEXT: pxor %xmm0, %xmm1
+; X86-SSE-NEXT: pmovmskb %xmm1, %eax
+; X86-SSE-NEXT: xorb %ah, %al
+; X86-SSE-NEXT: setnp %al
+; X86-SSE-NEXT: movl %ebp, %esp
+; X86-SSE-NEXT: popl %ebp
+; X86-SSE-NEXT: retl
;
; X64-SSE-LABEL: icmp_v64i8_v64i1:
; X64-SSE: # %bb.0:
@@ -3033,38 +3321,82 @@ define i1 @icmp_v64i8_v64i1(<64 x i8>, <64 x i8>) nounwind {
; X64-SSE-NEXT: setnp %al
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: icmp_v64i8_v64i1:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm4
-; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm5
-; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm4
-; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
-; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
-; AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm1
-; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
-; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
-; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpxor %xmm0, %xmm4, %xmm0
-; AVX1-NEXT: vpmovmskb %xmm0, %eax
-; AVX1-NEXT: xorb %ah, %al
-; AVX1-NEXT: setnp %al
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: icmp_v64i8_v64i1:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vpmovmskb %ymm0, %eax
-; AVX2-NEXT: movl %eax, %ecx
-; AVX2-NEXT: shrl $16, %ecx
-; AVX2-NEXT: xorl %eax, %ecx
-; AVX2-NEXT: xorb %ch, %cl
-; AVX2-NEXT: setnp %al
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: icmp_v64i8_v64i1:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3
+; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpcmpeqb 8(%ebp), %xmm1, %xmm2
+; X86-AVX1-NEXT: vpxor %xmm2, %xmm3, %xmm2
+; X86-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X86-AVX1-NEXT: vpcmpeqb 24(%ebp), %xmm1, %xmm1
+; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpxor %xmm0, %xmm2, %xmm0
+; X86-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X86-AVX1-NEXT: xorb %ah, %al
+; X86-AVX1-NEXT: setnp %al
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: icmp_v64i8_v64i1:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm4
+; X64-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm5
+; X64-AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm4
+; X64-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm3
+; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1
+; X64-AVX1-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm1
+; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0
+; X64-AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpxor %xmm0, %xmm4, %xmm0
+; X64-AVX1-NEXT: vpmovmskb %xmm0, %eax
+; X64-AVX1-NEXT: xorb %ah, %al
+; X64-AVX1-NEXT: setnp %al
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: icmp_v64i8_v64i1:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpcmpeqb 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X86-AVX2-NEXT: movl %eax, %ecx
+; X86-AVX2-NEXT: shrl $16, %ecx
+; X86-AVX2-NEXT: xorl %eax, %ecx
+; X86-AVX2-NEXT: xorb %ch, %cl
+; X86-AVX2-NEXT: setnp %al
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: icmp_v64i8_v64i1:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpcmpeqb %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpmovmskb %ymm0, %eax
+; X64-AVX2-NEXT: movl %eax, %ecx
+; X64-AVX2-NEXT: shrl $16, %ecx
+; X64-AVX2-NEXT: xorl %eax, %ecx
+; X64-AVX2-NEXT: xorb %ch, %cl
+; X64-AVX2-NEXT: setnp %al
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512F-LABEL: icmp_v64i8_v64i1:
; AVX512F: # %bb.0:
@@ -3133,3 +3465,5 @@ declare i1 @llvm.vector.reduce.xor.v8i1(<8 x i1>)
declare i1 @llvm.vector.reduce.xor.v16i1(<16 x i1>)
declare i1 @llvm.vector.reduce.xor.v32i1(<32 x i1>)
declare i1 @llvm.vector.reduce.xor.v64i1(<64 x i1>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; AVX512: {{.*}}
diff --git a/llvm/test/CodeGen/X86/vector-reduce-xor.ll b/llvm/test/CodeGen/X86/vector-reduce-xor.ll
index 33199388fd6fc..09e6318653538 100644
--- a/llvm/test/CodeGen/X86/vector-reduce-xor.ll
+++ b/llvm/test/CodeGen/X86/vector-reduce-xor.ll
@@ -1,25 +1,31 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
-; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX2
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefixes=AVX,AVX512
-; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f,+avx512bw,+avx512vl | FileCheck %s --check-prefixes=AVX,AVX512
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE2,X86-SSE2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE2,X64-SSE2
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.1 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X86-SSE,SSE4,X86-SSE4
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+sse4.2 | FileCheck %s --check-prefixes=SSE,X64-SSE,SSE4,X64-SSE4
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X86-AVX1
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1,X64-AVX1
+; RUN: llc < %s -mtriple=i686-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X86-AVX2
+; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx2 | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2,X64-AVX2
+; RUN: llc < %s -mtriple=x86_64- -mattr=+avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
+; 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
;
; vXi64
;
define i64 @test_v2i64(<2 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v2i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE-NEXT: pxor %xmm0, %xmm1
-; X86-SSE-NEXT: movd %xmm1, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v2i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT: pxor %xmm0, %xmm1
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v2i64:
; X64-SSE: # %bb.0:
@@ -28,26 +34,64 @@ define i64 @test_v2i64(<2 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX-LABEL: test_v2i64:
-; AVX: # %bb.0:
-; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX-NEXT: vmovq %xmm0, %rax
-; AVX-NEXT: retq
+; X86-SSE4-LABEL: test_v2i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT: pxor %xmm0, %xmm1
+; X86-SSE4-NEXT: movd %xmm1, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm1, %edx
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v2i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v2i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v2i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v2i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: retq
+;
+; AVX512-LABEL: test_v2i64:
+; AVX512: # %bb.0:
+; AVX512-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; AVX512-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; AVX512-NEXT: vmovq %xmm0, %rax
+; AVX512-NEXT: retq
%1 = call i64 @llvm.vector.reduce.xor.v2i64(<2 x i64> %a0)
ret i64 %1
}
define i64 @test_v4i64(<4 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v4i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pxor %xmm1, %xmm0
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; X86-SSE-NEXT: pxor %xmm0, %xmm1
-; X86-SSE-NEXT: movd %xmm1, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v4i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pxor %xmm1, %xmm0
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE2-NEXT: pxor %xmm0, %xmm1
+; X86-SSE2-NEXT: movd %xmm1, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v4i64:
; X64-SSE: # %bb.0:
@@ -57,25 +101,56 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v4i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v4i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v4i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pxor %xmm1, %xmm0
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-SSE4-NEXT: pxor %xmm0, %xmm1
+; X86-SSE4-NEXT: movd %xmm1, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm1, %edx
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v4i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v4i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v4i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v4i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v4i64:
; AVX512: # %bb.0:
@@ -91,23 +166,23 @@ define i64 @test_v4i64(<4 x i64> %a0) nounwind {
}
define i64 @test_v8i64(<8 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v8i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pushl %ebp
-; X86-SSE-NEXT: movl %esp, %ebp
-; X86-SSE-NEXT: andl $-16, %esp
-; X86-SSE-NEXT: subl $16, %esp
-; X86-SSE-NEXT: pxor %xmm2, %xmm0
-; X86-SSE-NEXT: pxor 8(%ebp), %xmm1
-; X86-SSE-NEXT: pxor %xmm0, %xmm1
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE-NEXT: pxor %xmm1, %xmm0
-; X86-SSE-NEXT: movd %xmm0, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: movl %ebp, %esp
-; X86-SSE-NEXT: popl %ebp
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v8i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: pxor %xmm2, %xmm0
+; X86-SSE2-NEXT: pxor 8(%ebp), %xmm1
+; X86-SSE2-NEXT: pxor %xmm0, %xmm1
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT: pxor %xmm1, %xmm0
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v8i64:
; X64-SSE: # %bb.0:
@@ -119,27 +194,68 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm1, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v8i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v8i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v8i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: pxor %xmm2, %xmm0
+; X86-SSE4-NEXT: pxor 8(%ebp), %xmm1
+; X86-SSE4-NEXT: pxor %xmm0, %xmm1
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE4-NEXT: pxor %xmm1, %xmm0
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %edx
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v8i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v8i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v8i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v8i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v8i64:
; AVX512: # %bb.0:
@@ -157,28 +273,28 @@ define i64 @test_v8i64(<8 x i64> %a0) nounwind {
}
define i64 @test_v16i64(<16 x i64> %a0) nounwind {
-; X86-SSE-LABEL: test_v16i64:
-; X86-SSE: # %bb.0:
-; X86-SSE-NEXT: pushl %ebp
-; X86-SSE-NEXT: movl %esp, %ebp
-; X86-SSE-NEXT: andl $-16, %esp
-; X86-SSE-NEXT: subl $16, %esp
-; X86-SSE-NEXT: movdqa 8(%ebp), %xmm3
-; X86-SSE-NEXT: pxor 56(%ebp), %xmm2
-; X86-SSE-NEXT: pxor 24(%ebp), %xmm0
-; X86-SSE-NEXT: pxor %xmm2, %xmm0
-; X86-SSE-NEXT: pxor 72(%ebp), %xmm3
-; X86-SSE-NEXT: pxor 40(%ebp), %xmm1
-; X86-SSE-NEXT: pxor %xmm3, %xmm1
-; X86-SSE-NEXT: pxor %xmm0, %xmm1
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
-; X86-SSE-NEXT: pxor %xmm1, %xmm0
-; X86-SSE-NEXT: movd %xmm0, %eax
-; X86-SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
-; X86-SSE-NEXT: movd %xmm0, %edx
-; X86-SSE-NEXT: movl %ebp, %esp
-; X86-SSE-NEXT: popl %ebp
-; X86-SSE-NEXT: retl
+; X86-SSE2-LABEL: test_v16i64:
+; X86-SSE2: # %bb.0:
+; X86-SSE2-NEXT: pushl %ebp
+; X86-SSE2-NEXT: movl %esp, %ebp
+; X86-SSE2-NEXT: andl $-16, %esp
+; X86-SSE2-NEXT: subl $16, %esp
+; X86-SSE2-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE2-NEXT: pxor 56(%ebp), %xmm2
+; X86-SSE2-NEXT: pxor 24(%ebp), %xmm0
+; X86-SSE2-NEXT: pxor %xmm2, %xmm0
+; X86-SSE2-NEXT: pxor 72(%ebp), %xmm3
+; X86-SSE2-NEXT: pxor 40(%ebp), %xmm1
+; X86-SSE2-NEXT: pxor %xmm3, %xmm1
+; X86-SSE2-NEXT: pxor %xmm0, %xmm1
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE2-NEXT: pxor %xmm1, %xmm0
+; X86-SSE2-NEXT: movd %xmm0, %eax
+; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1]
+; X86-SSE2-NEXT: movd %xmm0, %edx
+; X86-SSE2-NEXT: movl %ebp, %esp
+; X86-SSE2-NEXT: popl %ebp
+; X86-SSE2-NEXT: retl
;
; X64-SSE-LABEL: test_v16i64:
; X64-SSE: # %bb.0:
@@ -194,31 +310,93 @@ define i64 @test_v16i64(<16 x i64> %a0) nounwind {
; X64-SSE-NEXT: movq %xmm0, %rax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v16i64:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovq %xmm0, %rax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v16i64:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovq %xmm0, %rax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-SSE4-LABEL: test_v16i64:
+; X86-SSE4: # %bb.0:
+; X86-SSE4-NEXT: pushl %ebp
+; X86-SSE4-NEXT: movl %esp, %ebp
+; X86-SSE4-NEXT: andl $-16, %esp
+; X86-SSE4-NEXT: subl $16, %esp
+; X86-SSE4-NEXT: movdqa 8(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 56(%ebp), %xmm2
+; X86-SSE4-NEXT: pxor 24(%ebp), %xmm0
+; X86-SSE4-NEXT: pxor %xmm2, %xmm0
+; X86-SSE4-NEXT: pxor 72(%ebp), %xmm3
+; X86-SSE4-NEXT: pxor 40(%ebp), %xmm1
+; X86-SSE4-NEXT: pxor %xmm3, %xmm1
+; X86-SSE4-NEXT: pxor %xmm0, %xmm1
+; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,2,3]
+; X86-SSE4-NEXT: pxor %xmm1, %xmm0
+; X86-SSE4-NEXT: movd %xmm0, %eax
+; X86-SSE4-NEXT: pextrd $1, %xmm0, %edx
+; X86-SSE4-NEXT: movl %ebp, %esp
+; X86-SSE4-NEXT: popl %ebp
+; X86-SSE4-NEXT: retl
+;
+; X86-AVX1-LABEL: test_v16i64:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v16i64:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovq %xmm0, %rax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v16i64:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: vpextrd $1, %xmm0, %edx
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v16i64:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovq %xmm0, %rax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v16i64:
; AVX512: # %bb.0:
@@ -253,7 +431,7 @@ define i32 @test_v2i32(<2 x i32> %a0) nounwind {
; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.xor.v2i32(<2 x i32> %a0)
ret i32 %1
}
@@ -275,7 +453,7 @@ define i32 @test_v4i32(<4 x i32> %a0) nounwind {
; AVX-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i32 @llvm.vector.reduce.xor.v4i32(<4 x i32> %a0)
ret i32 %1
}
@@ -301,7 +479,7 @@ define i32 @test_v8i32(<8 x i32> %a0) nounwind {
; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v8i32:
; AVX2: # %bb.0:
@@ -313,7 +491,7 @@ define i32 @test_v8i32(<8 x i32> %a0) nounwind {
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v8i32:
; AVX512: # %bb.0:
@@ -372,7 +550,7 @@ define i32 @test_v16i32(<16 x i32> %a0) nounwind {
; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i32:
; AVX2: # %bb.0:
@@ -385,7 +563,7 @@ define i32 @test_v16i32(<16 x i32> %a0) nounwind {
; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i32:
; AVX512: # %bb.0:
@@ -444,35 +622,77 @@ define i32 @test_v32i32(<32 x i32> %a0) nounwind {
; X64-SSE-NEXT: movd %xmm1, %eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v32i32:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v32i32:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v32i32:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v32i32:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v32i32:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v32i32:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v32i32:
; AVX512: # %bb.0:
@@ -512,7 +732,7 @@ define i16 @test_v2i16(<2 x i16> %a0) nounwind {
; AVX-NEXT: vpxor %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.xor.v2i16(<2 x i16> %a0)
ret i16 %1
}
@@ -537,7 +757,7 @@ define i16 @test_v4i16(<4 x i16> %a0) nounwind {
; AVX-NEXT: vpxor %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.xor.v4i16(<4 x i16> %a0)
ret i16 %1
}
@@ -566,7 +786,7 @@ define i16 @test_v8i16(<8 x i16> %a0) nounwind {
; AVX-NEXT: vpxor %xmm0, %xmm1, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i16 @llvm.vector.reduce.xor.v8i16(<8 x i16> %a0)
ret i16 %1
}
@@ -599,7 +819,7 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v16i16:
; AVX2: # %bb.0:
@@ -614,7 +834,7 @@ define i16 @test_v16i16(<16 x i16> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v16i16:
; AVX512: # %bb.0:
@@ -687,7 +907,7 @@ define i16 @test_v32i16(<32 x i16> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i16:
; AVX2: # %bb.0:
@@ -703,7 +923,7 @@ define i16 @test_v32i16(<32 x i16> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i16:
; AVX512: # %bb.0:
@@ -773,41 +993,89 @@ define i16 @test_v64i16(<64 x i16> %a0) nounwind {
; X64-SSE-NEXT: # kill: def $ax killed $ax killed $eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v64i16:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v64i16:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: # kill: def $ax killed $ax killed $eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v64i16:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: # kill: def $ax killed $ax killed $eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v64i16:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vxorps %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v64i16:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v64i16:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm0, %xmm1, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: # kill: def $ax killed $ax killed $eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v64i16:
; AVX512: # %bb.0:
@@ -850,7 +1118,7 @@ define i8 @test_v2i8(<2 x i8> %a0) nounwind {
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.xor.v2i8(<2 x i8> %a0)
ret i8 %1
}
@@ -876,7 +1144,7 @@ define i8 @test_v4i8(<4 x i8> %a0) nounwind {
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.xor.v4i8(<4 x i8> %a0)
ret i8 %1
}
@@ -906,7 +1174,7 @@ define i8 @test_v8i8(<8 x i8> %a0) nounwind {
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.xor.v8i8(<8 x i8> %a0)
ret i8 %1
}
@@ -940,7 +1208,7 @@ define i8 @test_v16i8(<16 x i8> %a0) nounwind {
; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0
; AVX-NEXT: vmovd %xmm0, %eax
; AVX-NEXT: # kill: def $al killed $al killed $eax
-; AVX-NEXT: retq
+; AVX-NEXT: ret{{[l|q]}}
%1 = call i8 @llvm.vector.reduce.xor.v16i8(<16 x i8> %a0)
ret i8 %1
}
@@ -978,7 +1246,7 @@ define i8 @test_v32i8(<32 x i8> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v32i8:
; AVX2: # %bb.0:
@@ -995,7 +1263,7 @@ define i8 @test_v32i8(<32 x i8> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v32i8:
; AVX512: # %bb.0:
@@ -1078,7 +1346,7 @@ define i8 @test_v64i8(<64 x i8> %a0) nounwind {
; AVX1-NEXT: vmovd %xmm0, %eax
; AVX1-NEXT: # kill: def $al killed $al killed $eax
; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
+; AVX1-NEXT: ret{{[l|q]}}
;
; AVX2-LABEL: test_v64i8:
; AVX2: # %bb.0:
@@ -1096,7 +1364,7 @@ define i8 @test_v64i8(<64 x i8> %a0) nounwind {
; AVX2-NEXT: vmovd %xmm0, %eax
; AVX2-NEXT: # kill: def $al killed $al killed $eax
; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; AVX2-NEXT: ret{{[l|q]}}
;
; AVX512-LABEL: test_v64i8:
; AVX512: # %bb.0:
@@ -1174,45 +1442,97 @@ define i8 @test_v128i8(<128 x i8> %a0) nounwind {
; X64-SSE-NEXT: # kill: def $al killed $al killed $eax
; X64-SSE-NEXT: retq
;
-; AVX1-LABEL: test_v128i8:
-; AVX1: # %bb.0:
-; AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
-; AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
-; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
-; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
-; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX1-NEXT: vmovd %xmm0, %eax
-; AVX1-NEXT: # kill: def $al killed $al killed $eax
-; AVX1-NEXT: vzeroupper
-; AVX1-NEXT: retq
-;
-; AVX2-LABEL: test_v128i8:
-; AVX2: # %bb.0:
-; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
-; AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
-; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
-; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
-; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
-; AVX2-NEXT: vmovd %xmm0, %eax
-; AVX2-NEXT: # kill: def $al killed $al killed $eax
-; AVX2-NEXT: vzeroupper
-; AVX2-NEXT: retq
+; X86-AVX1-LABEL: test_v128i8:
+; X86-AVX1: # %bb.0:
+; X86-AVX1-NEXT: pushl %ebp
+; X86-AVX1-NEXT: movl %esp, %ebp
+; X86-AVX1-NEXT: andl $-32, %esp
+; X86-AVX1-NEXT: subl $32, %esp
+; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X86-AVX1-NEXT: vxorps 8(%ebp), %ymm1, %ymm1
+; X86-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X86-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX1-NEXT: vmovd %xmm0, %eax
+; X86-AVX1-NEXT: # kill: def $al killed $al killed $eax
+; X86-AVX1-NEXT: movl %ebp, %esp
+; X86-AVX1-NEXT: popl %ebp
+; X86-AVX1-NEXT: vzeroupper
+; X86-AVX1-NEXT: retl
+;
+; X64-AVX1-LABEL: test_v128i8:
+; X64-AVX1: # %bb.0:
+; X64-AVX1-NEXT: vxorps %ymm3, %ymm1, %ymm1
+; X64-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
+; X64-AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0
+; X64-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vshufps {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX1-NEXT: vxorps %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X64-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX1-NEXT: vmovd %xmm0, %eax
+; X64-AVX1-NEXT: # kill: def $al killed $al killed $eax
+; X64-AVX1-NEXT: vzeroupper
+; X64-AVX1-NEXT: retq
+;
+; X86-AVX2-LABEL: test_v128i8:
+; X86-AVX2: # %bb.0:
+; X86-AVX2-NEXT: pushl %ebp
+; X86-AVX2-NEXT: movl %esp, %ebp
+; X86-AVX2-NEXT: andl $-32, %esp
+; X86-AVX2-NEXT: subl $32, %esp
+; X86-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X86-AVX2-NEXT: vpxor 8(%ebp), %ymm1, %ymm1
+; X86-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X86-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X86-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X86-AVX2-NEXT: vmovd %xmm0, %eax
+; X86-AVX2-NEXT: # kill: def $al killed $al killed $eax
+; X86-AVX2-NEXT: movl %ebp, %esp
+; X86-AVX2-NEXT: popl %ebp
+; X86-AVX2-NEXT: vzeroupper
+; X86-AVX2-NEXT: retl
+;
+; X64-AVX2-LABEL: test_v128i8:
+; X64-AVX2: # %bb.0:
+; X64-AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1
+; X64-AVX2-NEXT: vpxor %ymm2, %ymm0, %ymm0
+; X64-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
+; X64-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,1,1]
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpsrld $16, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vpsrlw $8, %xmm0, %xmm1
+; X64-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
+; X64-AVX2-NEXT: vmovd %xmm0, %eax
+; X64-AVX2-NEXT: # kill: def $al killed $al killed $eax
+; X64-AVX2-NEXT: vzeroupper
+; X64-AVX2-NEXT: retq
;
; AVX512-LABEL: test_v128i8:
; AVX512: # %bb.0:
@@ -1262,3 +1582,12 @@ declare i8 @llvm.vector.reduce.xor.v16i8(<16 x i8>)
declare i8 @llvm.vector.reduce.xor.v32i8(<32 x i8>)
declare i8 @llvm.vector.reduce.xor.v64i8(<64 x i8>)
declare i8 @llvm.vector.reduce.xor.v128i8(<128 x i8>)
+;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
+; AVX1OR2: {{.*}}
+; AVX512BW: {{.*}}
+; AVX512F: {{.*}}
+; AVX512VL: {{.*}}
+; SSE2: {{.*}}
+; SSE4: {{.*}}
+; X64-SSE2: {{.*}}
+; X64-SSE4: {{.*}}
More information about the llvm-commits
mailing list