[x86] fix assert with horizontal math + broadcast of vector (PR43402)
[llvm-core.git] / test / CodeGen / X86 / avx512-vec-cmp.ll
blob17a36c122f27927f58cf5f0b20243bbe17dda788
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -show-mc-encoding -mattr=+avx512f | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512 --check-prefix=KNL
3 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -show-mc-encoding -mattr=+avx512f,+avx512bw | FileCheck %s --check-prefix=CHECK --check-prefix=AVX512 --check-prefix=AVX512BW
4 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -show-mc-encoding -mattr=+avx512f,+avx512bw,+avx512vl,+avx512dq | FileCheck %s --check-prefix=CHECK --check-prefix=SKX
6 define <16 x float> @test1(<16 x float> %x, <16 x float> %y) nounwind {
7 ; CHECK-LABEL: test1:
8 ; CHECK:       ## %bb.0:
9 ; CHECK-NEXT:    vcmpleps %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc9,0x02]
10 ; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
11 ; CHECK-NEXT:    retq ## encoding: [0xc3]
12   %mask = fcmp ole <16 x float> %x, %y
13   %max = select <16 x i1> %mask, <16 x float> %x, <16 x float> %y
14   ret <16 x float> %max
17 define <8 x double> @test2(<8 x double> %x, <8 x double> %y) nounwind {
18 ; CHECK-LABEL: test2:
19 ; CHECK:       ## %bb.0:
20 ; CHECK-NEXT:    vcmplepd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xc9,0x02]
21 ; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
22 ; CHECK-NEXT:    retq ## encoding: [0xc3]
23   %mask = fcmp ole <8 x double> %x, %y
24   %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %y
25   ret <8 x double> %max
28 define <16 x i32> @test3(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %yp) nounwind {
29 ; CHECK-LABEL: test3:
30 ; CHECK:       ## %bb.0:
31 ; CHECK-NEXT:    vpcmpeqd (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x0f]
32 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
33 ; CHECK-NEXT:    retq ## encoding: [0xc3]
34   %y = load <16 x i32>, <16 x i32>* %yp, align 4
35   %mask = icmp eq <16 x i32> %x, %y
36   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
37   ret <16 x i32> %max
40 define <16 x i32> @test4_unsigned(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
41 ; CHECK-LABEL: test4_unsigned:
42 ; CHECK:       ## %bb.0:
43 ; CHECK-NEXT:    vpcmpnltud %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1e,0xc9,0x05]
44 ; CHECK-NEXT:    vpblendmd %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc2]
45 ; CHECK-NEXT:    retq ## encoding: [0xc3]
46   %mask = icmp uge <16 x i32> %x, %y
47   %max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
48   ret <16 x i32> %max
51 define <8 x i64> @test5(<8 x i64> %x, <8 x i64> %y) nounwind {
52 ; CHECK-LABEL: test5:
53 ; CHECK:       ## %bb.0:
54 ; CHECK-NEXT:    vpcmpeqq %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc9]
55 ; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
56 ; CHECK-NEXT:    retq ## encoding: [0xc3]
57   %mask = icmp eq <8 x i64> %x, %y
58   %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %y
59   ret <8 x i64> %max
62 define <8 x i64> @test6_unsigned(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1) nounwind {
63 ; CHECK-LABEL: test6_unsigned:
64 ; CHECK:       ## %bb.0:
65 ; CHECK-NEXT:    vpcmpnleuq %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0xfd,0x48,0x1e,0xc9,0x06]
66 ; CHECK-NEXT:    vpblendmq %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc2]
67 ; CHECK-NEXT:    retq ## encoding: [0xc3]
68   %mask = icmp ugt <8 x i64> %x, %y
69   %max = select <8 x i1> %mask, <8 x i64> %x1, <8 x i64> %y
70   ret <8 x i64> %max
73 define <4 x float> @test7(<4 x float> %a, <4 x float> %b) {
74 ; AVX512-LABEL: test7:
75 ; AVX512:       ## %bb.0:
76 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
77 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
78 ; AVX512-NEXT:    vxorps %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe8,0x57,0xd2]
79 ; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
80 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
81 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
82 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
83 ; AVX512-NEXT:    retq ## encoding: [0xc3]
85 ; SKX-LABEL: test7:
86 ; SKX:       ## %bb.0:
87 ; SKX-NEXT:    vxorps %xmm2, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe8,0x57,0xd2]
88 ; SKX-NEXT:    vcmpltps %xmm2, %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x08,0xc2,0xca,0x01]
89 ; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
90 ; SKX-NEXT:    retq ## encoding: [0xc3]
92   %mask = fcmp olt <4 x float> %a, zeroinitializer
93   %c = select <4 x i1>%mask, <4 x float>%a, <4 x float>%b
94   ret <4 x float>%c
97 define <2 x double> @test8(<2 x double> %a, <2 x double> %b) {
98 ; AVX512-LABEL: test8:
99 ; AVX512:       ## %bb.0:
100 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
101 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
102 ; AVX512-NEXT:    vxorpd %xmm2, %xmm2, %xmm2 ## encoding: [0xc5,0xe9,0x57,0xd2]
103 ; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
104 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
105 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
106 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
107 ; AVX512-NEXT:    retq ## encoding: [0xc3]
109 ; SKX-LABEL: test8:
110 ; SKX:       ## %bb.0:
111 ; SKX-NEXT:    vxorpd %xmm2, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe9,0x57,0xd2]
112 ; SKX-NEXT:    vcmpltpd %xmm2, %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x08,0xc2,0xca,0x01]
113 ; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
114 ; SKX-NEXT:    retq ## encoding: [0xc3]
115   %mask = fcmp olt <2 x double> %a, zeroinitializer
116   %c = select <2 x i1>%mask, <2 x double>%a, <2 x double>%b
117   ret <2 x double>%c
120 define <8 x i32> @test9(<8 x i32> %x, <8 x i32> %y) nounwind {
121 ; AVX512-LABEL: test9:
122 ; AVX512:       ## %bb.0:
123 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
124 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
125 ; AVX512-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc9]
126 ; AVX512-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
127 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
128 ; AVX512-NEXT:    retq ## encoding: [0xc3]
130 ; SKX-LABEL: test9:
131 ; SKX:       ## %bb.0:
132 ; SKX-NEXT:    vpcmpeqd %ymm1, %ymm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x28,0x76,0xc9]
133 ; SKX-NEXT:    vpblendmd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x64,0xc0]
134 ; SKX-NEXT:    retq ## encoding: [0xc3]
135   %mask = icmp eq <8 x i32> %x, %y
136   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
137   ret <8 x i32> %max
140 define <8 x float> @test10(<8 x float> %x, <8 x float> %y) nounwind {
141 ; AVX512-LABEL: test10:
142 ; AVX512:       ## %bb.0:
143 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
144 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
145 ; AVX512-NEXT:    vcmpeqps %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc9,0x00]
146 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
147 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
148 ; AVX512-NEXT:    retq ## encoding: [0xc3]
150 ; SKX-LABEL: test10:
151 ; SKX:       ## %bb.0:
152 ; SKX-NEXT:    vcmpeqps %ymm1, %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x28,0xc2,0xc9,0x00]
153 ; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
154 ; SKX-NEXT:    retq ## encoding: [0xc3]
156   %mask = fcmp oeq <8 x float> %x, %y
157   %max = select <8 x i1> %mask, <8 x float> %x, <8 x float> %y
158   ret <8 x float> %max
161 define <8 x i32> @test11_unsigned(<8 x i32> %x, <8 x i32> %y) nounwind {
162 ; AVX512-LABEL: test11_unsigned:
163 ; AVX512:       ## %bb.0:
164 ; AVX512-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0 ## encoding: [0xc4,0xe2,0x7d,0x3f,0xc1]
165 ; AVX512-NEXT:    retq ## encoding: [0xc3]
167 ; SKX-LABEL: test11_unsigned:
168 ; SKX:       ## %bb.0:
169 ; SKX-NEXT:    vpmaxud %ymm1, %ymm0, %ymm0 ## EVEX TO VEX Compression encoding: [0xc4,0xe2,0x7d,0x3f,0xc1]
170 ; SKX-NEXT:    retq ## encoding: [0xc3]
171   %mask = icmp ugt <8 x i32> %x, %y
172   %max = select <8 x i1> %mask, <8 x i32> %x, <8 x i32> %y
173   ret <8 x i32> %max
176 define i16 @test12(<16 x i64> %a, <16 x i64> %b) nounwind {
177 ; KNL-LABEL: test12:
178 ; KNL:       ## %bb.0:
179 ; KNL-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc2]
180 ; KNL-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x29,0xcb]
181 ; KNL-NEXT:    kunpckbw %k0, %k1, %k0 ## encoding: [0xc5,0xf5,0x4b,0xc0]
182 ; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
183 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
184 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
185 ; KNL-NEXT:    retq ## encoding: [0xc3]
187 ; AVX512BW-LABEL: test12:
188 ; AVX512BW:       ## %bb.0:
189 ; AVX512BW-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc2]
190 ; AVX512BW-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x29,0xcb]
191 ; AVX512BW-NEXT:    kunpckbw %k0, %k1, %k0 ## encoding: [0xc5,0xf5,0x4b,0xc0]
192 ; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
193 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
194 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
195 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
197 ; SKX-LABEL: test12:
198 ; SKX:       ## %bb.0:
199 ; SKX-NEXT:    vpcmpeqq %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x29,0xc2]
200 ; SKX-NEXT:    vpcmpeqq %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x29,0xcb]
201 ; SKX-NEXT:    kunpckbw %k0, %k1, %k0 ## encoding: [0xc5,0xf5,0x4b,0xc0]
202 ; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
203 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
204 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
205 ; SKX-NEXT:    retq ## encoding: [0xc3]
206   %res = icmp eq <16 x i64> %a, %b
207   %res1 = bitcast <16 x i1> %res to i16
208   ret i16 %res1
211 define i32 @test12_v32i32(<32 x i32> %a, <32 x i32> %b) nounwind {
212 ; KNL-LABEL: test12_v32i32:
213 ; KNL:       ## %bb.0:
214 ; KNL-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc2]
215 ; KNL-NEXT:    kmovw %k0, %ecx ## encoding: [0xc5,0xf8,0x93,0xc8]
216 ; KNL-NEXT:    vpcmpeqd %zmm3, %zmm1, %k0 ## encoding: [0x62,0xf1,0x75,0x48,0x76,0xc3]
217 ; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
218 ; KNL-NEXT:    shll $16, %eax ## encoding: [0xc1,0xe0,0x10]
219 ; KNL-NEXT:    orl %ecx, %eax ## encoding: [0x09,0xc8]
220 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
221 ; KNL-NEXT:    retq ## encoding: [0xc3]
223 ; AVX512BW-LABEL: test12_v32i32:
224 ; AVX512BW:       ## %bb.0:
225 ; AVX512BW-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc2]
226 ; AVX512BW-NEXT:    vpcmpeqd %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x76,0xcb]
227 ; AVX512BW-NEXT:    kunpckwd %k0, %k1, %k0 ## encoding: [0xc5,0xf4,0x4b,0xc0]
228 ; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
229 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
230 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
232 ; SKX-LABEL: test12_v32i32:
233 ; SKX:       ## %bb.0:
234 ; SKX-NEXT:    vpcmpeqd %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc2]
235 ; SKX-NEXT:    vpcmpeqd %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x76,0xcb]
236 ; SKX-NEXT:    kunpckwd %k0, %k1, %k0 ## encoding: [0xc5,0xf4,0x4b,0xc0]
237 ; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
238 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
239 ; SKX-NEXT:    retq ## encoding: [0xc3]
240   %res = icmp eq <32 x i32> %a, %b
241   %res1 = bitcast <32 x i1> %res to i32
242   ret i32 %res1
245 define i64 @test12_v64i16(<64 x i16> %a, <64 x i16> %b) nounwind {
246 ; KNL-LABEL: test12_v64i16:
247 ; KNL:       ## %bb.0:
248 ; KNL-NEXT:    vpcmpeqw %ymm4, %ymm0, %ymm0 ## encoding: [0xc5,0xfd,0x75,0xc4]
249 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
250 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
251 ; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
252 ; KNL-NEXT:    vpcmpeqw %ymm5, %ymm1, %ymm0 ## encoding: [0xc5,0xf5,0x75,0xc5]
253 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
254 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
255 ; KNL-NEXT:    kmovw %k0, %ecx ## encoding: [0xc5,0xf8,0x93,0xc8]
256 ; KNL-NEXT:    shll $16, %ecx ## encoding: [0xc1,0xe1,0x10]
257 ; KNL-NEXT:    orl %eax, %ecx ## encoding: [0x09,0xc1]
258 ; KNL-NEXT:    vpcmpeqw %ymm6, %ymm2, %ymm0 ## encoding: [0xc5,0xed,0x75,0xc6]
259 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
260 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
261 ; KNL-NEXT:    kmovw %k0, %edx ## encoding: [0xc5,0xf8,0x93,0xd0]
262 ; KNL-NEXT:    vpcmpeqw %ymm7, %ymm3, %ymm0 ## encoding: [0xc5,0xe5,0x75,0xc7]
263 ; KNL-NEXT:    vpmovsxwd %ymm0, %zmm0 ## encoding: [0x62,0xf2,0x7d,0x48,0x23,0xc0]
264 ; KNL-NEXT:    vptestmd %zmm0, %zmm0, %k0 ## encoding: [0x62,0xf2,0x7d,0x48,0x27,0xc0]
265 ; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
266 ; KNL-NEXT:    shll $16, %eax ## encoding: [0xc1,0xe0,0x10]
267 ; KNL-NEXT:    orl %edx, %eax ## encoding: [0x09,0xd0]
268 ; KNL-NEXT:    shlq $32, %rax ## encoding: [0x48,0xc1,0xe0,0x20]
269 ; KNL-NEXT:    orq %rcx, %rax ## encoding: [0x48,0x09,0xc8]
270 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
271 ; KNL-NEXT:    retq ## encoding: [0xc3]
273 ; AVX512BW-LABEL: test12_v64i16:
274 ; AVX512BW:       ## %bb.0:
275 ; AVX512BW-NEXT:    vpcmpeqw %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x75,0xc2]
276 ; AVX512BW-NEXT:    vpcmpeqw %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x75,0xcb]
277 ; AVX512BW-NEXT:    kunpckdq %k0, %k1, %k0 ## encoding: [0xc4,0xe1,0xf4,0x4b,0xc0]
278 ; AVX512BW-NEXT:    kmovq %k0, %rax ## encoding: [0xc4,0xe1,0xfb,0x93,0xc0]
279 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
280 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
282 ; SKX-LABEL: test12_v64i16:
283 ; SKX:       ## %bb.0:
284 ; SKX-NEXT:    vpcmpeqw %zmm2, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x75,0xc2]
285 ; SKX-NEXT:    vpcmpeqw %zmm3, %zmm1, %k1 ## encoding: [0x62,0xf1,0x75,0x48,0x75,0xcb]
286 ; SKX-NEXT:    kunpckdq %k0, %k1, %k0 ## encoding: [0xc4,0xe1,0xf4,0x4b,0xc0]
287 ; SKX-NEXT:    kmovq %k0, %rax ## encoding: [0xc4,0xe1,0xfb,0x93,0xc0]
288 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
289 ; SKX-NEXT:    retq ## encoding: [0xc3]
290   %res = icmp eq <64 x i16> %a, %b
291   %res1 = bitcast <64 x i1> %res to i64
292   ret i64 %res1
295 define <16 x i32> @test13(<16 x float>%a, <16 x float>%b)
296 ; AVX512-LABEL: test13:
297 ; AVX512:       ## %bb.0:
298 ; AVX512-NEXT:    vcmpeqps %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc9,0x00]
299 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
300 ; AVX512-NEXT:    vpsrld $31, %zmm0, %zmm0 ## encoding: [0x62,0xf1,0x7d,0x48,0x72,0xd0,0x1f]
301 ; AVX512-NEXT:    retq ## encoding: [0xc3]
303 ; SKX-LABEL: test13:
304 ; SKX:       ## %bb.0:
305 ; SKX-NEXT:    vcmpeqps %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xc1,0x00]
306 ; SKX-NEXT:    vpmovm2d %k0, %zmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x38,0xc0]
307 ; SKX-NEXT:    vpsrld $31, %zmm0, %zmm0 ## encoding: [0x62,0xf1,0x7d,0x48,0x72,0xd0,0x1f]
308 ; SKX-NEXT:    retq ## encoding: [0xc3]
310   %cmpvector_i = fcmp oeq <16 x float> %a, %b
311   %conv = zext <16 x i1> %cmpvector_i to <16 x i32>
312   ret <16 x i32> %conv
315 define <16 x i32> @test14(<16 x i32>%a, <16 x i32>%b) {
316 ; CHECK-LABEL: test14:
317 ; CHECK:       ## %bb.0:
318 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm2 ## encoding: [0x62,0xf1,0x7d,0x48,0xfa,0xd1]
319 ; CHECK-NEXT:    vpcmpgtd %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xc8]
320 ; CHECK-NEXT:    vpsubd %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0x7d,0xc9,0xfa,0xc1]
321 ; CHECK-NEXT:    retq ## encoding: [0xc3]
322   %sub_r = sub <16 x i32> %a, %b
323   %cmp.i2.i = icmp sgt <16 x i32> %sub_r, %a
324   %sext.i3.i = sext <16 x i1> %cmp.i2.i to <16 x i32>
325   %mask = icmp eq <16 x i32> %sext.i3.i, zeroinitializer
326   %res = select <16 x i1> %mask, <16 x i32> zeroinitializer, <16 x i32> %sub_r
327   ret <16 x i32>%res
330 define <8 x i64> @test15(<8 x i64>%a, <8 x i64>%b) {
331 ; CHECK-LABEL: test15:
332 ; CHECK:       ## %bb.0:
333 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm2 ## encoding: [0x62,0xf1,0xfd,0x48,0xfb,0xd1]
334 ; CHECK-NEXT:    vpcmpgtq %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x37,0xc8]
335 ; CHECK-NEXT:    vpsubq %zmm1, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf1,0xfd,0xc9,0xfb,0xc1]
336 ; CHECK-NEXT:    retq ## encoding: [0xc3]
337   %sub_r = sub <8 x i64> %a, %b
338   %cmp.i2.i = icmp sgt <8 x i64> %sub_r, %a
339   %sext.i3.i = sext <8 x i1> %cmp.i2.i to <8 x i64>
340   %mask = icmp eq <8 x i64> %sext.i3.i, zeroinitializer
341   %res = select <8 x i1> %mask, <8 x i64> zeroinitializer, <8 x i64> %sub_r
342   ret <8 x i64>%res
345 define <16 x i32> @test16(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1) nounwind {
346 ; CHECK-LABEL: test16:
347 ; CHECK:       ## %bb.0:
348 ; CHECK-NEXT:    vpcmpnltd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1f,0xc9,0x05]
349 ; CHECK-NEXT:    vpblendmd %zmm2, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc2]
350 ; CHECK-NEXT:    retq ## encoding: [0xc3]
351   %mask = icmp sge <16 x i32> %x, %y
352   %max = select <16 x i1> %mask, <16 x i32> %x1, <16 x i32> %y
353   ret <16 x i32> %max
356 define <16 x i32> @test17(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
357 ; CHECK-LABEL: test17:
358 ; CHECK:       ## %bb.0:
359 ; CHECK-NEXT:    vpcmpgtd (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0x0f]
360 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
361 ; CHECK-NEXT:    retq ## encoding: [0xc3]
362   %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
363   %mask = icmp sgt <16 x i32> %x, %y
364   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
365   ret <16 x i32> %max
368 define <16 x i32> @test18(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
369 ; CHECK-LABEL: test18:
370 ; CHECK:       ## %bb.0:
371 ; CHECK-NEXT:    vpcmpled (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1f,0x0f,0x02]
372 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
373 ; CHECK-NEXT:    retq ## encoding: [0xc3]
374   %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
375   %mask = icmp sle <16 x i32> %x, %y
376   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
377   ret <16 x i32> %max
380 define <16 x i32> @test19(<16 x i32> %x, <16 x i32> %x1, <16 x i32>* %y.ptr) nounwind {
381 ; CHECK-LABEL: test19:
382 ; CHECK:       ## %bb.0:
383 ; CHECK-NEXT:    vpcmpleud (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x48,0x1e,0x0f,0x02]
384 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
385 ; CHECK-NEXT:    retq ## encoding: [0xc3]
386   %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
387   %mask = icmp ule <16 x i32> %x, %y
388   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
389   ret <16 x i32> %max
392 define <16 x i32> @test20(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1, <16 x i32> %y1) nounwind {
393 ; CHECK-LABEL: test20:
394 ; CHECK:       ## %bb.0:
395 ; CHECK-NEXT:    vpcmpeqd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0xc9]
396 ; CHECK-NEXT:    vpcmpeqd %zmm3, %zmm2, %k1 {%k1} ## encoding: [0x62,0xf1,0x6d,0x49,0x76,0xcb]
397 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
398 ; CHECK-NEXT:    retq ## encoding: [0xc3]
399   %mask1 = icmp eq <16 x i32> %x1, %y1
400   %mask0 = icmp eq <16 x i32> %x, %y
401   %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
402   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %y
403   ret <16 x i32> %max
406 define <8 x i64> @test21(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1) nounwind {
407 ; CHECK-LABEL: test21:
408 ; CHECK:       ## %bb.0:
409 ; CHECK-NEXT:    vpcmpleq %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf3,0xfd,0x48,0x1f,0xc9,0x02]
410 ; CHECK-NEXT:    vpcmpnltq %zmm3, %zmm2, %k1 {%k1} ## encoding: [0x62,0xf3,0xed,0x49,0x1f,0xcb,0x05]
411 ; CHECK-NEXT:    vpblendmq %zmm0, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x64,0xc0]
412 ; CHECK-NEXT:    retq ## encoding: [0xc3]
413   %mask1 = icmp sge <8 x i64> %x1, %y1
414   %mask0 = icmp sle <8 x i64> %x, %y
415   %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
416   %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
417   ret <8 x i64> %max
420 define <8 x i64> @test22(<8 x i64> %x, <8 x i64>* %y.ptr, <8 x i64> %x1, <8 x i64> %y1) nounwind {
421 ; CHECK-LABEL: test22:
422 ; CHECK:       ## %bb.0:
423 ; CHECK-NEXT:    vpcmpgtq %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf2,0xf5,0x48,0x37,0xca]
424 ; CHECK-NEXT:    vpcmpgtq (%rdi), %zmm0, %k1 {%k1} ## encoding: [0x62,0xf2,0xfd,0x49,0x37,0x0f]
425 ; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
426 ; CHECK-NEXT:    retq ## encoding: [0xc3]
427   %mask1 = icmp sgt <8 x i64> %x1, %y1
428   %y = load <8 x i64>, <8 x i64>* %y.ptr, align 4
429   %mask0 = icmp sgt <8 x i64> %x, %y
430   %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
431   %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
432   ret <8 x i64> %max
435 define <16 x i32> @test23(<16 x i32> %x, <16 x i32>* %y.ptr, <16 x i32> %x1, <16 x i32> %y1) nounwind {
436 ; CHECK-LABEL: test23:
437 ; CHECK:       ## %bb.0:
438 ; CHECK-NEXT:    vpcmpnltd %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf3,0x75,0x48,0x1f,0xca,0x05]
439 ; CHECK-NEXT:    vpcmpleud (%rdi), %zmm0, %k1 {%k1} ## encoding: [0x62,0xf3,0x7d,0x49,0x1e,0x0f,0x02]
440 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
441 ; CHECK-NEXT:    retq ## encoding: [0xc3]
442   %mask1 = icmp sge <16 x i32> %x1, %y1
443   %y = load <16 x i32>, <16 x i32>* %y.ptr, align 4
444   %mask0 = icmp ule <16 x i32> %x, %y
445   %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
446   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
447   ret <16 x i32> %max
450 define <8 x i64> @test24(<8 x i64> %x, <8 x i64> %x1, i64* %yb.ptr) nounwind {
451 ; CHECK-LABEL: test24:
452 ; CHECK:       ## %bb.0:
453 ; CHECK-NEXT:    vpcmpeqq (%rdi){1to8}, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfd,0x58,0x29,0x0f]
454 ; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
455 ; CHECK-NEXT:    retq ## encoding: [0xc3]
456   %yb = load i64, i64* %yb.ptr, align 4
457   %y.0 = insertelement <8 x i64> undef, i64 %yb, i32 0
458   %y = shufflevector <8 x i64> %y.0, <8 x i64> undef, <8 x i32> zeroinitializer
459   %mask = icmp eq <8 x i64> %x, %y
460   %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
461   ret <8 x i64> %max
464 define <16 x i32> @test25(<16 x i32> %x, i32* %yb.ptr, <16 x i32> %x1) nounwind {
465 ; CHECK-LABEL: test25:
466 ; CHECK:       ## %bb.0:
467 ; CHECK-NEXT:    vpcmpled (%rdi){1to16}, %zmm0, %k1 ## encoding: [0x62,0xf3,0x7d,0x58,0x1f,0x0f,0x02]
468 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
469 ; CHECK-NEXT:    retq ## encoding: [0xc3]
470   %yb = load i32, i32* %yb.ptr, align 4
471   %y.0 = insertelement <16 x i32> undef, i32 %yb, i32 0
472   %y = shufflevector <16 x i32> %y.0, <16 x i32> undef, <16 x i32> zeroinitializer
473   %mask = icmp sle <16 x i32> %x, %y
474   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
475   ret <16 x i32> %max
478 define <16 x i32> @test26(<16 x i32> %x, i32* %yb.ptr, <16 x i32> %x1, <16 x i32> %y1) nounwind {
479 ; CHECK-LABEL: test26:
480 ; CHECK:       ## %bb.0:
481 ; CHECK-NEXT:    vpcmpnltd %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf3,0x75,0x48,0x1f,0xca,0x05]
482 ; CHECK-NEXT:    vpcmpgtd (%rdi){1to16}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0x7d,0x59,0x66,0x0f]
483 ; CHECK-NEXT:    vpblendmd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x64,0xc0]
484 ; CHECK-NEXT:    retq ## encoding: [0xc3]
485   %mask1 = icmp sge <16 x i32> %x1, %y1
486   %yb = load i32, i32* %yb.ptr, align 4
487   %y.0 = insertelement <16 x i32> undef, i32 %yb, i32 0
488   %y = shufflevector <16 x i32> %y.0, <16 x i32> undef, <16 x i32> zeroinitializer
489   %mask0 = icmp sgt <16 x i32> %x, %y
490   %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer
491   %max = select <16 x i1> %mask, <16 x i32> %x, <16 x i32> %x1
492   ret <16 x i32> %max
495 define <8 x i64> @test27(<8 x i64> %x, i64* %yb.ptr, <8 x i64> %x1, <8 x i64> %y1) nounwind {
496 ; CHECK-LABEL: test27:
497 ; CHECK:       ## %bb.0:
498 ; CHECK-NEXT:    vpcmpnltq %zmm2, %zmm1, %k1 ## encoding: [0x62,0xf3,0xf5,0x48,0x1f,0xca,0x05]
499 ; CHECK-NEXT:    vpcmpleq (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf3,0xfd,0x59,0x1f,0x0f,0x02]
500 ; CHECK-NEXT:    vpblendmq %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x64,0xc0]
501 ; CHECK-NEXT:    retq ## encoding: [0xc3]
502   %mask1 = icmp sge <8 x i64> %x1, %y1
503   %yb = load i64, i64* %yb.ptr, align 4
504   %y.0 = insertelement <8 x i64> undef, i64 %yb, i32 0
505   %y = shufflevector <8 x i64> %y.0, <8 x i64> undef, <8 x i32> zeroinitializer
506   %mask0 = icmp sle <8 x i64> %x, %y
507   %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer
508   %max = select <8 x i1> %mask, <8 x i64> %x, <8 x i64> %x1
509   ret <8 x i64> %max
512 define <8 x i32>@test28(<8 x i64> %x, <8 x i64> %y, <8 x i64> %x1, <8 x i64> %y1) {
513 ; AVX512-LABEL: test28:
514 ; AVX512:       ## %bb.0:
515 ; AVX512-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x37,0xc1]
516 ; AVX512-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x37,0xcb]
517 ; AVX512-NEXT:    kxnorw %k1, %k0, %k1 ## encoding: [0xc5,0xfc,0x46,0xc9]
518 ; AVX512-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
519 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
520 ; AVX512-NEXT:    retq ## encoding: [0xc3]
522 ; SKX-LABEL: test28:
523 ; SKX:       ## %bb.0:
524 ; SKX-NEXT:    vpcmpgtq %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf2,0xfd,0x48,0x37,0xc1]
525 ; SKX-NEXT:    vpcmpgtq %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf2,0xed,0x48,0x37,0xcb]
526 ; SKX-NEXT:    kxnorb %k1, %k0, %k0 ## encoding: [0xc5,0xfd,0x46,0xc1]
527 ; SKX-NEXT:    vpmovm2d %k0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x28,0x38,0xc0]
528 ; SKX-NEXT:    retq ## encoding: [0xc3]
529   %x_gt_y = icmp sgt <8 x i64> %x, %y
530   %x1_gt_y1 = icmp sgt <8 x i64> %x1, %y1
531   %res = icmp eq <8 x i1>%x_gt_y, %x1_gt_y1
532   %resse = sext <8 x i1>%res to <8 x i32>
533   ret <8 x i32> %resse
536 define <16 x i8>@test29(<16 x i32> %x, <16 x i32> %y, <16 x i32> %x1, <16 x i32> %y1) {
537 ; KNL-LABEL: test29:
538 ; KNL:       ## %bb.0:
539 ; KNL-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0xc1]
540 ; KNL-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xcb]
541 ; KNL-NEXT:    kxorw %k1, %k0, %k1 ## encoding: [0xc5,0xfc,0x47,0xc9]
542 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
543 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x31,0xc0]
544 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
545 ; KNL-NEXT:    retq ## encoding: [0xc3]
547 ; AVX512BW-LABEL: test29:
548 ; AVX512BW:       ## %bb.0:
549 ; AVX512BW-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0xc1]
550 ; AVX512BW-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xcb]
551 ; AVX512BW-NEXT:    kxorw %k1, %k0, %k0 ## encoding: [0xc5,0xfc,0x47,0xc1]
552 ; AVX512BW-NEXT:    vpmovm2b %k0, %zmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x28,0xc0]
553 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
554 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
555 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
557 ; SKX-LABEL: test29:
558 ; SKX:       ## %bb.0:
559 ; SKX-NEXT:    vpcmpgtd %zmm1, %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x66,0xc1]
560 ; SKX-NEXT:    vpcmpgtd %zmm3, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6d,0x48,0x66,0xcb]
561 ; SKX-NEXT:    kxorw %k1, %k0, %k0 ## encoding: [0xc5,0xfc,0x47,0xc1]
562 ; SKX-NEXT:    vpmovm2b %k0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x08,0x28,0xc0]
563 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
564 ; SKX-NEXT:    retq ## encoding: [0xc3]
565   %x_gt_y = icmp sgt <16 x i32> %x, %y
566   %x1_gt_y1 = icmp sgt <16 x i32> %x1, %y1
567   %res = icmp ne <16 x i1>%x_gt_y, %x1_gt_y1
568   %resse = sext <16 x i1>%res to <16 x i8>
569   ret <16 x i8> %resse
572 define <4 x double> @test30(<4 x double> %x, <4 x double> %y) nounwind {
573 ; AVX512-LABEL: test30:
574 ; AVX512:       ## %bb.0:
575 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
576 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
577 ; AVX512-NEXT:    vcmpeqpd %zmm1, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xc9,0x00]
578 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
579 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
580 ; AVX512-NEXT:    retq ## encoding: [0xc3]
582 ; SKX-LABEL: test30:
583 ; SKX:       ## %bb.0:
584 ; SKX-NEXT:    vcmpeqpd %ymm1, %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x28,0xc2,0xc9,0x00]
585 ; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
586 ; SKX-NEXT:    retq ## encoding: [0xc3]
588   %mask = fcmp oeq <4 x double> %x, %y
589   %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %y
590   ret <4 x double> %max
593 define <2 x double> @test31(<2 x double> %x, <2 x double> %x1, <2 x double>* %yp) nounwind {
594 ; AVX512-LABEL: test31:
595 ; AVX512:       ## %bb.0:
596 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
597 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
598 ; AVX512-NEXT:    vmovupd (%rdi), %xmm2 ## encoding: [0xc5,0xf9,0x10,0x17]
599 ; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
600 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
601 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
602 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
603 ; AVX512-NEXT:    retq ## encoding: [0xc3]
605 ; SKX-LABEL: test31:
606 ; SKX:       ## %bb.0:
607 ; SKX-NEXT:    vcmpltpd (%rdi), %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x08,0xc2,0x0f,0x01]
608 ; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
609 ; SKX-NEXT:    retq ## encoding: [0xc3]
611   %y = load <2 x double>, <2 x double>* %yp, align 4
612   %mask = fcmp olt <2 x double> %x, %y
613   %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
614   ret <2 x double> %max
617 define <2 x double> @test31_commute(<2 x double> %x, <2 x double> %x1, <2 x double>* %yp) nounwind {
618 ; AVX512-LABEL: test31_commute:
619 ; AVX512:       ## %bb.0:
620 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
621 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
622 ; AVX512-NEXT:    vmovupd (%rdi), %xmm2 ## encoding: [0xc5,0xf9,0x10,0x17]
623 ; AVX512-NEXT:    vcmpltpd %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0xed,0x48,0xc2,0xc8,0x01]
624 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
625 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
626 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
627 ; AVX512-NEXT:    retq ## encoding: [0xc3]
629 ; SKX-LABEL: test31_commute:
630 ; SKX:       ## %bb.0:
631 ; SKX-NEXT:    vcmpgtpd (%rdi), %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x08,0xc2,0x0f,0x0e]
632 ; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
633 ; SKX-NEXT:    retq ## encoding: [0xc3]
635   %y = load <2 x double>, <2 x double>* %yp, align 4
636   %mask = fcmp olt <2 x double> %y, %x
637   %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
638   ret <2 x double> %max
641 define <4 x double> @test32(<4 x double> %x, <4 x double> %x1, <4 x double>* %yp) nounwind {
642 ; AVX512-LABEL: test32:
643 ; AVX512:       ## %bb.0:
644 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
645 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
646 ; AVX512-NEXT:    vmovupd (%rdi), %ymm2 ## encoding: [0xc5,0xfd,0x10,0x17]
647 ; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
648 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
649 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
650 ; AVX512-NEXT:    retq ## encoding: [0xc3]
652 ; SKX-LABEL: test32:
653 ; SKX:       ## %bb.0:
654 ; SKX-NEXT:    vcmpltpd (%rdi), %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x28,0xc2,0x0f,0x01]
655 ; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
656 ; SKX-NEXT:    retq ## encoding: [0xc3]
658   %y = load <4 x double>, <4 x double>* %yp, align 4
659   %mask = fcmp ogt <4 x double> %y, %x
660   %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
661   ret <4 x double> %max
664 define <4 x double> @test32_commute(<4 x double> %x, <4 x double> %x1, <4 x double>* %yp) nounwind {
665 ; AVX512-LABEL: test32_commute:
666 ; AVX512:       ## %bb.0:
667 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
668 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
669 ; AVX512-NEXT:    vmovupd (%rdi), %ymm2 ## encoding: [0xc5,0xfd,0x10,0x17]
670 ; AVX512-NEXT:    vcmpltpd %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0xed,0x48,0xc2,0xc8,0x01]
671 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
672 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
673 ; AVX512-NEXT:    retq ## encoding: [0xc3]
675 ; SKX-LABEL: test32_commute:
676 ; SKX:       ## %bb.0:
677 ; SKX-NEXT:    vcmpgtpd (%rdi), %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x28,0xc2,0x0f,0x0e]
678 ; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
679 ; SKX-NEXT:    retq ## encoding: [0xc3]
681   %y = load <4 x double>, <4 x double>* %yp, align 4
682   %mask = fcmp ogt <4 x double> %x, %y
683   %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
684   ret <4 x double> %max
687 define <8 x double> @test33(<8 x double> %x, <8 x double> %x1, <8 x double>* %yp) nounwind {
688 ; CHECK-LABEL: test33:
689 ; CHECK:       ## %bb.0:
690 ; CHECK-NEXT:    vcmpltpd (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0x0f,0x01]
691 ; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
692 ; CHECK-NEXT:    retq ## encoding: [0xc3]
693   %y = load <8 x double>, <8 x double>* %yp, align 4
694   %mask = fcmp olt <8 x double> %x, %y
695   %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
696   ret <8 x double> %max
699 define <8 x double> @test33_commute(<8 x double> %x, <8 x double> %x1, <8 x double>* %yp) nounwind {
700 ; CHECK-LABEL: test33_commute:
701 ; CHECK:       ## %bb.0:
702 ; CHECK-NEXT:    vcmpgtpd (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0x0f,0x0e]
703 ; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
704 ; CHECK-NEXT:    retq ## encoding: [0xc3]
705   %y = load <8 x double>, <8 x double>* %yp, align 4
706   %mask = fcmp olt <8 x double> %y, %x
707   %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
708   ret <8 x double> %max
711 define <4 x float> @test34(<4 x float> %x, <4 x float> %x1, <4 x float>* %yp) nounwind {
712 ; AVX512-LABEL: test34:
713 ; AVX512:       ## %bb.0:
714 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
715 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
716 ; AVX512-NEXT:    vmovups (%rdi), %xmm2 ## encoding: [0xc5,0xf8,0x10,0x17]
717 ; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
718 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
719 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
720 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
721 ; AVX512-NEXT:    retq ## encoding: [0xc3]
723 ; SKX-LABEL: test34:
724 ; SKX:       ## %bb.0:
725 ; SKX-NEXT:    vcmpltps (%rdi), %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x08,0xc2,0x0f,0x01]
726 ; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
727 ; SKX-NEXT:    retq ## encoding: [0xc3]
728   %y = load <4 x float>, <4 x float>* %yp, align 4
729   %mask = fcmp olt <4 x float> %x, %y
730   %max = select <4 x i1> %mask, <4 x float> %x, <4 x float> %x1
731   ret <4 x float> %max
734 define <4 x float> @test34_commute(<4 x float> %x, <4 x float> %x1, <4 x float>* %yp) nounwind {
735 ; AVX512-LABEL: test34_commute:
736 ; AVX512:       ## %bb.0:
737 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
738 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
739 ; AVX512-NEXT:    vmovups (%rdi), %xmm2 ## encoding: [0xc5,0xf8,0x10,0x17]
740 ; AVX512-NEXT:    vcmpltps %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6c,0x48,0xc2,0xc8,0x01]
741 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
742 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
743 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
744 ; AVX512-NEXT:    retq ## encoding: [0xc3]
746 ; SKX-LABEL: test34_commute:
747 ; SKX:       ## %bb.0:
748 ; SKX-NEXT:    vcmpgtps (%rdi), %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x08,0xc2,0x0f,0x0e]
749 ; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
750 ; SKX-NEXT:    retq ## encoding: [0xc3]
751   %y = load <4 x float>, <4 x float>* %yp, align 4
752   %mask = fcmp olt <4 x float> %y, %x
753   %max = select <4 x i1> %mask, <4 x float> %x, <4 x float> %x1
754   ret <4 x float> %max
757 define <8 x float> @test35(<8 x float> %x, <8 x float> %x1, <8 x float>* %yp) nounwind {
758 ; AVX512-LABEL: test35:
759 ; AVX512:       ## %bb.0:
760 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
761 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
762 ; AVX512-NEXT:    vmovups (%rdi), %ymm2 ## encoding: [0xc5,0xfc,0x10,0x17]
763 ; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
764 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
765 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
766 ; AVX512-NEXT:    retq ## encoding: [0xc3]
768 ; SKX-LABEL: test35:
769 ; SKX:       ## %bb.0:
770 ; SKX-NEXT:    vcmpltps (%rdi), %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x28,0xc2,0x0f,0x01]
771 ; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
772 ; SKX-NEXT:    retq ## encoding: [0xc3]
774   %y = load <8 x float>, <8 x float>* %yp, align 4
775   %mask = fcmp ogt <8 x float> %y, %x
776   %max = select <8 x i1> %mask, <8 x float> %x, <8 x float> %x1
777   ret <8 x float> %max
780 define <8 x float> @test35_commute(<8 x float> %x, <8 x float> %x1, <8 x float>* %yp) nounwind {
781 ; AVX512-LABEL: test35_commute:
782 ; AVX512:       ## %bb.0:
783 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
784 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
785 ; AVX512-NEXT:    vmovups (%rdi), %ymm2 ## encoding: [0xc5,0xfc,0x10,0x17]
786 ; AVX512-NEXT:    vcmpltps %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6c,0x48,0xc2,0xc8,0x01]
787 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
788 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
789 ; AVX512-NEXT:    retq ## encoding: [0xc3]
791 ; SKX-LABEL: test35_commute:
792 ; SKX:       ## %bb.0:
793 ; SKX-NEXT:    vcmpgtps (%rdi), %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x28,0xc2,0x0f,0x0e]
794 ; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
795 ; SKX-NEXT:    retq ## encoding: [0xc3]
797   %y = load <8 x float>, <8 x float>* %yp, align 4
798   %mask = fcmp ogt <8 x float> %x, %y
799   %max = select <8 x i1> %mask, <8 x float> %x, <8 x float> %x1
800   ret <8 x float> %max
803 define <16 x float> @test36(<16 x float> %x, <16 x float> %x1, <16 x float>* %yp) nounwind {
804 ; CHECK-LABEL: test36:
805 ; CHECK:       ## %bb.0:
806 ; CHECK-NEXT:    vcmpltps (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0x0f,0x01]
807 ; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
808 ; CHECK-NEXT:    retq ## encoding: [0xc3]
809   %y = load <16 x float>, <16 x float>* %yp, align 4
810   %mask = fcmp olt <16 x float> %x, %y
811   %max = select <16 x i1> %mask, <16 x float> %x, <16 x float> %x1
812   ret <16 x float> %max
815 define <16 x float> @test36_commute(<16 x float> %x, <16 x float> %x1, <16 x float>* %yp) nounwind {
816 ; CHECK-LABEL: test36_commute:
817 ; CHECK:       ## %bb.0:
818 ; CHECK-NEXT:    vcmpgtps (%rdi), %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0x0f,0x0e]
819 ; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
820 ; CHECK-NEXT:    retq ## encoding: [0xc3]
821   %y = load <16 x float>, <16 x float>* %yp, align 4
822   %mask = fcmp olt <16 x float> %y, %x
823   %max = select <16 x i1> %mask, <16 x float> %x, <16 x float> %x1
824   ret <16 x float> %max
827 define <8 x double> @test37(<8 x double> %x, <8 x double> %x1, double* %ptr) nounwind {
828 ; CHECK-LABEL: test37:
829 ; CHECK:       ## %bb.0:
830 ; CHECK-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x58,0xc2,0x0f,0x01]
831 ; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
832 ; CHECK-NEXT:    retq ## encoding: [0xc3]
834   %a = load double, double* %ptr
835   %v = insertelement <8 x double> undef, double %a, i32 0
836   %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
838   %mask = fcmp ogt <8 x double> %shuffle, %x
839   %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
840   ret <8 x double> %max
843 define <8 x double> @test37_commute(<8 x double> %x, <8 x double> %x1, double* %ptr) nounwind {
844 ; CHECK-LABEL: test37_commute:
845 ; CHECK:       ## %bb.0:
846 ; CHECK-NEXT:    vcmpgtpd (%rdi){1to8}, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x58,0xc2,0x0f,0x0e]
847 ; CHECK-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
848 ; CHECK-NEXT:    retq ## encoding: [0xc3]
850   %a = load double, double* %ptr
851   %v = insertelement <8 x double> undef, double %a, i32 0
852   %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
854   %mask = fcmp ogt <8 x double> %x, %shuffle
855   %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
856   ret <8 x double> %max
859 define <4 x double> @test38(<4 x double> %x, <4 x double> %x1, double* %ptr) nounwind {
860 ; AVX512-LABEL: test38:
861 ; AVX512:       ## %bb.0:
862 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
863 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
864 ; AVX512-NEXT:    vbroadcastsd (%rdi), %ymm2 ## encoding: [0xc4,0xe2,0x7d,0x19,0x17]
865 ; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
866 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
867 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
868 ; AVX512-NEXT:    retq ## encoding: [0xc3]
870 ; SKX-LABEL: test38:
871 ; SKX:       ## %bb.0:
872 ; SKX-NEXT:    vcmpltpd (%rdi){1to4}, %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x38,0xc2,0x0f,0x01]
873 ; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
874 ; SKX-NEXT:    retq ## encoding: [0xc3]
876   %a = load double, double* %ptr
877   %v = insertelement <4 x double> undef, double %a, i32 0
878   %shuffle = shufflevector <4 x double> %v, <4 x double> undef, <4 x i32> zeroinitializer
880   %mask = fcmp ogt <4 x double> %shuffle, %x
881   %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
882   ret <4 x double> %max
885 define <4 x double> @test38_commute(<4 x double> %x, <4 x double> %x1, double* %ptr) nounwind {
886 ; AVX512-LABEL: test38_commute:
887 ; AVX512:       ## %bb.0:
888 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
889 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
890 ; AVX512-NEXT:    vbroadcastsd (%rdi), %ymm2 ## encoding: [0xc4,0xe2,0x7d,0x19,0x17]
891 ; AVX512-NEXT:    vcmpltpd %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0xed,0x48,0xc2,0xc8,0x01]
892 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
893 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
894 ; AVX512-NEXT:    retq ## encoding: [0xc3]
896 ; SKX-LABEL: test38_commute:
897 ; SKX:       ## %bb.0:
898 ; SKX-NEXT:    vcmpgtpd (%rdi){1to4}, %ymm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x38,0xc2,0x0f,0x0e]
899 ; SKX-NEXT:    vblendmpd %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x29,0x65,0xc0]
900 ; SKX-NEXT:    retq ## encoding: [0xc3]
902   %a = load double, double* %ptr
903   %v = insertelement <4 x double> undef, double %a, i32 0
904   %shuffle = shufflevector <4 x double> %v, <4 x double> undef, <4 x i32> zeroinitializer
906   %mask = fcmp ogt <4 x double> %x, %shuffle
907   %max = select <4 x i1> %mask, <4 x double> %x, <4 x double> %x1
908   ret <4 x double> %max
911 define <2 x double> @test39(<2 x double> %x, <2 x double> %x1, double* %ptr) nounwind {
912 ; AVX512-LABEL: test39:
913 ; AVX512:       ## %bb.0:
914 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
915 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
916 ; AVX512-NEXT:    vmovddup (%rdi), %xmm2 ## encoding: [0xc5,0xfb,0x12,0x17]
917 ; AVX512-NEXT:    ## xmm2 = mem[0,0]
918 ; AVX512-NEXT:    vcmpltpd %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x48,0xc2,0xca,0x01]
919 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
920 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
921 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
922 ; AVX512-NEXT:    retq ## encoding: [0xc3]
924 ; SKX-LABEL: test39:
925 ; SKX:       ## %bb.0:
926 ; SKX-NEXT:    vcmpltpd (%rdi){1to2}, %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x18,0xc2,0x0f,0x01]
927 ; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
928 ; SKX-NEXT:    retq ## encoding: [0xc3]
930   %a = load double, double* %ptr
931   %v = insertelement <2 x double> undef, double %a, i32 0
932   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
934   %mask = fcmp ogt <2 x double> %shuffle, %x
935   %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
936   ret <2 x double> %max
939 define <2 x double> @test39_commute(<2 x double> %x, <2 x double> %x1, double* %ptr) nounwind {
940 ; AVX512-LABEL: test39_commute:
941 ; AVX512:       ## %bb.0:
942 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
943 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
944 ; AVX512-NEXT:    vmovddup (%rdi), %xmm2 ## encoding: [0xc5,0xfb,0x12,0x17]
945 ; AVX512-NEXT:    ## xmm2 = mem[0,0]
946 ; AVX512-NEXT:    vcmpltpd %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0xed,0x48,0xc2,0xc8,0x01]
947 ; AVX512-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
948 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
949 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
950 ; AVX512-NEXT:    retq ## encoding: [0xc3]
952 ; SKX-LABEL: test39_commute:
953 ; SKX:       ## %bb.0:
954 ; SKX-NEXT:    vcmpgtpd (%rdi){1to2}, %xmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x18,0xc2,0x0f,0x0e]
955 ; SKX-NEXT:    vblendmpd %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x09,0x65,0xc0]
956 ; SKX-NEXT:    retq ## encoding: [0xc3]
958   %a = load double, double* %ptr
959   %v = insertelement <2 x double> undef, double %a, i32 0
960   %shuffle = shufflevector <2 x double> %v, <2 x double> undef, <2 x i32> <i32 0, i32 0>
962   %mask = fcmp ogt <2 x double> %x, %shuffle
963   %max = select <2 x i1> %mask, <2 x double> %x, <2 x double> %x1
964   ret <2 x double> %max
968 define <16  x float> @test40(<16  x float> %x, <16  x float> %x1, float* %ptr) nounwind {
969 ; CHECK-LABEL: test40:
970 ; CHECK:       ## %bb.0:
971 ; CHECK-NEXT:    vcmpltps (%rdi){1to16}, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x58,0xc2,0x0f,0x01]
972 ; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
973 ; CHECK-NEXT:    retq ## encoding: [0xc3]
975   %a = load float, float* %ptr
976   %v = insertelement <16  x float> undef, float %a, i32 0
977   %shuffle = shufflevector <16  x float> %v, <16  x float> undef, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
979   %mask = fcmp ogt <16  x float> %shuffle, %x
980   %max = select <16 x i1> %mask, <16  x float> %x, <16  x float> %x1
981   ret <16  x float> %max
984 define <16  x float> @test40_commute(<16  x float> %x, <16  x float> %x1, float* %ptr) nounwind {
985 ; CHECK-LABEL: test40_commute:
986 ; CHECK:       ## %bb.0:
987 ; CHECK-NEXT:    vcmpgtps (%rdi){1to16}, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x58,0xc2,0x0f,0x0e]
988 ; CHECK-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
989 ; CHECK-NEXT:    retq ## encoding: [0xc3]
991   %a = load float, float* %ptr
992   %v = insertelement <16  x float> undef, float %a, i32 0
993   %shuffle = shufflevector <16  x float> %v, <16  x float> undef, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
995   %mask = fcmp ogt <16  x float> %x, %shuffle
996   %max = select <16 x i1> %mask, <16  x float> %x, <16  x float> %x1
997   ret <16  x float> %max
1000 define <8  x float> @test41(<8  x float> %x, <8  x float> %x1, float* %ptr) nounwind {
1001 ; AVX512-LABEL: test41:
1002 ; AVX512:       ## %bb.0:
1003 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
1004 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
1005 ; AVX512-NEXT:    vbroadcastss (%rdi), %ymm2 ## encoding: [0xc4,0xe2,0x7d,0x18,0x17]
1006 ; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
1007 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
1008 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1009 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1011 ; SKX-LABEL: test41:
1012 ; SKX:       ## %bb.0:
1013 ; SKX-NEXT:    vcmpltps (%rdi){1to8}, %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x38,0xc2,0x0f,0x01]
1014 ; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
1015 ; SKX-NEXT:    retq ## encoding: [0xc3]
1017   %a = load float, float* %ptr
1018   %v = insertelement <8  x float> undef, float %a, i32 0
1019   %shuffle = shufflevector <8  x float> %v, <8  x float> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
1021   %mask = fcmp ogt <8  x float> %shuffle, %x
1022   %max = select <8 x i1> %mask, <8  x float> %x, <8  x float> %x1
1023   ret <8  x float> %max
1026 define <8  x float> @test41_commute(<8  x float> %x, <8  x float> %x1, float* %ptr) nounwind {
1027 ; AVX512-LABEL: test41_commute:
1028 ; AVX512:       ## %bb.0:
1029 ; AVX512-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
1030 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
1031 ; AVX512-NEXT:    vbroadcastss (%rdi), %ymm2 ## encoding: [0xc4,0xe2,0x7d,0x18,0x17]
1032 ; AVX512-NEXT:    vcmpltps %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6c,0x48,0xc2,0xc8,0x01]
1033 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
1034 ; AVX512-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1035 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1037 ; SKX-LABEL: test41_commute:
1038 ; SKX:       ## %bb.0:
1039 ; SKX-NEXT:    vcmpgtps (%rdi){1to8}, %ymm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x38,0xc2,0x0f,0x0e]
1040 ; SKX-NEXT:    vblendmps %ymm0, %ymm1, %ymm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x29,0x65,0xc0]
1041 ; SKX-NEXT:    retq ## encoding: [0xc3]
1043   %a = load float, float* %ptr
1044   %v = insertelement <8  x float> undef, float %a, i32 0
1045   %shuffle = shufflevector <8  x float> %v, <8  x float> undef, <8 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0>
1047   %mask = fcmp ogt <8  x float> %x, %shuffle
1048   %max = select <8 x i1> %mask, <8  x float> %x, <8  x float> %x1
1049   ret <8  x float> %max
1052 define <4  x float> @test42(<4  x float> %x, <4  x float> %x1, float* %ptr) nounwind {
1053 ; AVX512-LABEL: test42:
1054 ; AVX512:       ## %bb.0:
1055 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1056 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
1057 ; AVX512-NEXT:    vbroadcastss (%rdi), %xmm2 ## encoding: [0xc4,0xe2,0x79,0x18,0x17]
1058 ; AVX512-NEXT:    vcmpltps %zmm2, %zmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x48,0xc2,0xca,0x01]
1059 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
1060 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1061 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1062 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1064 ; SKX-LABEL: test42:
1065 ; SKX:       ## %bb.0:
1066 ; SKX-NEXT:    vcmpltps (%rdi){1to4}, %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x18,0xc2,0x0f,0x01]
1067 ; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
1068 ; SKX-NEXT:    retq ## encoding: [0xc3]
1070   %a = load float, float* %ptr
1071   %v = insertelement <4  x float> undef, float %a, i32 0
1072   %shuffle = shufflevector <4  x float> %v, <4  x float> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1074   %mask = fcmp ogt <4  x float> %shuffle, %x
1075   %max = select <4 x i1> %mask, <4  x float> %x, <4  x float> %x1
1076   ret <4  x float> %max
1079 define <4  x float> @test42_commute(<4  x float> %x, <4  x float> %x1, float* %ptr) nounwind {
1080 ; AVX512-LABEL: test42_commute:
1081 ; AVX512:       ## %bb.0:
1082 ; AVX512-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1083 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
1084 ; AVX512-NEXT:    vbroadcastss (%rdi), %xmm2 ## encoding: [0xc4,0xe2,0x79,0x18,0x17]
1085 ; AVX512-NEXT:    vcmpltps %zmm0, %zmm2, %k1 ## encoding: [0x62,0xf1,0x6c,0x48,0xc2,0xc8,0x01]
1086 ; AVX512-NEXT:    vblendmps %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x49,0x65,0xc0]
1087 ; AVX512-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1088 ; AVX512-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1089 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1091 ; SKX-LABEL: test42_commute:
1092 ; SKX:       ## %bb.0:
1093 ; SKX-NEXT:    vcmpgtps (%rdi){1to4}, %xmm0, %k1 ## encoding: [0x62,0xf1,0x7c,0x18,0xc2,0x0f,0x0e]
1094 ; SKX-NEXT:    vblendmps %xmm0, %xmm1, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x75,0x09,0x65,0xc0]
1095 ; SKX-NEXT:    retq ## encoding: [0xc3]
1097   %a = load float, float* %ptr
1098   %v = insertelement <4  x float> undef, float %a, i32 0
1099   %shuffle = shufflevector <4  x float> %v, <4  x float> undef, <4 x i32> <i32 0, i32 0, i32 0, i32 0>
1101   %mask = fcmp ogt <4  x float> %x, %shuffle
1102   %max = select <4 x i1> %mask, <4  x float> %x, <4  x float> %x1
1103   ret <4  x float> %max
1106 define <8 x double> @test43(<8 x double> %x, <8 x double> %x1, double* %ptr,<8 x i1> %mask_in) nounwind {
1107 ; KNL-LABEL: test43:
1108 ; KNL:       ## %bb.0:
1109 ; KNL-NEXT:    vpmovsxwq %xmm2, %zmm2 ## encoding: [0x62,0xf2,0x7d,0x48,0x24,0xd2]
1110 ; KNL-NEXT:    vpsllq $63, %zmm2, %zmm2 ## encoding: [0x62,0xf1,0xed,0x48,0x73,0xf2,0x3f]
1111 ; KNL-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x58,0xc2,0x0f,0x01]
1112 ; KNL-NEXT:    vptestmq %zmm2, %zmm2, %k1 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x27,0xca]
1113 ; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
1114 ; KNL-NEXT:    retq ## encoding: [0xc3]
1116 ; AVX512BW-LABEL: test43:
1117 ; AVX512BW:       ## %bb.0:
1118 ; AVX512BW-NEXT:    vpsllw $15, %xmm2, %xmm2 ## encoding: [0xc5,0xe9,0x71,0xf2,0x0f]
1119 ; AVX512BW-NEXT:    vpmovw2m %zmm2, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x29,0xca]
1120 ; AVX512BW-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xc2,0x0f,0x01]
1121 ; AVX512BW-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
1122 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1124 ; SKX-LABEL: test43:
1125 ; SKX:       ## %bb.0:
1126 ; SKX-NEXT:    vpsllw $15, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe9,0x71,0xf2,0x0f]
1127 ; SKX-NEXT:    vpmovw2m %xmm2, %k1 ## encoding: [0x62,0xf2,0xfe,0x08,0x29,0xca]
1128 ; SKX-NEXT:    vcmpltpd (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xc2,0x0f,0x01]
1129 ; SKX-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
1130 ; SKX-NEXT:    retq ## encoding: [0xc3]
1132   %a = load double, double* %ptr
1133   %v = insertelement <8 x double> undef, double %a, i32 0
1134   %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
1136   %mask_cmp = fcmp ogt <8 x double> %shuffle, %x
1137   %mask = and <8 x i1> %mask_cmp, %mask_in
1138   %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
1139   ret <8 x double> %max
1142 define <8 x double> @test43_commute(<8 x double> %x, <8 x double> %x1, double* %ptr,<8 x i1> %mask_in) nounwind {
1143 ; KNL-LABEL: test43_commute:
1144 ; KNL:       ## %bb.0:
1145 ; KNL-NEXT:    vpmovsxwq %xmm2, %zmm2 ## encoding: [0x62,0xf2,0x7d,0x48,0x24,0xd2]
1146 ; KNL-NEXT:    vpsllq $63, %zmm2, %zmm2 ## encoding: [0x62,0xf1,0xed,0x48,0x73,0xf2,0x3f]
1147 ; KNL-NEXT:    vcmpgtpd (%rdi){1to8}, %zmm0, %k1 ## encoding: [0x62,0xf1,0xfd,0x58,0xc2,0x0f,0x0e]
1148 ; KNL-NEXT:    vptestmq %zmm2, %zmm2, %k1 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x27,0xca]
1149 ; KNL-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
1150 ; KNL-NEXT:    retq ## encoding: [0xc3]
1152 ; AVX512BW-LABEL: test43_commute:
1153 ; AVX512BW:       ## %bb.0:
1154 ; AVX512BW-NEXT:    vpsllw $15, %xmm2, %xmm2 ## encoding: [0xc5,0xe9,0x71,0xf2,0x0f]
1155 ; AVX512BW-NEXT:    vpmovw2m %zmm2, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x29,0xca]
1156 ; AVX512BW-NEXT:    vcmpgtpd (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xc2,0x0f,0x0e]
1157 ; AVX512BW-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
1158 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1160 ; SKX-LABEL: test43_commute:
1161 ; SKX:       ## %bb.0:
1162 ; SKX-NEXT:    vpsllw $15, %xmm2, %xmm2 ## EVEX TO VEX Compression encoding: [0xc5,0xe9,0x71,0xf2,0x0f]
1163 ; SKX-NEXT:    vpmovw2m %xmm2, %k1 ## encoding: [0x62,0xf2,0xfe,0x08,0x29,0xca]
1164 ; SKX-NEXT:    vcmpgtpd (%rdi){1to8}, %zmm0, %k1 {%k1} ## encoding: [0x62,0xf1,0xfd,0x59,0xc2,0x0f,0x0e]
1165 ; SKX-NEXT:    vblendmpd %zmm0, %zmm1, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xf5,0x49,0x65,0xc0]
1166 ; SKX-NEXT:    retq ## encoding: [0xc3]
1168   %a = load double, double* %ptr
1169   %v = insertelement <8 x double> undef, double %a, i32 0
1170   %shuffle = shufflevector <8 x double> %v, <8 x double> undef, <8 x i32> zeroinitializer
1172   %mask_cmp = fcmp ogt <8 x double> %x, %shuffle
1173   %mask = and <8 x i1> %mask_cmp, %mask_in
1174   %max = select <8 x i1> %mask, <8 x double> %x, <8 x double> %x1
1175   ret <8 x double> %max
1178 define <4 x i32> @test44(<4 x i16> %x, <4 x i16> %y) #0 {
1179 ; AVX512-LABEL: test44:
1180 ; AVX512:       ## %bb.0:
1181 ; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xf9,0x75,0xc1]
1182 ; AVX512-NEXT:    vpmovsxwd %xmm0, %xmm0 ## encoding: [0xc4,0xe2,0x79,0x23,0xc0]
1183 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1185 ; SKX-LABEL: test44:
1186 ; SKX:       ## %bb.0:
1187 ; SKX-NEXT:    vpcmpeqw %xmm1, %xmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x08,0x75,0xc1]
1188 ; SKX-NEXT:    vpmovm2d %k0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x08,0x38,0xc0]
1189 ; SKX-NEXT:    retq ## encoding: [0xc3]
1190   %mask = icmp eq <4 x i16> %x, %y
1191   %1 = sext <4 x i1> %mask to <4 x i32>
1192   ret <4 x i32> %1
1195 define <2 x i64> @test45(<2 x i16> %x, <2 x i16> %y) #0 {
1196 ; AVX512-LABEL: test45:
1197 ; AVX512:       ## %bb.0:
1198 ; AVX512-NEXT:    vpcmpeqw %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xf9,0x75,0xc1]
1199 ; AVX512-NEXT:    vpmovzxwq %xmm0, %xmm0 ## encoding: [0xc4,0xe2,0x79,0x34,0xc0]
1200 ; AVX512-NEXT:    ## xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1201 ; AVX512-NEXT:    vpand {{.*}}(%rip), %xmm0, %xmm0 ## encoding: [0xc5,0xf9,0xdb,0x05,A,A,A,A]
1202 ; AVX512-NEXT:    ## fixup A - offset: 4, value: LCPI59_0-4, kind: reloc_riprel_4byte
1203 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1205 ; SKX-LABEL: test45:
1206 ; SKX:       ## %bb.0:
1207 ; SKX-NEXT:    vpcmpeqw %xmm1, %xmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x08,0x75,0xc1]
1208 ; SKX-NEXT:    vpmovm2q %k0, %xmm0 ## encoding: [0x62,0xf2,0xfe,0x08,0x38,0xc0]
1209 ; SKX-NEXT:    vpsrlq $63, %xmm0, %xmm0 ## EVEX TO VEX Compression encoding: [0xc5,0xf9,0x73,0xd0,0x3f]
1210 ; SKX-NEXT:    retq ## encoding: [0xc3]
1211   %mask = icmp eq <2 x i16> %x, %y
1212   %1 = zext <2 x i1> %mask to <2 x i64>
1213   ret <2 x i64> %1
1216 define <2 x i64> @test46(<2 x float> %x, <2 x float> %y) #0 {
1217 ; AVX512-LABEL: test46:
1218 ; AVX512:       ## %bb.0:
1219 ; AVX512-NEXT:    vcmpeqps %xmm1, %xmm0, %xmm0 ## encoding: [0xc5,0xf8,0xc2,0xc1,0x00]
1220 ; AVX512-NEXT:    vpermilps $212, %xmm0, %xmm0 ## encoding: [0xc4,0xe3,0x79,0x04,0xc0,0xd4]
1221 ; AVX512-NEXT:    ## xmm0 = xmm0[0,1,1,3]
1222 ; AVX512-NEXT:    vandps {{.*}}(%rip), %xmm0, %xmm0 ## encoding: [0xc5,0xf8,0x54,0x05,A,A,A,A]
1223 ; AVX512-NEXT:    ## fixup A - offset: 4, value: LCPI60_0-4, kind: reloc_riprel_4byte
1224 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1226 ; SKX-LABEL: test46:
1227 ; SKX:       ## %bb.0:
1228 ; SKX-NEXT:    vcmpeqps %xmm1, %xmm0, %k0 ## encoding: [0x62,0xf1,0x7c,0x08,0xc2,0xc1,0x00]
1229 ; SKX-NEXT:    vpmovm2q %k0, %xmm0 ## encoding: [0x62,0xf2,0xfe,0x08,0x38,0xc0]
1230 ; SKX-NEXT:    vpsrlq $63, %xmm0, %xmm0 ## EVEX TO VEX Compression encoding: [0xc5,0xf9,0x73,0xd0,0x3f]
1231 ; SKX-NEXT:    retq ## encoding: [0xc3]
1232   %mask = fcmp oeq <2 x float> %x, %y
1233   %1 = zext <2 x i1> %mask to <2 x i64>
1234   ret <2 x i64> %1
1237 define <16 x i8> @test47(<16 x i32> %a, <16 x i8> %b, <16 x i8> %c) {
1238 ; KNL-LABEL: test47:
1239 ; KNL:       ## %bb.0:
1240 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1241 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1242 ; KNL-NEXT:    vpmovdb %zmm0, %xmm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x31,0xc0]
1243 ; KNL-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x4c,0xc1,0x00]
1244 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1245 ; KNL-NEXT:    retq ## encoding: [0xc3]
1247 ; AVX512BW-LABEL: test47:
1248 ; AVX512BW:       ## %bb.0:
1249 ; AVX512BW-NEXT:    ## kill: def $xmm2 killed $xmm2 def $zmm2
1250 ; AVX512BW-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1251 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1252 ; AVX512BW-NEXT:    vpblendmb %zmm1, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0x6d,0x49,0x66,0xc1]
1253 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1254 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1255 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1257 ; SKX-LABEL: test47:
1258 ; SKX:       ## %bb.0:
1259 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1260 ; SKX-NEXT:    vpblendmb %xmm1, %xmm2, %xmm0 {%k1} ## encoding: [0x62,0xf2,0x6d,0x09,0x66,0xc1]
1261 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1262 ; SKX-NEXT:    retq ## encoding: [0xc3]
1263   %cmp = icmp eq <16 x i32> %a, zeroinitializer
1264   %res = select <16 x i1> %cmp, <16 x i8> %b, <16 x i8> %c
1265   ret <16 x i8> %res
1268 define <16 x i16> @test48(<16 x i32> %a, <16 x i16> %b, <16 x i16> %c) {
1269 ; KNL-LABEL: test48:
1270 ; KNL:       ## %bb.0:
1271 ; KNL-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1272 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1273 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x33,0xc0]
1274 ; KNL-NEXT:    vpblendvb %ymm0, %ymm1, %ymm2, %ymm0 ## encoding: [0xc4,0xe3,0x6d,0x4c,0xc1,0x00]
1275 ; KNL-NEXT:    retq ## encoding: [0xc3]
1277 ; AVX512BW-LABEL: test48:
1278 ; AVX512BW:       ## %bb.0:
1279 ; AVX512BW-NEXT:    ## kill: def $ymm2 killed $ymm2 def $zmm2
1280 ; AVX512BW-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
1281 ; AVX512BW-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1282 ; AVX512BW-NEXT:    vpblendmw %zmm1, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x66,0xc1]
1283 ; AVX512BW-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1284 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1286 ; SKX-LABEL: test48:
1287 ; SKX:       ## %bb.0:
1288 ; SKX-NEXT:    vptestnmd %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0x7e,0x48,0x27,0xc8]
1289 ; SKX-NEXT:    vpblendmw %ymm1, %ymm2, %ymm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x29,0x66,0xc1]
1290 ; SKX-NEXT:    retq ## encoding: [0xc3]
1291   %cmp = icmp eq <16 x i32> %a, zeroinitializer
1292   %res = select <16 x i1> %cmp, <16 x i16> %b, <16 x i16> %c
1293   ret <16 x i16> %res
1296 define <8 x i16> @test49(<8 x i64> %a, <8 x i16> %b, <8 x i16> %c) {
1297 ; KNL-LABEL: test49:
1298 ; KNL:       ## %bb.0:
1299 ; KNL-NEXT:    vptestnmq %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x27,0xc8]
1300 ; KNL-NEXT:    vpternlogd $255, %zmm0, %zmm0, %zmm0 {%k1} {z} ## encoding: [0x62,0xf3,0x7d,0xc9,0x25,0xc0,0xff]
1301 ; KNL-NEXT:    vpmovdw %zmm0, %ymm0 ## encoding: [0x62,0xf2,0x7e,0x48,0x33,0xc0]
1302 ; KNL-NEXT:    vpblendvb %xmm0, %xmm1, %xmm2, %xmm0 ## encoding: [0xc4,0xe3,0x69,0x4c,0xc1,0x00]
1303 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1304 ; KNL-NEXT:    retq ## encoding: [0xc3]
1306 ; AVX512BW-LABEL: test49:
1307 ; AVX512BW:       ## %bb.0:
1308 ; AVX512BW-NEXT:    ## kill: def $xmm2 killed $xmm2 def $zmm2
1309 ; AVX512BW-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1310 ; AVX512BW-NEXT:    vptestnmq %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x27,0xc8]
1311 ; AVX512BW-NEXT:    vpblendmw %zmm1, %zmm2, %zmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x49,0x66,0xc1]
1312 ; AVX512BW-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1313 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1314 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1316 ; SKX-LABEL: test49:
1317 ; SKX:       ## %bb.0:
1318 ; SKX-NEXT:    vptestnmq %zmm0, %zmm0, %k1 ## encoding: [0x62,0xf2,0xfe,0x48,0x27,0xc8]
1319 ; SKX-NEXT:    vpblendmw %xmm1, %xmm2, %xmm0 {%k1} ## encoding: [0x62,0xf2,0xed,0x09,0x66,0xc1]
1320 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1321 ; SKX-NEXT:    retq ## encoding: [0xc3]
1322   %cmp = icmp eq <8 x i64> %a, zeroinitializer
1323   %res = select <8 x i1> %cmp, <8 x i16> %b, <8 x i16> %c
1324   ret <8 x i16> %res
1327 define i16 @pcmpeq_mem_1(<16 x i32> %a, <16 x i32>* %b) {
1328 ; KNL-LABEL: pcmpeq_mem_1:
1329 ; KNL:       ## %bb.0:
1330 ; KNL-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1331 ; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
1332 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
1333 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1334 ; KNL-NEXT:    retq ## encoding: [0xc3]
1336 ; AVX512BW-LABEL: pcmpeq_mem_1:
1337 ; AVX512BW:       ## %bb.0:
1338 ; AVX512BW-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1339 ; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1340 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
1341 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1342 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1344 ; SKX-LABEL: pcmpeq_mem_1:
1345 ; SKX:       ## %bb.0:
1346 ; SKX-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1347 ; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1348 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
1349 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1350 ; SKX-NEXT:    retq ## encoding: [0xc3]
1351   %load = load <16 x i32>, <16 x i32>* %b
1352   %cmp = icmp eq <16 x i32> %a, %load
1353   %cast = bitcast <16 x i1> %cmp to i16
1354   ret i16 %cast
1357 ; Make sure we use the short pcmpeq encoding like the test above when the memoryo
1358 ; operand is in the first argument instead of the second.
1359 define i16 @pcmpeq_mem_2(<16 x i32> %a, <16 x i32>* %b) {
1360 ; KNL-LABEL: pcmpeq_mem_2:
1361 ; KNL:       ## %bb.0:
1362 ; KNL-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1363 ; KNL-NEXT:    kmovw %k0, %eax ## encoding: [0xc5,0xf8,0x93,0xc0]
1364 ; KNL-NEXT:    ## kill: def $ax killed $ax killed $eax
1365 ; KNL-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1366 ; KNL-NEXT:    retq ## encoding: [0xc3]
1368 ; AVX512BW-LABEL: pcmpeq_mem_2:
1369 ; AVX512BW:       ## %bb.0:
1370 ; AVX512BW-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1371 ; AVX512BW-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1372 ; AVX512BW-NEXT:    ## kill: def $ax killed $ax killed $eax
1373 ; AVX512BW-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1374 ; AVX512BW-NEXT:    retq ## encoding: [0xc3]
1376 ; SKX-LABEL: pcmpeq_mem_2:
1377 ; SKX:       ## %bb.0:
1378 ; SKX-NEXT:    vpcmpeqd (%rdi), %zmm0, %k0 ## encoding: [0x62,0xf1,0x7d,0x48,0x76,0x07]
1379 ; SKX-NEXT:    kmovd %k0, %eax ## encoding: [0xc5,0xfb,0x93,0xc0]
1380 ; SKX-NEXT:    ## kill: def $ax killed $ax killed $eax
1381 ; SKX-NEXT:    vzeroupper ## encoding: [0xc5,0xf8,0x77]
1382 ; SKX-NEXT:    retq ## encoding: [0xc3]
1383   %load = load <16 x i32>, <16 x i32>* %b
1384   %cmp = icmp eq <16 x i32> %load, %a
1385   %cast = bitcast <16 x i1> %cmp to i16
1386   ret i16 %cast
1389 ; Don't let a degenerate case trigger an infinite loop.
1390 ; This should get simplified before it even exists as a vselect node,
1391 ; but that does not happen as of this change.
1393 define <2 x i64> @PR41066(<2 x i64> %t0, <2 x double> %x, <2 x double> %y) {
1394 ; AVX512-LABEL: PR41066:
1395 ; AVX512:       ## %bb.0:
1396 ; AVX512-NEXT:    vxorps %xmm0, %xmm0, %xmm0 ## encoding: [0xc5,0xf8,0x57,0xc0]
1397 ; AVX512-NEXT:    retq ## encoding: [0xc3]
1399 ; SKX-LABEL: PR41066:
1400 ; SKX:       ## %bb.0:
1401 ; SKX-NEXT:    vxorps %xmm0, %xmm0, %xmm0 ## EVEX TO VEX Compression encoding: [0xc5,0xf8,0x57,0xc0]
1402 ; SKX-NEXT:    retq ## encoding: [0xc3]
1403   %t1 = fcmp ogt <2 x double> %x, %y
1404   %t2 = select <2 x i1> %t1, <2 x i64> <i64 undef, i64 0>, <2 x i64> zeroinitializer
1405   ret <2 x i64> %t2