Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / CodeGen / X86 / masked_load.ll
blob8d28f45d98865d20f248e6b817269f87f4e92787
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=sse2    | FileCheck %s --check-prefixes=SSE,SSE2
3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=sse4.2  | FileCheck %s --check-prefixes=SSE,SSE42
4 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx     | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX1
5 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx2    | FileCheck %s --check-prefixes=AVX,AVX1OR2,AVX2
6 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512f | FileCheck %s --check-prefixes=AVX,AVX512,AVX512F
7 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=avx512f,avx512bw,avx512vl | FileCheck %s --check-prefixes=AVX,AVX512,AVX512VLBW
9 define <1 x double> @load_v1f64_v1i64(<1 x i64> %trigger, <1 x double>* %addr, <1 x double> %dst) {
10 ; SSE-LABEL: load_v1f64_v1i64:
11 ; SSE:       ## %bb.0:
12 ; SSE-NEXT:    testq %rdi, %rdi
13 ; SSE-NEXT:    jne LBB0_2
14 ; SSE-NEXT:  ## %bb.1: ## %cond.load
15 ; SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
16 ; SSE-NEXT:  LBB0_2: ## %else
17 ; SSE-NEXT:    retq
19 ; AVX-LABEL: load_v1f64_v1i64:
20 ; AVX:       ## %bb.0:
21 ; AVX-NEXT:    testq %rdi, %rdi
22 ; AVX-NEXT:    jne LBB0_2
23 ; AVX-NEXT:  ## %bb.1: ## %cond.load
24 ; AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
25 ; AVX-NEXT:  LBB0_2: ## %else
26 ; AVX-NEXT:    retq
27   %mask = icmp eq <1 x i64> %trigger, zeroinitializer
28   %res = call <1 x double> @llvm.masked.load.v1f64.p0v1f64(<1 x double>* %addr, i32 4, <1 x i1>%mask, <1 x double>%dst)
29   ret <1 x double> %res
32 define <2 x double> @load_v2f64_v2i64(<2 x i64> %trigger, <2 x double>* %addr, <2 x double> %dst) {
33 ; SSE2-LABEL: load_v2f64_v2i64:
34 ; SSE2:       ## %bb.0:
35 ; SSE2-NEXT:    pxor %xmm2, %xmm2
36 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
37 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
38 ; SSE2-NEXT:    pand %xmm2, %xmm0
39 ; SSE2-NEXT:    movd %xmm0, %eax
40 ; SSE2-NEXT:    testb $1, %al
41 ; SSE2-NEXT:    je LBB1_2
42 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
43 ; SSE2-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
44 ; SSE2-NEXT:  LBB1_2: ## %else
45 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
46 ; SSE2-NEXT:    testb $1, %al
47 ; SSE2-NEXT:    je LBB1_4
48 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
49 ; SSE2-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
50 ; SSE2-NEXT:  LBB1_4: ## %else2
51 ; SSE2-NEXT:    movapd %xmm1, %xmm0
52 ; SSE2-NEXT:    retq
54 ; SSE42-LABEL: load_v2f64_v2i64:
55 ; SSE42:       ## %bb.0:
56 ; SSE42-NEXT:    pxor %xmm2, %xmm2
57 ; SSE42-NEXT:    pcmpeqq %xmm0, %xmm2
58 ; SSE42-NEXT:    pextrb $0, %xmm2, %eax
59 ; SSE42-NEXT:    testb $1, %al
60 ; SSE42-NEXT:    je LBB1_2
61 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
62 ; SSE42-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
63 ; SSE42-NEXT:  LBB1_2: ## %else
64 ; SSE42-NEXT:    pextrb $8, %xmm2, %eax
65 ; SSE42-NEXT:    testb $1, %al
66 ; SSE42-NEXT:    je LBB1_4
67 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
68 ; SSE42-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
69 ; SSE42-NEXT:  LBB1_4: ## %else2
70 ; SSE42-NEXT:    movapd %xmm1, %xmm0
71 ; SSE42-NEXT:    retq
73 ; AVX1OR2-LABEL: load_v2f64_v2i64:
74 ; AVX1OR2:       ## %bb.0:
75 ; AVX1OR2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
76 ; AVX1OR2-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
77 ; AVX1OR2-NEXT:    vmaskmovpd (%rdi), %xmm0, %xmm2
78 ; AVX1OR2-NEXT:    vblendvpd %xmm0, %xmm2, %xmm1, %xmm0
79 ; AVX1OR2-NEXT:    retq
81 ; AVX512F-LABEL: load_v2f64_v2i64:
82 ; AVX512F:       ## %bb.0:
83 ; AVX512F-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
84 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
85 ; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
86 ; AVX512F-NEXT:    kshiftlw $14, %k0, %k0
87 ; AVX512F-NEXT:    kshiftrw $14, %k0, %k1
88 ; AVX512F-NEXT:    vblendmpd (%rdi), %zmm1, %zmm0 {%k1}
89 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
90 ; AVX512F-NEXT:    vzeroupper
91 ; AVX512F-NEXT:    retq
93 ; AVX512VLBW-LABEL: load_v2f64_v2i64:
94 ; AVX512VLBW:       ## %bb.0:
95 ; AVX512VLBW-NEXT:    vptestnmq %xmm0, %xmm0, %k1
96 ; AVX512VLBW-NEXT:    vblendmpd (%rdi), %xmm1, %xmm0 {%k1}
97 ; AVX512VLBW-NEXT:    retq
98   %mask = icmp eq <2 x i64> %trigger, zeroinitializer
99   %res = call <2 x double> @llvm.masked.load.v2f64.p0v2f64(<2 x double>* %addr, i32 4, <2 x i1>%mask, <2 x double>%dst)
100   ret <2 x double> %res
103 define <4 x float> @load_v4f32_v4i32(<4 x i32> %trigger, <4 x float>* %addr, <4 x float> %dst) {
104 ; SSE2-LABEL: load_v4f32_v4i32:
105 ; SSE2:       ## %bb.0:
106 ; SSE2-NEXT:    pxor %xmm2, %xmm2
107 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
108 ; SSE2-NEXT:    movd %xmm2, %eax
109 ; SSE2-NEXT:    testb $1, %al
110 ; SSE2-NEXT:    je LBB2_2
111 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
112 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
113 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3]
114 ; SSE2-NEXT:  LBB2_2: ## %else
115 ; SSE2-NEXT:    pextrw $2, %xmm2, %eax
116 ; SSE2-NEXT:    testb $1, %al
117 ; SSE2-NEXT:    je LBB2_4
118 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
119 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
120 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[0,0]
121 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm1[2,3]
122 ; SSE2-NEXT:    movaps %xmm2, %xmm1
123 ; SSE2-NEXT:  LBB2_4: ## %else2
124 ; SSE2-NEXT:    xorps %xmm2, %xmm2
125 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
126 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
127 ; SSE2-NEXT:    testb $1, %al
128 ; SSE2-NEXT:    je LBB2_6
129 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
130 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
131 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[3,0]
132 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0,2]
133 ; SSE2-NEXT:  LBB2_6: ## %else5
134 ; SSE2-NEXT:    pextrw $6, %xmm0, %eax
135 ; SSE2-NEXT:    testb $1, %al
136 ; SSE2-NEXT:    je LBB2_8
137 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
138 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
139 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
140 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
141 ; SSE2-NEXT:  LBB2_8: ## %else8
142 ; SSE2-NEXT:    movaps %xmm1, %xmm0
143 ; SSE2-NEXT:    retq
145 ; SSE42-LABEL: load_v4f32_v4i32:
146 ; SSE42:       ## %bb.0:
147 ; SSE42-NEXT:    pxor %xmm2, %xmm2
148 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm2
149 ; SSE42-NEXT:    pextrb $0, %xmm2, %eax
150 ; SSE42-NEXT:    testb $1, %al
151 ; SSE42-NEXT:    je LBB2_2
152 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
153 ; SSE42-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
154 ; SSE42-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3]
155 ; SSE42-NEXT:  LBB2_2: ## %else
156 ; SSE42-NEXT:    pextrb $4, %xmm2, %eax
157 ; SSE42-NEXT:    testb $1, %al
158 ; SSE42-NEXT:    je LBB2_4
159 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
160 ; SSE42-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]
161 ; SSE42-NEXT:  LBB2_4: ## %else2
162 ; SSE42-NEXT:    pxor %xmm2, %xmm2
163 ; SSE42-NEXT:    pcmpeqd %xmm2, %xmm0
164 ; SSE42-NEXT:    pextrb $8, %xmm0, %eax
165 ; SSE42-NEXT:    testb $1, %al
166 ; SSE42-NEXT:    je LBB2_6
167 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
168 ; SSE42-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3]
169 ; SSE42-NEXT:  LBB2_6: ## %else5
170 ; SSE42-NEXT:    pextrb $12, %xmm0, %eax
171 ; SSE42-NEXT:    testb $1, %al
172 ; SSE42-NEXT:    je LBB2_8
173 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
174 ; SSE42-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1,2],mem[0]
175 ; SSE42-NEXT:  LBB2_8: ## %else8
176 ; SSE42-NEXT:    movaps %xmm1, %xmm0
177 ; SSE42-NEXT:    retq
179 ; AVX1OR2-LABEL: load_v4f32_v4i32:
180 ; AVX1OR2:       ## %bb.0:
181 ; AVX1OR2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
182 ; AVX1OR2-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
183 ; AVX1OR2-NEXT:    vmaskmovps (%rdi), %xmm0, %xmm2
184 ; AVX1OR2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
185 ; AVX1OR2-NEXT:    retq
187 ; AVX512F-LABEL: load_v4f32_v4i32:
188 ; AVX512F:       ## %bb.0:
189 ; AVX512F-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
190 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
191 ; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
192 ; AVX512F-NEXT:    kshiftlw $12, %k0, %k0
193 ; AVX512F-NEXT:    kshiftrw $12, %k0, %k1
194 ; AVX512F-NEXT:    vblendmps (%rdi), %zmm1, %zmm0 {%k1}
195 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
196 ; AVX512F-NEXT:    vzeroupper
197 ; AVX512F-NEXT:    retq
199 ; AVX512VLBW-LABEL: load_v4f32_v4i32:
200 ; AVX512VLBW:       ## %bb.0:
201 ; AVX512VLBW-NEXT:    vptestnmd %xmm0, %xmm0, %k1
202 ; AVX512VLBW-NEXT:    vblendmps (%rdi), %xmm1, %xmm0 {%k1}
203 ; AVX512VLBW-NEXT:    retq
204   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
205   %res = call <4 x float> @llvm.masked.load.v4f32.p0v4f32(<4 x float>* %addr, i32 4, <4 x i1>%mask, <4 x float>%dst)
206   ret <4 x float> %res
209 define <4 x i32> @load_v4i32_v4i32(<4 x i32> %trigger, <4 x i32>* %addr, <4 x i32> %dst) {
210 ; SSE2-LABEL: load_v4i32_v4i32:
211 ; SSE2:       ## %bb.0:
212 ; SSE2-NEXT:    pxor %xmm2, %xmm2
213 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
214 ; SSE2-NEXT:    movd %xmm2, %eax
215 ; SSE2-NEXT:    testb $1, %al
216 ; SSE2-NEXT:    je LBB3_2
217 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
218 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
219 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3]
220 ; SSE2-NEXT:  LBB3_2: ## %else
221 ; SSE2-NEXT:    pextrw $2, %xmm2, %eax
222 ; SSE2-NEXT:    testb $1, %al
223 ; SSE2-NEXT:    je LBB3_4
224 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
225 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
226 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[0,0]
227 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm1[2,3]
228 ; SSE2-NEXT:    movaps %xmm2, %xmm1
229 ; SSE2-NEXT:  LBB3_4: ## %else2
230 ; SSE2-NEXT:    xorps %xmm2, %xmm2
231 ; SSE2-NEXT:    pcmpeqd %xmm2, %xmm0
232 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
233 ; SSE2-NEXT:    testb $1, %al
234 ; SSE2-NEXT:    je LBB3_6
235 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
236 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
237 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[3,0]
238 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0,2]
239 ; SSE2-NEXT:  LBB3_6: ## %else5
240 ; SSE2-NEXT:    pextrw $6, %xmm0, %eax
241 ; SSE2-NEXT:    testb $1, %al
242 ; SSE2-NEXT:    je LBB3_8
243 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
244 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
245 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
246 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
247 ; SSE2-NEXT:  LBB3_8: ## %else8
248 ; SSE2-NEXT:    movaps %xmm1, %xmm0
249 ; SSE2-NEXT:    retq
251 ; SSE42-LABEL: load_v4i32_v4i32:
252 ; SSE42:       ## %bb.0:
253 ; SSE42-NEXT:    pxor %xmm2, %xmm2
254 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm2
255 ; SSE42-NEXT:    pextrb $0, %xmm2, %eax
256 ; SSE42-NEXT:    testb $1, %al
257 ; SSE42-NEXT:    je LBB3_2
258 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
259 ; SSE42-NEXT:    pinsrd $0, (%rdi), %xmm1
260 ; SSE42-NEXT:  LBB3_2: ## %else
261 ; SSE42-NEXT:    pextrb $4, %xmm2, %eax
262 ; SSE42-NEXT:    testb $1, %al
263 ; SSE42-NEXT:    je LBB3_4
264 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
265 ; SSE42-NEXT:    pinsrd $1, 4(%rdi), %xmm1
266 ; SSE42-NEXT:  LBB3_4: ## %else2
267 ; SSE42-NEXT:    pxor %xmm2, %xmm2
268 ; SSE42-NEXT:    pcmpeqd %xmm2, %xmm0
269 ; SSE42-NEXT:    pextrb $8, %xmm0, %eax
270 ; SSE42-NEXT:    testb $1, %al
271 ; SSE42-NEXT:    je LBB3_6
272 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
273 ; SSE42-NEXT:    pinsrd $2, 8(%rdi), %xmm1
274 ; SSE42-NEXT:  LBB3_6: ## %else5
275 ; SSE42-NEXT:    pextrb $12, %xmm0, %eax
276 ; SSE42-NEXT:    testb $1, %al
277 ; SSE42-NEXT:    je LBB3_8
278 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
279 ; SSE42-NEXT:    pinsrd $3, 12(%rdi), %xmm1
280 ; SSE42-NEXT:  LBB3_8: ## %else8
281 ; SSE42-NEXT:    movdqa %xmm1, %xmm0
282 ; SSE42-NEXT:    retq
284 ; AVX1-LABEL: load_v4i32_v4i32:
285 ; AVX1:       ## %bb.0:
286 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
287 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
288 ; AVX1-NEXT:    vmaskmovps (%rdi), %xmm0, %xmm2
289 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
290 ; AVX1-NEXT:    retq
292 ; AVX2-LABEL: load_v4i32_v4i32:
293 ; AVX2:       ## %bb.0:
294 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
295 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
296 ; AVX2-NEXT:    vpmaskmovd (%rdi), %xmm0, %xmm2
297 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
298 ; AVX2-NEXT:    retq
300 ; AVX512F-LABEL: load_v4i32_v4i32:
301 ; AVX512F:       ## %bb.0:
302 ; AVX512F-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
303 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
304 ; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
305 ; AVX512F-NEXT:    kshiftlw $12, %k0, %k0
306 ; AVX512F-NEXT:    kshiftrw $12, %k0, %k1
307 ; AVX512F-NEXT:    vpblendmd (%rdi), %zmm1, %zmm0 {%k1}
308 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
309 ; AVX512F-NEXT:    vzeroupper
310 ; AVX512F-NEXT:    retq
312 ; AVX512VLBW-LABEL: load_v4i32_v4i32:
313 ; AVX512VLBW:       ## %bb.0:
314 ; AVX512VLBW-NEXT:    vptestnmd %xmm0, %xmm0, %k1
315 ; AVX512VLBW-NEXT:    vpblendmd (%rdi), %xmm1, %xmm0 {%k1}
316 ; AVX512VLBW-NEXT:    retq
317   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
318   %res = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %addr, i32 4, <4 x i1>%mask, <4 x i32>%dst)
319   ret <4 x i32> %res
322 define <4 x double> @load_v4f64_v4i32(<4 x i32> %trigger, <4 x double>* %addr, <4 x double> %dst) {
323 ; SSE2-LABEL: load_v4f64_v4i32:
324 ; SSE2:       ## %bb.0:
325 ; SSE2-NEXT:    pxor %xmm3, %xmm3
326 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm3
327 ; SSE2-NEXT:    movd %xmm3, %eax
328 ; SSE2-NEXT:    testb $1, %al
329 ; SSE2-NEXT:    je LBB4_2
330 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
331 ; SSE2-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
332 ; SSE2-NEXT:  LBB4_2: ## %else
333 ; SSE2-NEXT:    pextrw $2, %xmm3, %eax
334 ; SSE2-NEXT:    testb $1, %al
335 ; SSE2-NEXT:    je LBB4_4
336 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
337 ; SSE2-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
338 ; SSE2-NEXT:  LBB4_4: ## %else2
339 ; SSE2-NEXT:    pxor %xmm3, %xmm3
340 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm0
341 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
342 ; SSE2-NEXT:    testb $1, %al
343 ; SSE2-NEXT:    je LBB4_6
344 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
345 ; SSE2-NEXT:    movlpd {{.*#+}} xmm2 = mem[0],xmm2[1]
346 ; SSE2-NEXT:  LBB4_6: ## %else5
347 ; SSE2-NEXT:    pextrw $6, %xmm0, %eax
348 ; SSE2-NEXT:    testb $1, %al
349 ; SSE2-NEXT:    je LBB4_8
350 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
351 ; SSE2-NEXT:    movhpd {{.*#+}} xmm2 = xmm2[0],mem[0]
352 ; SSE2-NEXT:  LBB4_8: ## %else8
353 ; SSE2-NEXT:    movapd %xmm1, %xmm0
354 ; SSE2-NEXT:    movapd %xmm2, %xmm1
355 ; SSE2-NEXT:    retq
357 ; SSE42-LABEL: load_v4f64_v4i32:
358 ; SSE42:       ## %bb.0:
359 ; SSE42-NEXT:    pxor %xmm3, %xmm3
360 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm3
361 ; SSE42-NEXT:    pextrb $0, %xmm3, %eax
362 ; SSE42-NEXT:    testb $1, %al
363 ; SSE42-NEXT:    je LBB4_2
364 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
365 ; SSE42-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
366 ; SSE42-NEXT:  LBB4_2: ## %else
367 ; SSE42-NEXT:    pextrb $4, %xmm3, %eax
368 ; SSE42-NEXT:    testb $1, %al
369 ; SSE42-NEXT:    je LBB4_4
370 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
371 ; SSE42-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
372 ; SSE42-NEXT:  LBB4_4: ## %else2
373 ; SSE42-NEXT:    pxor %xmm3, %xmm3
374 ; SSE42-NEXT:    pcmpeqd %xmm3, %xmm0
375 ; SSE42-NEXT:    pextrb $8, %xmm0, %eax
376 ; SSE42-NEXT:    testb $1, %al
377 ; SSE42-NEXT:    je LBB4_6
378 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
379 ; SSE42-NEXT:    movlpd {{.*#+}} xmm2 = mem[0],xmm2[1]
380 ; SSE42-NEXT:  LBB4_6: ## %else5
381 ; SSE42-NEXT:    pextrb $12, %xmm0, %eax
382 ; SSE42-NEXT:    testb $1, %al
383 ; SSE42-NEXT:    je LBB4_8
384 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
385 ; SSE42-NEXT:    movhpd {{.*#+}} xmm2 = xmm2[0],mem[0]
386 ; SSE42-NEXT:  LBB4_8: ## %else8
387 ; SSE42-NEXT:    movapd %xmm1, %xmm0
388 ; SSE42-NEXT:    movapd %xmm2, %xmm1
389 ; SSE42-NEXT:    retq
391 ; AVX1-LABEL: load_v4f64_v4i32:
392 ; AVX1:       ## %bb.0:
393 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
394 ; AVX1-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
395 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm2
396 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
397 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
398 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
399 ; AVX1-NEXT:    vmaskmovpd (%rdi), %ymm0, %ymm2
400 ; AVX1-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
401 ; AVX1-NEXT:    retq
403 ; AVX2-LABEL: load_v4f64_v4i32:
404 ; AVX2:       ## %bb.0:
405 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
406 ; AVX2-NEXT:    vpcmpeqd %xmm2, %xmm0, %xmm0
407 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
408 ; AVX2-NEXT:    vmaskmovpd (%rdi), %ymm0, %ymm2
409 ; AVX2-NEXT:    vblendvpd %ymm0, %ymm2, %ymm1, %ymm0
410 ; AVX2-NEXT:    retq
412 ; AVX512F-LABEL: load_v4f64_v4i32:
413 ; AVX512F:       ## %bb.0:
414 ; AVX512F-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
415 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
416 ; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
417 ; AVX512F-NEXT:    kshiftlw $12, %k0, %k0
418 ; AVX512F-NEXT:    kshiftrw $12, %k0, %k1
419 ; AVX512F-NEXT:    vblendmpd (%rdi), %zmm1, %zmm0 {%k1}
420 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
421 ; AVX512F-NEXT:    retq
423 ; AVX512VLBW-LABEL: load_v4f64_v4i32:
424 ; AVX512VLBW:       ## %bb.0:
425 ; AVX512VLBW-NEXT:    vptestnmd %xmm0, %xmm0, %k1
426 ; AVX512VLBW-NEXT:    vblendmpd (%rdi), %ymm1, %ymm0 {%k1}
427 ; AVX512VLBW-NEXT:    retq
428   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
429   %res = call <4 x double> @llvm.masked.load.v4f64.p0v4f64(<4 x double>* %addr, i32 32, <4 x i1>%mask, <4 x double>%dst)
430   ret <4 x double> %res
433 define <4 x double> @load_zero_v4f64_v4i32(<4 x i32> %trigger, <4 x double>* %addr, <4 x double> %dst) {
434 ; SSE2-LABEL: load_zero_v4f64_v4i32:
435 ; SSE2:       ## %bb.0:
436 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
437 ; SSE2-NEXT:    pxor %xmm0, %xmm0
438 ; SSE2-NEXT:    movdqa %xmm2, %xmm3
439 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm3
440 ; SSE2-NEXT:    movd %xmm3, %eax
441 ; SSE2-NEXT:    testb $1, %al
442 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
443 ; SSE2-NEXT:    je LBB5_2
444 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
445 ; SSE2-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
446 ; SSE2-NEXT:    xorpd %xmm1, %xmm1
447 ; SSE2-NEXT:  LBB5_2: ## %else
448 ; SSE2-NEXT:    pextrw $2, %xmm3, %eax
449 ; SSE2-NEXT:    testb $1, %al
450 ; SSE2-NEXT:    je LBB5_4
451 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
452 ; SSE2-NEXT:    movhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
453 ; SSE2-NEXT:  LBB5_4: ## %else2
454 ; SSE2-NEXT:    pxor %xmm3, %xmm3
455 ; SSE2-NEXT:    pcmpeqd %xmm3, %xmm2
456 ; SSE2-NEXT:    pextrw $4, %xmm2, %eax
457 ; SSE2-NEXT:    testb $1, %al
458 ; SSE2-NEXT:    je LBB5_6
459 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
460 ; SSE2-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
461 ; SSE2-NEXT:  LBB5_6: ## %else5
462 ; SSE2-NEXT:    pextrw $6, %xmm2, %eax
463 ; SSE2-NEXT:    testb $1, %al
464 ; SSE2-NEXT:    je LBB5_8
465 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
466 ; SSE2-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
467 ; SSE2-NEXT:  LBB5_8: ## %else8
468 ; SSE2-NEXT:    retq
470 ; SSE42-LABEL: load_zero_v4f64_v4i32:
471 ; SSE42:       ## %bb.0:
472 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
473 ; SSE42-NEXT:    pxor %xmm0, %xmm0
474 ; SSE42-NEXT:    movdqa %xmm2, %xmm3
475 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm3
476 ; SSE42-NEXT:    pextrb $0, %xmm3, %eax
477 ; SSE42-NEXT:    testb $1, %al
478 ; SSE42-NEXT:    xorpd %xmm1, %xmm1
479 ; SSE42-NEXT:    je LBB5_2
480 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
481 ; SSE42-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
482 ; SSE42-NEXT:    xorpd %xmm1, %xmm1
483 ; SSE42-NEXT:  LBB5_2: ## %else
484 ; SSE42-NEXT:    pextrb $4, %xmm3, %eax
485 ; SSE42-NEXT:    testb $1, %al
486 ; SSE42-NEXT:    je LBB5_4
487 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
488 ; SSE42-NEXT:    movhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
489 ; SSE42-NEXT:  LBB5_4: ## %else2
490 ; SSE42-NEXT:    pxor %xmm3, %xmm3
491 ; SSE42-NEXT:    pcmpeqd %xmm3, %xmm2
492 ; SSE42-NEXT:    pextrb $8, %xmm2, %eax
493 ; SSE42-NEXT:    testb $1, %al
494 ; SSE42-NEXT:    je LBB5_6
495 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
496 ; SSE42-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
497 ; SSE42-NEXT:  LBB5_6: ## %else5
498 ; SSE42-NEXT:    pextrb $12, %xmm2, %eax
499 ; SSE42-NEXT:    testb $1, %al
500 ; SSE42-NEXT:    je LBB5_8
501 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
502 ; SSE42-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
503 ; SSE42-NEXT:  LBB5_8: ## %else8
504 ; SSE42-NEXT:    retq
506 ; AVX1-LABEL: load_zero_v4f64_v4i32:
507 ; AVX1:       ## %bb.0:
508 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
509 ; AVX1-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
510 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm1
511 ; AVX1-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1]
512 ; AVX1-NEXT:    vpmovsxdq %xmm0, %xmm0
513 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
514 ; AVX1-NEXT:    vmaskmovpd (%rdi), %ymm0, %ymm0
515 ; AVX1-NEXT:    retq
517 ; AVX2-LABEL: load_zero_v4f64_v4i32:
518 ; AVX2:       ## %bb.0:
519 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
520 ; AVX2-NEXT:    vpcmpeqd %xmm1, %xmm0, %xmm0
521 ; AVX2-NEXT:    vpmovsxdq %xmm0, %ymm0
522 ; AVX2-NEXT:    vmaskmovpd (%rdi), %ymm0, %ymm0
523 ; AVX2-NEXT:    retq
525 ; AVX512F-LABEL: load_zero_v4f64_v4i32:
526 ; AVX512F:       ## %bb.0:
527 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
528 ; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
529 ; AVX512F-NEXT:    kshiftlw $12, %k0, %k0
530 ; AVX512F-NEXT:    kshiftrw $12, %k0, %k1
531 ; AVX512F-NEXT:    vmovupd (%rdi), %zmm0 {%k1} {z}
532 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
533 ; AVX512F-NEXT:    retq
535 ; AVX512VLBW-LABEL: load_zero_v4f64_v4i32:
536 ; AVX512VLBW:       ## %bb.0:
537 ; AVX512VLBW-NEXT:    vptestnmd %xmm0, %xmm0, %k1
538 ; AVX512VLBW-NEXT:    vmovapd (%rdi), %ymm0 {%k1} {z}
539 ; AVX512VLBW-NEXT:    retq
540   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
541   %res = call <4 x double> @llvm.masked.load.v4f64.p0v4f64(<4 x double>* %addr, i32 32, <4 x i1>%mask, <4 x double>zeroinitializer)
542   ret <4 x double> %res
545 define <8 x float> @load_v8f32_v8i32(<8 x i32> %trigger, <8 x float>* %addr, <8 x float> %dst) {
546 ; SSE2-LABEL: load_v8f32_v8i32:
547 ; SSE2:       ## %bb.0:
548 ; SSE2-NEXT:    pxor %xmm4, %xmm4
549 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm4
550 ; SSE2-NEXT:    movdqa %xmm4, %xmm5
551 ; SSE2-NEXT:    packssdw %xmm0, %xmm5
552 ; SSE2-NEXT:    movd %xmm5, %eax
553 ; SSE2-NEXT:    testb $1, %al
554 ; SSE2-NEXT:    je LBB6_2
555 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
556 ; SSE2-NEXT:    movss {{.*#+}} xmm5 = mem[0],zero,zero,zero
557 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm5[0],xmm2[1,2,3]
558 ; SSE2-NEXT:  LBB6_2: ## %else
559 ; SSE2-NEXT:    psrlq $16, %xmm4
560 ; SSE2-NEXT:    movd %xmm4, %eax
561 ; SSE2-NEXT:    shrl $16, %eax
562 ; SSE2-NEXT:    testb $1, %al
563 ; SSE2-NEXT:    je LBB6_4
564 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
565 ; SSE2-NEXT:    movss {{.*#+}} xmm4 = mem[0],zero,zero,zero
566 ; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,0],xmm2[0,0]
567 ; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[2,0],xmm2[2,3]
568 ; SSE2-NEXT:    movaps %xmm4, %xmm2
569 ; SSE2-NEXT:  LBB6_4: ## %else2
570 ; SSE2-NEXT:    xorps %xmm4, %xmm4
571 ; SSE2-NEXT:    pcmpeqd %xmm4, %xmm0
572 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
573 ; SSE2-NEXT:    testb $1, %al
574 ; SSE2-NEXT:    je LBB6_6
575 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
576 ; SSE2-NEXT:    movss {{.*#+}} xmm4 = mem[0],zero,zero,zero
577 ; SSE2-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,0],xmm2[3,0]
578 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0,2]
579 ; SSE2-NEXT:  LBB6_6: ## %else5
580 ; SSE2-NEXT:    pextrw $6, %xmm0, %eax
581 ; SSE2-NEXT:    testb $1, %al
582 ; SSE2-NEXT:    je LBB6_8
583 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
584 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
585 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm2[2,0]
586 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
587 ; SSE2-NEXT:  LBB6_8: ## %else8
588 ; SSE2-NEXT:    xorps %xmm0, %xmm0
589 ; SSE2-NEXT:    pcmpeqd %xmm1, %xmm0
590 ; SSE2-NEXT:    pextrw $0, %xmm0, %eax
591 ; SSE2-NEXT:    testb $1, %al
592 ; SSE2-NEXT:    je LBB6_10
593 ; SSE2-NEXT:  ## %bb.9: ## %cond.load10
594 ; SSE2-NEXT:    movss {{.*#+}} xmm4 = mem[0],zero,zero,zero
595 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = xmm4[0],xmm3[1,2,3]
596 ; SSE2-NEXT:  LBB6_10: ## %else11
597 ; SSE2-NEXT:    pextrw $2, %xmm0, %eax
598 ; SSE2-NEXT:    testb $1, %al
599 ; SSE2-NEXT:    je LBB6_12
600 ; SSE2-NEXT:  ## %bb.11: ## %cond.load13
601 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
602 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm3[0,0]
603 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm3[2,3]
604 ; SSE2-NEXT:    movaps %xmm0, %xmm3
605 ; SSE2-NEXT:  LBB6_12: ## %else14
606 ; SSE2-NEXT:    xorps %xmm0, %xmm0
607 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm1
608 ; SSE2-NEXT:    pextrw $4, %xmm1, %eax
609 ; SSE2-NEXT:    testb $1, %al
610 ; SSE2-NEXT:    je LBB6_14
611 ; SSE2-NEXT:  ## %bb.13: ## %cond.load16
612 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
613 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm3[3,0]
614 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0,2]
615 ; SSE2-NEXT:  LBB6_14: ## %else17
616 ; SSE2-NEXT:    pextrw $6, %xmm1, %eax
617 ; SSE2-NEXT:    testb $1, %al
618 ; SSE2-NEXT:    je LBB6_16
619 ; SSE2-NEXT:  ## %bb.15: ## %cond.load19
620 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
621 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm3[2,0]
622 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,1],xmm0[2,0]
623 ; SSE2-NEXT:  LBB6_16: ## %else20
624 ; SSE2-NEXT:    movaps %xmm2, %xmm0
625 ; SSE2-NEXT:    movaps %xmm3, %xmm1
626 ; SSE2-NEXT:    retq
628 ; SSE42-LABEL: load_v8f32_v8i32:
629 ; SSE42:       ## %bb.0:
630 ; SSE42-NEXT:    pxor %xmm4, %xmm4
631 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm4
632 ; SSE42-NEXT:    pextrb $0, %xmm4, %eax
633 ; SSE42-NEXT:    testb $1, %al
634 ; SSE42-NEXT:    je LBB6_2
635 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
636 ; SSE42-NEXT:    movss {{.*#+}} xmm5 = mem[0],zero,zero,zero
637 ; SSE42-NEXT:    blendps {{.*#+}} xmm2 = xmm5[0],xmm2[1,2,3]
638 ; SSE42-NEXT:  LBB6_2: ## %else
639 ; SSE42-NEXT:    pextrb $4, %xmm4, %eax
640 ; SSE42-NEXT:    testb $1, %al
641 ; SSE42-NEXT:    je LBB6_4
642 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
643 ; SSE42-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3]
644 ; SSE42-NEXT:  LBB6_4: ## %else2
645 ; SSE42-NEXT:    pxor %xmm4, %xmm4
646 ; SSE42-NEXT:    pcmpeqd %xmm4, %xmm0
647 ; SSE42-NEXT:    pextrb $8, %xmm0, %eax
648 ; SSE42-NEXT:    testb $1, %al
649 ; SSE42-NEXT:    je LBB6_6
650 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
651 ; SSE42-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3]
652 ; SSE42-NEXT:  LBB6_6: ## %else5
653 ; SSE42-NEXT:    pextrb $12, %xmm0, %eax
654 ; SSE42-NEXT:    testb $1, %al
655 ; SSE42-NEXT:    je LBB6_8
656 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
657 ; SSE42-NEXT:    insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0]
658 ; SSE42-NEXT:  LBB6_8: ## %else8
659 ; SSE42-NEXT:    pxor %xmm0, %xmm0
660 ; SSE42-NEXT:    pcmpeqd %xmm1, %xmm0
661 ; SSE42-NEXT:    pextrb $0, %xmm0, %eax
662 ; SSE42-NEXT:    testb $1, %al
663 ; SSE42-NEXT:    je LBB6_10
664 ; SSE42-NEXT:  ## %bb.9: ## %cond.load10
665 ; SSE42-NEXT:    movd {{.*#+}} xmm4 = mem[0],zero,zero,zero
666 ; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm4[0,1],xmm3[2,3,4,5,6,7]
667 ; SSE42-NEXT:  LBB6_10: ## %else11
668 ; SSE42-NEXT:    pextrb $4, %xmm0, %eax
669 ; SSE42-NEXT:    testb $1, %al
670 ; SSE42-NEXT:    je LBB6_12
671 ; SSE42-NEXT:  ## %bb.11: ## %cond.load13
672 ; SSE42-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3]
673 ; SSE42-NEXT:  LBB6_12: ## %else14
674 ; SSE42-NEXT:    pxor %xmm0, %xmm0
675 ; SSE42-NEXT:    pcmpeqd %xmm0, %xmm1
676 ; SSE42-NEXT:    pextrb $8, %xmm1, %eax
677 ; SSE42-NEXT:    testb $1, %al
678 ; SSE42-NEXT:    je LBB6_14
679 ; SSE42-NEXT:  ## %bb.13: ## %cond.load16
680 ; SSE42-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3]
681 ; SSE42-NEXT:  LBB6_14: ## %else17
682 ; SSE42-NEXT:    pextrb $12, %xmm1, %eax
683 ; SSE42-NEXT:    testb $1, %al
684 ; SSE42-NEXT:    je LBB6_16
685 ; SSE42-NEXT:  ## %bb.15: ## %cond.load19
686 ; SSE42-NEXT:    insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0]
687 ; SSE42-NEXT:  LBB6_16: ## %else20
688 ; SSE42-NEXT:    movaps %xmm2, %xmm0
689 ; SSE42-NEXT:    movaps %xmm3, %xmm1
690 ; SSE42-NEXT:    retq
692 ; AVX1-LABEL: load_v8f32_v8i32:
693 ; AVX1:       ## %bb.0:
694 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm2
695 ; AVX1-NEXT:    vpxor %xmm3, %xmm3, %xmm3
696 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm2, %xmm2
697 ; AVX1-NEXT:    vpcmpeqd %xmm3, %xmm0, %xmm0
698 ; AVX1-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
699 ; AVX1-NEXT:    vmaskmovps (%rdi), %ymm0, %ymm2
700 ; AVX1-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
701 ; AVX1-NEXT:    retq
703 ; AVX2-LABEL: load_v8f32_v8i32:
704 ; AVX2:       ## %bb.0:
705 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
706 ; AVX2-NEXT:    vpcmpeqd %ymm2, %ymm0, %ymm0
707 ; AVX2-NEXT:    vmaskmovps (%rdi), %ymm0, %ymm2
708 ; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
709 ; AVX2-NEXT:    retq
711 ; AVX512F-LABEL: load_v8f32_v8i32:
712 ; AVX512F:       ## %bb.0:
713 ; AVX512F-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
714 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
715 ; AVX512F-NEXT:    vptestnmd %zmm0, %zmm0, %k0
716 ; AVX512F-NEXT:    kshiftlw $8, %k0, %k0
717 ; AVX512F-NEXT:    kshiftrw $8, %k0, %k1
718 ; AVX512F-NEXT:    vblendmps (%rdi), %zmm1, %zmm0 {%k1}
719 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
720 ; AVX512F-NEXT:    retq
722 ; AVX512VLBW-LABEL: load_v8f32_v8i32:
723 ; AVX512VLBW:       ## %bb.0:
724 ; AVX512VLBW-NEXT:    vptestnmd %ymm0, %ymm0, %k1
725 ; AVX512VLBW-NEXT:    vblendmps (%rdi), %ymm1, %ymm0 {%k1}
726 ; AVX512VLBW-NEXT:    retq
727   %mask = icmp eq <8 x i32> %trigger, zeroinitializer
728   %res = call <8 x float> @llvm.masked.load.v8f32.p0v8f32(<8 x float>* %addr, i32 32, <8 x i1>%mask, <8 x float>%dst)
729   ret <8 x float> %res
732 define <8 x i32> @load_v8i32_v8i1(<8 x i1> %mask, <8 x i32>* %addr, <8 x i32> %dst) {
733 ; SSE2-LABEL: load_v8i32_v8i1:
734 ; SSE2:       ## %bb.0:
735 ; SSE2-NEXT:    movd %xmm0, %eax
736 ; SSE2-NEXT:    testb $1, %al
737 ; SSE2-NEXT:    je LBB7_2
738 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
739 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
740 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3]
741 ; SSE2-NEXT:  LBB7_2: ## %else
742 ; SSE2-NEXT:    shrl $16, %eax
743 ; SSE2-NEXT:    testb $1, %al
744 ; SSE2-NEXT:    je LBB7_4
745 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
746 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
747 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[0,0]
748 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm1[2,3]
749 ; SSE2-NEXT:    movaps %xmm3, %xmm1
750 ; SSE2-NEXT:  LBB7_4: ## %else2
751 ; SSE2-NEXT:    pextrw $2, %xmm0, %eax
752 ; SSE2-NEXT:    testb $1, %al
753 ; SSE2-NEXT:    je LBB7_6
754 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
755 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
756 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[3,0]
757 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,2]
758 ; SSE2-NEXT:  LBB7_6: ## %else5
759 ; SSE2-NEXT:    pextrw $3, %xmm0, %eax
760 ; SSE2-NEXT:    testb $1, %al
761 ; SSE2-NEXT:    je LBB7_8
762 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
763 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
764 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[2,0]
765 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,0]
766 ; SSE2-NEXT:  LBB7_8: ## %else8
767 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
768 ; SSE2-NEXT:    testb $1, %al
769 ; SSE2-NEXT:    je LBB7_10
770 ; SSE2-NEXT:  ## %bb.9: ## %cond.load10
771 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
772 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3]
773 ; SSE2-NEXT:  LBB7_10: ## %else11
774 ; SSE2-NEXT:    pextrw $5, %xmm0, %eax
775 ; SSE2-NEXT:    testb $1, %al
776 ; SSE2-NEXT:    je LBB7_12
777 ; SSE2-NEXT:  ## %bb.11: ## %cond.load13
778 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
779 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm2[0,0]
780 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm2[2,3]
781 ; SSE2-NEXT:    movaps %xmm3, %xmm2
782 ; SSE2-NEXT:  LBB7_12: ## %else14
783 ; SSE2-NEXT:    pextrw $6, %xmm0, %eax
784 ; SSE2-NEXT:    testb $1, %al
785 ; SSE2-NEXT:    je LBB7_14
786 ; SSE2-NEXT:  ## %bb.13: ## %cond.load16
787 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
788 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm2[3,0]
789 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0,2]
790 ; SSE2-NEXT:  LBB7_14: ## %else17
791 ; SSE2-NEXT:    pextrw $7, %xmm0, %eax
792 ; SSE2-NEXT:    testb $1, %al
793 ; SSE2-NEXT:    je LBB7_16
794 ; SSE2-NEXT:  ## %bb.15: ## %cond.load19
795 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
796 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm2[2,0]
797 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,1],xmm0[2,0]
798 ; SSE2-NEXT:  LBB7_16: ## %else20
799 ; SSE2-NEXT:    movaps %xmm1, %xmm0
800 ; SSE2-NEXT:    movaps %xmm2, %xmm1
801 ; SSE2-NEXT:    retq
803 ; SSE42-LABEL: load_v8i32_v8i1:
804 ; SSE42:       ## %bb.0:
805 ; SSE42-NEXT:    pextrb $0, %xmm0, %eax
806 ; SSE42-NEXT:    testb $1, %al
807 ; SSE42-NEXT:    je LBB7_2
808 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
809 ; SSE42-NEXT:    pinsrd $0, (%rdi), %xmm1
810 ; SSE42-NEXT:  LBB7_2: ## %else
811 ; SSE42-NEXT:    pextrb $2, %xmm0, %eax
812 ; SSE42-NEXT:    testb $1, %al
813 ; SSE42-NEXT:    je LBB7_4
814 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
815 ; SSE42-NEXT:    pinsrd $1, 4(%rdi), %xmm1
816 ; SSE42-NEXT:  LBB7_4: ## %else2
817 ; SSE42-NEXT:    pextrb $4, %xmm0, %eax
818 ; SSE42-NEXT:    testb $1, %al
819 ; SSE42-NEXT:    je LBB7_6
820 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
821 ; SSE42-NEXT:    pinsrd $2, 8(%rdi), %xmm1
822 ; SSE42-NEXT:  LBB7_6: ## %else5
823 ; SSE42-NEXT:    pextrb $6, %xmm0, %eax
824 ; SSE42-NEXT:    testb $1, %al
825 ; SSE42-NEXT:    je LBB7_8
826 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
827 ; SSE42-NEXT:    pinsrd $3, 12(%rdi), %xmm1
828 ; SSE42-NEXT:  LBB7_8: ## %else8
829 ; SSE42-NEXT:    pextrb $8, %xmm0, %eax
830 ; SSE42-NEXT:    testb $1, %al
831 ; SSE42-NEXT:    je LBB7_10
832 ; SSE42-NEXT:  ## %bb.9: ## %cond.load10
833 ; SSE42-NEXT:    pinsrd $0, 16(%rdi), %xmm2
834 ; SSE42-NEXT:  LBB7_10: ## %else11
835 ; SSE42-NEXT:    pextrb $10, %xmm0, %eax
836 ; SSE42-NEXT:    testb $1, %al
837 ; SSE42-NEXT:    je LBB7_12
838 ; SSE42-NEXT:  ## %bb.11: ## %cond.load13
839 ; SSE42-NEXT:    pinsrd $1, 20(%rdi), %xmm2
840 ; SSE42-NEXT:  LBB7_12: ## %else14
841 ; SSE42-NEXT:    pextrb $12, %xmm0, %eax
842 ; SSE42-NEXT:    testb $1, %al
843 ; SSE42-NEXT:    je LBB7_14
844 ; SSE42-NEXT:  ## %bb.13: ## %cond.load16
845 ; SSE42-NEXT:    pinsrd $2, 24(%rdi), %xmm2
846 ; SSE42-NEXT:  LBB7_14: ## %else17
847 ; SSE42-NEXT:    pextrb $14, %xmm0, %eax
848 ; SSE42-NEXT:    testb $1, %al
849 ; SSE42-NEXT:    je LBB7_16
850 ; SSE42-NEXT:  ## %bb.15: ## %cond.load19
851 ; SSE42-NEXT:    pinsrd $3, 28(%rdi), %xmm2
852 ; SSE42-NEXT:  LBB7_16: ## %else20
853 ; SSE42-NEXT:    movdqa %xmm1, %xmm0
854 ; SSE42-NEXT:    movdqa %xmm2, %xmm1
855 ; SSE42-NEXT:    retq
857 ; AVX1-LABEL: load_v8i32_v8i1:
858 ; AVX1:       ## %bb.0:
859 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm2 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
860 ; AVX1-NEXT:    vpslld $31, %xmm2, %xmm2
861 ; AVX1-NEXT:    vpsrad $31, %xmm2, %xmm2
862 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
863 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
864 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
865 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm2, %ymm0
866 ; AVX1-NEXT:    vmaskmovps (%rdi), %ymm0, %ymm2
867 ; AVX1-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
868 ; AVX1-NEXT:    retq
870 ; AVX2-LABEL: load_v8i32_v8i1:
871 ; AVX2:       ## %bb.0:
872 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
873 ; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
874 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
875 ; AVX2-NEXT:    vpmaskmovd (%rdi), %ymm0, %ymm2
876 ; AVX2-NEXT:    vblendvps %ymm0, %ymm2, %ymm1, %ymm0
877 ; AVX2-NEXT:    retq
879 ; AVX512F-LABEL: load_v8i32_v8i1:
880 ; AVX512F:       ## %bb.0:
881 ; AVX512F-NEXT:    ## kill: def $ymm1 killed $ymm1 def $zmm1
882 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
883 ; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
884 ; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
885 ; AVX512F-NEXT:    vpblendmd (%rdi), %zmm1, %zmm0 {%k1}
886 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
887 ; AVX512F-NEXT:    retq
889 ; AVX512VLBW-LABEL: load_v8i32_v8i1:
890 ; AVX512VLBW:       ## %bb.0:
891 ; AVX512VLBW-NEXT:    vpsllw $15, %xmm0, %xmm0
892 ; AVX512VLBW-NEXT:    vpmovw2m %xmm0, %k1
893 ; AVX512VLBW-NEXT:    vpblendmd (%rdi), %ymm1, %ymm0 {%k1}
894 ; AVX512VLBW-NEXT:    retq
895   %res = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* %addr, i32 4, <8 x i1>%mask, <8 x i32>%dst)
896   ret <8 x i32> %res
899 define <8 x float> @load_zero_v8f32_v8i1(<8 x i1> %mask, <8 x float>* %addr) {
900 ; SSE2-LABEL: load_zero_v8f32_v8i1:
901 ; SSE2:       ## %bb.0:
902 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
903 ; SSE2-NEXT:    movd %xmm0, %eax
904 ; SSE2-NEXT:    pxor %xmm0, %xmm0
905 ; SSE2-NEXT:    testb $1, %al
906 ; SSE2-NEXT:    xorps %xmm1, %xmm1
907 ; SSE2-NEXT:    je LBB8_2
908 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
909 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
910 ; SSE2-NEXT:    xorps %xmm1, %xmm1
911 ; SSE2-NEXT:  LBB8_2: ## %else
912 ; SSE2-NEXT:    shrl $16, %eax
913 ; SSE2-NEXT:    testb $1, %al
914 ; SSE2-NEXT:    je LBB8_4
915 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
916 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
917 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[0,0]
918 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm0[2,3]
919 ; SSE2-NEXT:    movaps %xmm3, %xmm0
920 ; SSE2-NEXT:  LBB8_4: ## %else2
921 ; SSE2-NEXT:    pextrw $2, %xmm2, %eax
922 ; SSE2-NEXT:    testb $1, %al
923 ; SSE2-NEXT:    je LBB8_6
924 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
925 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
926 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[3,0]
927 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0,2]
928 ; SSE2-NEXT:  LBB8_6: ## %else5
929 ; SSE2-NEXT:    pextrw $3, %xmm2, %eax
930 ; SSE2-NEXT:    testb $1, %al
931 ; SSE2-NEXT:    je LBB8_8
932 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
933 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
934 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[2,0]
935 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,0]
936 ; SSE2-NEXT:  LBB8_8: ## %else8
937 ; SSE2-NEXT:    pextrw $4, %xmm2, %eax
938 ; SSE2-NEXT:    testb $1, %al
939 ; SSE2-NEXT:    je LBB8_10
940 ; SSE2-NEXT:  ## %bb.9: ## %cond.load10
941 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
942 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3]
943 ; SSE2-NEXT:  LBB8_10: ## %else11
944 ; SSE2-NEXT:    pextrw $5, %xmm2, %eax
945 ; SSE2-NEXT:    testb $1, %al
946 ; SSE2-NEXT:    je LBB8_12
947 ; SSE2-NEXT:  ## %bb.11: ## %cond.load13
948 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
949 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[0,0]
950 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm1[2,3]
951 ; SSE2-NEXT:    movaps %xmm3, %xmm1
952 ; SSE2-NEXT:  LBB8_12: ## %else14
953 ; SSE2-NEXT:    pextrw $6, %xmm2, %eax
954 ; SSE2-NEXT:    testb $1, %al
955 ; SSE2-NEXT:    je LBB8_14
956 ; SSE2-NEXT:  ## %bb.13: ## %cond.load16
957 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
958 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[3,0]
959 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,2]
960 ; SSE2-NEXT:  LBB8_14: ## %else17
961 ; SSE2-NEXT:    pextrw $7, %xmm2, %eax
962 ; SSE2-NEXT:    testb $1, %al
963 ; SSE2-NEXT:    je LBB8_16
964 ; SSE2-NEXT:  ## %bb.15: ## %cond.load19
965 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
966 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[2,0]
967 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,0]
968 ; SSE2-NEXT:  LBB8_16: ## %else20
969 ; SSE2-NEXT:    retq
971 ; SSE42-LABEL: load_zero_v8f32_v8i1:
972 ; SSE42:       ## %bb.0:
973 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
974 ; SSE42-NEXT:    pextrb $0, %xmm0, %eax
975 ; SSE42-NEXT:    pxor %xmm0, %xmm0
976 ; SSE42-NEXT:    testb $1, %al
977 ; SSE42-NEXT:    xorps %xmm1, %xmm1
978 ; SSE42-NEXT:    je LBB8_2
979 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
980 ; SSE42-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
981 ; SSE42-NEXT:    xorps %xmm1, %xmm1
982 ; SSE42-NEXT:  LBB8_2: ## %else
983 ; SSE42-NEXT:    pextrb $2, %xmm2, %eax
984 ; SSE42-NEXT:    testb $1, %al
985 ; SSE42-NEXT:    je LBB8_4
986 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
987 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]
988 ; SSE42-NEXT:  LBB8_4: ## %else2
989 ; SSE42-NEXT:    pextrb $4, %xmm2, %eax
990 ; SSE42-NEXT:    testb $1, %al
991 ; SSE42-NEXT:    je LBB8_6
992 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
993 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]
994 ; SSE42-NEXT:  LBB8_6: ## %else5
995 ; SSE42-NEXT:    pextrb $6, %xmm2, %eax
996 ; SSE42-NEXT:    testb $1, %al
997 ; SSE42-NEXT:    je LBB8_8
998 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
999 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]
1000 ; SSE42-NEXT:  LBB8_8: ## %else8
1001 ; SSE42-NEXT:    pextrb $8, %xmm2, %eax
1002 ; SSE42-NEXT:    testb $1, %al
1003 ; SSE42-NEXT:    je LBB8_10
1004 ; SSE42-NEXT:  ## %bb.9: ## %cond.load10
1005 ; SSE42-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1006 ; SSE42-NEXT:    blendps {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3]
1007 ; SSE42-NEXT:  LBB8_10: ## %else11
1008 ; SSE42-NEXT:    pextrb $10, %xmm2, %eax
1009 ; SSE42-NEXT:    testb $1, %al
1010 ; SSE42-NEXT:    je LBB8_12
1011 ; SSE42-NEXT:  ## %bb.11: ## %cond.load13
1012 ; SSE42-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]
1013 ; SSE42-NEXT:  LBB8_12: ## %else14
1014 ; SSE42-NEXT:    pextrb $12, %xmm2, %eax
1015 ; SSE42-NEXT:    testb $1, %al
1016 ; SSE42-NEXT:    je LBB8_14
1017 ; SSE42-NEXT:  ## %bb.13: ## %cond.load16
1018 ; SSE42-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3]
1019 ; SSE42-NEXT:  LBB8_14: ## %else17
1020 ; SSE42-NEXT:    pextrb $14, %xmm2, %eax
1021 ; SSE42-NEXT:    testb $1, %al
1022 ; SSE42-NEXT:    je LBB8_16
1023 ; SSE42-NEXT:  ## %bb.15: ## %cond.load19
1024 ; SSE42-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0,1,2],mem[0]
1025 ; SSE42-NEXT:  LBB8_16: ## %else20
1026 ; SSE42-NEXT:    retq
1028 ; AVX1-LABEL: load_zero_v8f32_v8i1:
1029 ; AVX1:       ## %bb.0:
1030 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1031 ; AVX1-NEXT:    vpslld $31, %xmm1, %xmm1
1032 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
1033 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1034 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
1035 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
1036 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1037 ; AVX1-NEXT:    vmaskmovps (%rdi), %ymm0, %ymm0
1038 ; AVX1-NEXT:    retq
1040 ; AVX2-LABEL: load_zero_v8f32_v8i1:
1041 ; AVX2:       ## %bb.0:
1042 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1043 ; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1044 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1045 ; AVX2-NEXT:    vmaskmovps (%rdi), %ymm0, %ymm0
1046 ; AVX2-NEXT:    retq
1048 ; AVX512F-LABEL: load_zero_v8f32_v8i1:
1049 ; AVX512F:       ## %bb.0:
1050 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1051 ; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
1052 ; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
1053 ; AVX512F-NEXT:    vmovups (%rdi), %zmm0 {%k1} {z}
1054 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1055 ; AVX512F-NEXT:    retq
1057 ; AVX512VLBW-LABEL: load_zero_v8f32_v8i1:
1058 ; AVX512VLBW:       ## %bb.0:
1059 ; AVX512VLBW-NEXT:    vpsllw $15, %xmm0, %xmm0
1060 ; AVX512VLBW-NEXT:    vpmovw2m %xmm0, %k1
1061 ; AVX512VLBW-NEXT:    vmovaps (%rdi), %ymm0 {%k1} {z}
1062 ; AVX512VLBW-NEXT:    retq
1063   %res = call <8 x float> @llvm.masked.load.v8f32.p0v8f32(<8 x float>* %addr, i32 32, <8 x i1> %mask, <8 x float> zeroinitializer)
1064   ret <8 x float> %res
1067 define <8 x i32> @load_zero_v8i32_v8i1(<8 x i1> %mask, <8 x i32>* %addr) {
1068 ; SSE2-LABEL: load_zero_v8i32_v8i1:
1069 ; SSE2:       ## %bb.0:
1070 ; SSE2-NEXT:    movdqa %xmm0, %xmm2
1071 ; SSE2-NEXT:    movd %xmm0, %eax
1072 ; SSE2-NEXT:    pxor %xmm0, %xmm0
1073 ; SSE2-NEXT:    testb $1, %al
1074 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1075 ; SSE2-NEXT:    je LBB9_2
1076 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
1077 ; SSE2-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1078 ; SSE2-NEXT:    xorps %xmm1, %xmm1
1079 ; SSE2-NEXT:  LBB9_2: ## %else
1080 ; SSE2-NEXT:    shrl $16, %eax
1081 ; SSE2-NEXT:    testb $1, %al
1082 ; SSE2-NEXT:    je LBB9_4
1083 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
1084 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1085 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[0,0]
1086 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm0[2,3]
1087 ; SSE2-NEXT:    movaps %xmm3, %xmm0
1088 ; SSE2-NEXT:  LBB9_4: ## %else2
1089 ; SSE2-NEXT:    pextrw $2, %xmm2, %eax
1090 ; SSE2-NEXT:    testb $1, %al
1091 ; SSE2-NEXT:    je LBB9_6
1092 ; SSE2-NEXT:  ## %bb.5: ## %cond.load4
1093 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1094 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[3,0]
1095 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0,2]
1096 ; SSE2-NEXT:  LBB9_6: ## %else5
1097 ; SSE2-NEXT:    pextrw $3, %xmm2, %eax
1098 ; SSE2-NEXT:    testb $1, %al
1099 ; SSE2-NEXT:    je LBB9_8
1100 ; SSE2-NEXT:  ## %bb.7: ## %cond.load7
1101 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1102 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[2,0]
1103 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,0]
1104 ; SSE2-NEXT:  LBB9_8: ## %else8
1105 ; SSE2-NEXT:    pextrw $4, %xmm2, %eax
1106 ; SSE2-NEXT:    testb $1, %al
1107 ; SSE2-NEXT:    je LBB9_10
1108 ; SSE2-NEXT:  ## %bb.9: ## %cond.load10
1109 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1110 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3]
1111 ; SSE2-NEXT:  LBB9_10: ## %else11
1112 ; SSE2-NEXT:    pextrw $5, %xmm2, %eax
1113 ; SSE2-NEXT:    testb $1, %al
1114 ; SSE2-NEXT:    je LBB9_12
1115 ; SSE2-NEXT:  ## %bb.11: ## %cond.load13
1116 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1117 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[0,0]
1118 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[2,0],xmm1[2,3]
1119 ; SSE2-NEXT:    movaps %xmm3, %xmm1
1120 ; SSE2-NEXT:  LBB9_12: ## %else14
1121 ; SSE2-NEXT:    pextrw $6, %xmm2, %eax
1122 ; SSE2-NEXT:    testb $1, %al
1123 ; SSE2-NEXT:    je LBB9_14
1124 ; SSE2-NEXT:  ## %bb.13: ## %cond.load16
1125 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1126 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[3,0]
1127 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,2]
1128 ; SSE2-NEXT:  LBB9_14: ## %else17
1129 ; SSE2-NEXT:    pextrw $7, %xmm2, %eax
1130 ; SSE2-NEXT:    testb $1, %al
1131 ; SSE2-NEXT:    je LBB9_16
1132 ; SSE2-NEXT:  ## %bb.15: ## %cond.load19
1133 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1134 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[2,0]
1135 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,0]
1136 ; SSE2-NEXT:  LBB9_16: ## %else20
1137 ; SSE2-NEXT:    retq
1139 ; SSE42-LABEL: load_zero_v8i32_v8i1:
1140 ; SSE42:       ## %bb.0:
1141 ; SSE42-NEXT:    movdqa %xmm0, %xmm2
1142 ; SSE42-NEXT:    pextrb $0, %xmm0, %eax
1143 ; SSE42-NEXT:    pxor %xmm0, %xmm0
1144 ; SSE42-NEXT:    testb $1, %al
1145 ; SSE42-NEXT:    pxor %xmm1, %xmm1
1146 ; SSE42-NEXT:    je LBB9_2
1147 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
1148 ; SSE42-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
1149 ; SSE42-NEXT:    pxor %xmm1, %xmm1
1150 ; SSE42-NEXT:  LBB9_2: ## %else
1151 ; SSE42-NEXT:    pextrb $2, %xmm2, %eax
1152 ; SSE42-NEXT:    testb $1, %al
1153 ; SSE42-NEXT:    je LBB9_4
1154 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
1155 ; SSE42-NEXT:    pinsrd $1, 4(%rdi), %xmm0
1156 ; SSE42-NEXT:  LBB9_4: ## %else2
1157 ; SSE42-NEXT:    pextrb $4, %xmm2, %eax
1158 ; SSE42-NEXT:    testb $1, %al
1159 ; SSE42-NEXT:    je LBB9_6
1160 ; SSE42-NEXT:  ## %bb.5: ## %cond.load4
1161 ; SSE42-NEXT:    pinsrd $2, 8(%rdi), %xmm0
1162 ; SSE42-NEXT:  LBB9_6: ## %else5
1163 ; SSE42-NEXT:    pextrb $6, %xmm2, %eax
1164 ; SSE42-NEXT:    testb $1, %al
1165 ; SSE42-NEXT:    je LBB9_8
1166 ; SSE42-NEXT:  ## %bb.7: ## %cond.load7
1167 ; SSE42-NEXT:    pinsrd $3, 12(%rdi), %xmm0
1168 ; SSE42-NEXT:  LBB9_8: ## %else8
1169 ; SSE42-NEXT:    pextrb $8, %xmm2, %eax
1170 ; SSE42-NEXT:    testb $1, %al
1171 ; SSE42-NEXT:    je LBB9_10
1172 ; SSE42-NEXT:  ## %bb.9: ## %cond.load10
1173 ; SSE42-NEXT:    pinsrd $0, 16(%rdi), %xmm1
1174 ; SSE42-NEXT:  LBB9_10: ## %else11
1175 ; SSE42-NEXT:    pextrb $10, %xmm2, %eax
1176 ; SSE42-NEXT:    testb $1, %al
1177 ; SSE42-NEXT:    je LBB9_12
1178 ; SSE42-NEXT:  ## %bb.11: ## %cond.load13
1179 ; SSE42-NEXT:    pinsrd $1, 20(%rdi), %xmm1
1180 ; SSE42-NEXT:  LBB9_12: ## %else14
1181 ; SSE42-NEXT:    pextrb $12, %xmm2, %eax
1182 ; SSE42-NEXT:    testb $1, %al
1183 ; SSE42-NEXT:    je LBB9_14
1184 ; SSE42-NEXT:  ## %bb.13: ## %cond.load16
1185 ; SSE42-NEXT:    pinsrd $2, 24(%rdi), %xmm1
1186 ; SSE42-NEXT:  LBB9_14: ## %else17
1187 ; SSE42-NEXT:    pextrb $14, %xmm2, %eax
1188 ; SSE42-NEXT:    testb $1, %al
1189 ; SSE42-NEXT:    je LBB9_16
1190 ; SSE42-NEXT:  ## %bb.15: ## %cond.load19
1191 ; SSE42-NEXT:    pinsrd $3, 28(%rdi), %xmm1
1192 ; SSE42-NEXT:  LBB9_16: ## %else20
1193 ; SSE42-NEXT:    retq
1195 ; AVX1-LABEL: load_zero_v8i32_v8i1:
1196 ; AVX1:       ## %bb.0:
1197 ; AVX1-NEXT:    vpmovzxwd {{.*#+}} xmm1 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero
1198 ; AVX1-NEXT:    vpslld $31, %xmm1, %xmm1
1199 ; AVX1-NEXT:    vpsrad $31, %xmm1, %xmm1
1200 ; AVX1-NEXT:    vpunpckhwd {{.*#+}} xmm0 = xmm0[4,4,5,5,6,6,7,7]
1201 ; AVX1-NEXT:    vpslld $31, %xmm0, %xmm0
1202 ; AVX1-NEXT:    vpsrad $31, %xmm0, %xmm0
1203 ; AVX1-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1204 ; AVX1-NEXT:    vmaskmovps (%rdi), %ymm0, %ymm0
1205 ; AVX1-NEXT:    retq
1207 ; AVX2-LABEL: load_zero_v8i32_v8i1:
1208 ; AVX2:       ## %bb.0:
1209 ; AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero
1210 ; AVX2-NEXT:    vpslld $31, %ymm0, %ymm0
1211 ; AVX2-NEXT:    vpsrad $31, %ymm0, %ymm0
1212 ; AVX2-NEXT:    vpmaskmovd (%rdi), %ymm0, %ymm0
1213 ; AVX2-NEXT:    retq
1215 ; AVX512F-LABEL: load_zero_v8i32_v8i1:
1216 ; AVX512F:       ## %bb.0:
1217 ; AVX512F-NEXT:    vpmovzxwq {{.*#+}} zmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero,xmm0[4],zero,zero,zero,xmm0[5],zero,zero,zero,xmm0[6],zero,zero,zero,xmm0[7],zero,zero,zero
1218 ; AVX512F-NEXT:    vpsllq $63, %zmm0, %zmm0
1219 ; AVX512F-NEXT:    vptestmq %zmm0, %zmm0, %k1
1220 ; AVX512F-NEXT:    vmovdqu32 (%rdi), %zmm0 {%k1} {z}
1221 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1222 ; AVX512F-NEXT:    retq
1224 ; AVX512VLBW-LABEL: load_zero_v8i32_v8i1:
1225 ; AVX512VLBW:       ## %bb.0:
1226 ; AVX512VLBW-NEXT:    vpsllw $15, %xmm0, %xmm0
1227 ; AVX512VLBW-NEXT:    vpmovw2m %xmm0, %k1
1228 ; AVX512VLBW-NEXT:    vmovdqu32 (%rdi), %ymm0 {%k1} {z}
1229 ; AVX512VLBW-NEXT:    retq
1230   %res = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* %addr, i32 4, <8 x i1> %mask, <8 x i32> zeroinitializer)
1231   ret <8 x i32> %res
1234 define <2 x float> @load_v2f32_v2i32(<2 x i32> %trigger, <2 x float>* %addr, <2 x float> %dst) {
1235 ; SSE2-LABEL: load_v2f32_v2i32:
1236 ; SSE2:       ## %bb.0:
1237 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1238 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1239 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
1240 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1241 ; SSE2-NEXT:    pand %xmm2, %xmm0
1242 ; SSE2-NEXT:    movd %xmm0, %eax
1243 ; SSE2-NEXT:    testb $1, %al
1244 ; SSE2-NEXT:    je LBB10_2
1245 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
1246 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1247 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3]
1248 ; SSE2-NEXT:  LBB10_2: ## %else
1249 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
1250 ; SSE2-NEXT:    testb $1, %al
1251 ; SSE2-NEXT:    je LBB10_4
1252 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
1253 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1254 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0]
1255 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
1256 ; SSE2-NEXT:    movaps %xmm0, %xmm1
1257 ; SSE2-NEXT:  LBB10_4: ## %else2
1258 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1259 ; SSE2-NEXT:    retq
1261 ; SSE42-LABEL: load_v2f32_v2i32:
1262 ; SSE42:       ## %bb.0:
1263 ; SSE42-NEXT:    pxor %xmm2, %xmm2
1264 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
1265 ; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
1266 ; SSE42-NEXT:    pcmpeqq %xmm2, %xmm3
1267 ; SSE42-NEXT:    pextrb $0, %xmm3, %eax
1268 ; SSE42-NEXT:    testb $1, %al
1269 ; SSE42-NEXT:    je LBB10_2
1270 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
1271 ; SSE42-NEXT:    movd {{.*#+}} xmm3 = mem[0],zero,zero,zero
1272 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm3[0,1],xmm1[2,3,4,5,6,7]
1273 ; SSE42-NEXT:  LBB10_2: ## %else
1274 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1275 ; SSE42-NEXT:    pcmpeqq %xmm2, %xmm0
1276 ; SSE42-NEXT:    pextrb $8, %xmm0, %eax
1277 ; SSE42-NEXT:    testb $1, %al
1278 ; SSE42-NEXT:    je LBB10_4
1279 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
1280 ; SSE42-NEXT:    insertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3]
1281 ; SSE42-NEXT:  LBB10_4: ## %else2
1282 ; SSE42-NEXT:    movaps %xmm1, %xmm0
1283 ; SSE42-NEXT:    retq
1285 ; AVX1-LABEL: load_v2f32_v2i32:
1286 ; AVX1:       ## %bb.0:
1287 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1288 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1289 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
1290 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
1291 ; AVX1-NEXT:    vmaskmovps (%rdi), %xmm0, %xmm2
1292 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
1293 ; AVX1-NEXT:    retq
1295 ; AVX2-LABEL: load_v2f32_v2i32:
1296 ; AVX2:       ## %bb.0:
1297 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1298 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1299 ; AVX2-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
1300 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
1301 ; AVX2-NEXT:    vmaskmovps (%rdi), %xmm0, %xmm2
1302 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
1303 ; AVX2-NEXT:    retq
1305 ; AVX512F-LABEL: load_v2f32_v2i32:
1306 ; AVX512F:       ## %bb.0:
1307 ; AVX512F-NEXT:    ## kill: def $xmm1 killed $xmm1 def $zmm1
1308 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1309 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1310 ; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1311 ; AVX512F-NEXT:    kshiftlw $14, %k0, %k0
1312 ; AVX512F-NEXT:    kshiftrw $14, %k0, %k1
1313 ; AVX512F-NEXT:    vblendmps (%rdi), %zmm1, %zmm0 {%k1}
1314 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1315 ; AVX512F-NEXT:    vzeroupper
1316 ; AVX512F-NEXT:    retq
1318 ; AVX512VLBW-LABEL: load_v2f32_v2i32:
1319 ; AVX512VLBW:       ## %bb.0:
1320 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1321 ; AVX512VLBW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1322 ; AVX512VLBW-NEXT:    vptestnmq %xmm0, %xmm0, %k1
1323 ; AVX512VLBW-NEXT:    vblendmps (%rdi), %xmm1, %xmm0 {%k1}
1324 ; AVX512VLBW-NEXT:    retq
1325   %mask = icmp eq <2 x i32> %trigger, zeroinitializer
1326   %res = call <2 x float> @llvm.masked.load.v2f32.p0v2f32(<2 x float>* %addr, i32 4, <2 x i1>%mask, <2 x float>%dst)
1327   ret <2 x float> %res
1330 define <2 x i32> @load_v2i32_v2i32(<2 x i32> %trigger, <2 x i32>* %addr, <2 x i32> %dst) {
1331 ; SSE2-LABEL: load_v2i32_v2i32:
1332 ; SSE2:       ## %bb.0:
1333 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1334 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1335 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
1336 ; SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2]
1337 ; SSE2-NEXT:    pand %xmm2, %xmm0
1338 ; SSE2-NEXT:    movd %xmm0, %eax
1339 ; SSE2-NEXT:    testb $1, %al
1340 ; SSE2-NEXT:    je LBB11_2
1341 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
1342 ; SSE2-NEXT:    movl (%rdi), %eax
1343 ; SSE2-NEXT:    movq %rax, %xmm2
1344 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1]
1345 ; SSE2-NEXT:  LBB11_2: ## %else
1346 ; SSE2-NEXT:    pextrw $4, %xmm0, %eax
1347 ; SSE2-NEXT:    testb $1, %al
1348 ; SSE2-NEXT:    je LBB11_4
1349 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
1350 ; SSE2-NEXT:    movl 4(%rdi), %eax
1351 ; SSE2-NEXT:    movq %rax, %xmm0
1352 ; SSE2-NEXT:    unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0]
1353 ; SSE2-NEXT:  LBB11_4: ## %else2
1354 ; SSE2-NEXT:    movapd %xmm1, %xmm0
1355 ; SSE2-NEXT:    retq
1357 ; SSE42-LABEL: load_v2i32_v2i32:
1358 ; SSE42:       ## %bb.0:
1359 ; SSE42-NEXT:    pxor %xmm2, %xmm2
1360 ; SSE42-NEXT:    movdqa %xmm0, %xmm3
1361 ; SSE42-NEXT:    pblendw {{.*#+}} xmm3 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7]
1362 ; SSE42-NEXT:    pcmpeqq %xmm2, %xmm3
1363 ; SSE42-NEXT:    pextrb $0, %xmm3, %eax
1364 ; SSE42-NEXT:    testb $1, %al
1365 ; SSE42-NEXT:    je LBB11_2
1366 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
1367 ; SSE42-NEXT:    movl (%rdi), %eax
1368 ; SSE42-NEXT:    pinsrq $0, %rax, %xmm1
1369 ; SSE42-NEXT:  LBB11_2: ## %else
1370 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1371 ; SSE42-NEXT:    pcmpeqq %xmm2, %xmm0
1372 ; SSE42-NEXT:    pextrb $8, %xmm0, %eax
1373 ; SSE42-NEXT:    testb $1, %al
1374 ; SSE42-NEXT:    je LBB11_4
1375 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
1376 ; SSE42-NEXT:    movl 4(%rdi), %eax
1377 ; SSE42-NEXT:    pinsrq $1, %rax, %xmm1
1378 ; SSE42-NEXT:  LBB11_4: ## %else2
1379 ; SSE42-NEXT:    movdqa %xmm1, %xmm0
1380 ; SSE42-NEXT:    retq
1382 ; AVX1-LABEL: load_v2i32_v2i32:
1383 ; AVX1:       ## %bb.0:
1384 ; AVX1-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1385 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1386 ; AVX1-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
1387 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
1388 ; AVX1-NEXT:    vmaskmovps (%rdi), %xmm0, %xmm2
1389 ; AVX1-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1390 ; AVX1-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
1391 ; AVX1-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1392 ; AVX1-NEXT:    retq
1394 ; AVX2-LABEL: load_v2i32_v2i32:
1395 ; AVX2:       ## %bb.0:
1396 ; AVX2-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1397 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1398 ; AVX2-NEXT:    vpcmpeqq %xmm2, %xmm0, %xmm0
1399 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
1400 ; AVX2-NEXT:    vpmaskmovd (%rdi), %xmm0, %xmm2
1401 ; AVX2-NEXT:    vpermilps {{.*#+}} xmm1 = xmm1[0,2,2,3]
1402 ; AVX2-NEXT:    vblendvps %xmm0, %xmm2, %xmm1, %xmm0
1403 ; AVX2-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1404 ; AVX2-NEXT:    retq
1406 ; AVX512F-LABEL: load_v2i32_v2i32:
1407 ; AVX512F:       ## %bb.0:
1408 ; AVX512F-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1409 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1410 ; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1411 ; AVX512F-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1412 ; AVX512F-NEXT:    kshiftlw $14, %k0, %k0
1413 ; AVX512F-NEXT:    kshiftrw $14, %k0, %k1
1414 ; AVX512F-NEXT:    vmovdqu32 (%rdi), %zmm0 {%k1}
1415 ; AVX512F-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1416 ; AVX512F-NEXT:    vzeroupper
1417 ; AVX512F-NEXT:    retq
1419 ; AVX512VLBW-LABEL: load_v2i32_v2i32:
1420 ; AVX512VLBW:       ## %bb.0:
1421 ; AVX512VLBW-NEXT:    vpxor %xmm2, %xmm2, %xmm2
1422 ; AVX512VLBW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3]
1423 ; AVX512VLBW-NEXT:    vptestnmq %xmm0, %xmm0, %k1
1424 ; AVX512VLBW-NEXT:    vpshufd {{.*#+}} xmm0 = xmm1[0,2,2,3]
1425 ; AVX512VLBW-NEXT:    vmovdqu32 (%rdi), %xmm0 {%k1}
1426 ; AVX512VLBW-NEXT:    vpmovzxdq {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero
1427 ; AVX512VLBW-NEXT:    retq
1428   %mask = icmp eq <2 x i32> %trigger, zeroinitializer
1429   %res = call <2 x i32> @llvm.masked.load.v2i32.p0v2i32(<2 x i32>* %addr, i32 4, <2 x i1>%mask, <2 x i32>%dst)
1430   ret <2 x i32> %res
1433 define <2 x float> @load_undef_v2f32_v2i32(<2 x i32> %trigger, <2 x float>* %addr) {
1434 ; SSE2-LABEL: load_undef_v2f32_v2i32:
1435 ; SSE2:       ## %bb.0:
1436 ; SSE2-NEXT:    pand {{.*}}(%rip), %xmm0
1437 ; SSE2-NEXT:    pxor %xmm2, %xmm2
1438 ; SSE2-NEXT:    pcmpeqd %xmm0, %xmm2
1439 ; SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2]
1440 ; SSE2-NEXT:    pand %xmm2, %xmm1
1441 ; SSE2-NEXT:    movd %xmm1, %eax
1442 ; SSE2-NEXT:    testb $1, %al
1443 ; SSE2-NEXT:    ## implicit-def: $xmm0
1444 ; SSE2-NEXT:    je LBB12_2
1445 ; SSE2-NEXT:  ## %bb.1: ## %cond.load
1446 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1447 ; SSE2-NEXT:  LBB12_2: ## %else
1448 ; SSE2-NEXT:    pextrw $4, %xmm1, %eax
1449 ; SSE2-NEXT:    testb $1, %al
1450 ; SSE2-NEXT:    je LBB12_4
1451 ; SSE2-NEXT:  ## %bb.3: ## %cond.load1
1452 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1453 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
1454 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3]
1455 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1456 ; SSE2-NEXT:  LBB12_4: ## %else2
1457 ; SSE2-NEXT:    retq
1459 ; SSE42-LABEL: load_undef_v2f32_v2i32:
1460 ; SSE42:       ## %bb.0:
1461 ; SSE42-NEXT:    movdqa %xmm0, %xmm1
1462 ; SSE42-NEXT:    pxor %xmm2, %xmm2
1463 ; SSE42-NEXT:    pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7]
1464 ; SSE42-NEXT:    pcmpeqq %xmm2, %xmm0
1465 ; SSE42-NEXT:    pextrb $0, %xmm0, %eax
1466 ; SSE42-NEXT:    testb $1, %al
1467 ; SSE42-NEXT:    ## implicit-def: $xmm0
1468 ; SSE42-NEXT:    je LBB12_2
1469 ; SSE42-NEXT:  ## %bb.1: ## %cond.load
1470 ; SSE42-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1471 ; SSE42-NEXT:  LBB12_2: ## %else
1472 ; SSE42-NEXT:    pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7]
1473 ; SSE42-NEXT:    pcmpeqq %xmm2, %xmm1
1474 ; SSE42-NEXT:    pextrb $8, %xmm1, %eax
1475 ; SSE42-NEXT:    testb $1, %al
1476 ; SSE42-NEXT:    je LBB12_4
1477 ; SSE42-NEXT:  ## %bb.3: ## %cond.load1
1478 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]
1479 ; SSE42-NEXT:  LBB12_4: ## %else2
1480 ; SSE42-NEXT:    retq
1482 ; AVX1-LABEL: load_undef_v2f32_v2i32:
1483 ; AVX1:       ## %bb.0:
1484 ; AVX1-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1485 ; AVX1-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7]
1486 ; AVX1-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
1487 ; AVX1-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
1488 ; AVX1-NEXT:    vmaskmovps (%rdi), %xmm0, %xmm0
1489 ; AVX1-NEXT:    retq
1491 ; AVX2-LABEL: load_undef_v2f32_v2i32:
1492 ; AVX2:       ## %bb.0:
1493 ; AVX2-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1494 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1495 ; AVX2-NEXT:    vpcmpeqq %xmm1, %xmm0, %xmm0
1496 ; AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,2],zero,zero
1497 ; AVX2-NEXT:    vmaskmovps (%rdi), %xmm0, %xmm0
1498 ; AVX2-NEXT:    retq
1500 ; AVX512F-LABEL: load_undef_v2f32_v2i32:
1501 ; AVX512F:       ## %bb.0:
1502 ; AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1503 ; AVX512F-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1504 ; AVX512F-NEXT:    vptestnmq %zmm0, %zmm0, %k0
1505 ; AVX512F-NEXT:    kshiftlw $14, %k0, %k0
1506 ; AVX512F-NEXT:    kshiftrw $14, %k0, %k1
1507 ; AVX512F-NEXT:    vmovups (%rdi), %zmm0 {%k1} {z}
1508 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1509 ; AVX512F-NEXT:    vzeroupper
1510 ; AVX512F-NEXT:    retq
1512 ; AVX512VLBW-LABEL: load_undef_v2f32_v2i32:
1513 ; AVX512VLBW:       ## %bb.0:
1514 ; AVX512VLBW-NEXT:    vpxor %xmm1, %xmm1, %xmm1
1515 ; AVX512VLBW-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3]
1516 ; AVX512VLBW-NEXT:    vptestnmq %xmm0, %xmm0, %k1
1517 ; AVX512VLBW-NEXT:    vmovups (%rdi), %xmm0 {%k1} {z}
1518 ; AVX512VLBW-NEXT:    retq
1519   %mask = icmp eq <2 x i32> %trigger, zeroinitializer
1520   %res = call <2 x float> @llvm.masked.load.v2f32.p0v2f32(<2 x float>* %addr, i32 4, <2 x i1>%mask, <2 x float>undef)
1521   ret <2 x float> %res
1524 define <4 x float> @load_all_v4f32_v4i32(<4 x i32> %trigger, <4 x float>* %addr) {
1525 ; SSE-LABEL: load_all_v4f32_v4i32:
1526 ; SSE:       ## %bb.0:
1527 ; SSE-NEXT:    movups (%rdi), %xmm0
1528 ; SSE-NEXT:    retq
1530 ; AVX1OR2-LABEL: load_all_v4f32_v4i32:
1531 ; AVX1OR2:       ## %bb.0:
1532 ; AVX1OR2-NEXT:    vmovups (%rdi), %xmm0
1533 ; AVX1OR2-NEXT:    retq
1535 ; AVX512F-LABEL: load_all_v4f32_v4i32:
1536 ; AVX512F:       ## %bb.0:
1537 ; AVX512F-NEXT:    movw $15, %ax
1538 ; AVX512F-NEXT:    kmovw %eax, %k1
1539 ; AVX512F-NEXT:    vmovups (%rdi), %zmm0 {%k1} {z}
1540 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1541 ; AVX512F-NEXT:    vzeroupper
1542 ; AVX512F-NEXT:    retq
1544 ; AVX512VLBW-LABEL: load_all_v4f32_v4i32:
1545 ; AVX512VLBW:       ## %bb.0:
1546 ; AVX512VLBW-NEXT:    kxnorw %k0, %k0, %k1
1547 ; AVX512VLBW-NEXT:    vmovups (%rdi), %xmm0 {%k1} {z}
1548 ; AVX512VLBW-NEXT:    retq
1549   %mask = icmp eq <4 x i32> %trigger, zeroinitializer
1550   %res = call <4 x float> @llvm.masked.load.v4f32.p0v4f32(<4 x float>* %addr, i32 4, <4 x i1><i1 true, i1 true, i1 true, i1 true>, <4 x float>undef)
1551   ret <4 x float> %res
1554 ;;; Loads with Constant Masks - these should be optimized to use something other than a variable blend.
1556 ; 128-bit FP vectors are supported with AVX.
1558 define <4 x float> @mload_constmask_v4f32(<4 x float>* %addr, <4 x float> %dst) {
1559 ; SSE2-LABEL: mload_constmask_v4f32:
1560 ; SSE2:       ## %bb.0:
1561 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1562 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1563 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1564 ; SSE2-NEXT:    movaps %xmm0, %xmm1
1565 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0,2]
1566 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1567 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[2,0]
1568 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,0]
1569 ; SSE2-NEXT:    retq
1571 ; SSE42-LABEL: mload_constmask_v4f32:
1572 ; SSE42:       ## %bb.0:
1573 ; SSE42-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1574 ; SSE42-NEXT:    blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1575 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]
1576 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0]
1577 ; SSE42-NEXT:    retq
1579 ; AVX1OR2-LABEL: mload_constmask_v4f32:
1580 ; AVX1OR2:       ## %bb.0:
1581 ; AVX1OR2-NEXT:    vblendps {{.*#+}} xmm0 = mem[0],xmm0[1],mem[2,3]
1582 ; AVX1OR2-NEXT:    retq
1584 ; AVX512F-LABEL: mload_constmask_v4f32:
1585 ; AVX512F:       ## %bb.0:
1586 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
1587 ; AVX512F-NEXT:    movw $13, %ax
1588 ; AVX512F-NEXT:    kmovw %eax, %k1
1589 ; AVX512F-NEXT:    vmovups (%rdi), %zmm0 {%k1}
1590 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1591 ; AVX512F-NEXT:    vzeroupper
1592 ; AVX512F-NEXT:    retq
1594 ; AVX512VLBW-LABEL: mload_constmask_v4f32:
1595 ; AVX512VLBW:       ## %bb.0:
1596 ; AVX512VLBW-NEXT:    movb $13, %al
1597 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1598 ; AVX512VLBW-NEXT:    vmovups (%rdi), %xmm0 {%k1}
1599 ; AVX512VLBW-NEXT:    retq
1600   %res = call <4 x float> @llvm.masked.load.v4f32.p0v4f32(<4 x float>* %addr, i32 4, <4 x i1> <i1 1, i1 0, i1 1, i1 1>, <4 x float> %dst)
1601   ret <4 x float> %res
1604 define <2 x double> @mload_constmask_v2f64(<2 x double>* %addr, <2 x double> %dst) {
1605 ; SSE-LABEL: mload_constmask_v2f64:
1606 ; SSE:       ## %bb.0:
1607 ; SSE-NEXT:    movhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
1608 ; SSE-NEXT:    retq
1610 ; AVX-LABEL: mload_constmask_v2f64:
1611 ; AVX:       ## %bb.0:
1612 ; AVX-NEXT:    vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0]
1613 ; AVX-NEXT:    retq
1614   %res = call <2 x double> @llvm.masked.load.v2f64.p0v2f64(<2 x double>* %addr, i32 4, <2 x i1> <i1 0, i1 1>, <2 x double> %dst)
1615   ret <2 x double> %res
1618 ; 128-bit integer vectors are supported with AVX2.
1620 define <4 x i32> @mload_constmask_v4i32(<4 x i32>* %addr, <4 x i32> %dst) {
1621 ; SSE2-LABEL: mload_constmask_v4i32:
1622 ; SSE2:       ## %bb.0:
1623 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1624 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0]
1625 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1626 ; SSE2-NEXT:    movaps %xmm1, %xmm2
1627 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm0[0,2]
1628 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1629 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm2[2,0]
1630 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,0]
1631 ; SSE2-NEXT:    movaps %xmm1, %xmm0
1632 ; SSE2-NEXT:    retq
1634 ; SSE42-LABEL: mload_constmask_v4i32:
1635 ; SSE42:       ## %bb.0:
1636 ; SSE42-NEXT:    pinsrd $1, 4(%rdi), %xmm0
1637 ; SSE42-NEXT:    pinsrd $2, 8(%rdi), %xmm0
1638 ; SSE42-NEXT:    pinsrd $3, 12(%rdi), %xmm0
1639 ; SSE42-NEXT:    retq
1641 ; AVX1-LABEL: mload_constmask_v4i32:
1642 ; AVX1:       ## %bb.0:
1643 ; AVX1-NEXT:    vmovaps {{.*#+}} xmm1 = [0,4294967295,4294967295,4294967295]
1644 ; AVX1-NEXT:    vmaskmovps (%rdi), %xmm1, %xmm1
1645 ; AVX1-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1646 ; AVX1-NEXT:    retq
1648 ; AVX2-LABEL: mload_constmask_v4i32:
1649 ; AVX2:       ## %bb.0:
1650 ; AVX2-NEXT:    vmovdqa {{.*#+}} xmm1 = [0,4294967295,4294967295,4294967295]
1651 ; AVX2-NEXT:    vpmaskmovd (%rdi), %xmm1, %xmm1
1652 ; AVX2-NEXT:    vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3]
1653 ; AVX2-NEXT:    retq
1655 ; AVX512F-LABEL: mload_constmask_v4i32:
1656 ; AVX512F:       ## %bb.0:
1657 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 def $zmm0
1658 ; AVX512F-NEXT:    movw $14, %ax
1659 ; AVX512F-NEXT:    kmovw %eax, %k1
1660 ; AVX512F-NEXT:    vmovdqu32 (%rdi), %zmm0 {%k1}
1661 ; AVX512F-NEXT:    ## kill: def $xmm0 killed $xmm0 killed $zmm0
1662 ; AVX512F-NEXT:    vzeroupper
1663 ; AVX512F-NEXT:    retq
1665 ; AVX512VLBW-LABEL: mload_constmask_v4i32:
1666 ; AVX512VLBW:       ## %bb.0:
1667 ; AVX512VLBW-NEXT:    movb $14, %al
1668 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1669 ; AVX512VLBW-NEXT:    vmovdqu32 (%rdi), %xmm0 {%k1}
1670 ; AVX512VLBW-NEXT:    retq
1671   %res = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %addr, i32 4, <4 x i1> <i1 0, i1 1, i1 1, i1 1>, <4 x i32> %dst)
1672   ret <4 x i32> %res
1675 define <2 x i64> @mload_constmask_v2i64(<2 x i64>* %addr, <2 x i64> %dst) {
1676 ; SSE2-LABEL: mload_constmask_v2i64:
1677 ; SSE2:       ## %bb.0:
1678 ; SSE2-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
1679 ; SSE2-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1680 ; SSE2-NEXT:    retq
1682 ; SSE42-LABEL: mload_constmask_v2i64:
1683 ; SSE42:       ## %bb.0:
1684 ; SSE42-NEXT:    pinsrq $1, 8(%rdi), %xmm0
1685 ; SSE42-NEXT:    retq
1687 ; AVX-LABEL: mload_constmask_v2i64:
1688 ; AVX:       ## %bb.0:
1689 ; AVX-NEXT:    vpinsrq $1, 8(%rdi), %xmm0, %xmm0
1690 ; AVX-NEXT:    retq
1691   %res = call <2 x i64> @llvm.masked.load.v2i64.p0v2i64(<2 x i64>* %addr, i32 4, <2 x i1> <i1 0, i1 1>, <2 x i64> %dst)
1692   ret <2 x i64> %res
1695 ; 256-bit FP vectors are supported with AVX.
1697 define <8 x float> @mload_constmask_v8f32(<8 x float>* %addr, <8 x float> %dst) {
1698 ; SSE2-LABEL: mload_constmask_v8f32:
1699 ; SSE2:       ## %bb.0:
1700 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1701 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1702 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm3[0,0]
1703 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1704 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[3,0]
1705 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm3[0,2]
1706 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1707 ; SSE2-NEXT:    retq
1709 ; SSE42-LABEL: mload_constmask_v8f32:
1710 ; SSE42:       ## %bb.0:
1711 ; SSE42-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1712 ; SSE42-NEXT:    blendps {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3]
1713 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3]
1714 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]
1715 ; SSE42-NEXT:    retq
1717 ; AVX1OR2-LABEL: mload_constmask_v8f32:
1718 ; AVX1OR2:       ## %bb.0:
1719 ; AVX1OR2-NEXT:    vmovaps {{.*#+}} ymm1 = [4294967295,4294967295,4294967295,0,0,0,0,0]
1720 ; AVX1OR2-NEXT:    vmaskmovps (%rdi), %ymm1, %ymm1
1721 ; AVX1OR2-NEXT:    vblendps {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3,4,5,6,7]
1722 ; AVX1OR2-NEXT:    retq
1724 ; AVX512F-LABEL: mload_constmask_v8f32:
1725 ; AVX512F:       ## %bb.0:
1726 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
1727 ; AVX512F-NEXT:    movw $7, %ax
1728 ; AVX512F-NEXT:    kmovw %eax, %k1
1729 ; AVX512F-NEXT:    vmovups (%rdi), %zmm0 {%k1}
1730 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1731 ; AVX512F-NEXT:    retq
1733 ; AVX512VLBW-LABEL: mload_constmask_v8f32:
1734 ; AVX512VLBW:       ## %bb.0:
1735 ; AVX512VLBW-NEXT:    movb $7, %al
1736 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1737 ; AVX512VLBW-NEXT:    vmovups (%rdi), %ymm0 {%k1}
1738 ; AVX512VLBW-NEXT:    retq
1739   %res = call <8 x float> @llvm.masked.load.v8f32.p0v8f32(<8 x float>* %addr, i32 4, <8 x i1> <i1 1, i1 1, i1 1, i1 0, i1 0, i1 0, i1 0, i1 0>, <8 x float> %dst)
1740   ret <8 x float> %res
1743 define <4 x double> @mload_constmask_v4f64(<4 x double>* %addr, <4 x double> %dst) {
1744 ; SSE-LABEL: mload_constmask_v4f64:
1745 ; SSE:       ## %bb.0:
1746 ; SSE-NEXT:    movups (%rdi), %xmm0
1747 ; SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
1748 ; SSE-NEXT:    retq
1750 ; AVX1OR2-LABEL: mload_constmask_v4f64:
1751 ; AVX1OR2:       ## %bb.0:
1752 ; AVX1OR2-NEXT:    vmovapd {{.*#+}} ymm1 = [18446744073709551615,18446744073709551615,18446744073709551615,0]
1753 ; AVX1OR2-NEXT:    vmaskmovpd (%rdi), %ymm1, %ymm1
1754 ; AVX1OR2-NEXT:    vblendpd {{.*#+}} ymm0 = ymm1[0,1,2],ymm0[3]
1755 ; AVX1OR2-NEXT:    retq
1757 ; AVX512F-LABEL: mload_constmask_v4f64:
1758 ; AVX512F:       ## %bb.0:
1759 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
1760 ; AVX512F-NEXT:    movb $7, %al
1761 ; AVX512F-NEXT:    kmovw %eax, %k1
1762 ; AVX512F-NEXT:    vmovupd (%rdi), %zmm0 {%k1}
1763 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1764 ; AVX512F-NEXT:    retq
1766 ; AVX512VLBW-LABEL: mload_constmask_v4f64:
1767 ; AVX512VLBW:       ## %bb.0:
1768 ; AVX512VLBW-NEXT:    movb $7, %al
1769 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1770 ; AVX512VLBW-NEXT:    vmovupd (%rdi), %ymm0 {%k1}
1771 ; AVX512VLBW-NEXT:    retq
1772   %res = call <4 x double> @llvm.masked.load.v4f64.p0v4f64(<4 x double>* %addr, i32 4, <4 x i1> <i1 1, i1 1, i1 1, i1 0>, <4 x double> %dst)
1773   ret <4 x double> %res
1776 ; 256-bit integer vectors are supported with AVX2.
1778 define <8 x i32> @mload_constmask_v8i32(<8 x i32>* %addr, <8 x i32> %dst) {
1779 ; SSE2-LABEL: mload_constmask_v8i32:
1780 ; SSE2:       ## %bb.0:
1781 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1782 ; SSE2-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
1783 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[0,0],xmm3[0,0]
1784 ; SSE2-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
1785 ; SSE2-NEXT:    shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[3,0]
1786 ; SSE2-NEXT:    shufps {{.*#+}} xmm2 = xmm2[2,0],xmm3[0,2]
1787 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1788 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0]
1789 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0]
1790 ; SSE2-NEXT:    movaps %xmm2, %xmm0
1791 ; SSE2-NEXT:    retq
1793 ; SSE42-LABEL: mload_constmask_v8i32:
1794 ; SSE42:       ## %bb.0:
1795 ; SSE42-NEXT:    pinsrd $0, (%rdi), %xmm0
1796 ; SSE42-NEXT:    pinsrd $1, 4(%rdi), %xmm0
1797 ; SSE42-NEXT:    pinsrd $2, 8(%rdi), %xmm0
1798 ; SSE42-NEXT:    pinsrd $3, 28(%rdi), %xmm1
1799 ; SSE42-NEXT:    retq
1801 ; AVX1OR2-LABEL: mload_constmask_v8i32:
1802 ; AVX1OR2:       ## %bb.0:
1803 ; AVX1OR2-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1,2],ymm0[3,4,5,6],mem[7]
1804 ; AVX1OR2-NEXT:    retq
1806 ; AVX512F-LABEL: mload_constmask_v8i32:
1807 ; AVX512F:       ## %bb.0:
1808 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
1809 ; AVX512F-NEXT:    movw $135, %ax
1810 ; AVX512F-NEXT:    kmovw %eax, %k1
1811 ; AVX512F-NEXT:    vmovdqu32 (%rdi), %zmm0 {%k1}
1812 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1813 ; AVX512F-NEXT:    retq
1815 ; AVX512VLBW-LABEL: mload_constmask_v8i32:
1816 ; AVX512VLBW:       ## %bb.0:
1817 ; AVX512VLBW-NEXT:    movb $-121, %al
1818 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1819 ; AVX512VLBW-NEXT:    vmovdqu32 (%rdi), %ymm0 {%k1}
1820 ; AVX512VLBW-NEXT:    retq
1821   %res = call <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>* %addr, i32 4, <8 x i1> <i1 1, i1 1, i1 1, i1 0, i1 0, i1 0, i1 0, i1 1>, <8 x i32> %dst)
1822   ret <8 x i32> %res
1825 define <4 x i64> @mload_constmask_v4i64(<4 x i64>* %addr, <4 x i64> %dst) {
1826 ; SSE2-LABEL: mload_constmask_v4i64:
1827 ; SSE2:       ## %bb.0:
1828 ; SSE2-NEXT:    movlpd {{.*#+}} xmm0 = mem[0],xmm0[1]
1829 ; SSE2-NEXT:    movsd {{.*#+}} xmm2 = mem[0],zero
1830 ; SSE2-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
1831 ; SSE2-NEXT:    retq
1833 ; SSE42-LABEL: mload_constmask_v4i64:
1834 ; SSE42:       ## %bb.0:
1835 ; SSE42-NEXT:    pinsrq $0, (%rdi), %xmm0
1836 ; SSE42-NEXT:    pinsrq $1, 24(%rdi), %xmm1
1837 ; SSE42-NEXT:    retq
1839 ; AVX1OR2-LABEL: mload_constmask_v4i64:
1840 ; AVX1OR2:       ## %bb.0:
1841 ; AVX1OR2-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1],ymm0[2,3,4,5],mem[6,7]
1842 ; AVX1OR2-NEXT:    retq
1844 ; AVX512F-LABEL: mload_constmask_v4i64:
1845 ; AVX512F:       ## %bb.0:
1846 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 def $zmm0
1847 ; AVX512F-NEXT:    movb $9, %al
1848 ; AVX512F-NEXT:    kmovw %eax, %k1
1849 ; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0 {%k1}
1850 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1851 ; AVX512F-NEXT:    retq
1853 ; AVX512VLBW-LABEL: mload_constmask_v4i64:
1854 ; AVX512VLBW:       ## %bb.0:
1855 ; AVX512VLBW-NEXT:    movb $9, %al
1856 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1857 ; AVX512VLBW-NEXT:    vmovdqu64 (%rdi), %ymm0 {%k1}
1858 ; AVX512VLBW-NEXT:    retq
1859   %res = call <4 x i64> @llvm.masked.load.v4i64.p0v4i64(<4 x i64>* %addr, i32 4, <4 x i1> <i1 1, i1 0, i1 0, i1 1>, <4 x i64> %dst)
1860   ret <4 x i64> %res
1863 ; 512-bit FP vectors are supported with AVX512.
1865 define <8 x double> @mload_constmask_v8f64(<8 x double>* %addr, <8 x double> %dst) {
1866 ; SSE-LABEL: mload_constmask_v8f64:
1867 ; SSE:       ## %bb.0:
1868 ; SSE-NEXT:    movups (%rdi), %xmm0
1869 ; SSE-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
1870 ; SSE-NEXT:    movhpd {{.*#+}} xmm3 = xmm3[0],mem[0]
1871 ; SSE-NEXT:    retq
1873 ; AVX1OR2-LABEL: mload_constmask_v8f64:
1874 ; AVX1OR2:       ## %bb.0:
1875 ; AVX1OR2-NEXT:    vblendps {{.*#+}} ymm0 = mem[0,1,2,3,4,5],ymm0[6,7]
1876 ; AVX1OR2-NEXT:    vblendps {{.*#+}} ymm1 = ymm1[0,1,2,3,4,5],mem[6,7]
1877 ; AVX1OR2-NEXT:    retq
1879 ; AVX512F-LABEL: mload_constmask_v8f64:
1880 ; AVX512F:       ## %bb.0:
1881 ; AVX512F-NEXT:    movb $-121, %al
1882 ; AVX512F-NEXT:    kmovw %eax, %k1
1883 ; AVX512F-NEXT:    vmovupd (%rdi), %zmm0 {%k1}
1884 ; AVX512F-NEXT:    retq
1886 ; AVX512VLBW-LABEL: mload_constmask_v8f64:
1887 ; AVX512VLBW:       ## %bb.0:
1888 ; AVX512VLBW-NEXT:    movb $-121, %al
1889 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1890 ; AVX512VLBW-NEXT:    vmovupd (%rdi), %zmm0 {%k1}
1891 ; AVX512VLBW-NEXT:    retq
1892   %res = call <8 x double> @llvm.masked.load.v8f64.p0v8f64(<8 x double>* %addr, i32 4, <8 x i1> <i1 1, i1 1, i1 1, i1 0, i1 0, i1 0, i1 0, i1 1>, <8 x double> %dst)
1893   ret <8 x double> %res
1896 ; If the pass-through operand is undef, no blend is needed.
1898 define <4 x double> @mload_constmask_v4f64_undef_passthrough(<4 x double>* %addr) {
1899 ; SSE-LABEL: mload_constmask_v4f64_undef_passthrough:
1900 ; SSE:       ## %bb.0:
1901 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
1902 ; SSE-NEXT:    movups (%rdi), %xmm0
1903 ; SSE-NEXT:    retq
1905 ; AVX1OR2-LABEL: mload_constmask_v4f64_undef_passthrough:
1906 ; AVX1OR2:       ## %bb.0:
1907 ; AVX1OR2-NEXT:    vmovapd {{.*#+}} ymm0 = [18446744073709551615,18446744073709551615,18446744073709551615,0]
1908 ; AVX1OR2-NEXT:    vmaskmovpd (%rdi), %ymm0, %ymm0
1909 ; AVX1OR2-NEXT:    retq
1911 ; AVX512F-LABEL: mload_constmask_v4f64_undef_passthrough:
1912 ; AVX512F:       ## %bb.0:
1913 ; AVX512F-NEXT:    movb $7, %al
1914 ; AVX512F-NEXT:    kmovw %eax, %k1
1915 ; AVX512F-NEXT:    vmovupd (%rdi), %zmm0 {%k1} {z}
1916 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1917 ; AVX512F-NEXT:    retq
1919 ; AVX512VLBW-LABEL: mload_constmask_v4f64_undef_passthrough:
1920 ; AVX512VLBW:       ## %bb.0:
1921 ; AVX512VLBW-NEXT:    movb $7, %al
1922 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1923 ; AVX512VLBW-NEXT:    vmovupd (%rdi), %ymm0 {%k1} {z}
1924 ; AVX512VLBW-NEXT:    retq
1925   %res = call <4 x double> @llvm.masked.load.v4f64.p0v4f64(<4 x double>* %addr, i32 4, <4 x i1> <i1 1, i1 1, i1 1, i1 0>, <4 x double> undef)
1926   ret <4 x double> %res
1929 define <4 x i64> @mload_constmask_v4i64_undef_passthrough(<4 x i64>* %addr) {
1930 ; SSE-LABEL: mload_constmask_v4i64_undef_passthrough:
1931 ; SSE:       ## %bb.0:
1932 ; SSE-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
1933 ; SSE-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
1934 ; SSE-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1]
1935 ; SSE-NEXT:    retq
1937 ; AVX1-LABEL: mload_constmask_v4i64_undef_passthrough:
1938 ; AVX1:       ## %bb.0:
1939 ; AVX1-NEXT:    vmovapd {{.*#+}} ymm0 = [0,18446744073709551615,18446744073709551615,0]
1940 ; AVX1-NEXT:    vmaskmovpd (%rdi), %ymm0, %ymm0
1941 ; AVX1-NEXT:    retq
1943 ; AVX2-LABEL: mload_constmask_v4i64_undef_passthrough:
1944 ; AVX2:       ## %bb.0:
1945 ; AVX2-NEXT:    vmovdqa {{.*#+}} ymm0 = [0,18446744073709551615,18446744073709551615,0]
1946 ; AVX2-NEXT:    vpmaskmovq (%rdi), %ymm0, %ymm0
1947 ; AVX2-NEXT:    retq
1949 ; AVX512F-LABEL: mload_constmask_v4i64_undef_passthrough:
1950 ; AVX512F:       ## %bb.0:
1951 ; AVX512F-NEXT:    movb $6, %al
1952 ; AVX512F-NEXT:    kmovw %eax, %k1
1953 ; AVX512F-NEXT:    vmovdqu64 (%rdi), %zmm0 {%k1} {z}
1954 ; AVX512F-NEXT:    ## kill: def $ymm0 killed $ymm0 killed $zmm0
1955 ; AVX512F-NEXT:    retq
1957 ; AVX512VLBW-LABEL: mload_constmask_v4i64_undef_passthrough:
1958 ; AVX512VLBW:       ## %bb.0:
1959 ; AVX512VLBW-NEXT:    movb $6, %al
1960 ; AVX512VLBW-NEXT:    kmovd %eax, %k1
1961 ; AVX512VLBW-NEXT:    vmovdqu64 (%rdi), %ymm0 {%k1} {z}
1962 ; AVX512VLBW-NEXT:    retq
1963   %res = call <4 x i64> @llvm.masked.load.v4i64.p0v4i64(<4 x i64>* %addr, i32 4, <4 x i1> <i1 0, i1 1, i1 1, i1 0>, <4 x i64> undef)
1964   ret <4 x i64> %res
1967 ;  When only one element of the mask is set, reduce to a scalar load.
1969 define <4 x i32> @load_one_mask_bit_set1(<4 x i32>* %addr, <4 x i32> %val) {
1970 ; SSE2-LABEL: load_one_mask_bit_set1:
1971 ; SSE2:       ## %bb.0:
1972 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1973 ; SSE2-NEXT:    movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3]
1974 ; SSE2-NEXT:    retq
1976 ; SSE42-LABEL: load_one_mask_bit_set1:
1977 ; SSE42:       ## %bb.0:
1978 ; SSE42-NEXT:    pinsrd $0, (%rdi), %xmm0
1979 ; SSE42-NEXT:    retq
1981 ; AVX-LABEL: load_one_mask_bit_set1:
1982 ; AVX:       ## %bb.0:
1983 ; AVX-NEXT:    vpinsrd $0, (%rdi), %xmm0, %xmm0
1984 ; AVX-NEXT:    retq
1985   %res = call <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>* %addr, i32 4, <4 x i1><i1 true, i1 false, i1 false, i1 false>, <4 x i32> %val)
1986   ret <4 x i32> %res
1989 ; Choose a different element to show that the correct address offset is produced.
1991 define <4 x float> @load_one_mask_bit_set2(<4 x float>* %addr, <4 x float> %val) {
1992 ; SSE2-LABEL: load_one_mask_bit_set2:
1993 ; SSE2:       ## %bb.0:
1994 ; SSE2-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1995 ; SSE2-NEXT:    shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0]
1996 ; SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
1997 ; SSE2-NEXT:    retq
1999 ; SSE42-LABEL: load_one_mask_bit_set2:
2000 ; SSE42:       ## %bb.0:
2001 ; SSE42-NEXT:    insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]
2002 ; SSE42-NEXT:    retq
2004 ; AVX-LABEL: load_one_mask_bit_set2:
2005 ; AVX:       ## %bb.0:
2006 ; AVX-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3]
2007 ; AVX-NEXT:    retq
2008   %res = call <4 x float> @llvm.masked.load.v4f32.p0v4f32(<4 x float>* %addr, i32 4, <4 x i1><i1 false, i1 false, i1 true, i1 false>, <4 x float> %val)
2009   ret <4 x float> %res
2012 ; Choose a different scalar type and a high element of a 256-bit vector because AVX doesn't support those evenly.
2014 define <4 x i64> @load_one_mask_bit_set3(<4 x i64>* %addr, <4 x i64> %val) {
2015 ; SSE2-LABEL: load_one_mask_bit_set3:
2016 ; SSE2:       ## %bb.0:
2017 ; SSE2-NEXT:    movlpd {{.*#+}} xmm1 = mem[0],xmm1[1]
2018 ; SSE2-NEXT:    retq
2020 ; SSE42-LABEL: load_one_mask_bit_set3:
2021 ; SSE42:       ## %bb.0:
2022 ; SSE42-NEXT:    pinsrq $0, 16(%rdi), %xmm1
2023 ; SSE42-NEXT:    retq
2025 ; AVX1-LABEL: load_one_mask_bit_set3:
2026 ; AVX1:       ## %bb.0:
2027 ; AVX1-NEXT:    vextractf128 $1, %ymm0, %xmm1
2028 ; AVX1-NEXT:    vpinsrq $0, 16(%rdi), %xmm1, %xmm1
2029 ; AVX1-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2030 ; AVX1-NEXT:    retq
2032 ; AVX2-LABEL: load_one_mask_bit_set3:
2033 ; AVX2:       ## %bb.0:
2034 ; AVX2-NEXT:    vextracti128 $1, %ymm0, %xmm1
2035 ; AVX2-NEXT:    vpinsrq $0, 16(%rdi), %xmm1, %xmm1
2036 ; AVX2-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2037 ; AVX2-NEXT:    retq
2039 ; AVX512-LABEL: load_one_mask_bit_set3:
2040 ; AVX512:       ## %bb.0:
2041 ; AVX512-NEXT:    vextracti128 $1, %ymm0, %xmm1
2042 ; AVX512-NEXT:    vpinsrq $0, 16(%rdi), %xmm1, %xmm1
2043 ; AVX512-NEXT:    vinserti128 $1, %xmm1, %ymm0, %ymm0
2044 ; AVX512-NEXT:    retq
2045   %res = call <4 x i64> @llvm.masked.load.v4i64.p0v4i64(<4 x i64>* %addr, i32 4, <4 x i1><i1 false, i1 false, i1 true, i1 false>, <4 x i64> %val)
2046   ret <4 x i64> %res
2049 ; Choose a different scalar type and a high element of a 256-bit vector because AVX doesn't support those evenly.
2051 define <4 x double> @load_one_mask_bit_set4(<4 x double>* %addr, <4 x double> %val) {
2052 ; SSE-LABEL: load_one_mask_bit_set4:
2053 ; SSE:       ## %bb.0:
2054 ; SSE-NEXT:    movhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
2055 ; SSE-NEXT:    retq
2057 ; AVX-LABEL: load_one_mask_bit_set4:
2058 ; AVX:       ## %bb.0:
2059 ; AVX-NEXT:    vextractf128 $1, %ymm0, %xmm1
2060 ; AVX-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
2061 ; AVX-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
2062 ; AVX-NEXT:    retq
2063   %res = call <4 x double> @llvm.masked.load.v4f64.p0v4f64(<4 x double>* %addr, i32 4, <4 x i1><i1 false, i1 false, i1 false, i1 true>, <4 x double> %val)
2064   ret <4 x double> %res
2067 ; Try a 512-bit vector to make sure AVX doesn't die and AVX512 works as expected.
2069 define <8 x double> @load_one_mask_bit_set5(<8 x double>* %addr, <8 x double> %val) {
2070 ; SSE-LABEL: load_one_mask_bit_set5:
2071 ; SSE:       ## %bb.0:
2072 ; SSE-NEXT:    movhpd {{.*#+}} xmm3 = xmm3[0],mem[0]
2073 ; SSE-NEXT:    retq
2075 ; AVX1OR2-LABEL: load_one_mask_bit_set5:
2076 ; AVX1OR2:       ## %bb.0:
2077 ; AVX1OR2-NEXT:    vextractf128 $1, %ymm1, %xmm2
2078 ; AVX1OR2-NEXT:    vmovhpd {{.*#+}} xmm2 = xmm2[0],mem[0]
2079 ; AVX1OR2-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2080 ; AVX1OR2-NEXT:    retq
2082 ; AVX512-LABEL: load_one_mask_bit_set5:
2083 ; AVX512:       ## %bb.0:
2084 ; AVX512-NEXT:    vextractf32x4 $3, %zmm0, %xmm1
2085 ; AVX512-NEXT:    vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0]
2086 ; AVX512-NEXT:    vinsertf32x4 $3, %xmm1, %zmm0, %zmm0
2087 ; AVX512-NEXT:    retq
2088   %res = call <8 x double> @llvm.masked.load.v8f64.p0v8f64(<8 x double>* %addr, i32 4, <8 x i1><i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 true>, <8 x double> %val)
2089   ret <8 x double> %res
2092 define i32 @pr38986(i1 %c, i32* %p) {
2093 ; SSE-LABEL: pr38986:
2094 ; SSE:       ## %bb.0:
2095 ; SSE-NEXT:    testb $1, %dil
2096 ; SSE-NEXT:    ## implicit-def: $eax
2097 ; SSE-NEXT:    je LBB30_2
2098 ; SSE-NEXT:  ## %bb.1: ## %cond.load
2099 ; SSE-NEXT:    movl (%rsi), %eax
2100 ; SSE-NEXT:  LBB30_2: ## %else
2101 ; SSE-NEXT:    retq
2103 ; AVX-LABEL: pr38986:
2104 ; AVX:       ## %bb.0:
2105 ; AVX-NEXT:    testb $1, %dil
2106 ; AVX-NEXT:    ## implicit-def: $eax
2107 ; AVX-NEXT:    je LBB30_2
2108 ; AVX-NEXT:  ## %bb.1: ## %cond.load
2109 ; AVX-NEXT:    movl (%rsi), %eax
2110 ; AVX-NEXT:  LBB30_2: ## %else
2111 ; AVX-NEXT:    retq
2112  %vc = insertelement <1 x i1> undef, i1 %c, i32 0
2113  %vp = bitcast i32* %p to <1 x i32>*
2114  %L = call <1 x i32> @llvm.masked.load.v1i32.p0v1i32 (<1 x i32>* %vp, i32 4, <1 x i1> %vc, <1 x i32> undef)
2115  %ret = bitcast <1 x i32> %L to i32
2116  ret i32 %ret
2118 declare <1 x i32>  @llvm.masked.load.v1i32.p0v1i32 (<1 x i32>*, i32, <1 x i1>, <1 x i32>)
2121 declare <4 x i32> @llvm.masked.load.v4i32.p0v4i32(<4 x i32>*, i32, <4 x i1>, <4 x i32>)
2122 declare <2 x i32> @llvm.masked.load.v2i32.p0v2i32(<2 x i32>*, i32, <2 x i1>, <2 x i32>)
2123 declare <4 x i64> @llvm.masked.load.v4i64.p0v4i64(<4 x i64>*, i32, <4 x i1>, <4 x i64>)
2124 declare <2 x i64> @llvm.masked.load.v2i64.p0v2i64(<2 x i64>*, i32, <2 x i1>, <2 x i64>)
2125 declare <8 x float> @llvm.masked.load.v8f32.p0v8f32(<8 x float>*, i32, <8 x i1>, <8 x float>)
2126 declare <8 x i32> @llvm.masked.load.v8i32.p0v8i32(<8 x i32>*, i32, <8 x i1>, <8 x i32>)
2127 declare <4 x float> @llvm.masked.load.v4f32.p0v4f32(<4 x float>*, i32, <4 x i1>, <4 x float>)
2128 declare <2 x float> @llvm.masked.load.v2f32.p0v2f32(<2 x float>*, i32, <2 x i1>, <2 x float>)
2129 declare <8 x double> @llvm.masked.load.v8f64.p0v8f64(<8 x double>*, i32, <8 x i1>, <8 x double>)
2130 declare <4 x double> @llvm.masked.load.v4f64.p0v4f64(<4 x double>*, i32, <4 x i1>, <4 x double>)
2131 declare <2 x double> @llvm.masked.load.v2f64.p0v2f64(<2 x double>*, i32, <2 x i1>, <2 x double>)
2132 declare <1 x double> @llvm.masked.load.v1f64.p0v1f64(<1 x double>*, i32, <1 x i1>, <1 x double>)