[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512fp16-mov.ll
blob0b384a4d10c3a5937a8cd655fcd19f3592417913
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512fp16 | FileCheck %s --check-prefixes=CHECK,X64
3 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512fp16 | FileCheck %s --check-prefixes=CHECK,X86
5 define <8 x half> @broadcastph128(half* %x) {
6 ; X64-LABEL: broadcastph128:
7 ; X64:       # %bb.0:
8 ; X64-NEXT:    vpbroadcastw (%rdi), %xmm0
9 ; X64-NEXT:    retq
11 ; X86-LABEL: broadcastph128:
12 ; X86:       # %bb.0:
13 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
14 ; X86-NEXT:    vpbroadcastw (%eax), %xmm0
15 ; X86-NEXT:    retl
16   %l1 = load half, half* %x, align 2
17   %vec = insertelement <8 x half> undef, half %l1, i32 0
18   %res = shufflevector <8 x half> %vec, <8 x half> undef, <8 x i32> zeroinitializer
19   ret <8 x half> %res
22 define <16 x half> @broadcastph256(half* %x) {
23 ; X64-LABEL: broadcastph256:
24 ; X64:       # %bb.0:
25 ; X64-NEXT:    vpbroadcastw (%rdi), %ymm0
26 ; X64-NEXT:    retq
28 ; X86-LABEL: broadcastph256:
29 ; X86:       # %bb.0:
30 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
31 ; X86-NEXT:    vpbroadcastw (%eax), %ymm0
32 ; X86-NEXT:    retl
33   %l1 = load half, half* %x, align 2
34   %vec = insertelement <16 x half> undef, half %l1, i32 0
35   %res = shufflevector <16 x half> %vec, <16 x half> undef, <16 x i32> zeroinitializer
36   ret <16 x half> %res
39 define <32 x half> @broadcastph512(half* %x) {
40 ; X64-LABEL: broadcastph512:
41 ; X64:       # %bb.0:
42 ; X64-NEXT:    vpbroadcastw (%rdi), %zmm0
43 ; X64-NEXT:    retq
45 ; X86-LABEL: broadcastph512:
46 ; X86:       # %bb.0:
47 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
48 ; X86-NEXT:    vpbroadcastw (%eax), %zmm0
49 ; X86-NEXT:    retl
50   %l1 = load half, half* %x, align 2
51   %vec = insertelement <32 x half> undef, half %l1, i32 0
52   %res = shufflevector <32 x half> %vec, <32 x half> undef, <32 x i32> zeroinitializer
53   ret <32 x half> %res
56 define <8 x half> @broadcastph128_scalar(half %x) {
57 ; X64-LABEL: broadcastph128_scalar:
58 ; X64:       # %bb.0:
59 ; X64-NEXT:    vpbroadcastw %xmm0, %xmm0
60 ; X64-NEXT:    retq
62 ; X86-LABEL: broadcastph128_scalar:
63 ; X86:       # %bb.0:
64 ; X86-NEXT:    vpbroadcastw {{[0-9]+}}(%esp), %xmm0
65 ; X86-NEXT:    retl
66   %vec = insertelement <8 x half> undef, half %x, i32 0
67   %res = shufflevector <8 x half> %vec, <8 x half> undef, <8 x i32> zeroinitializer
68   ret <8 x half> %res
71 define <16 x half> @broadcastph256_scalar(half %x) {
72 ; X64-LABEL: broadcastph256_scalar:
73 ; X64:       # %bb.0:
74 ; X64-NEXT:    vpbroadcastw %xmm0, %ymm0
75 ; X64-NEXT:    retq
77 ; X86-LABEL: broadcastph256_scalar:
78 ; X86:       # %bb.0:
79 ; X86-NEXT:    vpbroadcastw {{[0-9]+}}(%esp), %ymm0
80 ; X86-NEXT:    retl
81   %vec = insertelement <16 x half> undef, half %x, i32 0
82   %res = shufflevector <16 x half> %vec, <16 x half> undef, <16 x i32> zeroinitializer
83   ret <16 x half> %res
86 define <32 x half> @broadcastph512_scalar(half %x) {
87 ; X64-LABEL: broadcastph512_scalar:
88 ; X64:       # %bb.0:
89 ; X64-NEXT:    vpbroadcastw %xmm0, %zmm0
90 ; X64-NEXT:    retq
92 ; X86-LABEL: broadcastph512_scalar:
93 ; X86:       # %bb.0:
94 ; X86-NEXT:    vpbroadcastw {{[0-9]+}}(%esp), %zmm0
95 ; X86-NEXT:    retl
96   %vec = insertelement <32 x half> undef, half %x, i32 0
97   %res = shufflevector <32 x half> %vec, <32 x half> undef, <32 x i32> zeroinitializer
98   ret <32 x half> %res
101 define <8 x half> @broadcastph128_reg(<8 x half> %x) {
102 ; CHECK-LABEL: broadcastph128_reg:
103 ; CHECK:       # %bb.0:
104 ; CHECK-NEXT:    vpbroadcastw %xmm0, %xmm0
105 ; CHECK-NEXT:    ret{{[l|q]}}
106   %res = shufflevector <8 x half> %x, <8 x half> undef, <8 x i32> zeroinitializer
107   ret <8 x half> %res
110 define <16 x half> @broadcastph256_reg(<16 x half> %x) {
111 ; CHECK-LABEL: broadcastph256_reg:
112 ; CHECK:       # %bb.0:
113 ; CHECK-NEXT:    vpbroadcastw %xmm0, %ymm0
114 ; CHECK-NEXT:    ret{{[l|q]}}
115   %res = shufflevector <16 x half> %x, <16 x half> undef, <16 x i32> zeroinitializer
116   ret <16 x half> %res
119 define <32 x half> @broadcastph512_reg(<32 x half> %x) {
120 ; CHECK-LABEL: broadcastph512_reg:
121 ; CHECK:       # %bb.0:
122 ; CHECK-NEXT:    vpbroadcastw %xmm0, %zmm0
123 ; CHECK-NEXT:    ret{{[l|q]}}
124   %res = shufflevector <32 x half> %x, <32 x half> undef, <32 x i32> zeroinitializer
125   ret <32 x half> %res
128 define i16 @test1(half %x) {
129 ; X64-LABEL: test1:
130 ; X64:       # %bb.0:
131 ; X64-NEXT:    vmovw %xmm0, %eax
132 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
133 ; X64-NEXT:    retq
135 ; X86-LABEL: test1:
136 ; X86:       # %bb.0:
137 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
138 ; X86-NEXT:    retl
139    %res = bitcast half %x to i16
140    ret i16 %res
143 define <8 x i16> @test2(i16 %x) {
144 ; X64-LABEL: test2:
145 ; X64:       # %bb.0:
146 ; X64-NEXT:    vmovw %edi, %xmm0
147 ; X64-NEXT:    retq
149 ; X86-LABEL: test2:
150 ; X86:       # %bb.0:
151 ; X86-NEXT:    vpbroadcastw {{[0-9]+}}(%esp), %xmm0
152 ; X86-NEXT:    retl
153    %res = insertelement <8 x i16>undef, i16 %x, i32 0
154    ret <8 x i16>%res
157 define <8 x i16> @test4(i16* %x) {
158 ; X64-LABEL: test4:
159 ; X64:       # %bb.0:
160 ; X64-NEXT:    vpbroadcastw (%rdi), %xmm0
161 ; X64-NEXT:    retq
163 ; X86-LABEL: test4:
164 ; X86:       # %bb.0:
165 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
166 ; X86-NEXT:    vpbroadcastw (%eax), %xmm0
167 ; X86-NEXT:    retl
168    %y = load i16, i16* %x
169    %res = insertelement <8 x i16>undef, i16 %y, i32 0
170    ret <8 x i16>%res
173 define void @test5(half %x, half* %y) {
174 ; X64-LABEL: test5:
175 ; X64:       # %bb.0:
176 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
177 ; X64-NEXT:    retq
179 ; X86-LABEL: test5:
180 ; X86:       # %bb.0:
181 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
182 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
183 ; X86-NEXT:    vmovsh %xmm0, (%eax)
184 ; X86-NEXT:    retl
185    store half %x, half* %y, align 2
186    ret void
189 define half @test7(i16* %x) {
190 ; X64-LABEL: test7:
191 ; X64:       # %bb.0:
192 ; X64-NEXT:    vmovsh (%rdi), %xmm0
193 ; X64-NEXT:    retq
195 ; X86-LABEL: test7:
196 ; X86:       # %bb.0:
197 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
198 ; X86-NEXT:    vmovsh (%eax), %xmm0
199 ; X86-NEXT:    retl
200    %y = load i16, i16* %x
201    %res = bitcast i16 %y to half
202    ret half %res
205 define <8 x i16> @test10(i16* %x) {
206 ; X64-LABEL: test10:
207 ; X64:       # %bb.0:
208 ; X64-NEXT:    vmovw (%rdi), %xmm0
209 ; X64-NEXT:    retq
211 ; X86-LABEL: test10:
212 ; X86:       # %bb.0:
213 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
214 ; X86-NEXT:    vmovw (%eax), %xmm0
215 ; X86-NEXT:    retl
216    %y = load i16, i16* %x, align 2
217    %res = insertelement <8 x i16>zeroinitializer, i16 %y, i32 0
218    ret <8 x i16>%res
221 define <16 x i16> @test10b(i16* %x) {
222 ; X64-LABEL: test10b:
223 ; X64:       # %bb.0:
224 ; X64-NEXT:    vmovw (%rdi), %xmm0
225 ; X64-NEXT:    retq
227 ; X86-LABEL: test10b:
228 ; X86:       # %bb.0:
229 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
230 ; X86-NEXT:    vmovw (%eax), %xmm0
231 ; X86-NEXT:    retl
232    %y = load i16, i16* %x, align 2
233    %res = insertelement <16 x i16>zeroinitializer, i16 %y, i32 0
234    ret <16 x i16>%res
237 define <32 x i16> @test10c(i16* %x) {
238 ; X64-LABEL: test10c:
239 ; X64:       # %bb.0:
240 ; X64-NEXT:    vmovw (%rdi), %xmm0
241 ; X64-NEXT:    retq
243 ; X86-LABEL: test10c:
244 ; X86:       # %bb.0:
245 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
246 ; X86-NEXT:    vmovw (%eax), %xmm0
247 ; X86-NEXT:    retl
248    %y = load i16, i16* %x, align 2
249    %res = insertelement <32 x i16>zeroinitializer, i16 %y, i32 0
250    ret <32 x i16>%res
253 define <8 x half> @test11(half* %x) {
254 ; X64-LABEL: test11:
255 ; X64:       # %bb.0:
256 ; X64-NEXT:    vmovsh (%rdi), %xmm0
257 ; X64-NEXT:    retq
259 ; X86-LABEL: test11:
260 ; X86:       # %bb.0:
261 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
262 ; X86-NEXT:    vmovsh (%eax), %xmm0
263 ; X86-NEXT:    retl
264    %y = load half, half* %x, align 2
265    %res = insertelement <8 x half>zeroinitializer, half %y, i32 0
266    ret <8 x half>%res
269 define <16 x half> @test11b(half* %x) {
270 ; X64-LABEL: test11b:
271 ; X64:       # %bb.0:
272 ; X64-NEXT:    vmovsh (%rdi), %xmm0
273 ; X64-NEXT:    retq
275 ; X86-LABEL: test11b:
276 ; X86:       # %bb.0:
277 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
278 ; X86-NEXT:    vmovsh (%eax), %xmm0
279 ; X86-NEXT:    retl
280    %y = load half, half* %x, align 2
281    %res = insertelement <16 x half>zeroinitializer, half %y, i32 0
282    ret <16 x half>%res
285 define <32 x half> @test11c(half* %x) {
286 ; X64-LABEL: test11c:
287 ; X64:       # %bb.0:
288 ; X64-NEXT:    vmovsh (%rdi), %xmm0
289 ; X64-NEXT:    retq
291 ; X86-LABEL: test11c:
292 ; X86:       # %bb.0:
293 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
294 ; X86-NEXT:    vmovsh (%eax), %xmm0
295 ; X86-NEXT:    retl
296    %y = load half, half* %x, align 2
297    %res = insertelement <32 x half>zeroinitializer, half %y, i32 0
298    ret <32 x half>%res
301 define <8 x half> @test14(half %x) {
302 ; X64-LABEL: test14:
303 ; X64:       # %bb.0:
304 ; X64-NEXT:    vxorps %xmm1, %xmm1, %xmm1
305 ; X64-NEXT:    vmovsh %xmm0, %xmm1, %xmm0
306 ; X64-NEXT:    retq
308 ; X86-LABEL: test14:
309 ; X86:       # %bb.0:
310 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
311 ; X86-NEXT:    retl
312    %res = insertelement <8 x half>zeroinitializer, half %x, i32 0
313    ret <8 x half>%res
316 define <16 x half> @test14b(half %x) {
317 ; X64-LABEL: test14b:
318 ; X64:       # %bb.0:
319 ; X64-NEXT:    vxorps %xmm1, %xmm1, %xmm1
320 ; X64-NEXT:    vmovsh %xmm0, %xmm1, %xmm0
321 ; X64-NEXT:    retq
323 ; X86-LABEL: test14b:
324 ; X86:       # %bb.0:
325 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
326 ; X86-NEXT:    retl
327    %res = insertelement <16 x half>zeroinitializer, half %x, i32 0
328    ret <16 x half>%res
331 define <32 x half> @test14c(half %x) {
332 ; X64-LABEL: test14c:
333 ; X64:       # %bb.0:
334 ; X64-NEXT:    vxorps %xmm1, %xmm1, %xmm1
335 ; X64-NEXT:    vmovsh %xmm0, %xmm1, %xmm0
336 ; X64-NEXT:    retq
338 ; X86-LABEL: test14c:
339 ; X86:       # %bb.0:
340 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
341 ; X86-NEXT:    retl
342    %res = insertelement <32 x half>zeroinitializer, half %x, i32 0
343    ret <32 x half>%res
346 define <8 x i16> @test15(i16 %x) {
347 ; X64-LABEL: test15:
348 ; X64:       # %bb.0:
349 ; X64-NEXT:    vmovw %edi, %xmm0
350 ; X64-NEXT:    retq
352 ; X86-LABEL: test15:
353 ; X86:       # %bb.0:
354 ; X86-NEXT:    vmovw {{[0-9]+}}(%esp), %xmm0
355 ; X86-NEXT:    retl
356    %res = insertelement <8 x i16>zeroinitializer, i16 %x, i32 0
357    ret <8 x i16>%res
360 define <16 x i16> @test16(i16 %x) {
361 ; X64-LABEL: test16:
362 ; X64:       # %bb.0:
363 ; X64-NEXT:    vmovw %edi, %xmm0
364 ; X64-NEXT:    retq
366 ; X86-LABEL: test16:
367 ; X86:       # %bb.0:
368 ; X86-NEXT:    vmovw {{[0-9]+}}(%esp), %xmm0
369 ; X86-NEXT:    retl
370    %res = insertelement <16 x i16>zeroinitializer, i16 %x, i32 0
371    ret <16 x i16>%res
374 define <32 x i16> @test17(i16 %x) {
375 ; X64-LABEL: test17:
376 ; X64:       # %bb.0:
377 ; X64-NEXT:    vmovw %edi, %xmm0
378 ; X64-NEXT:    retq
380 ; X86-LABEL: test17:
381 ; X86:       # %bb.0:
382 ; X86-NEXT:    vmovw {{[0-9]+}}(%esp), %xmm0
383 ; X86-NEXT:    retl
384    %res = insertelement <32 x i16>zeroinitializer, i16 %x, i32 0
385    ret <32 x i16>%res
388 define <8 x i16> @test18(i16 %x) {
389 ; X64-LABEL: test18:
390 ; X64:       # %bb.0:
391 ; X64-NEXT:    vmovw %edi, %xmm0
392 ; X64-NEXT:    retq
394 ; X86-LABEL: test18:
395 ; X86:       # %bb.0:
396 ; X86-NEXT:    vpbroadcastw {{[0-9]+}}(%esp), %xmm0
397 ; X86-NEXT:    retl
398    %res = insertelement <8 x i16> undef, i16 %x, i32 0
399    ret <8 x i16>%res
402 define <16 x i16> @test19(i16 %x) {
403 ; X64-LABEL: test19:
404 ; X64:       # %bb.0:
405 ; X64-NEXT:    vmovw %edi, %xmm0
406 ; X64-NEXT:    retq
408 ; X86-LABEL: test19:
409 ; X86:       # %bb.0:
410 ; X86-NEXT:    vpbroadcastw {{[0-9]+}}(%esp), %ymm0
411 ; X86-NEXT:    retl
412    %res = insertelement <16 x i16> undef, i16 %x, i32 0
413    ret <16 x i16>%res
416 define <32 x i16> @test20(i16 %x) {
417 ; X64-LABEL: test20:
418 ; X64:       # %bb.0:
419 ; X64-NEXT:    vmovw %edi, %xmm0
420 ; X64-NEXT:    retq
422 ; X86-LABEL: test20:
423 ; X86:       # %bb.0:
424 ; X86-NEXT:    vpbroadcastw {{[0-9]+}}(%esp), %zmm0
425 ; X86-NEXT:    retl
426    %res = insertelement <32 x i16> undef, i16 %x, i32 0
427    ret <32 x i16>%res
430 @g8f16 = external global <8 x half>
431 @g8f16u = external global <8 x half>, align 8
432 @g16f16 = external global <16 x half>
433 @g16f16u = external global <16 x half>, align 8
434 @g32f16 = external global <32 x half>
435 @g32f16u = external global <32 x half>, align 8
437 define <32 x half> @load32f16(<32 x half>* %a) {
438 ; X64-LABEL: load32f16:
439 ; X64:       # %bb.0:
440 ; X64-NEXT:    vmovaps (%rdi), %zmm0
441 ; X64-NEXT:    retq
443 ; X86-LABEL: load32f16:
444 ; X86:       # %bb.0:
445 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
446 ; X86-NEXT:    vmovaps (%eax), %zmm0
447 ; X86-NEXT:    retl
448   %res = load <32 x half>, <32 x half>* %a
449   ret <32 x half> %res
452 define <32 x half> @load32f16mask(<32 x half>* %a, <32 x half> %b, i32 %c) {
453 ; X64-LABEL: load32f16mask:
454 ; X64:       # %bb.0:
455 ; X64-NEXT:    kmovd %esi, %k1
456 ; X64-NEXT:    vmovdqu16 (%rdi), %zmm0 {%k1}
457 ; X64-NEXT:    retq
459 ; X86-LABEL: load32f16mask:
460 ; X86:       # %bb.0:
461 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
462 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k1
463 ; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1}
464 ; X86-NEXT:    retl
465   %msk = bitcast i32 %c to <32 x i1>
466   %res0 = load <32 x half>, <32 x half>* %a
467   %res = select <32 x i1> %msk, <32 x half> %res0, <32 x half> %b
468   ret <32 x half> %res
471 define <32 x half> @load32f16maskz(<32 x half>* %a, i32 %c) {
472 ; X64-LABEL: load32f16maskz:
473 ; X64:       # %bb.0:
474 ; X64-NEXT:    kmovd %esi, %k1
475 ; X64-NEXT:    vmovdqu16 (%rdi), %zmm0 {%k1} {z}
476 ; X64-NEXT:    retq
478 ; X86-LABEL: load32f16maskz:
479 ; X86:       # %bb.0:
480 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
481 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k1
482 ; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1} {z}
483 ; X86-NEXT:    retl
484   %msk = bitcast i32 %c to <32 x i1>
485   %res0 = load <32 x half>, <32 x half>* %a
486   %res = select <32 x i1> %msk, <32 x half> %res0, <32 x half> zeroinitializer
487   ret <32 x half> %res
490 define <32 x half> @loadu32f16(<32 x half>* %a) {
491 ; X64-LABEL: loadu32f16:
492 ; X64:       # %bb.0:
493 ; X64-NEXT:    vmovups (%rdi), %zmm0
494 ; X64-NEXT:    retq
496 ; X86-LABEL: loadu32f16:
497 ; X86:       # %bb.0:
498 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
499 ; X86-NEXT:    vmovups (%eax), %zmm0
500 ; X86-NEXT:    retl
501   %res = load <32 x half>, <32 x half>* %a, align 8
502   ret <32 x half> %res
505 define <32 x half> @loadu32f16mask(<32 x half>* %a, <32 x half> %b, i32 %c) {
506 ; X64-LABEL: loadu32f16mask:
507 ; X64:       # %bb.0:
508 ; X64-NEXT:    kmovd %esi, %k1
509 ; X64-NEXT:    vmovdqu16 (%rdi), %zmm0 {%k1}
510 ; X64-NEXT:    retq
512 ; X86-LABEL: loadu32f16mask:
513 ; X86:       # %bb.0:
514 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
515 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k1
516 ; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1}
517 ; X86-NEXT:    retl
518   %msk = bitcast i32 %c to <32 x i1>
519   %res0 = load <32 x half>, <32 x half>* %a, align 8
520   %res = select <32 x i1> %msk, <32 x half> %res0, <32 x half> %b
521   ret <32 x half> %res
524 define <32 x half> @loadu32f16maskz(<32 x half>* %a, i32 %c) {
525 ; X64-LABEL: loadu32f16maskz:
526 ; X64:       # %bb.0:
527 ; X64-NEXT:    kmovd %esi, %k1
528 ; X64-NEXT:    vmovdqu16 (%rdi), %zmm0 {%k1} {z}
529 ; X64-NEXT:    retq
531 ; X86-LABEL: loadu32f16maskz:
532 ; X86:       # %bb.0:
533 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
534 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k1
535 ; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1} {z}
536 ; X86-NEXT:    retl
537   %msk = bitcast i32 %c to <32 x i1>
538   %res0 = load <32 x half>, <32 x half>* %a, align 8
539   %res = select <32 x i1> %msk, <32 x half> %res0, <32 x half> zeroinitializer
540   ret <32 x half> %res
543 define void @store32f16(<32 x half> %a) {
544 ; X64-LABEL: store32f16:
545 ; X64:       # %bb.0:
546 ; X64-NEXT:    movq g32f16@GOTPCREL(%rip), %rax
547 ; X64-NEXT:    vmovaps %zmm0, (%rax)
548 ; X64-NEXT:    vzeroupper
549 ; X64-NEXT:    retq
551 ; X86-LABEL: store32f16:
552 ; X86:       # %bb.0:
553 ; X86-NEXT:    vmovaps %zmm0, g32f16
554 ; X86-NEXT:    vzeroupper
555 ; X86-NEXT:    retl
556   store <32 x half> %a, <32 x half>* @g32f16
557   ret void
560 define void @storeu32f16(<32 x half> %a) {
561 ; X64-LABEL: storeu32f16:
562 ; X64:       # %bb.0:
563 ; X64-NEXT:    movq g32f16u@GOTPCREL(%rip), %rax
564 ; X64-NEXT:    vmovups %zmm0, (%rax)
565 ; X64-NEXT:    vzeroupper
566 ; X64-NEXT:    retq
568 ; X86-LABEL: storeu32f16:
569 ; X86:       # %bb.0:
570 ; X86-NEXT:    vmovups %zmm0, g32f16u
571 ; X86-NEXT:    vzeroupper
572 ; X86-NEXT:    retl
573   store <32 x half> %a, <32 x half>* @g32f16u, align 8
574   ret void
577 declare void @llvm.masked.store.v32f16.p0v32f16(<32 x half>, <32 x half>*, i32, <32 x i1>)
578 declare <32 x half> @llvm.masked.load.v32f16.p0v32f16(<32 x half>*, i32,  <32 x i1>, <32 x half>)
580 define void @storeu32f16mask(<32 x i1> %mask, <32 x half>* %addr, <32 x half> %val) {
581 ; X64-LABEL: storeu32f16mask:
582 ; X64:       # %bb.0:
583 ; X64-NEXT:    vpsllw $7, %ymm0, %ymm0
584 ; X64-NEXT:    vpmovb2m %ymm0, %k1
585 ; X64-NEXT:    vmovdqu16 %zmm1, (%rdi) {%k1}
586 ; X64-NEXT:    vzeroupper
587 ; X64-NEXT:    retq
589 ; X86-LABEL: storeu32f16mask:
590 ; X86:       # %bb.0:
591 ; X86-NEXT:    vpsllw $7, %ymm0, %ymm0
592 ; X86-NEXT:    vpmovb2m %ymm0, %k1
593 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
594 ; X86-NEXT:    vmovdqu16 %zmm1, (%eax) {%k1}
595 ; X86-NEXT:    vzeroupper
596 ; X86-NEXT:    retl
597   call void @llvm.masked.store.v32f16.p0v32f16(<32 x half> %val, <32 x half>* %addr, i32 4, <32 x i1>%mask)
598   ret void
601 define <32 x half> @maskloadu32f16(<32 x half>* %addr, <32 x half> %val, <32 x i1> %mask) {
602 ; X64-LABEL: maskloadu32f16:
603 ; X64:       # %bb.0:
604 ; X64-NEXT:    vpsllw $7, %ymm1, %ymm1
605 ; X64-NEXT:    vpmovb2m %ymm1, %k1
606 ; X64-NEXT:    vmovdqu16 (%rdi), %zmm0 {%k1}
607 ; X64-NEXT:    retq
609 ; X86-LABEL: maskloadu32f16:
610 ; X86:       # %bb.0:
611 ; X86-NEXT:    vpsllw $7, %ymm1, %ymm1
612 ; X86-NEXT:    vpmovb2m %ymm1, %k1
613 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
614 ; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1}
615 ; X86-NEXT:    retl
616   %res = call <32 x half> @llvm.masked.load.v32f16.p0v32f16(<32 x half>* %addr, i32 4, <32 x i1> %mask, <32 x half> %val)
617   ret <32 x half> %res
620 define <32 x half> @maskuloadu32f16(<32 x half>* %addr, <32 x i1> %mask) {
621 ; X64-LABEL: maskuloadu32f16:
622 ; X64:       # %bb.0:
623 ; X64-NEXT:    vpsllw $7, %ymm0, %ymm0
624 ; X64-NEXT:    vpmovb2m %ymm0, %k1
625 ; X64-NEXT:    vmovdqu16 (%rdi), %zmm0 {%k1} {z}
626 ; X64-NEXT:    retq
628 ; X86-LABEL: maskuloadu32f16:
629 ; X86:       # %bb.0:
630 ; X86-NEXT:    vpsllw $7, %ymm0, %ymm0
631 ; X86-NEXT:    vpmovb2m %ymm0, %k1
632 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
633 ; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1} {z}
634 ; X86-NEXT:    retl
635   %res = call <32 x half> @llvm.masked.load.v32f16.p0v32f16(<32 x half>* %addr, i32 4, <32 x i1> %mask, <32 x half> undef)
636   ret <32 x half> %res
639 define <32 x half> @maskzloadu32f16(<32 x half>* %addr, <32 x i1> %mask) {
640 ; X64-LABEL: maskzloadu32f16:
641 ; X64:       # %bb.0:
642 ; X64-NEXT:    vpsllw $7, %ymm0, %ymm0
643 ; X64-NEXT:    vpmovb2m %ymm0, %k1
644 ; X64-NEXT:    vmovdqu16 (%rdi), %zmm0 {%k1} {z}
645 ; X64-NEXT:    retq
647 ; X86-LABEL: maskzloadu32f16:
648 ; X86:       # %bb.0:
649 ; X86-NEXT:    vpsllw $7, %ymm0, %ymm0
650 ; X86-NEXT:    vpmovb2m %ymm0, %k1
651 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
652 ; X86-NEXT:    vmovdqu16 (%eax), %zmm0 {%k1} {z}
653 ; X86-NEXT:    retl
654   %res = call <32 x half> @llvm.masked.load.v32f16.p0v32f16(<32 x half>* %addr, i32 4, <32 x i1> %mask, <32 x half> zeroinitializer)
655   ret <32 x half> %res
658 define <32 x half> @movrr32f16(<32 x half> %a, <32 x half> %b) {
659 ; CHECK-LABEL: movrr32f16:
660 ; CHECK:       # %bb.0:
661 ; CHECK-NEXT:    vmovaps %zmm1, %zmm0
662 ; CHECK-NEXT:    ret{{[l|q]}}
663   ret <32 x half> %b
666 define <32 x half> @movrrk32f16(<32 x half> %a, <32 x half> %b, i32 %msk) {
667 ; X64-LABEL: movrrk32f16:
668 ; X64:       # %bb.0:
669 ; X64-NEXT:    kmovd %edi, %k1
670 ; X64-NEXT:    vpblendmw %zmm0, %zmm1, %zmm0 {%k1}
671 ; X64-NEXT:    retq
673 ; X86-LABEL: movrrk32f16:
674 ; X86:       # %bb.0:
675 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k1
676 ; X86-NEXT:    vpblendmw %zmm0, %zmm1, %zmm0 {%k1}
677 ; X86-NEXT:    retl
678   %mask = bitcast i32 %msk to <32 x i1>
679   %res = select <32 x i1> %mask, <32 x half> %a, <32 x half> %b
680   ret <32 x half> %res
683 define <32 x half> @movrrkz32f16(<32 x half> %a, i32 %msk) {
684 ; X64-LABEL: movrrkz32f16:
685 ; X64:       # %bb.0:
686 ; X64-NEXT:    kmovd %edi, %k1
687 ; X64-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
688 ; X64-NEXT:    retq
690 ; X86-LABEL: movrrkz32f16:
691 ; X86:       # %bb.0:
692 ; X86-NEXT:    kmovd {{[0-9]+}}(%esp), %k1
693 ; X86-NEXT:    vmovdqu16 %zmm0, %zmm0 {%k1} {z}
694 ; X86-NEXT:    retl
695   %mask = bitcast i32 %msk to <32 x i1>
696   %res = select <32 x i1> %mask, <32 x half> %a, <32 x half> zeroinitializer
697   ret <32 x half> %res
700 define <16 x half> @load16f16(<16 x half>* %a) {
701 ; X64-LABEL: load16f16:
702 ; X64:       # %bb.0:
703 ; X64-NEXT:    vmovaps (%rdi), %ymm0
704 ; X64-NEXT:    retq
706 ; X86-LABEL: load16f16:
707 ; X86:       # %bb.0:
708 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
709 ; X86-NEXT:    vmovaps (%eax), %ymm0
710 ; X86-NEXT:    retl
711   %res = load <16 x half>, <16 x half>* %a
712   ret <16 x half> %res
715 define <16 x half> @load16f16mask(<16 x half>* %a, <16 x half> %b, i16 %c) {
716 ; X64-LABEL: load16f16mask:
717 ; X64:       # %bb.0:
718 ; X64-NEXT:    kmovd %esi, %k1
719 ; X64-NEXT:    vmovdqu16 (%rdi), %ymm0 {%k1}
720 ; X64-NEXT:    retq
722 ; X86-LABEL: load16f16mask:
723 ; X86:       # %bb.0:
724 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
725 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
726 ; X86-NEXT:    vmovdqu16 (%eax), %ymm0 {%k1}
727 ; X86-NEXT:    retl
728   %msk = bitcast i16 %c to <16 x i1>
729   %res0 = load <16 x half>, <16 x half>* %a
730   %res = select <16 x i1> %msk, <16 x half> %res0, <16 x half> %b
731   ret <16 x half> %res
734 define <16 x half> @load16f16maskz(<16 x half>* %a, i16 %c) {
735 ; X64-LABEL: load16f16maskz:
736 ; X64:       # %bb.0:
737 ; X64-NEXT:    kmovd %esi, %k1
738 ; X64-NEXT:    vmovdqu16 (%rdi), %ymm0 {%k1} {z}
739 ; X64-NEXT:    retq
741 ; X86-LABEL: load16f16maskz:
742 ; X86:       # %bb.0:
743 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
744 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
745 ; X86-NEXT:    vmovdqu16 (%eax), %ymm0 {%k1} {z}
746 ; X86-NEXT:    retl
747   %msk = bitcast i16 %c to <16 x i1>
748   %res0 = load <16 x half>, <16 x half>* %a
749   %res = select <16 x i1> %msk, <16 x half> %res0, <16 x half> zeroinitializer
750   ret <16 x half> %res
753 define <16 x half> @loadu16f16(<16 x half>* %a) {
754 ; X64-LABEL: loadu16f16:
755 ; X64:       # %bb.0:
756 ; X64-NEXT:    vmovups (%rdi), %ymm0
757 ; X64-NEXT:    retq
759 ; X86-LABEL: loadu16f16:
760 ; X86:       # %bb.0:
761 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
762 ; X86-NEXT:    vmovups (%eax), %ymm0
763 ; X86-NEXT:    retl
764   %res = load <16 x half>, <16 x half>* %a, align 8
765   ret <16 x half> %res
768 define <16 x half> @loadu16f16mask(<16 x half>* %a, <16 x half> %b, i16 %c) {
769 ; X64-LABEL: loadu16f16mask:
770 ; X64:       # %bb.0:
771 ; X64-NEXT:    kmovd %esi, %k1
772 ; X64-NEXT:    vmovdqu16 (%rdi), %ymm0 {%k1}
773 ; X64-NEXT:    retq
775 ; X86-LABEL: loadu16f16mask:
776 ; X86:       # %bb.0:
777 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
778 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
779 ; X86-NEXT:    vmovdqu16 (%eax), %ymm0 {%k1}
780 ; X86-NEXT:    retl
781   %msk = bitcast i16 %c to <16 x i1>
782   %res0 = load <16 x half>, <16 x half>* %a, align 8
783   %res = select <16 x i1> %msk, <16 x half> %res0, <16 x half> %b
784   ret <16 x half> %res
787 define <16 x half> @loadu16f16maskz(<16 x half>* %a, i16 %c) {
788 ; X64-LABEL: loadu16f16maskz:
789 ; X64:       # %bb.0:
790 ; X64-NEXT:    kmovd %esi, %k1
791 ; X64-NEXT:    vmovdqu16 (%rdi), %ymm0 {%k1} {z}
792 ; X64-NEXT:    retq
794 ; X86-LABEL: loadu16f16maskz:
795 ; X86:       # %bb.0:
796 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
797 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
798 ; X86-NEXT:    vmovdqu16 (%eax), %ymm0 {%k1} {z}
799 ; X86-NEXT:    retl
800   %msk = bitcast i16 %c to <16 x i1>
801   %res0 = load <16 x half>, <16 x half>* %a, align 8
802   %res = select <16 x i1> %msk, <16 x half> %res0, <16 x half> zeroinitializer
803   ret <16 x half> %res
806 define void @store16f16(<16 x half> %a) {
807 ; X64-LABEL: store16f16:
808 ; X64:       # %bb.0:
809 ; X64-NEXT:    movq g16f16@GOTPCREL(%rip), %rax
810 ; X64-NEXT:    vmovaps %ymm0, (%rax)
811 ; X64-NEXT:    vzeroupper
812 ; X64-NEXT:    retq
814 ; X86-LABEL: store16f16:
815 ; X86:       # %bb.0:
816 ; X86-NEXT:    vmovaps %ymm0, g16f16
817 ; X86-NEXT:    vzeroupper
818 ; X86-NEXT:    retl
819   store <16 x half> %a, <16 x half>* @g16f16
820   ret void
823 define void @storeu16f16(<16 x half> %a) {
824 ; X64-LABEL: storeu16f16:
825 ; X64:       # %bb.0:
826 ; X64-NEXT:    movq g16f16u@GOTPCREL(%rip), %rax
827 ; X64-NEXT:    vmovups %ymm0, (%rax)
828 ; X64-NEXT:    vzeroupper
829 ; X64-NEXT:    retq
831 ; X86-LABEL: storeu16f16:
832 ; X86:       # %bb.0:
833 ; X86-NEXT:    vmovups %ymm0, g16f16u
834 ; X86-NEXT:    vzeroupper
835 ; X86-NEXT:    retl
836   store <16 x half> %a, <16 x half>* @g16f16u, align 8
837   ret void
840 declare void @llvm.masked.store.v16f16.p0v16f16(<16 x half>, <16 x half>*, i32, <16 x i1>)
841 declare <16 x half> @llvm.masked.load.v16f16.p0v16f16(<16 x half>*, i32,  <16 x i1>, <16 x half>)
843 define void @storeu16f16mask(<16 x i1> %mask, <16 x half>* %addr, <16 x half> %val) {
844 ; X64-LABEL: storeu16f16mask:
845 ; X64:       # %bb.0:
846 ; X64-NEXT:    vpsllw $7, %xmm0, %xmm0
847 ; X64-NEXT:    vpmovb2m %xmm0, %k1
848 ; X64-NEXT:    vmovdqu16 %ymm1, (%rdi) {%k1}
849 ; X64-NEXT:    vzeroupper
850 ; X64-NEXT:    retq
852 ; X86-LABEL: storeu16f16mask:
853 ; X86:       # %bb.0:
854 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
855 ; X86-NEXT:    vpmovb2m %xmm0, %k1
856 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
857 ; X86-NEXT:    vmovdqu16 %ymm1, (%eax) {%k1}
858 ; X86-NEXT:    vzeroupper
859 ; X86-NEXT:    retl
860   call void @llvm.masked.store.v16f16.p0v16f16(<16 x half> %val, <16 x half>* %addr, i32 4, <16 x i1>%mask)
861   ret void
864 define <16 x half> @maskloadu16f16(<16 x half>* %addr, <16 x half> %val, <16 x i1> %mask) {
865 ; X64-LABEL: maskloadu16f16:
866 ; X64:       # %bb.0:
867 ; X64-NEXT:    vpsllw $7, %xmm1, %xmm1
868 ; X64-NEXT:    vpmovb2m %xmm1, %k1
869 ; X64-NEXT:    vmovdqu16 (%rdi), %ymm0 {%k1}
870 ; X64-NEXT:    retq
872 ; X86-LABEL: maskloadu16f16:
873 ; X86:       # %bb.0:
874 ; X86-NEXT:    vpsllw $7, %xmm1, %xmm1
875 ; X86-NEXT:    vpmovb2m %xmm1, %k1
876 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
877 ; X86-NEXT:    vmovdqu16 (%eax), %ymm0 {%k1}
878 ; X86-NEXT:    retl
879   %res = call <16 x half> @llvm.masked.load.v16f16.p0v16f16(<16 x half>* %addr, i32 4, <16 x i1> %mask, <16 x half> %val)
880   ret <16 x half> %res
883 define <16 x half> @maskuloadu16f16(<16 x half>* %addr, <16 x i1> %mask) {
884 ; X64-LABEL: maskuloadu16f16:
885 ; X64:       # %bb.0:
886 ; X64-NEXT:    vpsllw $7, %xmm0, %xmm0
887 ; X64-NEXT:    vpmovb2m %xmm0, %k1
888 ; X64-NEXT:    vmovdqu16 (%rdi), %ymm0 {%k1} {z}
889 ; X64-NEXT:    retq
891 ; X86-LABEL: maskuloadu16f16:
892 ; X86:       # %bb.0:
893 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
894 ; X86-NEXT:    vpmovb2m %xmm0, %k1
895 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
896 ; X86-NEXT:    vmovdqu16 (%eax), %ymm0 {%k1} {z}
897 ; X86-NEXT:    retl
898   %res = call <16 x half> @llvm.masked.load.v16f16.p0v16f16(<16 x half>* %addr, i32 4, <16 x i1> %mask, <16 x half> undef)
899   ret <16 x half> %res
902 define <16 x half> @maskzloadu16f16(<16 x half>* %addr, <16 x i1> %mask) {
903 ; X64-LABEL: maskzloadu16f16:
904 ; X64:       # %bb.0:
905 ; X64-NEXT:    vpsllw $7, %xmm0, %xmm0
906 ; X64-NEXT:    vpmovb2m %xmm0, %k1
907 ; X64-NEXT:    vmovdqu16 (%rdi), %ymm0 {%k1} {z}
908 ; X64-NEXT:    retq
910 ; X86-LABEL: maskzloadu16f16:
911 ; X86:       # %bb.0:
912 ; X86-NEXT:    vpsllw $7, %xmm0, %xmm0
913 ; X86-NEXT:    vpmovb2m %xmm0, %k1
914 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
915 ; X86-NEXT:    vmovdqu16 (%eax), %ymm0 {%k1} {z}
916 ; X86-NEXT:    retl
917   %res = call <16 x half> @llvm.masked.load.v16f16.p0v16f16(<16 x half>* %addr, i32 4, <16 x i1> %mask, <16 x half> zeroinitializer)
918   ret <16 x half> %res
921 define <16 x half> @movrr16f16(<16 x half> %a, <16 x half> %b) {
922 ; CHECK-LABEL: movrr16f16:
923 ; CHECK:       # %bb.0:
924 ; CHECK-NEXT:    vmovaps %ymm1, %ymm0
925 ; CHECK-NEXT:    ret{{[l|q]}}
926   ret <16 x half> %b
929 define <16 x half> @movrrk16f16(<16 x half> %a, <16 x half> %b, i16 %msk) {
930 ; X64-LABEL: movrrk16f16:
931 ; X64:       # %bb.0:
932 ; X64-NEXT:    kmovd %edi, %k1
933 ; X64-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
934 ; X64-NEXT:    retq
936 ; X86-LABEL: movrrk16f16:
937 ; X86:       # %bb.0:
938 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
939 ; X86-NEXT:    vpblendmw %ymm0, %ymm1, %ymm0 {%k1}
940 ; X86-NEXT:    retl
941   %mask = bitcast i16 %msk to <16 x i1>
942   %res = select <16 x i1> %mask, <16 x half> %a, <16 x half> %b
943   ret <16 x half> %res
946 define <16 x half> @movrrkz16f16(<16 x half> %a, i16 %msk) {
947 ; X64-LABEL: movrrkz16f16:
948 ; X64:       # %bb.0:
949 ; X64-NEXT:    kmovd %edi, %k1
950 ; X64-NEXT:    vmovdqu16 %ymm0, %ymm0 {%k1} {z}
951 ; X64-NEXT:    retq
953 ; X86-LABEL: movrrkz16f16:
954 ; X86:       # %bb.0:
955 ; X86-NEXT:    kmovw {{[0-9]+}}(%esp), %k1
956 ; X86-NEXT:    vmovdqu16 %ymm0, %ymm0 {%k1} {z}
957 ; X86-NEXT:    retl
958   %mask = bitcast i16 %msk to <16 x i1>
959   %res = select <16 x i1> %mask, <16 x half> %a, <16 x half> zeroinitializer
960   ret <16 x half> %res
963 define <8 x half> @load8f16(<8 x half>* %a) {
964 ; X64-LABEL: load8f16:
965 ; X64:       # %bb.0:
966 ; X64-NEXT:    vmovaps (%rdi), %xmm0
967 ; X64-NEXT:    retq
969 ; X86-LABEL: load8f16:
970 ; X86:       # %bb.0:
971 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
972 ; X86-NEXT:    vmovaps (%eax), %xmm0
973 ; X86-NEXT:    retl
974   %res = load <8 x half>, <8 x half>* %a
975   ret <8 x half> %res
978 define <8 x half> @load8f16mask(<8 x half>* %a, <8 x half> %b, i8 %c) {
979 ; X64-LABEL: load8f16mask:
980 ; X64:       # %bb.0:
981 ; X64-NEXT:    kmovd %esi, %k1
982 ; X64-NEXT:    vmovdqu16 (%rdi), %xmm0 {%k1}
983 ; X64-NEXT:    retq
985 ; X86-LABEL: load8f16mask:
986 ; X86:       # %bb.0:
987 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
988 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
989 ; X86-NEXT:    vmovdqu16 (%eax), %xmm0 {%k1}
990 ; X86-NEXT:    retl
991   %msk = bitcast i8 %c to <8 x i1>
992   %res0 = load <8 x half>, <8 x half>* %a
993   %res = select <8 x i1> %msk, <8 x half> %res0, <8 x half> %b
994   ret <8 x half> %res
997 define <8 x half> @load8f16maskz(<8 x half>* %a, i8 %c) {
998 ; X64-LABEL: load8f16maskz:
999 ; X64:       # %bb.0:
1000 ; X64-NEXT:    kmovd %esi, %k1
1001 ; X64-NEXT:    vmovdqu16 (%rdi), %xmm0 {%k1} {z}
1002 ; X64-NEXT:    retq
1004 ; X86-LABEL: load8f16maskz:
1005 ; X86:       # %bb.0:
1006 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1007 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
1008 ; X86-NEXT:    vmovdqu16 (%eax), %xmm0 {%k1} {z}
1009 ; X86-NEXT:    retl
1010   %msk = bitcast i8 %c to <8 x i1>
1011   %res0 = load <8 x half>, <8 x half>* %a
1012   %res = select <8 x i1> %msk, <8 x half> %res0, <8 x half> zeroinitializer
1013   ret <8 x half> %res
1016 define <8 x half> @loadu8f16(<8 x half>* %a) {
1017 ; X64-LABEL: loadu8f16:
1018 ; X64:       # %bb.0:
1019 ; X64-NEXT:    vmovups (%rdi), %xmm0
1020 ; X64-NEXT:    retq
1022 ; X86-LABEL: loadu8f16:
1023 ; X86:       # %bb.0:
1024 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1025 ; X86-NEXT:    vmovups (%eax), %xmm0
1026 ; X86-NEXT:    retl
1027   %res = load <8 x half>, <8 x half>* %a, align 8
1028   ret <8 x half> %res
1031 define <8 x half> @loadu8f16mask(<8 x half>* %a, <8 x half> %b, i8 %c) {
1032 ; X64-LABEL: loadu8f16mask:
1033 ; X64:       # %bb.0:
1034 ; X64-NEXT:    kmovd %esi, %k1
1035 ; X64-NEXT:    vmovdqu16 (%rdi), %xmm0 {%k1}
1036 ; X64-NEXT:    retq
1038 ; X86-LABEL: loadu8f16mask:
1039 ; X86:       # %bb.0:
1040 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1041 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
1042 ; X86-NEXT:    vmovdqu16 (%eax), %xmm0 {%k1}
1043 ; X86-NEXT:    retl
1044   %msk = bitcast i8 %c to <8 x i1>
1045   %res0 = load <8 x half>, <8 x half>* %a, align 8
1046   %res = select <8 x i1> %msk, <8 x half> %res0, <8 x half> %b
1047   ret <8 x half> %res
1050 define <8 x half> @loadu8f16maskz(<8 x half>* %a, i8 %c) {
1051 ; X64-LABEL: loadu8f16maskz:
1052 ; X64:       # %bb.0:
1053 ; X64-NEXT:    kmovd %esi, %k1
1054 ; X64-NEXT:    vmovdqu16 (%rdi), %xmm0 {%k1} {z}
1055 ; X64-NEXT:    retq
1057 ; X86-LABEL: loadu8f16maskz:
1058 ; X86:       # %bb.0:
1059 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1060 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
1061 ; X86-NEXT:    vmovdqu16 (%eax), %xmm0 {%k1} {z}
1062 ; X86-NEXT:    retl
1063   %msk = bitcast i8 %c to <8 x i1>
1064   %res0 = load <8 x half>, <8 x half>* %a, align 8
1065   %res = select <8 x i1> %msk, <8 x half> %res0, <8 x half> zeroinitializer
1066   ret <8 x half> %res
1069 define void @store8f16(<8 x half> %a) {
1070 ; X64-LABEL: store8f16:
1071 ; X64:       # %bb.0:
1072 ; X64-NEXT:    movq g8f16@GOTPCREL(%rip), %rax
1073 ; X64-NEXT:    vmovaps %xmm0, (%rax)
1074 ; X64-NEXT:    retq
1076 ; X86-LABEL: store8f16:
1077 ; X86:       # %bb.0:
1078 ; X86-NEXT:    vmovaps %xmm0, g8f16
1079 ; X86-NEXT:    retl
1080   store <8 x half> %a, <8 x half>* @g8f16
1081   ret void
1084 define void @storeu8f16(<8 x half> %a) {
1085 ; X64-LABEL: storeu8f16:
1086 ; X64:       # %bb.0:
1087 ; X64-NEXT:    movq g8f16u@GOTPCREL(%rip), %rax
1088 ; X64-NEXT:    vmovups %xmm0, (%rax)
1089 ; X64-NEXT:    retq
1091 ; X86-LABEL: storeu8f16:
1092 ; X86:       # %bb.0:
1093 ; X86-NEXT:    vmovups %xmm0, g8f16u
1094 ; X86-NEXT:    retl
1095   store <8 x half> %a, <8 x half>* @g8f16u, align 8
1096   ret void
1099 declare void @llvm.masked.store.v8f16.p0v8f16(<8 x half>, <8 x half>*, i32, <8 x i1>)
1100 declare <8 x half> @llvm.masked.load.v8f16.p0v8f16(<8 x half>*, i32,  <8 x i1>, <8 x half>)
1102 define void @storeu8f16mask(<8 x i1> %mask, <8 x half>* %addr, <8 x half> %val) {
1103 ; X64-LABEL: storeu8f16mask:
1104 ; X64:       # %bb.0:
1105 ; X64-NEXT:    vpsllw $15, %xmm0, %xmm0
1106 ; X64-NEXT:    vpmovw2m %xmm0, %k1
1107 ; X64-NEXT:    vmovdqu16 %xmm1, (%rdi) {%k1}
1108 ; X64-NEXT:    retq
1110 ; X86-LABEL: storeu8f16mask:
1111 ; X86:       # %bb.0:
1112 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
1113 ; X86-NEXT:    vpmovw2m %xmm0, %k1
1114 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1115 ; X86-NEXT:    vmovdqu16 %xmm1, (%eax) {%k1}
1116 ; X86-NEXT:    retl
1117   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %val, <8 x half>* %addr, i32 4, <8 x i1>%mask)
1118   ret void
1121 define <8 x half> @maskloadu8f16(<8 x half>* %addr, <8 x half> %val, <8 x i1> %mask) {
1122 ; X64-LABEL: maskloadu8f16:
1123 ; X64:       # %bb.0:
1124 ; X64-NEXT:    vpsllw $15, %xmm1, %xmm1
1125 ; X64-NEXT:    vpmovw2m %xmm1, %k1
1126 ; X64-NEXT:    vmovdqu16 (%rdi), %xmm0 {%k1}
1127 ; X64-NEXT:    retq
1129 ; X86-LABEL: maskloadu8f16:
1130 ; X86:       # %bb.0:
1131 ; X86-NEXT:    vpsllw $15, %xmm1, %xmm1
1132 ; X86-NEXT:    vpmovw2m %xmm1, %k1
1133 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1134 ; X86-NEXT:    vmovdqu16 (%eax), %xmm0 {%k1}
1135 ; X86-NEXT:    retl
1136   %res = call <8 x half> @llvm.masked.load.v8f16.p0v8f16(<8 x half>* %addr, i32 4, <8 x i1> %mask, <8 x half> %val)
1137   ret <8 x half> %res
1140 define <8 x half> @maskuloadu8f16(<8 x half>* %addr, <8 x i1> %mask) {
1141 ; X64-LABEL: maskuloadu8f16:
1142 ; X64:       # %bb.0:
1143 ; X64-NEXT:    vpsllw $15, %xmm0, %xmm0
1144 ; X64-NEXT:    vpmovw2m %xmm0, %k1
1145 ; X64-NEXT:    vmovdqu16 (%rdi), %xmm0 {%k1} {z}
1146 ; X64-NEXT:    retq
1148 ; X86-LABEL: maskuloadu8f16:
1149 ; X86:       # %bb.0:
1150 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
1151 ; X86-NEXT:    vpmovw2m %xmm0, %k1
1152 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1153 ; X86-NEXT:    vmovdqu16 (%eax), %xmm0 {%k1} {z}
1154 ; X86-NEXT:    retl
1155   %res = call <8 x half> @llvm.masked.load.v8f16.p0v8f16(<8 x half>* %addr, i32 4, <8 x i1> %mask, <8 x half> undef)
1156   ret <8 x half> %res
1159 define <8 x half> @maskzloadu8f16(<8 x half>* %addr, <8 x i1> %mask) {
1160 ; X64-LABEL: maskzloadu8f16:
1161 ; X64:       # %bb.0:
1162 ; X64-NEXT:    vpsllw $15, %xmm0, %xmm0
1163 ; X64-NEXT:    vpmovw2m %xmm0, %k1
1164 ; X64-NEXT:    vmovdqu16 (%rdi), %xmm0 {%k1} {z}
1165 ; X64-NEXT:    retq
1167 ; X86-LABEL: maskzloadu8f16:
1168 ; X86:       # %bb.0:
1169 ; X86-NEXT:    vpsllw $15, %xmm0, %xmm0
1170 ; X86-NEXT:    vpmovw2m %xmm0, %k1
1171 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1172 ; X86-NEXT:    vmovdqu16 (%eax), %xmm0 {%k1} {z}
1173 ; X86-NEXT:    retl
1174   %res = call <8 x half> @llvm.masked.load.v8f16.p0v8f16(<8 x half>* %addr, i32 4, <8 x i1> %mask, <8 x half> zeroinitializer)
1175   ret <8 x half> %res
1178 define <8 x half> @movrr8f16(<8 x half> %a, <8 x half> %b) {
1179 ; CHECK-LABEL: movrr8f16:
1180 ; CHECK:       # %bb.0:
1181 ; CHECK-NEXT:    vmovaps %xmm1, %xmm0
1182 ; CHECK-NEXT:    ret{{[l|q]}}
1183   ret <8 x half> %b
1186 define <8 x half> @movrrk8f16(<8 x half> %a, <8 x half> %b, i8 %msk) {
1187 ; X64-LABEL: movrrk8f16:
1188 ; X64:       # %bb.0:
1189 ; X64-NEXT:    kmovd %edi, %k1
1190 ; X64-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
1191 ; X64-NEXT:    retq
1193 ; X86-LABEL: movrrk8f16:
1194 ; X86:       # %bb.0:
1195 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
1196 ; X86-NEXT:    vpblendmw %xmm0, %xmm1, %xmm0 {%k1}
1197 ; X86-NEXT:    retl
1198   %mask = bitcast i8 %msk to <8 x i1>
1199   %res = select <8 x i1> %mask, <8 x half> %a, <8 x half> %b
1200   ret <8 x half> %res
1203 define <8 x half> @movrrkz8f16(<8 x half> %a, i8 %msk) {
1204 ; X64-LABEL: movrrkz8f16:
1205 ; X64:       # %bb.0:
1206 ; X64-NEXT:    kmovd %edi, %k1
1207 ; X64-NEXT:    vmovdqu16 %xmm0, %xmm0 {%k1} {z}
1208 ; X64-NEXT:    retq
1210 ; X86-LABEL: movrrkz8f16:
1211 ; X86:       # %bb.0:
1212 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
1213 ; X86-NEXT:    vmovdqu16 %xmm0, %xmm0 {%k1} {z}
1214 ; X86-NEXT:    retl
1215   %mask = bitcast i8 %msk to <8 x i1>
1216   %res = select <8 x i1> %mask, <8 x half> %a, <8 x half> zeroinitializer
1217   ret <8 x half> %res
1220 define <8 x half> @movsh(<8 x half> %a, <8 x half> %b) {
1221 ; CHECK-LABEL: movsh:
1222 ; CHECK:       # %bb.0:
1223 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm2 = xmm0[0,1,14,15,0,1,2,3,4,5,6,7,14,15,10,11]
1224 ; CHECK-NEXT:    vmovsh %xmm0, %xmm1, %xmm0
1225 ; CHECK-NEXT:    vaddph %xmm0, %xmm2, %xmm0
1226 ; CHECK-NEXT:    ret{{[l|q]}}
1227   %res1 = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 7, i32 0, i32 1, i32 2, i32 3, i32 7, i32 5>
1228   %res2 = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
1229   %res = fadd <8 x half> %res1, %res2
1230   ret <8 x half> %res
1233 define i16 @test_movw(half %x) {
1234 ; X64-LABEL: test_movw:
1235 ; X64:       # %bb.0:
1236 ; X64-NEXT:    vmovw %xmm0, %eax
1237 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
1238 ; X64-NEXT:    retq
1240 ; X86-LABEL: test_movw:
1241 ; X86:       # %bb.0:
1242 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1243 ; X86-NEXT:    retl
1244   %res = bitcast half %x to i16
1245   ret i16 %res
1248 define half @test_movw2(i16 %x) {
1249 ; X64-LABEL: test_movw2:
1250 ; X64:       # %bb.0:
1251 ; X64-NEXT:    vmovw %edi, %xmm0
1252 ; X64-NEXT:    retq
1254 ; X86-LABEL: test_movw2:
1255 ; X86:       # %bb.0:
1256 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
1257 ; X86-NEXT:    retl
1258   %res = bitcast i16 %x to half
1259   ret half %res
1262 ; sext avoids having a truncate in front of the bitcast input due to calling
1263 ; convention or i16 op promotion.
1264 define half @test_movw3(i8 %x) {
1265 ; X64-LABEL: test_movw3:
1266 ; X64:       # %bb.0:
1267 ; X64-NEXT:    movsbl %dil, %eax
1268 ; X64-NEXT:    vmovw %eax, %xmm0
1269 ; X64-NEXT:    retq
1271 ; X86-LABEL: test_movw3:
1272 ; X86:       # %bb.0:
1273 ; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
1274 ; X86-NEXT:    vmovw %eax, %xmm0
1275 ; X86-NEXT:    retl
1276   %z = sext i8 %x to i16
1277   %a = bitcast i16 %z to half
1278   ret half %a
1281 define half @extract_f16_0(<8 x half> %x) {
1282 ; CHECK-LABEL: extract_f16_0:
1283 ; CHECK:       # %bb.0:
1284 ; CHECK-NEXT:    ret{{[l|q]}}
1285    %res = extractelement <8 x half> %x, i32 0
1286    ret half %res
1289 define half @extract_f16_1(<8 x half> %x) {
1290 ; CHECK-LABEL: extract_f16_1:
1291 ; CHECK:       # %bb.0:
1292 ; CHECK-NEXT:    vpsrld $16, %xmm0, %xmm0
1293 ; CHECK-NEXT:    ret{{[l|q]}}
1294    %res = extractelement <8 x half> %x, i32 1
1295    ret half %res
1298 define half @extract_f16_2(<8 x half> %x) {
1299 ; CHECK-LABEL: extract_f16_2:
1300 ; CHECK:       # %bb.0:
1301 ; CHECK-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1302 ; CHECK-NEXT:    ret{{[l|q]}}
1303    %res = extractelement <8 x half> %x, i32 2
1304    ret half %res
1307 define half @extract_f16_3(<8 x half> %x) {
1308 ; CHECK-LABEL: extract_f16_3:
1309 ; CHECK:       # %bb.0:
1310 ; CHECK-NEXT:    vpsrlq $48, %xmm0, %xmm0
1311 ; CHECK-NEXT:    ret{{[l|q]}}
1312    %res = extractelement <8 x half> %x, i32 3
1313    ret half %res
1316 define half @extract_f16_4(<8 x half> %x) {
1317 ; CHECK-LABEL: extract_f16_4:
1318 ; CHECK:       # %bb.0:
1319 ; CHECK-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
1320 ; CHECK-NEXT:    ret{{[l|q]}}
1321    %res = extractelement <8 x half> %x, i32 4
1322    ret half %res
1325 define half @extract_f16_5(<8 x half> %x) {
1326 ; CHECK-LABEL: extract_f16_5:
1327 ; CHECK:       # %bb.0:
1328 ; CHECK-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1329 ; CHECK-NEXT:    ret{{[l|q]}}
1330    %res = extractelement <8 x half> %x, i32 5
1331    ret half %res
1334 define half @extract_f16_6(<8 x half> %x) {
1335 ; CHECK-LABEL: extract_f16_6:
1336 ; CHECK:       # %bb.0:
1337 ; CHECK-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1338 ; CHECK-NEXT:    ret{{[l|q]}}
1339    %res = extractelement <8 x half> %x, i32 6
1340    ret half %res
1343 define half @extract_f16_7(<8 x half> %x) {
1344 ; CHECK-LABEL: extract_f16_7:
1345 ; CHECK:       # %bb.0:
1346 ; CHECK-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1347 ; CHECK-NEXT:    ret{{[l|q]}}
1348    %res = extractelement <8 x half> %x, i32 7
1349    ret half %res
1352 define i16 @extract_i16_0(<8 x i16> %x) {
1353 ; CHECK-LABEL: extract_i16_0:
1354 ; CHECK:       # %bb.0:
1355 ; CHECK-NEXT:    vmovw %xmm0, %eax
1356 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1357 ; CHECK-NEXT:    ret{{[l|q]}}
1358    %res = extractelement <8 x i16> %x, i32 0
1359    ret i16 %res
1362 define i16 @extract_i16_1(<8 x i16> %x) {
1363 ; CHECK-LABEL: extract_i16_1:
1364 ; CHECK:       # %bb.0:
1365 ; CHECK-NEXT:    vpextrw $1, %xmm0, %eax
1366 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1367 ; CHECK-NEXT:    ret{{[l|q]}}
1368    %res = extractelement <8 x i16> %x, i32 1
1369    ret i16 %res
1372 define i16 @extract_i16_2(<8 x i16> %x) {
1373 ; CHECK-LABEL: extract_i16_2:
1374 ; CHECK:       # %bb.0:
1375 ; CHECK-NEXT:    vpextrw $2, %xmm0, %eax
1376 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1377 ; CHECK-NEXT:    ret{{[l|q]}}
1378    %res = extractelement <8 x i16> %x, i32 2
1379    ret i16 %res
1382 define i16 @extract_i16_3(<8 x i16> %x) {
1383 ; CHECK-LABEL: extract_i16_3:
1384 ; CHECK:       # %bb.0:
1385 ; CHECK-NEXT:    vpextrw $3, %xmm0, %eax
1386 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1387 ; CHECK-NEXT:    ret{{[l|q]}}
1388    %res = extractelement <8 x i16> %x, i32 3
1389    ret i16 %res
1392 define i16 @extract_i16_4(<8 x i16> %x) {
1393 ; CHECK-LABEL: extract_i16_4:
1394 ; CHECK:       # %bb.0:
1395 ; CHECK-NEXT:    vpextrw $4, %xmm0, %eax
1396 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1397 ; CHECK-NEXT:    ret{{[l|q]}}
1398    %res = extractelement <8 x i16> %x, i32 4
1399    ret i16 %res
1402 define i16 @extract_i16_5(<8 x i16> %x) {
1403 ; CHECK-LABEL: extract_i16_5:
1404 ; CHECK:       # %bb.0:
1405 ; CHECK-NEXT:    vpextrw $5, %xmm0, %eax
1406 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1407 ; CHECK-NEXT:    ret{{[l|q]}}
1408    %res = extractelement <8 x i16> %x, i32 5
1409    ret i16 %res
1412 define i16 @extract_i16_6(<8 x i16> %x) {
1413 ; CHECK-LABEL: extract_i16_6:
1414 ; CHECK:       # %bb.0:
1415 ; CHECK-NEXT:    vpextrw $6, %xmm0, %eax
1416 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1417 ; CHECK-NEXT:    ret{{[l|q]}}
1418    %res = extractelement <8 x i16> %x, i32 6
1419    ret i16 %res
1422 define i16 @extract_i16_7(<8 x i16> %x) {
1423 ; CHECK-LABEL: extract_i16_7:
1424 ; CHECK:       # %bb.0:
1425 ; CHECK-NEXT:    vpextrw $7, %xmm0, %eax
1426 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
1427 ; CHECK-NEXT:    ret{{[l|q]}}
1428    %res = extractelement <8 x i16> %x, i32 7
1429    ret i16 %res
1432 define void @extract_store_f16_0(<8 x half> %x, half* %y) {
1433 ; X64-LABEL: extract_store_f16_0:
1434 ; X64:       # %bb.0:
1435 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1436 ; X64-NEXT:    retq
1438 ; X86-LABEL: extract_store_f16_0:
1439 ; X86:       # %bb.0:
1440 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1441 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1442 ; X86-NEXT:    retl
1443    %res = extractelement <8 x half> %x, i32 0
1444    store half %res, half* %y
1445    ret void
1448 define void @extract_store_f16_1(<8 x half> %x, half* %y) {
1449 ; X64-LABEL: extract_store_f16_1:
1450 ; X64:       # %bb.0:
1451 ; X64-NEXT:    vpsrld $16, %xmm0, %xmm0
1452 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1453 ; X64-NEXT:    retq
1455 ; X86-LABEL: extract_store_f16_1:
1456 ; X86:       # %bb.0:
1457 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1458 ; X86-NEXT:    vpsrld $16, %xmm0, %xmm0
1459 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1460 ; X86-NEXT:    retl
1461    %res = extractelement <8 x half> %x, i32 1
1462    store half %res, half* %y
1463    ret void
1466 define void @extract_store_f16_2(<8 x half> %x, half* %y) {
1467 ; X64-LABEL: extract_store_f16_2:
1468 ; X64:       # %bb.0:
1469 ; X64-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1470 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1471 ; X64-NEXT:    retq
1473 ; X86-LABEL: extract_store_f16_2:
1474 ; X86:       # %bb.0:
1475 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1476 ; X86-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]
1477 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1478 ; X86-NEXT:    retl
1479    %res = extractelement <8 x half> %x, i32 2
1480    store half %res, half* %y
1481    ret void
1484 define void @extract_store_f16_3(<8 x half> %x, half* %y) {
1485 ; X64-LABEL: extract_store_f16_3:
1486 ; X64:       # %bb.0:
1487 ; X64-NEXT:    vpsrlq $48, %xmm0, %xmm0
1488 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1489 ; X64-NEXT:    retq
1491 ; X86-LABEL: extract_store_f16_3:
1492 ; X86:       # %bb.0:
1493 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1494 ; X86-NEXT:    vpsrlq $48, %xmm0, %xmm0
1495 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1496 ; X86-NEXT:    retl
1497    %res = extractelement <8 x half> %x, i32 3
1498    store half %res, half* %y
1499    ret void
1502 define void @extract_store_f16_4(<8 x half> %x, half* %y) {
1503 ; X64-LABEL: extract_store_f16_4:
1504 ; X64:       # %bb.0:
1505 ; X64-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
1506 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1507 ; X64-NEXT:    retq
1509 ; X86-LABEL: extract_store_f16_4:
1510 ; X86:       # %bb.0:
1511 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1512 ; X86-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
1513 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1514 ; X86-NEXT:    retl
1515    %res = extractelement <8 x half> %x, i32 4
1516    store half %res, half* %y
1517    ret void
1520 define void @extract_store_f16_5(<8 x half> %x, half* %y) {
1521 ; X64-LABEL: extract_store_f16_5:
1522 ; X64:       # %bb.0:
1523 ; X64-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1524 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1525 ; X64-NEXT:    retq
1527 ; X86-LABEL: extract_store_f16_5:
1528 ; X86:       # %bb.0:
1529 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1530 ; X86-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1531 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1532 ; X86-NEXT:    retl
1533    %res = extractelement <8 x half> %x, i32 5
1534    store half %res, half* %y
1535    ret void
1538 define void @extract_store_f16_6(<8 x half> %x, half* %y) {
1539 ; X64-LABEL: extract_store_f16_6:
1540 ; X64:       # %bb.0:
1541 ; X64-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1542 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1543 ; X64-NEXT:    retq
1545 ; X86-LABEL: extract_store_f16_6:
1546 ; X86:       # %bb.0:
1547 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1548 ; X86-NEXT:    vpermilps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1549 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1550 ; X86-NEXT:    retl
1551    %res = extractelement <8 x half> %x, i32 6
1552    store half %res, half* %y
1553    ret void
1556 define void @extract_store_f16_7(<8 x half> %x, half* %y) {
1557 ; X64-LABEL: extract_store_f16_7:
1558 ; X64:       # %bb.0:
1559 ; X64-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1560 ; X64-NEXT:    vmovsh %xmm0, (%rdi)
1561 ; X64-NEXT:    retq
1563 ; X86-LABEL: extract_store_f16_7:
1564 ; X86:       # %bb.0:
1565 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1566 ; X86-NEXT:    vpsrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1567 ; X86-NEXT:    vmovsh %xmm0, (%eax)
1568 ; X86-NEXT:    retl
1569    %res = extractelement <8 x half> %x, i32 7
1570    store half %res, half* %y
1571    ret void
1574 define void @extract_store_i16_0(<8 x i16> %x, i16* %y) {
1575 ; X64-LABEL: extract_store_i16_0:
1576 ; X64:       # %bb.0:
1577 ; X64-NEXT:    vpextrw $0, %xmm0, (%rdi)
1578 ; X64-NEXT:    retq
1580 ; X86-LABEL: extract_store_i16_0:
1581 ; X86:       # %bb.0:
1582 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1583 ; X86-NEXT:    vpextrw $0, %xmm0, (%eax)
1584 ; X86-NEXT:    retl
1585    %res = extractelement <8 x i16> %x, i32 0
1586    store i16 %res, i16* %y
1587    ret void
1590 define void @extract_store_i16_1(<8 x i16> %x, i16* %y) {
1591 ; X64-LABEL: extract_store_i16_1:
1592 ; X64:       # %bb.0:
1593 ; X64-NEXT:    vpextrw $1, %xmm0, (%rdi)
1594 ; X64-NEXT:    retq
1596 ; X86-LABEL: extract_store_i16_1:
1597 ; X86:       # %bb.0:
1598 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1599 ; X86-NEXT:    vpextrw $1, %xmm0, (%eax)
1600 ; X86-NEXT:    retl
1601    %res = extractelement <8 x i16> %x, i32 1
1602    store i16 %res, i16* %y
1603    ret void
1606 define void @extract_store_i16_2(<8 x i16> %x, i16* %y) {
1607 ; X64-LABEL: extract_store_i16_2:
1608 ; X64:       # %bb.0:
1609 ; X64-NEXT:    vpextrw $2, %xmm0, (%rdi)
1610 ; X64-NEXT:    retq
1612 ; X86-LABEL: extract_store_i16_2:
1613 ; X86:       # %bb.0:
1614 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1615 ; X86-NEXT:    vpextrw $2, %xmm0, (%eax)
1616 ; X86-NEXT:    retl
1617    %res = extractelement <8 x i16> %x, i32 2
1618    store i16 %res, i16* %y
1619    ret void
1622 define void @extract_store_i16_3(<8 x i16> %x, i16* %y) {
1623 ; X64-LABEL: extract_store_i16_3:
1624 ; X64:       # %bb.0:
1625 ; X64-NEXT:    vpextrw $3, %xmm0, (%rdi)
1626 ; X64-NEXT:    retq
1628 ; X86-LABEL: extract_store_i16_3:
1629 ; X86:       # %bb.0:
1630 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1631 ; X86-NEXT:    vpextrw $3, %xmm0, (%eax)
1632 ; X86-NEXT:    retl
1633    %res = extractelement <8 x i16> %x, i32 3
1634    store i16 %res, i16* %y
1635    ret void
1638 define void @extract_store_i16_4(<8 x i16> %x, i16* %y) {
1639 ; X64-LABEL: extract_store_i16_4:
1640 ; X64:       # %bb.0:
1641 ; X64-NEXT:    vpextrw $4, %xmm0, (%rdi)
1642 ; X64-NEXT:    retq
1644 ; X86-LABEL: extract_store_i16_4:
1645 ; X86:       # %bb.0:
1646 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1647 ; X86-NEXT:    vpextrw $4, %xmm0, (%eax)
1648 ; X86-NEXT:    retl
1649    %res = extractelement <8 x i16> %x, i32 4
1650    store i16 %res, i16* %y
1651    ret void
1654 define void @extract_store_i16_5(<8 x i16> %x, i16* %y) {
1655 ; X64-LABEL: extract_store_i16_5:
1656 ; X64:       # %bb.0:
1657 ; X64-NEXT:    vpextrw $5, %xmm0, (%rdi)
1658 ; X64-NEXT:    retq
1660 ; X86-LABEL: extract_store_i16_5:
1661 ; X86:       # %bb.0:
1662 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1663 ; X86-NEXT:    vpextrw $5, %xmm0, (%eax)
1664 ; X86-NEXT:    retl
1665    %res = extractelement <8 x i16> %x, i32 5
1666    store i16 %res, i16* %y
1667    ret void
1670 define void @extract_store_i16_6(<8 x i16> %x, i16* %y) {
1671 ; X64-LABEL: extract_store_i16_6:
1672 ; X64:       # %bb.0:
1673 ; X64-NEXT:    vpextrw $6, %xmm0, (%rdi)
1674 ; X64-NEXT:    retq
1676 ; X86-LABEL: extract_store_i16_6:
1677 ; X86:       # %bb.0:
1678 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1679 ; X86-NEXT:    vpextrw $6, %xmm0, (%eax)
1680 ; X86-NEXT:    retl
1681    %res = extractelement <8 x i16> %x, i32 6
1682    store i16 %res, i16* %y
1683    ret void
1686 define void @extract_store_i16_7(<8 x i16> %x, i16* %y) {
1687 ; X64-LABEL: extract_store_i16_7:
1688 ; X64:       # %bb.0:
1689 ; X64-NEXT:    vpextrw $7, %xmm0, (%rdi)
1690 ; X64-NEXT:    retq
1692 ; X86-LABEL: extract_store_i16_7:
1693 ; X86:       # %bb.0:
1694 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1695 ; X86-NEXT:    vpextrw $7, %xmm0, (%eax)
1696 ; X86-NEXT:    retl
1697    %res = extractelement <8 x i16> %x, i32 7
1698    store i16 %res, i16* %y
1699    ret void
1702 define i32 @extract_zext_i16_0(<8 x i16> %x) {
1703 ; CHECK-LABEL: extract_zext_i16_0:
1704 ; CHECK:       # %bb.0:
1705 ; CHECK-NEXT:    vpextrw $0, %xmm0, %eax
1706 ; CHECK-NEXT:    ret{{[l|q]}}
1707    %res = extractelement <8 x i16> %x, i32 0
1708    %res2 = zext i16 %res to i32
1709    ret i32 %res2
1712 define i32 @extract_zext_i16_1(<8 x i16> %x) {
1713 ; CHECK-LABEL: extract_zext_i16_1:
1714 ; CHECK:       # %bb.0:
1715 ; CHECK-NEXT:    vpextrw $1, %xmm0, %eax
1716 ; CHECK-NEXT:    ret{{[l|q]}}
1717    %res = extractelement <8 x i16> %x, i32 1
1718    %res2 = zext i16 %res to i32
1719    ret i32 %res2
1722 define <8 x half> @build_vector_xxxxuuuu(half %a0, half %a1, half %a2, half %a3) {
1723 ; X64-LABEL: build_vector_xxxxuuuu:
1724 ; X64:       # %bb.0:
1725 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
1726 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1727 ; X64-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],zero,zero
1728 ; X64-NEXT:    retq
1730 ; X86-LABEL: build_vector_xxxxuuuu:
1731 ; X86:       # %bb.0:
1732 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
1733 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1734 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1735 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1736 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1737 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1738 ; X86-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero
1739 ; X86-NEXT:    retl
1740   %a = insertelement <8 x half> undef, half %a0, i32 0
1741   %b = insertelement <8 x half> %a, half %a1, i32 1
1742   %c = insertelement <8 x half> %b, half %a2, i32 2
1743   %d = insertelement <8 x half> %c, half %a3, i32 3
1744   ret <8 x half> %d
1747 define <8 x half> @build_vector_uuuuxxxx(half %a0, half %a1, half %a2, half %a3) {
1748 ; X64-LABEL: build_vector_uuuuxxxx:
1749 ; X64:       # %bb.0:
1750 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
1751 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1752 ; X64-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1753 ; X64-NEXT:    vpbroadcastq %xmm0, %xmm0
1754 ; X64-NEXT:    retq
1756 ; X86-LABEL: build_vector_uuuuxxxx:
1757 ; X86:       # %bb.0:
1758 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
1759 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1760 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1761 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1762 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1763 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1764 ; X86-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1765 ; X86-NEXT:    vpbroadcastq %xmm0, %xmm0
1766 ; X86-NEXT:    retl
1767   %a = insertelement <8 x half> undef, half %a0, i32 4
1768   %b = insertelement <8 x half> %a, half %a1, i32 5
1769   %c = insertelement <8 x half> %b, half %a2, i32 6
1770   %d = insertelement <8 x half> %c, half %a3, i32 7
1771   ret <8 x half> %d
1774 define <8 x half> @build_vector_xxxxxxxx(half %a0, half %a1, half %a2, half %a3, half %a4, half %a5, half %a6, half %a7) {
1775 ; X64-LABEL: build_vector_xxxxxxxx:
1776 ; X64:       # %bb.0:
1777 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm6 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]
1778 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm4 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]
1779 ; X64-NEXT:    vpunpckldq {{.*#+}} xmm4 = xmm4[0],xmm6[0],xmm4[1],xmm6[1]
1780 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
1781 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1782 ; X64-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
1783 ; X64-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0]
1784 ; X64-NEXT:    retq
1786 ; X86-LABEL: build_vector_xxxxxxxx:
1787 ; X86:       # %bb.0:
1788 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
1789 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1790 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1791 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1792 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1793 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1794 ; X86-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1795 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1796 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1797 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1798 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1799 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm3
1800 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
1801 ; X86-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1]
1802 ; X86-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1803 ; X86-NEXT:    retl
1804   %a = insertelement <8 x half> undef, half %a0, i32 0
1805   %b = insertelement <8 x half> %a, half %a1, i32 1
1806   %c = insertelement <8 x half> %b, half %a2, i32 2
1807   %d = insertelement <8 x half> %c, half %a3, i32 3
1808   %e = insertelement <8 x half> %d, half %a4, i32 4
1809   %f = insertelement <8 x half> %e, half %a5, i32 5
1810   %g = insertelement <8 x half> %f, half %a6, i32 6
1811   %h = insertelement <8 x half> %g, half %a7, i32 7
1812   ret <8 x half> %h
1815 define <16 x half> @build_vector_xxxxuuuuuuuuxxxx(half %a0, half %a1, half %a2, half %a3, half %a4, half %a5, half %a6, half %a7) {
1816 ; X64-LABEL: build_vector_xxxxuuuuuuuuxxxx:
1817 ; X64:       # %bb.0:
1818 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
1819 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1820 ; X64-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm2[0],zero,zero
1821 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm6[0],xmm7[0],xmm6[1],xmm7[1],xmm6[2],xmm7[2],xmm6[3],xmm7[3]
1822 ; X64-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm4[0],xmm5[0],xmm4[1],xmm5[1],xmm4[2],xmm5[2],xmm4[3],xmm5[3]
1823 ; X64-NEXT:    vpunpckldq {{.*#+}} xmm1 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
1824 ; X64-NEXT:    vpbroadcastq %xmm1, %xmm1
1825 ; X64-NEXT:    vinsertf128 $1, %xmm1, %ymm0, %ymm0
1826 ; X64-NEXT:    retq
1828 ; X86-LABEL: build_vector_xxxxuuuuuuuuxxxx:
1829 ; X86:       # %bb.0:
1830 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
1831 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1832 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3]
1833 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1834 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1835 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1836 ; X86-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
1837 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm1
1838 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1839 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1],xmm1[2],xmm2[2],xmm1[3],xmm2[3]
1840 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm2
1841 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm3
1842 ; X86-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm2[0],xmm3[0],xmm2[1],xmm3[1],xmm2[2],xmm3[2],xmm2[3],xmm3[3]
1843 ; X86-NEXT:    vinsertps {{.*#+}} xmm1 = xmm1[0],xmm2[0],zero,zero
1844 ; X86-NEXT:    vpbroadcastq %xmm0, %xmm0
1845 ; X86-NEXT:    vinsertf128 $1, %xmm0, %ymm1, %ymm0
1846 ; X86-NEXT:    retl
1847   %a = insertelement <16 x half> undef, half %a0, i32 0
1848   %b = insertelement <16 x half> %a, half %a1, i32 1
1849   %c = insertelement <16 x half> %b, half %a2, i32 2
1850   %d = insertelement <16 x half> %c, half %a3, i32 3
1851   %e = insertelement <16 x half> %d, half %a4, i32 12
1852   %f = insertelement <16 x half> %e, half %a5, i32 13
1853   %g = insertelement <16 x half> %f, half %a6, i32 14
1854   %h = insertelement <16 x half> %g, half %a7, i32 15
1855   ret <16 x half> %h
1858 define <8 x half> @regression1(<8 x half> %a, <8 x half> %b) {
1859 ; CHECK-LABEL: regression1:
1860 ; CHECK:       # %bb.0:
1861 ; CHECK-NEXT:    vpshufb {{.*#+}} xmm0 = xmm0[0,1,14,15,0,1,2,3,4,5,6,7,14,15,10,11]
1862 ; CHECK-NEXT:    ret{{[l|q]}}
1863   %res = shufflevector <8 x half> %a, <8 x half> %b, <8 x i32> <i32 0, i32 7, i32 0, i32 1, i32 2, i32 3, i32 7, i32 5>
1864   ret <8 x half> %res
1867 define <4 x float> @regression2(i8 addrspace(1)* %0, <4 x i32> %1, <4 x i32> %2, <4 x float> %3, i8* %4) {
1868 ; X64-LABEL: regression2:
1869 ; X64:       # %bb.0:
1870 ; X64-NEXT:    vmovw (%rsi), %xmm0
1871 ; X64-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1872 ; X64-NEXT:    vcvtdq2ps %xmm0, %xmm0
1873 ; X64-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1],mem[2,3]
1874 ; X64-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
1875 ; X64-NEXT:    retq
1877 ; X86-LABEL: regression2:
1878 ; X86:       # %bb.0:
1879 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1880 ; X86-NEXT:    vmovw (%eax), %xmm0
1881 ; X86-NEXT:    vpmovzxbd {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero,xmm0[2],zero,zero,zero,xmm0[3],zero,zero,zero
1882 ; X86-NEXT:    vcvtdq2ps %xmm0, %xmm0
1883 ; X86-NEXT:    vblendps {{.*#+}} xmm0 = xmm0[0,1],mem[2,3]
1884 ; X86-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}{1to4}, %xmm0, %xmm0
1885 ; X86-NEXT:    retl
1886   %6 = getelementptr i8, i8* %4, i64 0
1887   %7 = getelementptr i8, i8* %6, i64 0
1888   %8 = getelementptr i8, i8* %7, i64 0
1889   %9 = load i8, i8* %8, align 1
1890   %10 = getelementptr i8, i8* %8, i64 1
1891   %11 = addrspacecast i8* %10 to i8 addrspace(4)*
1892   %12 = load i8, i8 addrspace(4)* %11, align 1
1893   %13 = insertelement <2 x i8> poison, i8 %9, i32 0
1894   %14 = insertelement <2 x i8> %13, i8 %12, i32 1
1895   %15 = uitofp <2 x i8> %14 to <2 x float>
1896   %16 = shufflevector <2 x float> %15, <2 x float> poison, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef>
1897   %17 = shufflevector <4 x float> %16, <4 x float> <float poison, float poison, float 0.000000e+00, float 2.550000e+02>, <4 x i32> <i32 0, i32 1, i32 6, i32 7>
1898   %18 = fmul contract <4 x float> %17, <float 0x3F70101020000000, float 0x3F70101020000000, float 0x3F70101020000000, float 0x3F70101020000000>
1899   ret <4 x float> %18
1902 ; Make sure load/stores of v4f16 are handled well on 32-bit targets where
1903 ; default widening legalization can't use i64.
1904 define void @load_store_v4f16(<4 x half>* %x, <4 x half>* %y, <4 x half>* %z) {
1905 ; X64-LABEL: load_store_v4f16:
1906 ; X64:       # %bb.0:
1907 ; X64-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
1908 ; X64-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
1909 ; X64-NEXT:    vaddph %xmm1, %xmm0, %xmm0
1910 ; X64-NEXT:    vmovlps %xmm0, (%rdx)
1911 ; X64-NEXT:    retq
1913 ; X86-LABEL: load_store_v4f16:
1914 ; X86:       # %bb.0:
1915 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
1916 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1917 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
1918 ; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
1919 ; X86-NEXT:    vmovsd {{.*#+}} xmm1 = mem[0],zero
1920 ; X86-NEXT:    vaddph %xmm1, %xmm0, %xmm0
1921 ; X86-NEXT:    vmovlps %xmm0, (%eax)
1922 ; X86-NEXT:    retl
1923   %a = load <4 x half>, <4 x half>* %x
1924   %b = load <4 x half>, <4 x half>* %y
1925   %c = fadd <4 x half> %a, %b
1926   store <4 x half> %c, <4 x half>* %z
1927   ret void