[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / X86 / half.ll
blob34978bdfeb049a46984c893448c46c4b944657a7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=-f16c -fixup-byte-word-insts=1 \
3 ; RUN:   | FileCheck %s -check-prefixes=CHECK,CHECK-LIBCALL,BWON,BWON-NOF16C
4 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=-f16c  -fixup-byte-word-insts=0 \
5 ; RUN:   | FileCheck %s -check-prefixes=CHECK,CHECK-LIBCALL,BWOFF
6 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=+f16c -fixup-byte-word-insts=1 \
7 ; RUN:    | FileCheck %s -check-prefixes=CHECK,BWON,BWON-F16C
8 ; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr +sse2 -fixup-byte-word-insts=0  \
9 ; RUN:    | FileCheck %s -check-prefixes=CHECK-I686
11 define void @test_load_store(half* %in, half* %out) #0 {
12 ; BWON-LABEL: test_load_store:
13 ; BWON:       # %bb.0:
14 ; BWON-NEXT:    movzwl (%rdi), %eax
15 ; BWON-NEXT:    movw %ax, (%rsi)
16 ; BWON-NEXT:    retq
18 ; BWOFF-LABEL: test_load_store:
19 ; BWOFF:       # %bb.0:
20 ; BWOFF-NEXT:    movw (%rdi), %ax
21 ; BWOFF-NEXT:    movw %ax, (%rsi)
22 ; BWOFF-NEXT:    retq
24 ; CHECK-I686-LABEL: test_load_store:
25 ; CHECK-I686:       # %bb.0:
26 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
27 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ecx
28 ; CHECK-I686-NEXT:    movw (%ecx), %cx
29 ; CHECK-I686-NEXT:    movw %cx, (%eax)
30 ; CHECK-I686-NEXT:    retl
31   %val = load half, half* %in
32   store half %val, half* %out
33   ret void
36 define i16 @test_bitcast_from_half(half* %addr) #0 {
37 ; BWON-LABEL: test_bitcast_from_half:
38 ; BWON:       # %bb.0:
39 ; BWON-NEXT:    movzwl (%rdi), %eax
40 ; BWON-NEXT:    retq
42 ; BWOFF-LABEL: test_bitcast_from_half:
43 ; BWOFF:       # %bb.0:
44 ; BWOFF-NEXT:    movw (%rdi), %ax
45 ; BWOFF-NEXT:    retq
47 ; CHECK-I686-LABEL: test_bitcast_from_half:
48 ; CHECK-I686:       # %bb.0:
49 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
50 ; CHECK-I686-NEXT:    movw (%eax), %ax
51 ; CHECK-I686-NEXT:    retl
52   %val = load half, half* %addr
53   %val_int = bitcast half %val to i16
54   ret i16 %val_int
57 define void @test_bitcast_to_half(half* %addr, i16 %in) #0 {
58 ; CHECK-LABEL: test_bitcast_to_half:
59 ; CHECK:       # %bb.0:
60 ; CHECK-NEXT:    movw %si, (%rdi)
61 ; CHECK-NEXT:    retq
63 ; CHECK-I686-LABEL: test_bitcast_to_half:
64 ; CHECK-I686:       # %bb.0:
65 ; CHECK-I686-NEXT:    movw {{[0-9]+}}(%esp), %ax
66 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ecx
67 ; CHECK-I686-NEXT:    movw %ax, (%ecx)
68 ; CHECK-I686-NEXT:    retl
69   %val_fp = bitcast i16 %in to half
70   store half %val_fp, half* %addr
71   ret void
74 define float @test_extend32(half* %addr) #0 {
75 ; CHECK-LIBCALL-LABEL: test_extend32:
76 ; CHECK-LIBCALL:       # %bb.0:
77 ; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi
78 ; CHECK-LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL
80 ; BWON-F16C-LABEL: test_extend32:
81 ; BWON-F16C:       # %bb.0:
82 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
83 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
84 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
85 ; BWON-F16C-NEXT:    retq
87 ; CHECK-I686-LABEL: test_extend32:
88 ; CHECK-I686:       # %bb.0:
89 ; CHECK-I686-NEXT:    subl $12, %esp
90 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
91 ; CHECK-I686-NEXT:    movzwl (%eax), %eax
92 ; CHECK-I686-NEXT:    movl %eax, (%esp)
93 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
94 ; CHECK-I686-NEXT:    addl $12, %esp
95 ; CHECK-I686-NEXT:    retl
96   %val16 = load half, half* %addr
97   %val32 = fpext half %val16 to float
98   ret float %val32
101 define double @test_extend64(half* %addr) #0 {
102 ; CHECK-LIBCALL-LABEL: test_extend64:
103 ; CHECK-LIBCALL:       # %bb.0:
104 ; CHECK-LIBCALL-NEXT:    pushq %rax
105 ; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi
106 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
107 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
108 ; CHECK-LIBCALL-NEXT:    popq %rax
109 ; CHECK-LIBCALL-NEXT:    retq
111 ; BWON-F16C-LABEL: test_extend64:
112 ; BWON-F16C:       # %bb.0:
113 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
114 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
115 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
116 ; BWON-F16C-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
117 ; BWON-F16C-NEXT:    retq
119 ; CHECK-I686-LABEL: test_extend64:
120 ; CHECK-I686:       # %bb.0:
121 ; CHECK-I686-NEXT:    subl $12, %esp
122 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
123 ; CHECK-I686-NEXT:    movzwl (%eax), %eax
124 ; CHECK-I686-NEXT:    movl %eax, (%esp)
125 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
126 ; CHECK-I686-NEXT:    addl $12, %esp
127 ; CHECK-I686-NEXT:    retl
128   %val16 = load half, half* %addr
129   %val32 = fpext half %val16 to double
130   ret double %val32
133 define void @test_trunc32(float %in, half* %addr) #0 {
134 ; CHECK-LIBCALL-LABEL: test_trunc32:
135 ; CHECK-LIBCALL:       # %bb.0:
136 ; CHECK-LIBCALL-NEXT:    pushq %rbx
137 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx
138 ; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
139 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
140 ; CHECK-LIBCALL-NEXT:    popq %rbx
141 ; CHECK-LIBCALL-NEXT:    retq
143 ; BWON-F16C-LABEL: test_trunc32:
144 ; BWON-F16C:       # %bb.0:
145 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
146 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rdi)
147 ; BWON-F16C-NEXT:    retq
149 ; CHECK-I686-LABEL: test_trunc32:
150 ; CHECK-I686:       # %bb.0:
151 ; CHECK-I686-NEXT:    pushl %esi
152 ; CHECK-I686-NEXT:    subl $8, %esp
153 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
154 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
155 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
156 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
157 ; CHECK-I686-NEXT:    movw %ax, (%esi)
158 ; CHECK-I686-NEXT:    addl $8, %esp
159 ; CHECK-I686-NEXT:    popl %esi
160 ; CHECK-I686-NEXT:    retl
161   %val16 = fptrunc float %in to half
162   store half %val16, half* %addr
163   ret void
166 define void @test_trunc64(double %in, half* %addr) #0 {
167 ; CHECK-LABEL: test_trunc64:
168 ; CHECK:       # %bb.0:
169 ; CHECK-NEXT:    pushq %rbx
170 ; CHECK-NEXT:    movq %rdi, %rbx
171 ; CHECK-NEXT:    callq __truncdfhf2@PLT
172 ; CHECK-NEXT:    movw %ax, (%rbx)
173 ; CHECK-NEXT:    popq %rbx
174 ; CHECK-NEXT:    retq
176 ; CHECK-I686-LABEL: test_trunc64:
177 ; CHECK-I686:       # %bb.0:
178 ; CHECK-I686-NEXT:    pushl %esi
179 ; CHECK-I686-NEXT:    subl $8, %esp
180 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
181 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
182 ; CHECK-I686-NEXT:    movsd %xmm0, (%esp)
183 ; CHECK-I686-NEXT:    calll __truncdfhf2
184 ; CHECK-I686-NEXT:    movw %ax, (%esi)
185 ; CHECK-I686-NEXT:    addl $8, %esp
186 ; CHECK-I686-NEXT:    popl %esi
187 ; CHECK-I686-NEXT:    retl
188   %val16 = fptrunc double %in to half
189   store half %val16, half* %addr
190   ret void
193 define i64 @test_fptosi_i64(half* %p) #0 {
194 ; CHECK-LIBCALL-LABEL: test_fptosi_i64:
195 ; CHECK-LIBCALL:       # %bb.0:
196 ; CHECK-LIBCALL-NEXT:    pushq %rax
197 ; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi
198 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
199 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rax
200 ; CHECK-LIBCALL-NEXT:    popq %rcx
201 ; CHECK-LIBCALL-NEXT:    retq
203 ; BWON-F16C-LABEL: test_fptosi_i64:
204 ; BWON-F16C:       # %bb.0:
205 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
206 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
207 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
208 ; BWON-F16C-NEXT:    vcvttss2si %xmm0, %rax
209 ; BWON-F16C-NEXT:    retq
211 ; CHECK-I686-LABEL: test_fptosi_i64:
212 ; CHECK-I686:       # %bb.0:
213 ; CHECK-I686-NEXT:    subl $12, %esp
214 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
215 ; CHECK-I686-NEXT:    movzwl (%eax), %eax
216 ; CHECK-I686-NEXT:    movl %eax, (%esp)
217 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
218 ; CHECK-I686-NEXT:    fstps (%esp)
219 ; CHECK-I686-NEXT:    calll __fixsfdi
220 ; CHECK-I686-NEXT:    addl $12, %esp
221 ; CHECK-I686-NEXT:    retl
222   %a = load half, half* %p, align 2
223   %r = fptosi half %a to i64
224   ret i64 %r
227 define void @test_sitofp_i64(i64 %a, half* %p) #0 {
228 ; CHECK-LIBCALL-LABEL: test_sitofp_i64:
229 ; CHECK-LIBCALL:       # %bb.0:
230 ; CHECK-LIBCALL-NEXT:    pushq %rbx
231 ; CHECK-LIBCALL-NEXT:    movq %rsi, %rbx
232 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0
233 ; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
234 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
235 ; CHECK-LIBCALL-NEXT:    popq %rbx
236 ; CHECK-LIBCALL-NEXT:    retq
238 ; BWON-F16C-LABEL: test_sitofp_i64:
239 ; BWON-F16C:       # %bb.0:
240 ; BWON-F16C-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
241 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
242 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rsi)
243 ; BWON-F16C-NEXT:    retq
245 ; CHECK-I686-LABEL: test_sitofp_i64:
246 ; CHECK-I686:       # %bb.0:
247 ; CHECK-I686-NEXT:    pushl %esi
248 ; CHECK-I686-NEXT:    subl $24, %esp
249 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
250 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
251 ; CHECK-I686-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)
252 ; CHECK-I686-NEXT:    fildll {{[0-9]+}}(%esp)
253 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
254 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
255 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
256 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
257 ; CHECK-I686-NEXT:    movw %ax, (%esi)
258 ; CHECK-I686-NEXT:    addl $24, %esp
259 ; CHECK-I686-NEXT:    popl %esi
260 ; CHECK-I686-NEXT:    retl
261   %r = sitofp i64 %a to half
262   store half %r, half* %p
263   ret void
266 define i64 @test_fptoui_i64(half* %p) #0 {
267 ; CHECK-LIBCALL-LABEL: test_fptoui_i64:
268 ; CHECK-LIBCALL:       # %bb.0:
269 ; CHECK-LIBCALL-NEXT:    pushq %rax
270 ; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %edi
271 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
272 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rcx
273 ; CHECK-LIBCALL-NEXT:    movq %rcx, %rdx
274 ; CHECK-LIBCALL-NEXT:    sarq $63, %rdx
275 ; CHECK-LIBCALL-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
276 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rax
277 ; CHECK-LIBCALL-NEXT:    andq %rdx, %rax
278 ; CHECK-LIBCALL-NEXT:    orq %rcx, %rax
279 ; CHECK-LIBCALL-NEXT:    popq %rcx
280 ; CHECK-LIBCALL-NEXT:    retq
282 ; BWON-F16C-LABEL: test_fptoui_i64:
283 ; BWON-F16C:       # %bb.0:
284 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
285 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
286 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
287 ; BWON-F16C-NEXT:    vcvttss2si %xmm0, %rcx
288 ; BWON-F16C-NEXT:    movq %rcx, %rdx
289 ; BWON-F16C-NEXT:    sarq $63, %rdx
290 ; BWON-F16C-NEXT:    vsubss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
291 ; BWON-F16C-NEXT:    vcvttss2si %xmm0, %rax
292 ; BWON-F16C-NEXT:    andq %rdx, %rax
293 ; BWON-F16C-NEXT:    orq %rcx, %rax
294 ; BWON-F16C-NEXT:    retq
296 ; CHECK-I686-LABEL: test_fptoui_i64:
297 ; CHECK-I686:       # %bb.0:
298 ; CHECK-I686-NEXT:    subl $12, %esp
299 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
300 ; CHECK-I686-NEXT:    movzwl (%eax), %eax
301 ; CHECK-I686-NEXT:    movl %eax, (%esp)
302 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
303 ; CHECK-I686-NEXT:    fstps (%esp)
304 ; CHECK-I686-NEXT:    calll __fixunssfdi
305 ; CHECK-I686-NEXT:    addl $12, %esp
306 ; CHECK-I686-NEXT:    retl
307   %a = load half, half* %p, align 2
308   %r = fptoui half %a to i64
309   ret i64 %r
312 define void @test_uitofp_i64(i64 %a, half* %p) #0 {
313 ; CHECK-LIBCALL-LABEL: test_uitofp_i64:
314 ; CHECK-LIBCALL:       # %bb.0:
315 ; CHECK-LIBCALL-NEXT:    pushq %rbx
316 ; CHECK-LIBCALL-NEXT:    movq %rsi, %rbx
317 ; CHECK-LIBCALL-NEXT:    testq %rdi, %rdi
318 ; CHECK-LIBCALL-NEXT:    js .LBB10_1
319 ; CHECK-LIBCALL-NEXT:  # %bb.2:
320 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0
321 ; CHECK-LIBCALL-NEXT:    jmp .LBB10_3
322 ; CHECK-LIBCALL-NEXT:  .LBB10_1:
323 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rax
324 ; CHECK-LIBCALL-NEXT:    shrq %rax
325 ; CHECK-LIBCALL-NEXT:    andl $1, %edi
326 ; CHECK-LIBCALL-NEXT:    orq %rax, %rdi
327 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0
328 ; CHECK-LIBCALL-NEXT:    addss %xmm0, %xmm0
329 ; CHECK-LIBCALL-NEXT:  .LBB10_3:
330 ; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
331 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
332 ; CHECK-LIBCALL-NEXT:    popq %rbx
333 ; CHECK-LIBCALL-NEXT:    retq
335 ; BWON-F16C-LABEL: test_uitofp_i64:
336 ; BWON-F16C:       # %bb.0:
337 ; BWON-F16C-NEXT:    testq %rdi, %rdi
338 ; BWON-F16C-NEXT:    js .LBB10_1
339 ; BWON-F16C-NEXT:  # %bb.2:
340 ; BWON-F16C-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
341 ; BWON-F16C-NEXT:    jmp .LBB10_3
342 ; BWON-F16C-NEXT:  .LBB10_1:
343 ; BWON-F16C-NEXT:    movq %rdi, %rax
344 ; BWON-F16C-NEXT:    shrq %rax
345 ; BWON-F16C-NEXT:    andl $1, %edi
346 ; BWON-F16C-NEXT:    orq %rax, %rdi
347 ; BWON-F16C-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
348 ; BWON-F16C-NEXT:    vaddss %xmm0, %xmm0, %xmm0
349 ; BWON-F16C-NEXT:  .LBB10_3:
350 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
351 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rsi)
352 ; BWON-F16C-NEXT:    retq
354 ; CHECK-I686-LABEL: test_uitofp_i64:
355 ; CHECK-I686:       # %bb.0:
356 ; CHECK-I686-NEXT:    pushl %esi
357 ; CHECK-I686-NEXT:    subl $24, %esp
358 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
359 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
360 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
361 ; CHECK-I686-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)
362 ; CHECK-I686-NEXT:    shrl $31, %eax
363 ; CHECK-I686-NEXT:    fildll {{[0-9]+}}(%esp)
364 ; CHECK-I686-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4)
365 ; CHECK-I686-NEXT:    fstps (%esp)
366 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
367 ; CHECK-I686-NEXT:    movw %ax, (%esi)
368 ; CHECK-I686-NEXT:    addl $24, %esp
369 ; CHECK-I686-NEXT:    popl %esi
370 ; CHECK-I686-NEXT:    retl
371   %r = uitofp i64 %a to half
372   store half %r, half* %p
373   ret void
376 define <4 x float> @test_extend32_vec4(<4 x half>* %p) #0 {
377 ; CHECK-LIBCALL-LABEL: test_extend32_vec4:
378 ; CHECK-LIBCALL:       # %bb.0:
379 ; CHECK-LIBCALL-NEXT:    subq $88, %rsp
380 ; CHECK-LIBCALL-NEXT:    movl (%rdi), %eax
381 ; CHECK-LIBCALL-NEXT:    movl 4(%rdi), %ecx
382 ; CHECK-LIBCALL-NEXT:    movl %eax, (%rsp)
383 ; CHECK-LIBCALL-NEXT:    movl %ecx, {{[0-9]+}}(%rsp)
384 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0
385 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
386 ; CHECK-LIBCALL-NEXT:    movdqa {{[0-9]+}}(%rsp), %xmm0
387 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
388 ; CHECK-LIBCALL-NEXT:    pextrw $1, %xmm0, %edi
389 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
390 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
391 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
392 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %edi
393 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
394 ; CHECK-LIBCALL-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
395 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
396 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
397 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
398 ; CHECK-LIBCALL-NEXT:    pextrw $1, %xmm0, %edi
399 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
400 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
401 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
402 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %edi
403 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
404 ; CHECK-LIBCALL-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
405 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
406 ; CHECK-LIBCALL-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
407 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0]
408 ; CHECK-LIBCALL-NEXT:    addq $88, %rsp
409 ; CHECK-LIBCALL-NEXT:    retq
411 ; BWON-F16C-LABEL: test_extend32_vec4:
412 ; BWON-F16C:       # %bb.0:
413 ; BWON-F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
414 ; BWON-F16C-NEXT:    retq
416 ; CHECK-I686-LABEL: test_extend32_vec4:
417 ; CHECK-I686:       # %bb.0:
418 ; CHECK-I686-NEXT:    subl $124, %esp
419 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
420 ; CHECK-I686-NEXT:    movl (%eax), %ecx
421 ; CHECK-I686-NEXT:    movl 4(%eax), %eax
422 ; CHECK-I686-NEXT:    movl %eax, {{[0-9]+}}(%esp)
423 ; CHECK-I686-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
424 ; CHECK-I686-NEXT:    movaps {{[0-9]+}}(%esp), %xmm0
425 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
426 ; CHECK-I686-NEXT:    movdqa {{[0-9]+}}(%esp), %xmm0
427 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
428 ; CHECK-I686-NEXT:    pextrw $1, %xmm0, %eax
429 ; CHECK-I686-NEXT:    movl %eax, (%esp)
430 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
431 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
432 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
433 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
434 ; CHECK-I686-NEXT:    movl %eax, (%esp)
435 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
436 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
437 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
438 ; CHECK-I686-NEXT:    pextrw $1, %xmm0, %eax
439 ; CHECK-I686-NEXT:    movl %eax, (%esp)
440 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
441 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
442 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
443 ; CHECK-I686-NEXT:    movl %eax, (%esp)
444 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
445 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
446 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
447 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
448 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
449 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
450 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
451 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
452 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
453 ; CHECK-I686-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
454 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
455 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
456 ; CHECK-I686-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
457 ; CHECK-I686-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
458 ; CHECK-I686-NEXT:    addl $124, %esp
459 ; CHECK-I686-NEXT:    retl
460   %a = load <4 x half>, <4 x half>* %p, align 8
461   %b = fpext <4 x half> %a to <4 x float>
462   ret <4 x float> %b
465 define <4 x double> @test_extend64_vec4(<4 x half>* %p) #0 {
466 ; CHECK-LIBCALL-LABEL: test_extend64_vec4:
467 ; CHECK-LIBCALL:       # %bb.0:
468 ; CHECK-LIBCALL-NEXT:    pushq %rbp
469 ; CHECK-LIBCALL-NEXT:    pushq %r14
470 ; CHECK-LIBCALL-NEXT:    pushq %rbx
471 ; CHECK-LIBCALL-NEXT:    subq $32, %rsp
472 ; CHECK-LIBCALL-NEXT:    movzwl 4(%rdi), %r14d
473 ; CHECK-LIBCALL-NEXT:    movzwl 6(%rdi), %ebp
474 ; CHECK-LIBCALL-NEXT:    movzwl (%rdi), %ebx
475 ; CHECK-LIBCALL-NEXT:    movzwl 2(%rdi), %edi
476 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
477 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
478 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
479 ; CHECK-LIBCALL-NEXT:    movl %ebx, %edi
480 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
481 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
482 ; CHECK-LIBCALL-NEXT:    unpcklpd (%rsp), %xmm0 # 16-byte Folded Reload
483 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0]
484 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
485 ; CHECK-LIBCALL-NEXT:    movl %ebp, %edi
486 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
487 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
488 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
489 ; CHECK-LIBCALL-NEXT:    movl %r14d, %edi
490 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
491 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm1
492 ; CHECK-LIBCALL-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
493 ; CHECK-LIBCALL-NEXT:    # xmm1 = xmm1[0],mem[0]
494 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
495 ; CHECK-LIBCALL-NEXT:    addq $32, %rsp
496 ; CHECK-LIBCALL-NEXT:    popq %rbx
497 ; CHECK-LIBCALL-NEXT:    popq %r14
498 ; CHECK-LIBCALL-NEXT:    popq %rbp
499 ; CHECK-LIBCALL-NEXT:    retq
501 ; BWON-F16C-LABEL: test_extend64_vec4:
502 ; BWON-F16C:       # %bb.0:
503 ; BWON-F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
504 ; BWON-F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
505 ; BWON-F16C-NEXT:    retq
507 ; CHECK-I686-LABEL: test_extend64_vec4:
508 ; CHECK-I686:       # %bb.0:
509 ; CHECK-I686-NEXT:    pushl %ebx
510 ; CHECK-I686-NEXT:    pushl %edi
511 ; CHECK-I686-NEXT:    pushl %esi
512 ; CHECK-I686-NEXT:    subl $64, %esp
513 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
514 ; CHECK-I686-NEXT:    movzwl 6(%eax), %esi
515 ; CHECK-I686-NEXT:    movzwl (%eax), %edi
516 ; CHECK-I686-NEXT:    movzwl 2(%eax), %ebx
517 ; CHECK-I686-NEXT:    movzwl 4(%eax), %eax
518 ; CHECK-I686-NEXT:    movl %eax, (%esp)
519 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
520 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
521 ; CHECK-I686-NEXT:    movl %ebx, (%esp)
522 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
523 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
524 ; CHECK-I686-NEXT:    movl %edi, (%esp)
525 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
526 ; CHECK-I686-NEXT:    movl %esi, (%esp)
527 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
528 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
529 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
530 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
531 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
532 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
533 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
534 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
535 ; CHECK-I686-NEXT:    movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]
536 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
537 ; CHECK-I686-NEXT:    movhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]
538 ; CHECK-I686-NEXT:    addl $64, %esp
539 ; CHECK-I686-NEXT:    popl %esi
540 ; CHECK-I686-NEXT:    popl %edi
541 ; CHECK-I686-NEXT:    popl %ebx
542 ; CHECK-I686-NEXT:    retl
543   %a = load <4 x half>, <4 x half>* %p, align 8
544   %b = fpext <4 x half> %a to <4 x double>
545   ret <4 x double> %b
548 define void @test_trunc32_vec4(<4 x float> %a, <4 x half>* %p) #0 {
549 ; BWON-NOF16C-LABEL: test_trunc32_vec4:
550 ; BWON-NOF16C:       # %bb.0:
551 ; BWON-NOF16C-NEXT:    pushq %rbp
552 ; BWON-NOF16C-NEXT:    pushq %r15
553 ; BWON-NOF16C-NEXT:    pushq %r14
554 ; BWON-NOF16C-NEXT:    pushq %rbx
555 ; BWON-NOF16C-NEXT:    subq $24, %rsp
556 ; BWON-NOF16C-NEXT:    movq %rdi, %rbx
557 ; BWON-NOF16C-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
558 ; BWON-NOF16C-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
559 ; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT
560 ; BWON-NOF16C-NEXT:    movl %eax, %r14d
561 ; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
562 ; BWON-NOF16C-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
563 ; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT
564 ; BWON-NOF16C-NEXT:    movl %eax, %r15d
565 ; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
566 ; BWON-NOF16C-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
567 ; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT
568 ; BWON-NOF16C-NEXT:    movl %eax, %ebp
569 ; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
570 ; BWON-NOF16C-NEXT:    callq __gnu_f2h_ieee@PLT
571 ; BWON-NOF16C-NEXT:    movw %ax, (%rbx)
572 ; BWON-NOF16C-NEXT:    movw %bp, 6(%rbx)
573 ; BWON-NOF16C-NEXT:    movw %r15w, 4(%rbx)
574 ; BWON-NOF16C-NEXT:    movw %r14w, 2(%rbx)
575 ; BWON-NOF16C-NEXT:    addq $24, %rsp
576 ; BWON-NOF16C-NEXT:    popq %rbx
577 ; BWON-NOF16C-NEXT:    popq %r14
578 ; BWON-NOF16C-NEXT:    popq %r15
579 ; BWON-NOF16C-NEXT:    popq %rbp
580 ; BWON-NOF16C-NEXT:    retq
582 ; BWOFF-LABEL: test_trunc32_vec4:
583 ; BWOFF:       # %bb.0:
584 ; BWOFF-NEXT:    pushq %rbp
585 ; BWOFF-NEXT:    pushq %r15
586 ; BWOFF-NEXT:    pushq %r14
587 ; BWOFF-NEXT:    pushq %rbx
588 ; BWOFF-NEXT:    subq $24, %rsp
589 ; BWOFF-NEXT:    movq %rdi, %rbx
590 ; BWOFF-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
591 ; BWOFF-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
592 ; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT
593 ; BWOFF-NEXT:    movw %ax, %r14w
594 ; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
595 ; BWOFF-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
596 ; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT
597 ; BWOFF-NEXT:    movw %ax, %r15w
598 ; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
599 ; BWOFF-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
600 ; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT
601 ; BWOFF-NEXT:    movw %ax, %bp
602 ; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
603 ; BWOFF-NEXT:    callq __gnu_f2h_ieee@PLT
604 ; BWOFF-NEXT:    movw %ax, (%rbx)
605 ; BWOFF-NEXT:    movw %bp, 6(%rbx)
606 ; BWOFF-NEXT:    movw %r15w, 4(%rbx)
607 ; BWOFF-NEXT:    movw %r14w, 2(%rbx)
608 ; BWOFF-NEXT:    addq $24, %rsp
609 ; BWOFF-NEXT:    popq %rbx
610 ; BWOFF-NEXT:    popq %r14
611 ; BWOFF-NEXT:    popq %r15
612 ; BWOFF-NEXT:    popq %rbp
613 ; BWOFF-NEXT:    retq
615 ; BWON-F16C-LABEL: test_trunc32_vec4:
616 ; BWON-F16C:       # %bb.0:
617 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, (%rdi)
618 ; BWON-F16C-NEXT:    retq
620 ; CHECK-I686-LABEL: test_trunc32_vec4:
621 ; CHECK-I686:       # %bb.0:
622 ; CHECK-I686-NEXT:    pushl %ebp
623 ; CHECK-I686-NEXT:    pushl %ebx
624 ; CHECK-I686-NEXT:    pushl %edi
625 ; CHECK-I686-NEXT:    pushl %esi
626 ; CHECK-I686-NEXT:    subl $44, %esp
627 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
628 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ebp
629 ; CHECK-I686-NEXT:    movaps %xmm0, %xmm1
630 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
631 ; CHECK-I686-NEXT:    movss %xmm1, (%esp)
632 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
633 ; CHECK-I686-NEXT:    movw %ax, %si
634 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
635 ; CHECK-I686-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
636 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
637 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
638 ; CHECK-I686-NEXT:    movw %ax, %di
639 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
640 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
641 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
642 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
643 ; CHECK-I686-NEXT:    movw %ax, %bx
644 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
645 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
646 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
647 ; CHECK-I686-NEXT:    movw %ax, (%ebp)
648 ; CHECK-I686-NEXT:    movw %bx, 6(%ebp)
649 ; CHECK-I686-NEXT:    movw %di, 4(%ebp)
650 ; CHECK-I686-NEXT:    movw %si, 2(%ebp)
651 ; CHECK-I686-NEXT:    addl $44, %esp
652 ; CHECK-I686-NEXT:    popl %esi
653 ; CHECK-I686-NEXT:    popl %edi
654 ; CHECK-I686-NEXT:    popl %ebx
655 ; CHECK-I686-NEXT:    popl %ebp
656 ; CHECK-I686-NEXT:    retl
657   %v = fptrunc <4 x float> %a to <4 x half>
658   store <4 x half> %v, <4 x half>* %p
659   ret void
662 define void @test_trunc64_vec4(<4 x double> %a, <4 x half>* %p) #0 {
663 ; BWON-NOF16C-LABEL: test_trunc64_vec4:
664 ; BWON-NOF16C:       # %bb.0:
665 ; BWON-NOF16C-NEXT:    pushq %rbp
666 ; BWON-NOF16C-NEXT:    pushq %r15
667 ; BWON-NOF16C-NEXT:    pushq %r14
668 ; BWON-NOF16C-NEXT:    pushq %rbx
669 ; BWON-NOF16C-NEXT:    subq $40, %rsp
670 ; BWON-NOF16C-NEXT:    movq %rdi, %rbx
671 ; BWON-NOF16C-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill
672 ; BWON-NOF16C-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
673 ; BWON-NOF16C-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
674 ; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT
675 ; BWON-NOF16C-NEXT:    movl %eax, %r14d
676 ; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
677 ; BWON-NOF16C-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
678 ; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT
679 ; BWON-NOF16C-NEXT:    movl %eax, %r15d
680 ; BWON-NOF16C-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
681 ; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT
682 ; BWON-NOF16C-NEXT:    movl %eax, %ebp
683 ; BWON-NOF16C-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
684 ; BWON-NOF16C-NEXT:    callq __truncdfhf2@PLT
685 ; BWON-NOF16C-NEXT:    movw %ax, 4(%rbx)
686 ; BWON-NOF16C-NEXT:    movw %bp, (%rbx)
687 ; BWON-NOF16C-NEXT:    movw %r15w, 6(%rbx)
688 ; BWON-NOF16C-NEXT:    movw %r14w, 2(%rbx)
689 ; BWON-NOF16C-NEXT:    addq $40, %rsp
690 ; BWON-NOF16C-NEXT:    popq %rbx
691 ; BWON-NOF16C-NEXT:    popq %r14
692 ; BWON-NOF16C-NEXT:    popq %r15
693 ; BWON-NOF16C-NEXT:    popq %rbp
694 ; BWON-NOF16C-NEXT:    retq
696 ; BWOFF-LABEL: test_trunc64_vec4:
697 ; BWOFF:       # %bb.0:
698 ; BWOFF-NEXT:    pushq %rbp
699 ; BWOFF-NEXT:    pushq %r15
700 ; BWOFF-NEXT:    pushq %r14
701 ; BWOFF-NEXT:    pushq %rbx
702 ; BWOFF-NEXT:    subq $40, %rsp
703 ; BWOFF-NEXT:    movq %rdi, %rbx
704 ; BWOFF-NEXT:    movaps %xmm1, (%rsp) # 16-byte Spill
705 ; BWOFF-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
706 ; BWOFF-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
707 ; BWOFF-NEXT:    callq __truncdfhf2@PLT
708 ; BWOFF-NEXT:    movw %ax, %r14w
709 ; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
710 ; BWOFF-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
711 ; BWOFF-NEXT:    callq __truncdfhf2@PLT
712 ; BWOFF-NEXT:    movw %ax, %r15w
713 ; BWOFF-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
714 ; BWOFF-NEXT:    callq __truncdfhf2@PLT
715 ; BWOFF-NEXT:    movw %ax, %bp
716 ; BWOFF-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
717 ; BWOFF-NEXT:    callq __truncdfhf2@PLT
718 ; BWOFF-NEXT:    movw %ax, 4(%rbx)
719 ; BWOFF-NEXT:    movw %bp, (%rbx)
720 ; BWOFF-NEXT:    movw %r15w, 6(%rbx)
721 ; BWOFF-NEXT:    movw %r14w, 2(%rbx)
722 ; BWOFF-NEXT:    addq $40, %rsp
723 ; BWOFF-NEXT:    popq %rbx
724 ; BWOFF-NEXT:    popq %r14
725 ; BWOFF-NEXT:    popq %r15
726 ; BWOFF-NEXT:    popq %rbp
727 ; BWOFF-NEXT:    retq
729 ; BWON-F16C-LABEL: test_trunc64_vec4:
730 ; BWON-F16C:       # %bb.0:
731 ; BWON-F16C-NEXT:    pushq %rbp
732 ; BWON-F16C-NEXT:    pushq %r15
733 ; BWON-F16C-NEXT:    pushq %r14
734 ; BWON-F16C-NEXT:    pushq %rbx
735 ; BWON-F16C-NEXT:    subq $56, %rsp
736 ; BWON-F16C-NEXT:    movq %rdi, %rbx
737 ; BWON-F16C-NEXT:    vmovupd %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
738 ; BWON-F16C-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
739 ; BWON-F16C-NEXT:    vzeroupper
740 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
741 ; BWON-F16C-NEXT:    movl %eax, %r14d
742 ; BWON-F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
743 ; BWON-F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
744 ; BWON-F16C-NEXT:    vmovapd %xmm0, (%rsp) # 16-byte Spill
745 ; BWON-F16C-NEXT:    vpermilpd {{.*#+}} xmm0 = xmm0[1,0]
746 ; BWON-F16C-NEXT:    vzeroupper
747 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
748 ; BWON-F16C-NEXT:    movl %eax, %r15d
749 ; BWON-F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
750 ; BWON-F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
751 ; BWON-F16C-NEXT:    vzeroupper
752 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
753 ; BWON-F16C-NEXT:    movl %eax, %ebp
754 ; BWON-F16C-NEXT:    vmovaps (%rsp), %xmm0 # 16-byte Reload
755 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
756 ; BWON-F16C-NEXT:    movw %ax, 4(%rbx)
757 ; BWON-F16C-NEXT:    movw %bp, (%rbx)
758 ; BWON-F16C-NEXT:    movw %r15w, 6(%rbx)
759 ; BWON-F16C-NEXT:    movw %r14w, 2(%rbx)
760 ; BWON-F16C-NEXT:    addq $56, %rsp
761 ; BWON-F16C-NEXT:    popq %rbx
762 ; BWON-F16C-NEXT:    popq %r14
763 ; BWON-F16C-NEXT:    popq %r15
764 ; BWON-F16C-NEXT:    popq %rbp
765 ; BWON-F16C-NEXT:    retq
767 ; CHECK-I686-LABEL: test_trunc64_vec4:
768 ; CHECK-I686:       # %bb.0:
769 ; CHECK-I686-NEXT:    pushl %ebp
770 ; CHECK-I686-NEXT:    pushl %ebx
771 ; CHECK-I686-NEXT:    pushl %edi
772 ; CHECK-I686-NEXT:    pushl %esi
773 ; CHECK-I686-NEXT:    subl $60, %esp
774 ; CHECK-I686-NEXT:    movaps %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
775 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
776 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ebp
777 ; CHECK-I686-NEXT:    movlps %xmm0, (%esp)
778 ; CHECK-I686-NEXT:    calll __truncdfhf2
779 ; CHECK-I686-NEXT:    movw %ax, %si
780 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
781 ; CHECK-I686-NEXT:    movhps %xmm0, (%esp)
782 ; CHECK-I686-NEXT:    calll __truncdfhf2
783 ; CHECK-I686-NEXT:    movw %ax, %di
784 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
785 ; CHECK-I686-NEXT:    movlps %xmm0, (%esp)
786 ; CHECK-I686-NEXT:    calll __truncdfhf2
787 ; CHECK-I686-NEXT:    movw %ax, %bx
788 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
789 ; CHECK-I686-NEXT:    movhps %xmm0, (%esp)
790 ; CHECK-I686-NEXT:    calll __truncdfhf2
791 ; CHECK-I686-NEXT:    movw %ax, 6(%ebp)
792 ; CHECK-I686-NEXT:    movw %bx, 4(%ebp)
793 ; CHECK-I686-NEXT:    movw %di, 2(%ebp)
794 ; CHECK-I686-NEXT:    movw %si, (%ebp)
795 ; CHECK-I686-NEXT:    addl $60, %esp
796 ; CHECK-I686-NEXT:    popl %esi
797 ; CHECK-I686-NEXT:    popl %edi
798 ; CHECK-I686-NEXT:    popl %ebx
799 ; CHECK-I686-NEXT:    popl %ebp
800 ; CHECK-I686-NEXT:    retl
801   %v = fptrunc <4 x double> %a to <4 x half>
802   store <4 x half> %v, <4 x half>* %p
803   ret void
806 declare float @test_floatret();
808 ; On i686, if SSE2 is available, the return value from test_floatret is loaded
809 ; to f80 and then rounded to f32.  The DAG combiner should not combine this
810 ; fp_round and the subsequent fptrunc from float to half.
811 define half @test_f80trunc_nodagcombine() #0 {
812 ; CHECK-LIBCALL-LABEL: test_f80trunc_nodagcombine:
813 ; CHECK-LIBCALL:       # %bb.0:
814 ; CHECK-LIBCALL-NEXT:    pushq %rax
815 ; CHECK-LIBCALL-NEXT:    callq test_floatret@PLT
816 ; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
817 ; CHECK-LIBCALL-NEXT:    popq %rcx
818 ; CHECK-LIBCALL-NEXT:    retq
820 ; BWON-F16C-LABEL: test_f80trunc_nodagcombine:
821 ; BWON-F16C:       # %bb.0:
822 ; BWON-F16C-NEXT:    pushq %rax
823 ; BWON-F16C-NEXT:    callq test_floatret@PLT
824 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
825 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
826 ; BWON-F16C-NEXT:    # kill: def $ax killed $ax killed $eax
827 ; BWON-F16C-NEXT:    popq %rcx
828 ; BWON-F16C-NEXT:    retq
830 ; CHECK-I686-LABEL: test_f80trunc_nodagcombine:
831 ; CHECK-I686:       # %bb.0:
832 ; CHECK-I686-NEXT:    subl $12, %esp
833 ; CHECK-I686-NEXT:    calll test_floatret@PLT
834 ; CHECK-I686-NEXT:    fstps (%esp)
835 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
836 ; CHECK-I686-NEXT:    addl $12, %esp
837 ; CHECK-I686-NEXT:    retl
838   %1 = call float @test_floatret()
839   %2 = fptrunc float %1 to half
840   ret half %2
846 define float @test_sitofp_fadd_i32(i32 %a, half* %b) #0 {
847 ; CHECK-LIBCALL-LABEL: test_sitofp_fadd_i32:
848 ; CHECK-LIBCALL:       # %bb.0:
849 ; CHECK-LIBCALL-NEXT:    pushq %rbx
850 ; CHECK-LIBCALL-NEXT:    subq $16, %rsp
851 ; CHECK-LIBCALL-NEXT:    movzwl (%rsi), %ebx
852 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %edi, %xmm0
853 ; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
854 ; CHECK-LIBCALL-NEXT:    movzwl %ax, %edi
855 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
856 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
857 ; CHECK-LIBCALL-NEXT:    movl %ebx, %edi
858 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
859 ; CHECK-LIBCALL-NEXT:    addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
860 ; CHECK-LIBCALL-NEXT:    callq __gnu_f2h_ieee@PLT
861 ; CHECK-LIBCALL-NEXT:    movzwl %ax, %edi
862 ; CHECK-LIBCALL-NEXT:    addq $16, %rsp
863 ; CHECK-LIBCALL-NEXT:    popq %rbx
864 ; CHECK-LIBCALL-NEXT:    jmp __gnu_h2f_ieee@PLT # TAILCALL
866 ; BWON-F16C-LABEL: test_sitofp_fadd_i32:
867 ; BWON-F16C:       # %bb.0:
868 ; BWON-F16C-NEXT:    movzwl (%rsi), %eax
869 ; BWON-F16C-NEXT:    vcvtsi2ss %edi, %xmm0, %xmm0
870 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
871 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
872 ; BWON-F16C-NEXT:    vmovd %eax, %xmm1
873 ; BWON-F16C-NEXT:    vcvtph2ps %xmm1, %xmm1
874 ; BWON-F16C-NEXT:    vaddss %xmm0, %xmm1, %xmm0
875 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
876 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
877 ; BWON-F16C-NEXT:    retq
879 ; CHECK-I686-LABEL: test_sitofp_fadd_i32:
880 ; CHECK-I686:       # %bb.0:
881 ; CHECK-I686-NEXT:    pushl %edi
882 ; CHECK-I686-NEXT:    pushl %esi
883 ; CHECK-I686-NEXT:    subl $20, %esp
884 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
885 ; CHECK-I686-NEXT:    movzwl (%eax), %edi
886 ; CHECK-I686-NEXT:    cvtsi2ssl {{[0-9]+}}(%esp), %xmm0
887 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
888 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
889 ; CHECK-I686-NEXT:    movw %ax, %si
890 ; CHECK-I686-NEXT:    movl %edi, (%esp)
891 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
892 ; CHECK-I686-NEXT:    movzwl %si, %eax
893 ; CHECK-I686-NEXT:    movl %eax, (%esp)
894 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
895 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
896 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
897 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
898 ; CHECK-I686-NEXT:    addss {{[0-9]+}}(%esp), %xmm0
899 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
900 ; CHECK-I686-NEXT:    calll __gnu_f2h_ieee
901 ; CHECK-I686-NEXT:    movzwl %ax, %eax
902 ; CHECK-I686-NEXT:    movl %eax, (%esp)
903 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
904 ; CHECK-I686-NEXT:    addl $20, %esp
905 ; CHECK-I686-NEXT:    popl %esi
906 ; CHECK-I686-NEXT:    popl %edi
907 ; CHECK-I686-NEXT:    retl
908   %tmp0 = load half, half* %b
909   %tmp1 = sitofp i32 %a to half
910   %tmp2 = fadd half %tmp0, %tmp1
911   %tmp3 = fpext half %tmp2 to float
912   ret float %tmp3
915 define half @PR40273(half) #0 {
916 ; CHECK-LIBCALL-LABEL: PR40273:
917 ; CHECK-LIBCALL:       # %bb.0:
918 ; CHECK-LIBCALL-NEXT:    pushq %rax
919 ; CHECK-LIBCALL-NEXT:    movzwl %di, %edi
920 ; CHECK-LIBCALL-NEXT:    callq __gnu_h2f_ieee@PLT
921 ; CHECK-LIBCALL-NEXT:    xorl %eax, %eax
922 ; CHECK-LIBCALL-NEXT:    xorps %xmm1, %xmm1
923 ; CHECK-LIBCALL-NEXT:    ucomiss %xmm1, %xmm0
924 ; CHECK-LIBCALL-NEXT:    movl $15360, %ecx # imm = 0x3C00
925 ; CHECK-LIBCALL-NEXT:    cmovnel %ecx, %eax
926 ; CHECK-LIBCALL-NEXT:    cmovpl %ecx, %eax
927 ; CHECK-LIBCALL-NEXT:    # kill: def $ax killed $ax killed $eax
928 ; CHECK-LIBCALL-NEXT:    popq %rcx
929 ; CHECK-LIBCALL-NEXT:    retq
931 ; BWON-F16C-LABEL: PR40273:
932 ; BWON-F16C:       # %bb.0:
933 ; BWON-F16C-NEXT:    movzwl %di, %eax
934 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
935 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
936 ; BWON-F16C-NEXT:    xorl %eax, %eax
937 ; BWON-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1
938 ; BWON-F16C-NEXT:    vucomiss %xmm1, %xmm0
939 ; BWON-F16C-NEXT:    movl $15360, %ecx # imm = 0x3C00
940 ; BWON-F16C-NEXT:    cmovnel %ecx, %eax
941 ; BWON-F16C-NEXT:    cmovpl %ecx, %eax
942 ; BWON-F16C-NEXT:    # kill: def $ax killed $ax killed $eax
943 ; BWON-F16C-NEXT:    retq
945 ; CHECK-I686-LABEL: PR40273:
946 ; CHECK-I686:       # %bb.0:
947 ; CHECK-I686-NEXT:    subl $12, %esp
948 ; CHECK-I686-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
949 ; CHECK-I686-NEXT:    movl %eax, (%esp)
950 ; CHECK-I686-NEXT:    calll __gnu_h2f_ieee
951 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
952 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
953 ; CHECK-I686-NEXT:    xorl %eax, %eax
954 ; CHECK-I686-NEXT:    xorps %xmm1, %xmm1
955 ; CHECK-I686-NEXT:    ucomiss %xmm1, %xmm0
956 ; CHECK-I686-NEXT:    movl $15360, %ecx # imm = 0x3C00
957 ; CHECK-I686-NEXT:    cmovnel %ecx, %eax
958 ; CHECK-I686-NEXT:    cmovpl %ecx, %eax
959 ; CHECK-I686-NEXT:    # kill: def $ax killed $ax killed $eax
960 ; CHECK-I686-NEXT:    addl $12, %esp
961 ; CHECK-I686-NEXT:    retl
962   %2 = fcmp une half %0, 0xH0000
963   %3 = uitofp i1 %2 to half
964   ret half %3
967 attributes #0 = { nounwind }