[Reland][Runtimes] Merge 'compile_commands.json' files from runtimes build (#116303)
[llvm-project.git] / llvm / test / CodeGen / X86 / avx512fp16-cvt.ll
blobe1e013528738a4d0b95498a85e19bba6bb729aaf
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512fp16 -mattr=+avx512vl | FileCheck %s --check-prefixes=CHECK,X64
3 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+avx512fp16 -mattr=+avx512vl | FileCheck %s --check-prefixes=CHECK,X86
5 define half @f32tof16(float %b) nounwind {
6 ; X64-LABEL: f32tof16:
7 ; X64:       # %bb.0:
8 ; X64-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0
9 ; X64-NEXT:    retq
11 ; X86-LABEL: f32tof16:
12 ; X86:       # %bb.0:
13 ; X86-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
14 ; X86-NEXT:    vcvtss2sh %xmm0, %xmm0, %xmm0
15 ; X86-NEXT:    retl
16   %a = fptrunc float %b to half
17   ret half %a
20 define half @f64tof16(double %b) nounwind {
21 ; X64-LABEL: f64tof16:
22 ; X64:       # %bb.0:
23 ; X64-NEXT:    vcvtsd2sh %xmm0, %xmm0, %xmm0
24 ; X64-NEXT:    retq
26 ; X86-LABEL: f64tof16:
27 ; X86:       # %bb.0:
28 ; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
29 ; X86-NEXT:    vcvtsd2sh %xmm0, %xmm0, %xmm0
30 ; X86-NEXT:    retl
31   %a = fptrunc double %b to half
32   ret half %a
35 define <16 x half> @f32to16f16(<16 x float> %b) nounwind {
36 ; CHECK-LABEL: f32to16f16:
37 ; CHECK:       # %bb.0:
38 ; CHECK-NEXT:    vcvtps2phx %zmm0, %ymm0
39 ; CHECK-NEXT:    ret{{[l|q]}}
40   %a = fptrunc <16 x float> %b to <16 x half>
41   ret <16 x half> %a
44 define <8 x half> @f32to8f16(<8 x float> %b) {
45 ; CHECK-LABEL: f32to8f16:
46 ; CHECK:       # %bb.0:
47 ; CHECK-NEXT:    vcvtps2phx %ymm0, %xmm0
48 ; CHECK-NEXT:    vzeroupper
49 ; CHECK-NEXT:    ret{{[l|q]}}
50   %a = fptrunc <8 x float> %b to <8 x half>
51   ret <8 x half> %a
54 define <4 x half> @f32to4f16(<4 x float> %b) {
55 ; CHECK-LABEL: f32to4f16:
56 ; CHECK:       # %bb.0:
57 ; CHECK-NEXT:    vcvtps2phx %xmm0, %xmm0
58 ; CHECK-NEXT:    ret{{[l|q]}}
59   %a = fptrunc <4 x float> %b to <4 x half>
60   ret <4 x half> %a
63 define <2 x half> @f32to2f16(<2 x float> %b) {
64 ; CHECK-LABEL: f32to2f16:
65 ; CHECK:       # %bb.0:
66 ; CHECK-NEXT:    vcvtps2phx %xmm0, %xmm0
67 ; CHECK-NEXT:    ret{{[l|q]}}
68   %a = fptrunc <2 x float> %b to <2 x half>
69   ret <2 x half> %a
72 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtps2phx.128(<4 x float>, <8 x half>, i8)
73 declare <8 x half> @llvm.x86.avx512fp16.mask.vcvtps2phx.256(<8 x float>, <8 x half>, i8)
75 define <8 x half> @f32to4f16_mask(<4 x float> %a, <8 x half> %b, i8 %mask) {
76 ; X64-LABEL: f32to4f16_mask:
77 ; X64:       # %bb.0:
78 ; X64-NEXT:    kmovd %edi, %k1
79 ; X64-NEXT:    vcvtps2phx %xmm0, %xmm1 {%k1}
80 ; X64-NEXT:    vmovaps %xmm1, %xmm0
81 ; X64-NEXT:    retq
83 ; X86-LABEL: f32to4f16_mask:
84 ; X86:       # %bb.0:
85 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
86 ; X86-NEXT:    vcvtps2phx %xmm0, %xmm1 {%k1}
87 ; X86-NEXT:    vmovaps %xmm1, %xmm0
88 ; X86-NEXT:    retl
89   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtps2phx.128(<4 x float> %a, <8 x half> %b, i8 %mask)
90   ret <8 x half> %res
93 define <8 x half> @f32to8f16_mask(<8 x float> %a, <8 x half> %b, i8 %mask) {
94 ; X64-LABEL: f32to8f16_mask:
95 ; X64:       # %bb.0:
96 ; X64-NEXT:    kmovd %edi, %k1
97 ; X64-NEXT:    vcvtps2phx %ymm0, %xmm1 {%k1}
98 ; X64-NEXT:    vmovaps %xmm1, %xmm0
99 ; X64-NEXT:    vzeroupper
100 ; X64-NEXT:    retq
102 ; X86-LABEL: f32to8f16_mask:
103 ; X86:       # %bb.0:
104 ; X86-NEXT:    kmovb {{[0-9]+}}(%esp), %k1
105 ; X86-NEXT:    vcvtps2phx %ymm0, %xmm1 {%k1}
106 ; X86-NEXT:    vmovaps %xmm1, %xmm0
107 ; X86-NEXT:    vzeroupper
108 ; X86-NEXT:    retl
109   %res = call <8 x half> @llvm.x86.avx512fp16.mask.vcvtps2phx.256(<8 x float> %a, <8 x half> %b, i8 %mask)
110   ret <8 x half> %res
113 define <8 x half> @f32to8f16_mask2(<8 x float> %b, <8 x i1> %mask) {
114 ; CHECK-LABEL: f32to8f16_mask2:
115 ; CHECK:       # %bb.0:
116 ; CHECK-NEXT:    vpsllw $15, %xmm1, %xmm1
117 ; CHECK-NEXT:    vpmovw2m %xmm1, %k1
118 ; CHECK-NEXT:    vcvtps2phx %ymm0, %xmm0 {%k1} {z}
119 ; CHECK-NEXT:    vzeroupper
120 ; CHECK-NEXT:    ret{{[l|q]}}
121   %a = fptrunc <8 x float> %b to <8 x half>
122   %c = select <8 x i1>%mask, <8 x half>%a, <8 x half> zeroinitializer
123   ret <8 x half> %c
126 define <16 x half> @f32to16f16_mask(<16 x float> %b, <16 x i1> %mask) {
127 ; CHECK-LABEL: f32to16f16_mask:
128 ; CHECK:       # %bb.0:
129 ; CHECK-NEXT:    vpsllw $7, %xmm1, %xmm1
130 ; CHECK-NEXT:    vpmovb2m %xmm1, %k1
131 ; CHECK-NEXT:    vcvtps2phx %zmm0, %ymm0 {%k1} {z}
132 ; CHECK-NEXT:    ret{{[l|q]}}
133   %a = fptrunc <16 x float> %b to <16 x half>
134   %c = select <16 x i1>%mask, <16 x half>%a, <16 x half> zeroinitializer
135   ret <16 x half> %c
138 define float @f16tof32(half %b) nounwind {
139 ; X64-LABEL: f16tof32:
140 ; X64:       # %bb.0:
141 ; X64-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
142 ; X64-NEXT:    retq
144 ; X86-LABEL: f16tof32:
145 ; X86:       # %bb.0:
146 ; X86-NEXT:    pushl %eax
147 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
148 ; X86-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
149 ; X86-NEXT:    vmovss %xmm0, (%esp)
150 ; X86-NEXT:    flds (%esp)
151 ; X86-NEXT:    popl %eax
152 ; X86-NEXT:    retl
153   %a = fpext half %b to float
154   ret float %a
157 define double @f16tof64(half %b) nounwind {
158 ; X64-LABEL: f16tof64:
159 ; X64:       # %bb.0:
160 ; X64-NEXT:    vcvtsh2sd %xmm0, %xmm0, %xmm0
161 ; X64-NEXT:    retq
163 ; X86-LABEL: f16tof64:
164 ; X86:       # %bb.0:
165 ; X86-NEXT:    pushl %ebp
166 ; X86-NEXT:    movl %esp, %ebp
167 ; X86-NEXT:    andl $-8, %esp
168 ; X86-NEXT:    subl $8, %esp
169 ; X86-NEXT:    vmovsh 8(%ebp), %xmm0
170 ; X86-NEXT:    vcvtsh2sd %xmm0, %xmm0, %xmm0
171 ; X86-NEXT:    vmovsd %xmm0, (%esp)
172 ; X86-NEXT:    fldl (%esp)
173 ; X86-NEXT:    movl %ebp, %esp
174 ; X86-NEXT:    popl %ebp
175 ; X86-NEXT:    retl
176   %a = fpext half %b to double
177   ret double %a
180 define <16 x float> @f16to16f32(<16 x half> %b) nounwind {
181 ; CHECK-LABEL: f16to16f32:
182 ; CHECK:       # %bb.0:
183 ; CHECK-NEXT:    vcvtph2psx %ymm0, %zmm0
184 ; CHECK-NEXT:    ret{{[l|q]}}
185   %a = fpext <16 x half> %b to <16 x float>
186   ret <16 x float> %a
189 define <8 x float> @f16to8f32(<8 x half> %b) nounwind {
190 ; CHECK-LABEL: f16to8f32:
191 ; CHECK:       # %bb.0:
192 ; CHECK-NEXT:    vcvtph2psx %xmm0, %ymm0
193 ; CHECK-NEXT:    ret{{[l|q]}}
194   %a = fpext <8 x half> %b to <8 x float>
195   ret <8 x float> %a
198 define <4 x float> @f16to4f32(<4 x half> %b) nounwind {
199 ; CHECK-LABEL: f16to4f32:
200 ; CHECK:       # %bb.0:
201 ; CHECK-NEXT:    vcvtph2psx %xmm0, %xmm0
202 ; CHECK-NEXT:    ret{{[l|q]}}
203   %a = fpext <4 x half> %b to <4 x float>
204   ret <4 x float> %a
207 define <2 x float> @f16to2f32(<2 x half> %b) nounwind {
208 ; CHECK-LABEL: f16to2f32:
209 ; CHECK:       # %bb.0:
210 ; CHECK-NEXT:    vcvtph2psx %xmm0, %xmm0
211 ; CHECK-NEXT:    ret{{[l|q]}}
212   %a = fpext <2 x half> %b to <2 x float>
213   ret <2 x float> %a
216 define <16 x float> @f16to16f32_mask(<16 x half> %b, <16 x float> %b1, <16 x float> %a1) {
217 ; CHECK-LABEL: f16to16f32_mask:
218 ; CHECK:       # %bb.0:
219 ; CHECK-NEXT:    vcmpltps %zmm2, %zmm1, %k1
220 ; CHECK-NEXT:    vcvtph2psx %ymm0, %zmm0 {%k1} {z}
221 ; CHECK-NEXT:    ret{{[l|q]}}
222   %a = fpext <16 x half> %b to <16 x float>
223   %mask = fcmp ogt <16 x float> %a1, %b1
224   %c = select <16 x i1> %mask, <16 x float> %a, <16 x float> zeroinitializer
225   ret <16 x float> %c
228 define <8 x float> @f16to8f32_mask(<8 x half> %b, <8 x float> %b1, <8 x float> %a1) {
229 ; CHECK-LABEL: f16to8f32_mask:
230 ; CHECK:       # %bb.0:
231 ; CHECK-NEXT:    vcmpltps %ymm2, %ymm1, %k1
232 ; CHECK-NEXT:    vcvtph2psx %xmm0, %ymm0 {%k1} {z}
233 ; CHECK-NEXT:    ret{{[l|q]}}
234   %a = fpext <8 x half> %b to <8 x float>
235   %mask = fcmp ogt <8 x float> %a1, %b1
236   %c = select <8 x i1> %mask, <8 x float> %a, <8 x float> zeroinitializer
237   ret <8 x float> %c
240 define <4 x float> @f16to4f32_mask(<4 x half> %b, <4 x float> %b1, <4 x float> %a1) {
241 ; CHECK-LABEL: f16to4f32_mask:
242 ; CHECK:       # %bb.0:
243 ; CHECK-NEXT:    vcmpltps %xmm2, %xmm1, %k1
244 ; CHECK-NEXT:    vcvtph2psx %xmm0, %xmm0 {%k1} {z}
245 ; CHECK-NEXT:    ret{{[l|q]}}
246   %a = fpext <4 x half> %b to <4 x float>
247   %mask = fcmp ogt <4 x float> %a1, %b1
248   %c = select <4 x i1> %mask, <4 x float> %a, <4 x float> zeroinitializer
249   ret <4 x float> %c
252 define <2 x float> @f16to2f32_mask(<2 x half> %b, <2 x float> %b1, <2 x float> %a1) {
253 ; CHECK-LABEL: f16to2f32_mask:
254 ; CHECK:       # %bb.0:
255 ; CHECK-NEXT:    vcmpltps %xmm2, %xmm1, %k1
256 ; CHECK-NEXT:    vcvtph2psx %xmm0, %xmm0 {%k1} {z}
257 ; CHECK-NEXT:    ret{{[l|q]}}
258   %a = fpext <2 x half> %b to <2 x float>
259   %mask = fcmp ogt <2 x float> %a1, %b1
260   %c = select <2 x i1> %mask, <2 x float> %a, <2 x float> zeroinitializer
261   ret <2 x float> %c
264 define <2 x double> @f16to2f64(<2 x half> %b) nounwind {
265 ; CHECK-LABEL: f16to2f64:
266 ; CHECK:       # %bb.0:
267 ; CHECK-NEXT:    vcvtph2pd %xmm0, %xmm0
268 ; CHECK-NEXT:    ret{{[l|q]}}
269   %a = fpext <2 x half> %b to <2 x double>
270   ret <2 x double> %a
273 define <2 x double> @f16to2f64_mask(<2 x half> %b, <2 x double> %b1, <2 x double> %a1) {
274 ; CHECK-LABEL: f16to2f64_mask:
275 ; CHECK:       # %bb.0:
276 ; CHECK-NEXT:    vcmpltpd %xmm2, %xmm1, %k1
277 ; CHECK-NEXT:    vcvtph2pd %xmm0, %xmm0 {%k1} {z}
278 ; CHECK-NEXT:    ret{{[l|q]}}
279   %a = fpext <2 x half> %b to <2 x double>
280   %mask = fcmp ogt <2 x double> %a1, %b1
281   %c = select <2 x i1> %mask, <2 x double> %a, <2 x double> zeroinitializer
282   ret <2 x double> %c
285 define <4 x double> @f16to4f64(<4 x half> %b) nounwind {
286 ; CHECK-LABEL: f16to4f64:
287 ; CHECK:       # %bb.0:
288 ; CHECK-NEXT:    vcvtph2pd %xmm0, %ymm0
289 ; CHECK-NEXT:    ret{{[l|q]}}
290   %a = fpext <4 x half> %b to <4 x double>
291   ret <4 x double> %a
294 define <4 x double> @f16to4f64_mask(<4 x half> %b, <4 x double> %b1, <4 x double> %a1) {
295 ; CHECK-LABEL: f16to4f64_mask:
296 ; CHECK:       # %bb.0:
297 ; CHECK-NEXT:    vcmpltpd %ymm2, %ymm1, %k1
298 ; CHECK-NEXT:    vcvtph2pd %xmm0, %ymm0 {%k1} {z}
299 ; CHECK-NEXT:    ret{{[l|q]}}
300   %a = fpext <4 x half> %b to <4 x double>
301   %mask = fcmp ogt <4 x double> %a1, %b1
302   %c = select <4 x i1> %mask, <4 x double> %a, <4 x double> zeroinitializer
303   ret <4 x double> %c
306 define <8 x double> @f16to8f64(<8 x half> %b) nounwind {
307 ; CHECK-LABEL: f16to8f64:
308 ; CHECK:       # %bb.0:
309 ; CHECK-NEXT:    vcvtph2pd %xmm0, %zmm0
310 ; CHECK-NEXT:    ret{{[l|q]}}
311   %a = fpext <8 x half> %b to <8 x double>
312   ret <8 x double> %a
315 define <8 x double> @f16to8f64_mask(<8 x half> %b, <8 x double> %b1, <8 x double> %a1) {
316 ; CHECK-LABEL: f16to8f64_mask:
317 ; CHECK:       # %bb.0:
318 ; CHECK-NEXT:    vcmpltpd %zmm2, %zmm1, %k1
319 ; CHECK-NEXT:    vcvtph2pd %xmm0, %zmm0 {%k1} {z}
320 ; CHECK-NEXT:    ret{{[l|q]}}
321   %a = fpext <8 x half> %b to <8 x double>
322   %mask = fcmp ogt <8 x double> %a1, %b1
323   %c = select <8 x i1> %mask, <8 x double> %a, <8 x double> zeroinitializer
324   ret <8 x double> %c
327 define <2 x half> @f64to2f16(<2 x double> %b) {
328 ; CHECK-LABEL: f64to2f16:
329 ; CHECK:       # %bb.0:
330 ; CHECK-NEXT:    vcvtpd2ph %xmm0, %xmm0
331 ; CHECK-NEXT:    ret{{[l|q]}}
332   %a = fptrunc <2 x double> %b to <2 x half>
333   ret <2 x half> %a
336 define <4 x half> @f64to4f16(<4 x double> %b) {
337 ; CHECK-LABEL: f64to4f16:
338 ; CHECK:       # %bb.0:
339 ; CHECK-NEXT:    vcvtpd2ph %ymm0, %xmm0
340 ; CHECK-NEXT:    vzeroupper
341 ; CHECK-NEXT:    ret{{[l|q]}}
342   %a = fptrunc <4 x double> %b to <4 x half>
343   ret <4 x half> %a
346 define <8 x half> @f64to8f16(<8 x double> %b) {
347 ; CHECK-LABEL: f64to8f16:
348 ; CHECK:       # %bb.0:
349 ; CHECK-NEXT:    vcvtpd2ph %zmm0, %xmm0
350 ; CHECK-NEXT:    vzeroupper
351 ; CHECK-NEXT:    ret{{[l|q]}}
352   %a = fptrunc <8 x double> %b to <8 x half>
353   ret <8 x half> %a
356 define float @extload_f16_f32(ptr %x) {
357 ; X64-LABEL: extload_f16_f32:
358 ; X64:       # %bb.0:
359 ; X64-NEXT:    vmovsh (%rdi), %xmm0
360 ; X64-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
361 ; X64-NEXT:    retq
363 ; X86-LABEL: extload_f16_f32:
364 ; X86:       # %bb.0:
365 ; X86-NEXT:    pushl %eax
366 ; X86-NEXT:    .cfi_def_cfa_offset 8
367 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
368 ; X86-NEXT:    vmovsh (%eax), %xmm0
369 ; X86-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
370 ; X86-NEXT:    vmovss %xmm0, (%esp)
371 ; X86-NEXT:    flds (%esp)
372 ; X86-NEXT:    popl %eax
373 ; X86-NEXT:    .cfi_def_cfa_offset 4
374 ; X86-NEXT:    retl
375   %a = load half, ptr %x
376   %b = fpext half %a to float
377   ret float %b
380 define double @extload_f16_f64(ptr %x) {
381 ; X64-LABEL: extload_f16_f64:
382 ; X64:       # %bb.0:
383 ; X64-NEXT:    vmovsh (%rdi), %xmm0
384 ; X64-NEXT:    vcvtsh2sd %xmm0, %xmm0, %xmm0
385 ; X64-NEXT:    retq
387 ; X86-LABEL: extload_f16_f64:
388 ; X86:       # %bb.0:
389 ; X86-NEXT:    pushl %ebp
390 ; X86-NEXT:    .cfi_def_cfa_offset 8
391 ; X86-NEXT:    .cfi_offset %ebp, -8
392 ; X86-NEXT:    movl %esp, %ebp
393 ; X86-NEXT:    .cfi_def_cfa_register %ebp
394 ; X86-NEXT:    andl $-8, %esp
395 ; X86-NEXT:    subl $8, %esp
396 ; X86-NEXT:    movl 8(%ebp), %eax
397 ; X86-NEXT:    vmovsh (%eax), %xmm0
398 ; X86-NEXT:    vcvtsh2sd %xmm0, %xmm0, %xmm0
399 ; X86-NEXT:    vmovsd %xmm0, (%esp)
400 ; X86-NEXT:    fldl (%esp)
401 ; X86-NEXT:    movl %ebp, %esp
402 ; X86-NEXT:    popl %ebp
403 ; X86-NEXT:    .cfi_def_cfa %esp, 4
404 ; X86-NEXT:    retl
405   %a = load half, ptr %x
406   %b = fpext half %a to double
407   ret double %b
410 define float @extload_f16_f32_optsize(ptr %x) optsize {
411 ; X64-LABEL: extload_f16_f32_optsize:
412 ; X64:       # %bb.0:
413 ; X64-NEXT:    vcvtsh2ss (%rdi), %xmm0, %xmm0
414 ; X64-NEXT:    retq
416 ; X86-LABEL: extload_f16_f32_optsize:
417 ; X86:       # %bb.0:
418 ; X86-NEXT:    pushl %eax
419 ; X86-NEXT:    .cfi_def_cfa_offset 8
420 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
421 ; X86-NEXT:    vcvtsh2ss (%eax), %xmm0, %xmm0
422 ; X86-NEXT:    vmovss %xmm0, (%esp)
423 ; X86-NEXT:    flds (%esp)
424 ; X86-NEXT:    popl %eax
425 ; X86-NEXT:    .cfi_def_cfa_offset 4
426 ; X86-NEXT:    retl
427   %a = load half, ptr %x
428   %b = fpext half %a to float
429   ret float %b
432 define double @extload_f16_f64_optsize(ptr %x) optsize {
433 ; X64-LABEL: extload_f16_f64_optsize:
434 ; X64:       # %bb.0:
435 ; X64-NEXT:    vcvtsh2sd (%rdi), %xmm0, %xmm0
436 ; X64-NEXT:    retq
438 ; X86-LABEL: extload_f16_f64_optsize:
439 ; X86:       # %bb.0:
440 ; X86-NEXT:    pushl %ebp
441 ; X86-NEXT:    .cfi_def_cfa_offset 8
442 ; X86-NEXT:    .cfi_offset %ebp, -8
443 ; X86-NEXT:    movl %esp, %ebp
444 ; X86-NEXT:    .cfi_def_cfa_register %ebp
445 ; X86-NEXT:    andl $-8, %esp
446 ; X86-NEXT:    subl $8, %esp
447 ; X86-NEXT:    movl 8(%ebp), %eax
448 ; X86-NEXT:    vcvtsh2sd (%eax), %xmm0, %xmm0
449 ; X86-NEXT:    vmovsd %xmm0, (%esp)
450 ; X86-NEXT:    fldl (%esp)
451 ; X86-NEXT:    movl %ebp, %esp
452 ; X86-NEXT:    popl %ebp
453 ; X86-NEXT:    .cfi_def_cfa %esp, 4
454 ; X86-NEXT:    retl
455   %a = load half, ptr %x
456   %b = fpext half %a to double
457   ret double %b
460 define <16 x float> @extload_v16f16_v16f32(ptr %x) {
461 ; X64-LABEL: extload_v16f16_v16f32:
462 ; X64:       # %bb.0:
463 ; X64-NEXT:    vcvtph2psx (%rdi), %zmm0
464 ; X64-NEXT:    retq
466 ; X86-LABEL: extload_v16f16_v16f32:
467 ; X86:       # %bb.0:
468 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
469 ; X86-NEXT:    vcvtph2psx (%eax), %zmm0
470 ; X86-NEXT:    retl
471   %a = load <16 x half>, ptr %x
472   %b = fpext <16 x half> %a to <16 x float>
473   ret <16 x float> %b
476 define <8 x float> @extload_v8f16_v8f32(ptr %x) {
477 ; X64-LABEL: extload_v8f16_v8f32:
478 ; X64:       # %bb.0:
479 ; X64-NEXT:    vcvtph2psx (%rdi), %ymm0
480 ; X64-NEXT:    retq
482 ; X86-LABEL: extload_v8f16_v8f32:
483 ; X86:       # %bb.0:
484 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
485 ; X86-NEXT:    vcvtph2psx (%eax), %ymm0
486 ; X86-NEXT:    retl
487   %a = load <8 x half>, ptr %x
488   %b = fpext <8 x half> %a to <8 x float>
489   ret <8 x float> %b
492 define <4 x float> @extload_v4f16_v4f32(ptr %x) {
493 ; X64-LABEL: extload_v4f16_v4f32:
494 ; X64:       # %bb.0:
495 ; X64-NEXT:    vcvtph2psx (%rdi), %xmm0
496 ; X64-NEXT:    retq
498 ; X86-LABEL: extload_v4f16_v4f32:
499 ; X86:       # %bb.0:
500 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
501 ; X86-NEXT:    vcvtph2psx (%eax), %xmm0
502 ; X86-NEXT:    retl
503   %a = load <4 x half>, ptr %x
504   %b = fpext <4 x half> %a to <4 x float>
505   ret <4 x float> %b
508 define <8 x double> @extload_v8f16_v8f64(ptr %x) {
509 ; X64-LABEL: extload_v8f16_v8f64:
510 ; X64:       # %bb.0:
511 ; X64-NEXT:    vcvtph2pd (%rdi), %zmm0
512 ; X64-NEXT:    retq
514 ; X86-LABEL: extload_v8f16_v8f64:
515 ; X86:       # %bb.0:
516 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
517 ; X86-NEXT:    vcvtph2pd (%eax), %zmm0
518 ; X86-NEXT:    retl
519   %a = load <8 x half>, ptr %x
520   %b = fpext <8 x half> %a to <8 x double>
521   ret <8 x double> %b
524 define <4 x double> @extload_v4f16_v4f64(ptr %x) {
525 ; X64-LABEL: extload_v4f16_v4f64:
526 ; X64:       # %bb.0:
527 ; X64-NEXT:    vcvtph2pd (%rdi), %ymm0
528 ; X64-NEXT:    retq
530 ; X86-LABEL: extload_v4f16_v4f64:
531 ; X86:       # %bb.0:
532 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
533 ; X86-NEXT:    vcvtph2pd (%eax), %ymm0
534 ; X86-NEXT:    retl
535   %a = load <4 x half>, ptr %x
536   %b = fpext <4 x half> %a to <4 x double>
537   ret <4 x double> %b
540 define <2 x double> @extload_v2f16_v2f64(ptr %x) {
541 ; X64-LABEL: extload_v2f16_v2f64:
542 ; X64:       # %bb.0:
543 ; X64-NEXT:    vcvtph2pd (%rdi), %xmm0
544 ; X64-NEXT:    retq
546 ; X86-LABEL: extload_v2f16_v2f64:
547 ; X86:       # %bb.0:
548 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
549 ; X86-NEXT:    vcvtph2pd (%eax), %xmm0
550 ; X86-NEXT:    retl
551   %a = load <2 x half>, ptr %x
552   %b = fpext <2 x half> %a to <2 x double>
553   ret <2 x double> %b
556 define half @s8_to_half(i8 %x) {
557 ; X64-LABEL: s8_to_half:
558 ; X64:       # %bb.0:
559 ; X64-NEXT:    movsbl %dil, %eax
560 ; X64-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
561 ; X64-NEXT:    retq
563 ; X86-LABEL: s8_to_half:
564 ; X86:       # %bb.0:
565 ; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
566 ; X86-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
567 ; X86-NEXT:    retl
568   %a = sitofp i8 %x to half
569   ret half %a
572 define half @s16_to_half(i16 %x) {
573 ; X64-LABEL: s16_to_half:
574 ; X64:       # %bb.0:
575 ; X64-NEXT:    movswl %di, %eax
576 ; X64-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
577 ; X64-NEXT:    retq
579 ; X86-LABEL: s16_to_half:
580 ; X86:       # %bb.0:
581 ; X86-NEXT:    movswl {{[0-9]+}}(%esp), %eax
582 ; X86-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
583 ; X86-NEXT:    retl
584   %a = sitofp i16 %x to half
585   ret half %a
588 define half @s32_to_half(i32 %x) {
589 ; X64-LABEL: s32_to_half:
590 ; X64:       # %bb.0:
591 ; X64-NEXT:    vcvtsi2sh %edi, %xmm0, %xmm0
592 ; X64-NEXT:    retq
594 ; X86-LABEL: s32_to_half:
595 ; X86:       # %bb.0:
596 ; X86-NEXT:    vcvtsi2shl {{[0-9]+}}(%esp), %xmm0, %xmm0
597 ; X86-NEXT:    retl
598   %a = sitofp i32 %x to half
599   ret half %a
602 define half @s64_to_half(i64 %x) {
603 ; X64-LABEL: s64_to_half:
604 ; X64:       # %bb.0:
605 ; X64-NEXT:    vcvtsi2sh %rdi, %xmm0, %xmm0
606 ; X64-NEXT:    retq
608 ; X86-LABEL: s64_to_half:
609 ; X86:       # %bb.0:
610 ; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
611 ; X86-NEXT:    vcvtqq2ph %xmm0, %xmm0
612 ; X86-NEXT:    retl
613   %a = sitofp i64 %x to half
614   ret half %a
617 define half @s128_to_half(i128 %x) {
618 ; X64-LABEL: s128_to_half:
619 ; X64:       # %bb.0:
620 ; X64-NEXT:    pushq %rax
621 ; X64-NEXT:    .cfi_def_cfa_offset 16
622 ; X64-NEXT:    callq __floattihf@PLT
623 ; X64-NEXT:    popq %rax
624 ; X64-NEXT:    .cfi_def_cfa_offset 8
625 ; X64-NEXT:    retq
627 ; X86-LABEL: s128_to_half:
628 ; X86:       # %bb.0:
629 ; X86-NEXT:    subl $16, %esp
630 ; X86-NEXT:    .cfi_def_cfa_offset 20
631 ; X86-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0
632 ; X86-NEXT:    vmovups %xmm0, (%esp)
633 ; X86-NEXT:    calll __floattihf
634 ; X86-NEXT:    addl $16, %esp
635 ; X86-NEXT:    .cfi_def_cfa_offset 4
636 ; X86-NEXT:    retl
637   %a = sitofp i128 %x to half
638   ret half %a
641 define half @u8_to_half(i8 %x) {
642 ; X64-LABEL: u8_to_half:
643 ; X64:       # %bb.0:
644 ; X64-NEXT:    movzbl %dil, %eax
645 ; X64-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
646 ; X64-NEXT:    retq
648 ; X86-LABEL: u8_to_half:
649 ; X86:       # %bb.0:
650 ; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
651 ; X86-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
652 ; X86-NEXT:    retl
653   %a = uitofp i8 %x to half
654   ret half %a
657 define half @u16_to_half(i16 %x) {
658 ; X64-LABEL: u16_to_half:
659 ; X64:       # %bb.0:
660 ; X64-NEXT:    movzwl %di, %eax
661 ; X64-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
662 ; X64-NEXT:    retq
664 ; X86-LABEL: u16_to_half:
665 ; X86:       # %bb.0:
666 ; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
667 ; X86-NEXT:    vcvtsi2sh %eax, %xmm0, %xmm0
668 ; X86-NEXT:    retl
669   %a = uitofp i16 %x to half
670   ret half %a
673 define half @u32_to_half(i32 %x) {
674 ; X64-LABEL: u32_to_half:
675 ; X64:       # %bb.0:
676 ; X64-NEXT:    vcvtusi2sh %edi, %xmm0, %xmm0
677 ; X64-NEXT:    retq
679 ; X86-LABEL: u32_to_half:
680 ; X86:       # %bb.0:
681 ; X86-NEXT:    vcvtusi2shl {{[0-9]+}}(%esp), %xmm0, %xmm0
682 ; X86-NEXT:    retl
683   %a = uitofp i32 %x to half
684   ret half %a
687 define half @u64_to_half(i64 %x) {
688 ; X64-LABEL: u64_to_half:
689 ; X64:       # %bb.0:
690 ; X64-NEXT:    vcvtusi2sh %rdi, %xmm0, %xmm0
691 ; X64-NEXT:    retq
693 ; X86-LABEL: u64_to_half:
694 ; X86:       # %bb.0:
695 ; X86-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero
696 ; X86-NEXT:    vcvtuqq2ph %xmm0, %xmm0
697 ; X86-NEXT:    retl
698   %a = uitofp i64 %x to half
699   ret half %a
702 define half @u128_to_half(i128 %x) {
703 ; X64-LABEL: u128_to_half:
704 ; X64:       # %bb.0:
705 ; X64-NEXT:    pushq %rax
706 ; X64-NEXT:    .cfi_def_cfa_offset 16
707 ; X64-NEXT:    callq __floatuntihf@PLT
708 ; X64-NEXT:    popq %rax
709 ; X64-NEXT:    .cfi_def_cfa_offset 8
710 ; X64-NEXT:    retq
712 ; X86-LABEL: u128_to_half:
713 ; X86:       # %bb.0:
714 ; X86-NEXT:    subl $16, %esp
715 ; X86-NEXT:    .cfi_def_cfa_offset 20
716 ; X86-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0
717 ; X86-NEXT:    vmovups %xmm0, (%esp)
718 ; X86-NEXT:    calll __floatuntihf
719 ; X86-NEXT:    addl $16, %esp
720 ; X86-NEXT:    .cfi_def_cfa_offset 4
721 ; X86-NEXT:    retl
722   %a = uitofp i128 %x to half
723   ret half %a
726 define i8 @half_to_s8(half %x) {
727 ; X64-LABEL: half_to_s8:
728 ; X64:       # %bb.0:
729 ; X64-NEXT:    vcvttsh2si %xmm0, %eax
730 ; X64-NEXT:    # kill: def $al killed $al killed $eax
731 ; X64-NEXT:    retq
733 ; X86-LABEL: half_to_s8:
734 ; X86:       # %bb.0:
735 ; X86-NEXT:    vcvttsh2si {{[0-9]+}}(%esp), %eax
736 ; X86-NEXT:    # kill: def $al killed $al killed $eax
737 ; X86-NEXT:    retl
738   %a = fptosi half %x to i8
739   ret i8 %a
742 define i16 @half_to_s16(half %x) {
743 ; X64-LABEL: half_to_s16:
744 ; X64:       # %bb.0:
745 ; X64-NEXT:    vcvttsh2si %xmm0, %eax
746 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
747 ; X64-NEXT:    retq
749 ; X86-LABEL: half_to_s16:
750 ; X86:       # %bb.0:
751 ; X86-NEXT:    vcvttsh2si {{[0-9]+}}(%esp), %eax
752 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
753 ; X86-NEXT:    retl
754   %a = fptosi half %x to i16
755   ret i16 %a
758 define i32 @half_to_s32(half %x) {
759 ; X64-LABEL: half_to_s32:
760 ; X64:       # %bb.0:
761 ; X64-NEXT:    vcvttsh2si %xmm0, %eax
762 ; X64-NEXT:    retq
764 ; X86-LABEL: half_to_s32:
765 ; X86:       # %bb.0:
766 ; X86-NEXT:    vcvttsh2si {{[0-9]+}}(%esp), %eax
767 ; X86-NEXT:    retl
768   %a = fptosi half %x to i32
769   ret i32 %a
772 define i64 @half_to_s64(half %x) {
773 ; X64-LABEL: half_to_s64:
774 ; X64:       # %bb.0:
775 ; X64-NEXT:    vcvttsh2si %xmm0, %rax
776 ; X64-NEXT:    retq
778 ; X86-LABEL: half_to_s64:
779 ; X86:       # %bb.0:
780 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
781 ; X86-NEXT:    vcvttph2qq %xmm0, %xmm0
782 ; X86-NEXT:    vmovd %xmm0, %eax
783 ; X86-NEXT:    vpextrd $1, %xmm0, %edx
784 ; X86-NEXT:    retl
785   %a = fptosi half %x to i64
786   ret i64 %a
789 define i128 @half_to_s128(half %x) {
790 ; X64-LABEL: half_to_s128:
791 ; X64:       # %bb.0:
792 ; X64-NEXT:    pushq %rax
793 ; X64-NEXT:    .cfi_def_cfa_offset 16
794 ; X64-NEXT:    callq __fixhfti@PLT
795 ; X64-NEXT:    popq %rcx
796 ; X64-NEXT:    .cfi_def_cfa_offset 8
797 ; X64-NEXT:    retq
799 ; X86-LABEL: half_to_s128:
800 ; X86:       # %bb.0:
801 ; X86-NEXT:    pushl %ebp
802 ; X86-NEXT:    .cfi_def_cfa_offset 8
803 ; X86-NEXT:    .cfi_offset %ebp, -8
804 ; X86-NEXT:    movl %esp, %ebp
805 ; X86-NEXT:    .cfi_def_cfa_register %ebp
806 ; X86-NEXT:    pushl %esi
807 ; X86-NEXT:    andl $-16, %esp
808 ; X86-NEXT:    subl $48, %esp
809 ; X86-NEXT:    .cfi_offset %esi, -12
810 ; X86-NEXT:    movl 8(%ebp), %esi
811 ; X86-NEXT:    vmovsh 12(%ebp), %xmm0
812 ; X86-NEXT:    vmovsh %xmm0, {{[0-9]+}}(%esp)
813 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
814 ; X86-NEXT:    movl %eax, (%esp)
815 ; X86-NEXT:    calll __fixhfti
816 ; X86-NEXT:    subl $4, %esp
817 ; X86-NEXT:    vmovaps {{[0-9]+}}(%esp), %xmm0
818 ; X86-NEXT:    vmovaps %xmm0, (%esi)
819 ; X86-NEXT:    movl %esi, %eax
820 ; X86-NEXT:    leal -4(%ebp), %esp
821 ; X86-NEXT:    popl %esi
822 ; X86-NEXT:    popl %ebp
823 ; X86-NEXT:    .cfi_def_cfa %esp, 4
824 ; X86-NEXT:    retl $4
825   %a = fptosi half %x to i128
826   ret i128 %a
829 define i8 @half_to_u8(half %x) {
830 ; X64-LABEL: half_to_u8:
831 ; X64:       # %bb.0:
832 ; X64-NEXT:    vcvttsh2si %xmm0, %eax
833 ; X64-NEXT:    # kill: def $al killed $al killed $eax
834 ; X64-NEXT:    retq
836 ; X86-LABEL: half_to_u8:
837 ; X86:       # %bb.0:
838 ; X86-NEXT:    vcvttsh2si {{[0-9]+}}(%esp), %eax
839 ; X86-NEXT:    # kill: def $al killed $al killed $eax
840 ; X86-NEXT:    retl
841   %a = fptoui half %x to i8
842   ret i8 %a
845 define i16 @half_to_u16(half %x) {
846 ; X64-LABEL: half_to_u16:
847 ; X64:       # %bb.0:
848 ; X64-NEXT:    vcvttsh2si %xmm0, %eax
849 ; X64-NEXT:    # kill: def $ax killed $ax killed $eax
850 ; X64-NEXT:    retq
852 ; X86-LABEL: half_to_u16:
853 ; X86:       # %bb.0:
854 ; X86-NEXT:    vcvttsh2si {{[0-9]+}}(%esp), %eax
855 ; X86-NEXT:    # kill: def $ax killed $ax killed $eax
856 ; X86-NEXT:    retl
857   %a = fptoui half %x to i16
858   ret i16 %a
861 define i32 @half_to_u32(half %x) {
862 ; X64-LABEL: half_to_u32:
863 ; X64:       # %bb.0:
864 ; X64-NEXT:    vcvttsh2usi %xmm0, %eax
865 ; X64-NEXT:    retq
867 ; X86-LABEL: half_to_u32:
868 ; X86:       # %bb.0:
869 ; X86-NEXT:    vcvttsh2usi {{[0-9]+}}(%esp), %eax
870 ; X86-NEXT:    retl
871   %a = fptoui half %x to i32
872   ret i32 %a
875 define i64 @half_to_u64(half %x) {
876 ; X64-LABEL: half_to_u64:
877 ; X64:       # %bb.0:
878 ; X64-NEXT:    vcvttsh2usi %xmm0, %rax
879 ; X64-NEXT:    retq
881 ; X86-LABEL: half_to_u64:
882 ; X86:       # %bb.0:
883 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
884 ; X86-NEXT:    vcvttph2uqq %xmm0, %xmm0
885 ; X86-NEXT:    vmovd %xmm0, %eax
886 ; X86-NEXT:    vpextrd $1, %xmm0, %edx
887 ; X86-NEXT:    retl
888   %a = fptoui half %x to i64
889   ret i64 %a
892 define i128 @half_to_u128(half %x) {
893 ; X64-LABEL: half_to_u128:
894 ; X64:       # %bb.0:
895 ; X64-NEXT:    pushq %rax
896 ; X64-NEXT:    .cfi_def_cfa_offset 16
897 ; X64-NEXT:    callq __fixunshfti@PLT
898 ; X64-NEXT:    popq %rcx
899 ; X64-NEXT:    .cfi_def_cfa_offset 8
900 ; X64-NEXT:    retq
902 ; X86-LABEL: half_to_u128:
903 ; X86:       # %bb.0:
904 ; X86-NEXT:    pushl %ebp
905 ; X86-NEXT:    .cfi_def_cfa_offset 8
906 ; X86-NEXT:    .cfi_offset %ebp, -8
907 ; X86-NEXT:    movl %esp, %ebp
908 ; X86-NEXT:    .cfi_def_cfa_register %ebp
909 ; X86-NEXT:    pushl %esi
910 ; X86-NEXT:    andl $-16, %esp
911 ; X86-NEXT:    subl $48, %esp
912 ; X86-NEXT:    .cfi_offset %esi, -12
913 ; X86-NEXT:    movl 8(%ebp), %esi
914 ; X86-NEXT:    vmovsh 12(%ebp), %xmm0
915 ; X86-NEXT:    vmovsh %xmm0, {{[0-9]+}}(%esp)
916 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
917 ; X86-NEXT:    movl %eax, (%esp)
918 ; X86-NEXT:    calll __fixunshfti
919 ; X86-NEXT:    subl $4, %esp
920 ; X86-NEXT:    vmovaps {{[0-9]+}}(%esp), %xmm0
921 ; X86-NEXT:    vmovaps %xmm0, (%esi)
922 ; X86-NEXT:    movl %esi, %eax
923 ; X86-NEXT:    leal -4(%ebp), %esp
924 ; X86-NEXT:    popl %esi
925 ; X86-NEXT:    popl %ebp
926 ; X86-NEXT:    .cfi_def_cfa %esp, 4
927 ; X86-NEXT:    retl $4
928   %a = fptoui half %x to i128
929   ret i128 %a
932 define x86_fp80 @half_to_f80(half %x) nounwind {
933 ; X64-LABEL: half_to_f80:
934 ; X64:       # %bb.0:
935 ; X64-NEXT:    pushq %rax
936 ; X64-NEXT:    callq __extendhfxf2@PLT
937 ; X64-NEXT:    popq %rax
938 ; X64-NEXT:    retq
940 ; X86-LABEL: half_to_f80:
941 ; X86:       # %bb.0:
942 ; X86-NEXT:    pushl %eax
943 ; X86-NEXT:    vmovsh {{[0-9]+}}(%esp), %xmm0
944 ; X86-NEXT:    vmovsh %xmm0, (%esp)
945 ; X86-NEXT:    calll __extendhfxf2
946 ; X86-NEXT:    popl %eax
947 ; X86-NEXT:    retl
948   %a = fpext half %x to x86_fp80
949   ret x86_fp80 %a
952 define half @f80_to_half(x86_fp80 %x) nounwind {
953 ; X64-LABEL: f80_to_half:
954 ; X64:       # %bb.0:
955 ; X64-NEXT:    subq $24, %rsp
956 ; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
957 ; X64-NEXT:    fstpt (%rsp)
958 ; X64-NEXT:    callq __truncxfhf2@PLT
959 ; X64-NEXT:    addq $24, %rsp
960 ; X64-NEXT:    retq
962 ; X86-LABEL: f80_to_half:
963 ; X86:       # %bb.0:
964 ; X86-NEXT:    subl $12, %esp
965 ; X86-NEXT:    fldt {{[0-9]+}}(%esp)
966 ; X86-NEXT:    fstpt (%esp)
967 ; X86-NEXT:    calll __truncxfhf2
968 ; X86-NEXT:    addl $12, %esp
969 ; X86-NEXT:    retl
970   %a = fptrunc x86_fp80 %x to half
971   ret half %a
974 ; FIXME: We're doing a two step conversion here on 32-bit.
975 ; First from f16->f32 then f32->f128. This is occuring
976 ; due to common code in LegalizeFloatTypes that thinks
977 ; there are no libcalls for f16 to any type but f32.
978 ; Changing this may break other non-x86 targets. The code
979 ; generated here should be functional.
980 define fp128 @half_to_f128(half %x) nounwind {
981 ; X64-LABEL: half_to_f128:
982 ; X64:       # %bb.0:
983 ; X64-NEXT:    jmp __extendhftf2@PLT # TAILCALL
985 ; X86-LABEL: half_to_f128:
986 ; X86:       # %bb.0:
987 ; X86-NEXT:    pushl %ebp
988 ; X86-NEXT:    movl %esp, %ebp
989 ; X86-NEXT:    pushl %esi
990 ; X86-NEXT:    andl $-16, %esp
991 ; X86-NEXT:    subl $48, %esp
992 ; X86-NEXT:    movl 8(%ebp), %esi
993 ; X86-NEXT:    vmovsh 12(%ebp), %xmm0
994 ; X86-NEXT:    vcvtsh2ss %xmm0, %xmm0, %xmm0
995 ; X86-NEXT:    vmovss %xmm0, {{[0-9]+}}(%esp)
996 ; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax
997 ; X86-NEXT:    movl %eax, (%esp)
998 ; X86-NEXT:    calll __extendsftf2
999 ; X86-NEXT:    subl $4, %esp
1000 ; X86-NEXT:    vmovaps {{[0-9]+}}(%esp), %xmm0
1001 ; X86-NEXT:    vmovaps %xmm0, (%esi)
1002 ; X86-NEXT:    movl %esi, %eax
1003 ; X86-NEXT:    leal -4(%ebp), %esp
1004 ; X86-NEXT:    popl %esi
1005 ; X86-NEXT:    popl %ebp
1006 ; X86-NEXT:    retl $4
1007   %a = fpext half %x to fp128
1008   ret fp128 %a
1011 define half @f128_to_half(fp128 %x) nounwind {
1012 ; X64-LABEL: f128_to_half:
1013 ; X64:       # %bb.0:
1014 ; X64-NEXT:    pushq %rax
1015 ; X64-NEXT:    callq __trunctfhf2@PLT
1016 ; X64-NEXT:    popq %rax
1017 ; X64-NEXT:    retq
1019 ; X86-LABEL: f128_to_half:
1020 ; X86:       # %bb.0:
1021 ; X86-NEXT:    subl $16, %esp
1022 ; X86-NEXT:    vmovups {{[0-9]+}}(%esp), %xmm0
1023 ; X86-NEXT:    vmovups %xmm0, (%esp)
1024 ; X86-NEXT:    calll __trunctfhf2
1025 ; X86-NEXT:    addl $16, %esp
1026 ; X86-NEXT:    retl
1027   %a = fptrunc fp128 %x to half
1028   ret half %a
1031 define <8 x half> @s64tof16(<8 x i64> %a) #0 {
1032 ; CHECK-LABEL: s64tof16:
1033 ; CHECK:       # %bb.0:
1034 ; CHECK-NEXT:    vcvtqq2ph %ymm1, %xmm1
1035 ; CHECK-NEXT:    vcvtqq2ph %ymm0, %xmm0
1036 ; CHECK-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1037 ; CHECK-NEXT:    vzeroupper
1038 ; CHECK-NEXT:    ret{{[l|q]}}
1039   %1 = sitofp <8 x i64> %a to <8 x half>
1040   ret <8 x half> %1
1043 define <8 x half> @u64tof16(<8 x i64> %a) #0 {
1044 ; CHECK-LABEL: u64tof16:
1045 ; CHECK:       # %bb.0:
1046 ; CHECK-NEXT:    vcvtuqq2ph %ymm1, %xmm1
1047 ; CHECK-NEXT:    vcvtuqq2ph %ymm0, %xmm0
1048 ; CHECK-NEXT:    vmovlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
1049 ; CHECK-NEXT:    vzeroupper
1050 ; CHECK-NEXT:    ret{{[l|q]}}
1051   %1 = uitofp <8 x i64> %a to <8 x half>
1052   ret <8 x half> %1
1055 attributes #0 = { "min-legal-vector-width"="256" "prefer-vector-width"="256" }