Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / half.ll
blob596e465ee8cacf20365b1ffaee7aecf0570d6457
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 -verify-machineinstrs \
3 ; RUN:   | FileCheck %s -check-prefixes=CHECK,CHECK-LIBCALL,BWON
4 ; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mattr=-f16c  -fixup-byte-word-insts=0 -verify-machineinstrs \
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 -verify-machineinstrs \
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 -verify-machineinstrs \
9 ; RUN:    | FileCheck %s -check-prefixes=CHECK-I686
11 define void @test_load_store(ptr %in, ptr %out) #0 {
12 ; CHECK-LIBCALL-LABEL: test_load_store:
13 ; CHECK-LIBCALL:       # %bb.0:
14 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0
15 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
16 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rsi)
17 ; CHECK-LIBCALL-NEXT:    retq
19 ; BWON-F16C-LABEL: test_load_store:
20 ; BWON-F16C:       # %bb.0:
21 ; BWON-F16C-NEXT:    vpinsrw $0, (%rdi), %xmm0, %xmm0
22 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rsi)
23 ; BWON-F16C-NEXT:    retq
25 ; CHECK-I686-LABEL: test_load_store:
26 ; CHECK-I686:       # %bb.0:
27 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
28 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ecx
29 ; CHECK-I686-NEXT:    pinsrw $0, (%ecx), %xmm0
30 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %ecx
31 ; CHECK-I686-NEXT:    movw %cx, (%eax)
32 ; CHECK-I686-NEXT:    retl
33   %val = load half, ptr %in
34   store half %val, ptr %out
35   ret void
38 define i16 @test_bitcast_from_half(ptr %addr) #0 {
39 ; BWON-LABEL: test_bitcast_from_half:
40 ; BWON:       # %bb.0:
41 ; BWON-NEXT:    movzwl (%rdi), %eax
42 ; BWON-NEXT:    retq
44 ; BWOFF-LABEL: test_bitcast_from_half:
45 ; BWOFF:       # %bb.0:
46 ; BWOFF-NEXT:    movw (%rdi), %ax
47 ; BWOFF-NEXT:    retq
49 ; CHECK-I686-LABEL: test_bitcast_from_half:
50 ; CHECK-I686:       # %bb.0:
51 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
52 ; CHECK-I686-NEXT:    movw (%eax), %ax
53 ; CHECK-I686-NEXT:    retl
54   %val = load half, ptr %addr
55   %val_int = bitcast half %val to i16
56   ret i16 %val_int
59 define void @test_bitcast_to_half(ptr %addr, i16 %in) #0 {
60 ; CHECK-LABEL: test_bitcast_to_half:
61 ; CHECK:       # %bb.0:
62 ; CHECK-NEXT:    movw %si, (%rdi)
63 ; CHECK-NEXT:    retq
65 ; CHECK-I686-LABEL: test_bitcast_to_half:
66 ; CHECK-I686:       # %bb.0:
67 ; CHECK-I686-NEXT:    movw {{[0-9]+}}(%esp), %ax
68 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %ecx
69 ; CHECK-I686-NEXT:    movw %ax, (%ecx)
70 ; CHECK-I686-NEXT:    retl
71   %val_fp = bitcast i16 %in to half
72   store half %val_fp, ptr %addr
73   ret void
76 define float @test_extend32(ptr %addr) #0 {
77 ; CHECK-LIBCALL-LABEL: test_extend32:
78 ; CHECK-LIBCALL:       # %bb.0:
79 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0
80 ; CHECK-LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL
82 ; BWON-F16C-LABEL: test_extend32:
83 ; BWON-F16C:       # %bb.0:
84 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
85 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
86 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
87 ; BWON-F16C-NEXT:    retq
89 ; CHECK-I686-LABEL: test_extend32:
90 ; CHECK-I686:       # %bb.0:
91 ; CHECK-I686-NEXT:    subl $12, %esp
92 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
93 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
94 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
95 ; CHECK-I686-NEXT:    movw %ax, (%esp)
96 ; CHECK-I686-NEXT:    calll __extendhfsf2
97 ; CHECK-I686-NEXT:    addl $12, %esp
98 ; CHECK-I686-NEXT:    retl
99   %val16 = load half, ptr %addr
100   %val32 = fpext half %val16 to float
101   ret float %val32
104 define double @test_extend64(ptr %addr) #0 {
105 ; CHECK-LIBCALL-LABEL: test_extend64:
106 ; CHECK-LIBCALL:       # %bb.0:
107 ; CHECK-LIBCALL-NEXT:    pushq %rax
108 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0
109 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
110 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
111 ; CHECK-LIBCALL-NEXT:    popq %rax
112 ; CHECK-LIBCALL-NEXT:    retq
114 ; BWON-F16C-LABEL: test_extend64:
115 ; BWON-F16C:       # %bb.0:
116 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
117 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
118 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
119 ; BWON-F16C-NEXT:    vcvtss2sd %xmm0, %xmm0, %xmm0
120 ; BWON-F16C-NEXT:    retq
122 ; CHECK-I686-LABEL: test_extend64:
123 ; CHECK-I686:       # %bb.0:
124 ; CHECK-I686-NEXT:    subl $12, %esp
125 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
126 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
127 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
128 ; CHECK-I686-NEXT:    movw %ax, (%esp)
129 ; CHECK-I686-NEXT:    calll __extendhfsf2
130 ; CHECK-I686-NEXT:    addl $12, %esp
131 ; CHECK-I686-NEXT:    retl
132   %val16 = load half, ptr %addr
133   %val32 = fpext half %val16 to double
134   ret double %val32
137 define void @test_trunc32(float %in, ptr %addr) #0 {
138 ; CHECK-LIBCALL-LABEL: test_trunc32:
139 ; CHECK-LIBCALL:       # %bb.0:
140 ; CHECK-LIBCALL-NEXT:    pushq %rbx
141 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx
142 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
143 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
144 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
145 ; CHECK-LIBCALL-NEXT:    popq %rbx
146 ; CHECK-LIBCALL-NEXT:    retq
148 ; BWON-F16C-LABEL: test_trunc32:
149 ; BWON-F16C:       # %bb.0:
150 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
151 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
152 ; BWON-F16C-NEXT:    movw %ax, (%rdi)
153 ; BWON-F16C-NEXT:    retq
155 ; CHECK-I686-LABEL: test_trunc32:
156 ; CHECK-I686:       # %bb.0:
157 ; CHECK-I686-NEXT:    pushl %esi
158 ; CHECK-I686-NEXT:    subl $8, %esp
159 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
160 ; CHECK-I686-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
161 ; CHECK-I686-NEXT:    movd %xmm0, (%esp)
162 ; CHECK-I686-NEXT:    calll __truncsfhf2
163 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
164 ; CHECK-I686-NEXT:    movw %ax, (%esi)
165 ; CHECK-I686-NEXT:    addl $8, %esp
166 ; CHECK-I686-NEXT:    popl %esi
167 ; CHECK-I686-NEXT:    retl
168   %val16 = fptrunc float %in to half
169   store half %val16, ptr %addr
170   ret void
173 define void @test_trunc64(double %in, ptr %addr) #0 {
174 ; CHECK-LIBCALL-LABEL: test_trunc64:
175 ; CHECK-LIBCALL:       # %bb.0:
176 ; CHECK-LIBCALL-NEXT:    pushq %rbx
177 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx
178 ; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT
179 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
180 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
181 ; CHECK-LIBCALL-NEXT:    popq %rbx
182 ; CHECK-LIBCALL-NEXT:    retq
184 ; BWON-F16C-LABEL: test_trunc64:
185 ; BWON-F16C:       # %bb.0:
186 ; BWON-F16C-NEXT:    pushq %rbx
187 ; BWON-F16C-NEXT:    movq %rdi, %rbx
188 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
189 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, (%rbx)
190 ; BWON-F16C-NEXT:    popq %rbx
191 ; BWON-F16C-NEXT:    retq
193 ; CHECK-I686-LABEL: test_trunc64:
194 ; CHECK-I686:       # %bb.0:
195 ; CHECK-I686-NEXT:    pushl %esi
196 ; CHECK-I686-NEXT:    subl $8, %esp
197 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
198 ; CHECK-I686-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
199 ; CHECK-I686-NEXT:    movq %xmm0, (%esp)
200 ; CHECK-I686-NEXT:    calll __truncdfhf2
201 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
202 ; CHECK-I686-NEXT:    movw %ax, (%esi)
203 ; CHECK-I686-NEXT:    addl $8, %esp
204 ; CHECK-I686-NEXT:    popl %esi
205 ; CHECK-I686-NEXT:    retl
206   %val16 = fptrunc double %in to half
207   store half %val16, ptr %addr
208   ret void
211 define i64 @test_fptosi_i64(ptr %p) #0 {
212 ; CHECK-LIBCALL-LABEL: test_fptosi_i64:
213 ; CHECK-LIBCALL:       # %bb.0:
214 ; CHECK-LIBCALL-NEXT:    pushq %rax
215 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0
216 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
217 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rax
218 ; CHECK-LIBCALL-NEXT:    popq %rcx
219 ; CHECK-LIBCALL-NEXT:    retq
221 ; BWON-F16C-LABEL: test_fptosi_i64:
222 ; BWON-F16C:       # %bb.0:
223 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
224 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
225 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
226 ; BWON-F16C-NEXT:    vcvttss2si %xmm0, %rax
227 ; BWON-F16C-NEXT:    retq
229 ; CHECK-I686-LABEL: test_fptosi_i64:
230 ; CHECK-I686:       # %bb.0:
231 ; CHECK-I686-NEXT:    subl $28, %esp
232 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
233 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
234 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
235 ; CHECK-I686-NEXT:    movw %ax, (%esp)
236 ; CHECK-I686-NEXT:    calll __extendhfsf2
237 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
238 ; CHECK-I686-NEXT:    flds {{[0-9]+}}(%esp)
239 ; CHECK-I686-NEXT:    fnstcw {{[0-9]+}}(%esp)
240 ; CHECK-I686-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
241 ; CHECK-I686-NEXT:    orl $3072, %eax # imm = 0xC00
242 ; CHECK-I686-NEXT:    movw %ax, {{[0-9]+}}(%esp)
243 ; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)
244 ; CHECK-I686-NEXT:    fistpll {{[0-9]+}}(%esp)
245 ; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)
246 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
247 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %edx
248 ; CHECK-I686-NEXT:    addl $28, %esp
249 ; CHECK-I686-NEXT:    retl
250   %a = load half, ptr %p, align 2
251   %r = fptosi half %a to i64
252   ret i64 %r
255 define void @test_sitofp_i64(i64 %a, ptr %p) #0 {
256 ; CHECK-LIBCALL-LABEL: test_sitofp_i64:
257 ; CHECK-LIBCALL:       # %bb.0:
258 ; CHECK-LIBCALL-NEXT:    pushq %rbx
259 ; CHECK-LIBCALL-NEXT:    movq %rsi, %rbx
260 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0
261 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
262 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
263 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
264 ; CHECK-LIBCALL-NEXT:    popq %rbx
265 ; CHECK-LIBCALL-NEXT:    retq
267 ; BWON-F16C-LABEL: test_sitofp_i64:
268 ; BWON-F16C:       # %bb.0:
269 ; BWON-F16C-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
270 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
271 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
272 ; BWON-F16C-NEXT:    movw %ax, (%rsi)
273 ; BWON-F16C-NEXT:    retq
275 ; CHECK-I686-LABEL: test_sitofp_i64:
276 ; CHECK-I686:       # %bb.0:
277 ; CHECK-I686-NEXT:    pushl %esi
278 ; CHECK-I686-NEXT:    subl $24, %esp
279 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
280 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
281 ; CHECK-I686-NEXT:    movlps %xmm0, {{[0-9]+}}(%esp)
282 ; CHECK-I686-NEXT:    fildll {{[0-9]+}}(%esp)
283 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
284 ; CHECK-I686-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
285 ; CHECK-I686-NEXT:    movd %xmm0, (%esp)
286 ; CHECK-I686-NEXT:    calll __truncsfhf2
287 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
288 ; CHECK-I686-NEXT:    movw %ax, (%esi)
289 ; CHECK-I686-NEXT:    addl $24, %esp
290 ; CHECK-I686-NEXT:    popl %esi
291 ; CHECK-I686-NEXT:    retl
292   %r = sitofp i64 %a to half
293   store half %r, ptr %p
294   ret void
297 define i64 @test_fptoui_i64(ptr %p) #0 {
298 ; CHECK-LIBCALL-LABEL: test_fptoui_i64:
299 ; CHECK-LIBCALL:       # %bb.0:
300 ; CHECK-LIBCALL-NEXT:    pushq %rax
301 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0
302 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
303 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rcx
304 ; CHECK-LIBCALL-NEXT:    movq %rcx, %rdx
305 ; CHECK-LIBCALL-NEXT:    sarq $63, %rdx
306 ; CHECK-LIBCALL-NEXT:    subss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
307 ; CHECK-LIBCALL-NEXT:    cvttss2si %xmm0, %rax
308 ; CHECK-LIBCALL-NEXT:    andq %rdx, %rax
309 ; CHECK-LIBCALL-NEXT:    orq %rcx, %rax
310 ; CHECK-LIBCALL-NEXT:    popq %rcx
311 ; CHECK-LIBCALL-NEXT:    retq
313 ; BWON-F16C-LABEL: test_fptoui_i64:
314 ; BWON-F16C:       # %bb.0:
315 ; BWON-F16C-NEXT:    movzwl (%rdi), %eax
316 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
317 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
318 ; BWON-F16C-NEXT:    vcvttss2si %xmm0, %rcx
319 ; BWON-F16C-NEXT:    movq %rcx, %rdx
320 ; BWON-F16C-NEXT:    sarq $63, %rdx
321 ; BWON-F16C-NEXT:    vsubss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
322 ; BWON-F16C-NEXT:    vcvttss2si %xmm0, %rax
323 ; BWON-F16C-NEXT:    andq %rdx, %rax
324 ; BWON-F16C-NEXT:    orq %rcx, %rax
325 ; BWON-F16C-NEXT:    retq
327 ; CHECK-I686-LABEL: test_fptoui_i64:
328 ; CHECK-I686:       # %bb.0:
329 ; CHECK-I686-NEXT:    subl $28, %esp
330 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
331 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
332 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
333 ; CHECK-I686-NEXT:    movw %ax, (%esp)
334 ; CHECK-I686-NEXT:    calll __extendhfsf2
335 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
336 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
337 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
338 ; CHECK-I686-NEXT:    ucomiss %xmm1, %xmm0
339 ; CHECK-I686-NEXT:    jae .LBB9_2
340 ; CHECK-I686-NEXT:  # %bb.1:
341 ; CHECK-I686-NEXT:    xorps %xmm1, %xmm1
342 ; CHECK-I686-NEXT:  .LBB9_2:
343 ; CHECK-I686-NEXT:    subss %xmm1, %xmm0
344 ; CHECK-I686-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
345 ; CHECK-I686-NEXT:    setae %al
346 ; CHECK-I686-NEXT:    flds {{[0-9]+}}(%esp)
347 ; CHECK-I686-NEXT:    fnstcw {{[0-9]+}}(%esp)
348 ; CHECK-I686-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
349 ; CHECK-I686-NEXT:    orl $3072, %ecx # imm = 0xC00
350 ; CHECK-I686-NEXT:    movw %cx, {{[0-9]+}}(%esp)
351 ; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)
352 ; CHECK-I686-NEXT:    fistpll {{[0-9]+}}(%esp)
353 ; CHECK-I686-NEXT:    fldcw {{[0-9]+}}(%esp)
354 ; CHECK-I686-NEXT:    movzbl %al, %edx
355 ; CHECK-I686-NEXT:    shll $31, %edx
356 ; CHECK-I686-NEXT:    xorl {{[0-9]+}}(%esp), %edx
357 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
358 ; CHECK-I686-NEXT:    addl $28, %esp
359 ; CHECK-I686-NEXT:    retl
360   %a = load half, ptr %p, align 2
361   %r = fptoui half %a to i64
362   ret i64 %r
365 define void @test_uitofp_i64(i64 %a, ptr %p) #0 {
366 ; CHECK-LIBCALL-LABEL: test_uitofp_i64:
367 ; CHECK-LIBCALL:       # %bb.0:
368 ; CHECK-LIBCALL-NEXT:    pushq %rbx
369 ; CHECK-LIBCALL-NEXT:    movq %rsi, %rbx
370 ; CHECK-LIBCALL-NEXT:    testq %rdi, %rdi
371 ; CHECK-LIBCALL-NEXT:    js .LBB10_1
372 ; CHECK-LIBCALL-NEXT:  # %bb.2:
373 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0
374 ; CHECK-LIBCALL-NEXT:    jmp .LBB10_3
375 ; CHECK-LIBCALL-NEXT:  .LBB10_1:
376 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rax
377 ; CHECK-LIBCALL-NEXT:    shrq %rax
378 ; CHECK-LIBCALL-NEXT:    andl $1, %edi
379 ; CHECK-LIBCALL-NEXT:    orq %rax, %rdi
380 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %rdi, %xmm0
381 ; CHECK-LIBCALL-NEXT:    addss %xmm0, %xmm0
382 ; CHECK-LIBCALL-NEXT:  .LBB10_3:
383 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
384 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
385 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
386 ; CHECK-LIBCALL-NEXT:    popq %rbx
387 ; CHECK-LIBCALL-NEXT:    retq
389 ; BWON-F16C-LABEL: test_uitofp_i64:
390 ; BWON-F16C:       # %bb.0:
391 ; BWON-F16C-NEXT:    testq %rdi, %rdi
392 ; BWON-F16C-NEXT:    js .LBB10_1
393 ; BWON-F16C-NEXT:  # %bb.2:
394 ; BWON-F16C-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
395 ; BWON-F16C-NEXT:    jmp .LBB10_3
396 ; BWON-F16C-NEXT:  .LBB10_1:
397 ; BWON-F16C-NEXT:    movq %rdi, %rax
398 ; BWON-F16C-NEXT:    shrq %rax
399 ; BWON-F16C-NEXT:    andl $1, %edi
400 ; BWON-F16C-NEXT:    orq %rax, %rdi
401 ; BWON-F16C-NEXT:    vcvtsi2ss %rdi, %xmm0, %xmm0
402 ; BWON-F16C-NEXT:    vaddss %xmm0, %xmm0, %xmm0
403 ; BWON-F16C-NEXT:  .LBB10_3:
404 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
405 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
406 ; BWON-F16C-NEXT:    movw %ax, (%rsi)
407 ; BWON-F16C-NEXT:    retq
409 ; CHECK-I686-LABEL: test_uitofp_i64:
410 ; CHECK-I686:       # %bb.0:
411 ; CHECK-I686-NEXT:    pushl %esi
412 ; CHECK-I686-NEXT:    subl $24, %esp
413 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
414 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
415 ; CHECK-I686-NEXT:    movq {{.*#+}} xmm0 = mem[0],zero
416 ; CHECK-I686-NEXT:    movq %xmm0, {{[0-9]+}}(%esp)
417 ; CHECK-I686-NEXT:    shrl $31, %eax
418 ; CHECK-I686-NEXT:    fildll {{[0-9]+}}(%esp)
419 ; CHECK-I686-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%eax,4)
420 ; CHECK-I686-NEXT:    fstps (%esp)
421 ; CHECK-I686-NEXT:    calll __truncsfhf2
422 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
423 ; CHECK-I686-NEXT:    movw %ax, (%esi)
424 ; CHECK-I686-NEXT:    addl $24, %esp
425 ; CHECK-I686-NEXT:    popl %esi
426 ; CHECK-I686-NEXT:    retl
427   %r = uitofp i64 %a to half
428   store half %r, ptr %p
429   ret void
432 define <4 x float> @test_extend32_vec4(ptr %p) #0 {
433 ; CHECK-LIBCALL-LABEL: test_extend32_vec4:
434 ; CHECK-LIBCALL:       # %bb.0:
435 ; CHECK-LIBCALL-NEXT:    subq $72, %rsp
436 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0
437 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
438 ; CHECK-LIBCALL-NEXT:    pinsrw $0, 2(%rdi), %xmm0
439 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
440 ; CHECK-LIBCALL-NEXT:    pinsrw $0, 4(%rdi), %xmm0
441 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
442 ; CHECK-LIBCALL-NEXT:    pinsrw $0, 6(%rdi), %xmm0
443 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
444 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
445 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
446 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
447 ; CHECK-LIBCALL-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
448 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
449 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
450 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
451 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
452 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
453 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
454 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
455 ; CHECK-LIBCALL-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
456 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
457 ; CHECK-LIBCALL-NEXT:    unpcklpd (%rsp), %xmm0 # 16-byte Folded Reload
458 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0]
459 ; CHECK-LIBCALL-NEXT:    addq $72, %rsp
460 ; CHECK-LIBCALL-NEXT:    retq
462 ; BWON-F16C-LABEL: test_extend32_vec4:
463 ; BWON-F16C:       # %bb.0:
464 ; BWON-F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
465 ; BWON-F16C-NEXT:    retq
467 ; CHECK-I686-LABEL: test_extend32_vec4:
468 ; CHECK-I686:       # %bb.0:
469 ; CHECK-I686-NEXT:    pushl %esi
470 ; CHECK-I686-NEXT:    subl $88, %esp
471 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
472 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
473 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
474 ; CHECK-I686-NEXT:    pinsrw $0, 6(%eax), %xmm0
475 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
476 ; CHECK-I686-NEXT:    pinsrw $0, 4(%eax), %xmm0
477 ; CHECK-I686-NEXT:    pinsrw $0, 2(%eax), %xmm1
478 ; CHECK-I686-NEXT:    pextrw $0, %xmm1, %eax
479 ; CHECK-I686-NEXT:    movw %ax, (%esp)
480 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
481 ; CHECK-I686-NEXT:    calll __extendhfsf2
482 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
483 ; CHECK-I686-NEXT:    movw %si, (%esp)
484 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
485 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
486 ; CHECK-I686-NEXT:    calll __extendhfsf2
487 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
488 ; CHECK-I686-NEXT:    movw %si, (%esp)
489 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
490 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
491 ; CHECK-I686-NEXT:    calll __extendhfsf2
492 ; CHECK-I686-NEXT:    movw %si, (%esp)
493 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
494 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
495 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
496 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
497 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
498 ; CHECK-I686-NEXT:    calll __extendhfsf2
499 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
500 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
501 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
502 ; CHECK-I686-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
503 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
504 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
505 ; CHECK-I686-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
506 ; CHECK-I686-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
507 ; CHECK-I686-NEXT:    addl $88, %esp
508 ; CHECK-I686-NEXT:    popl %esi
509 ; CHECK-I686-NEXT:    retl
510   %a = load <4 x half>, ptr %p, align 8
511   %b = fpext <4 x half> %a to <4 x float>
512   ret <4 x float> %b
515 define <4 x double> @test_extend64_vec4(ptr %p) #0 {
516 ; CHECK-LIBCALL-LABEL: test_extend64_vec4:
517 ; CHECK-LIBCALL:       # %bb.0:
518 ; CHECK-LIBCALL-NEXT:    subq $72, %rsp
519 ; CHECK-LIBCALL-NEXT:    pinsrw $0, 4(%rdi), %xmm0
520 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
521 ; CHECK-LIBCALL-NEXT:    pinsrw $0, 6(%rdi), %xmm0
522 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
523 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rdi), %xmm0
524 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
525 ; CHECK-LIBCALL-NEXT:    pinsrw $0, 2(%rdi), %xmm0
526 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
527 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
528 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
529 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
530 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
531 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
532 ; CHECK-LIBCALL-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
533 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0]
534 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
535 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
536 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
537 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm0
538 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
539 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
540 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
541 ; CHECK-LIBCALL-NEXT:    cvtss2sd %xmm0, %xmm1
542 ; CHECK-LIBCALL-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
543 ; CHECK-LIBCALL-NEXT:    # xmm1 = xmm1[0],mem[0]
544 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
545 ; CHECK-LIBCALL-NEXT:    addq $72, %rsp
546 ; CHECK-LIBCALL-NEXT:    retq
548 ; BWON-F16C-LABEL: test_extend64_vec4:
549 ; BWON-F16C:       # %bb.0:
550 ; BWON-F16C-NEXT:    vcvtph2ps (%rdi), %xmm0
551 ; BWON-F16C-NEXT:    vcvtps2pd %xmm0, %ymm0
552 ; BWON-F16C-NEXT:    retq
554 ; CHECK-I686-LABEL: test_extend64_vec4:
555 ; CHECK-I686:       # %bb.0:
556 ; CHECK-I686-NEXT:    pushl %esi
557 ; CHECK-I686-NEXT:    subl $104, %esp
558 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
559 ; CHECK-I686-NEXT:    pinsrw $0, 6(%eax), %xmm0
560 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
561 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
562 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
563 ; CHECK-I686-NEXT:    pinsrw $0, 2(%eax), %xmm0
564 ; CHECK-I686-NEXT:    pinsrw $0, 4(%eax), %xmm1
565 ; CHECK-I686-NEXT:    pextrw $0, %xmm1, %eax
566 ; CHECK-I686-NEXT:    movw %ax, (%esp)
567 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
568 ; CHECK-I686-NEXT:    calll __extendhfsf2
569 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
570 ; CHECK-I686-NEXT:    movw %si, (%esp)
571 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
572 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
573 ; CHECK-I686-NEXT:    calll __extendhfsf2
574 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
575 ; CHECK-I686-NEXT:    movw %si, (%esp)
576 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
577 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
578 ; CHECK-I686-NEXT:    calll __extendhfsf2
579 ; CHECK-I686-NEXT:    movw %si, (%esp)
580 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
581 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
582 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
583 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
584 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
585 ; CHECK-I686-NEXT:    calll __extendhfsf2
586 ; CHECK-I686-NEXT:    fstpl {{[0-9]+}}(%esp)
587 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
588 ; CHECK-I686-NEXT:    movhps {{.*#+}} xmm0 = xmm0[0,1],mem[0,1]
589 ; CHECK-I686-NEXT:    movsd {{.*#+}} xmm1 = mem[0],zero
590 ; CHECK-I686-NEXT:    movhps {{.*#+}} xmm1 = xmm1[0,1],mem[0,1]
591 ; CHECK-I686-NEXT:    addl $104, %esp
592 ; CHECK-I686-NEXT:    popl %esi
593 ; CHECK-I686-NEXT:    retl
594   %a = load <4 x half>, ptr %p, align 8
595   %b = fpext <4 x half> %a to <4 x double>
596   ret <4 x double> %b
599 define void @test_trunc32_vec4(<4 x float> %a, ptr %p) #0 {
600 ; CHECK-LIBCALL-LABEL: test_trunc32_vec4:
601 ; CHECK-LIBCALL:       # %bb.0:
602 ; CHECK-LIBCALL-NEXT:    pushq %rbx
603 ; CHECK-LIBCALL-NEXT:    subq $64, %rsp
604 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx
605 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
606 ; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
607 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
608 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
609 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
610 ; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
611 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
612 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
613 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
614 ; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
615 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
616 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
617 ; CHECK-LIBCALL-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
618 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
619 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
620 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
621 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
622 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
623 ; CHECK-LIBCALL-NEXT:    movw %ax, 6(%rbx)
624 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
625 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
626 ; CHECK-LIBCALL-NEXT:    movw %ax, 4(%rbx)
627 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
628 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
629 ; CHECK-LIBCALL-NEXT:    movw %ax, 2(%rbx)
630 ; CHECK-LIBCALL-NEXT:    addq $64, %rsp
631 ; CHECK-LIBCALL-NEXT:    popq %rbx
632 ; CHECK-LIBCALL-NEXT:    retq
634 ; BWON-F16C-LABEL: test_trunc32_vec4:
635 ; BWON-F16C:       # %bb.0:
636 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, (%rdi)
637 ; BWON-F16C-NEXT:    retq
639 ; CHECK-I686-LABEL: test_trunc32_vec4:
640 ; CHECK-I686:       # %bb.0:
641 ; CHECK-I686-NEXT:    pushl %esi
642 ; CHECK-I686-NEXT:    subl $88, %esp
643 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
644 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
645 ; CHECK-I686-NEXT:    movaps %xmm0, %xmm1
646 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[1,1]
647 ; CHECK-I686-NEXT:    movss %xmm1, (%esp)
648 ; CHECK-I686-NEXT:    calll __truncsfhf2
649 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
650 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
651 ; CHECK-I686-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
652 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
653 ; CHECK-I686-NEXT:    calll __truncsfhf2
654 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
655 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
656 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
657 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
658 ; CHECK-I686-NEXT:    calll __truncsfhf2
659 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
660 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
661 ; CHECK-I686-NEXT:    movd %xmm0, (%esp)
662 ; CHECK-I686-NEXT:    calll __truncsfhf2
663 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
664 ; CHECK-I686-NEXT:    movw %ax, (%esi)
665 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
666 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
667 ; CHECK-I686-NEXT:    movw %ax, 6(%esi)
668 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
669 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
670 ; CHECK-I686-NEXT:    movw %ax, 4(%esi)
671 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
672 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
673 ; CHECK-I686-NEXT:    movw %ax, 2(%esi)
674 ; CHECK-I686-NEXT:    addl $88, %esp
675 ; CHECK-I686-NEXT:    popl %esi
676 ; CHECK-I686-NEXT:    retl
677   %v = fptrunc <4 x float> %a to <4 x half>
678   store <4 x half> %v, ptr %p
679   ret void
682 define void @test_trunc64_vec4(<4 x double> %a, ptr %p) #0 {
683 ; CHECK-LIBCALL-LABEL: test_trunc64_vec4:
684 ; CHECK-LIBCALL:       # %bb.0:
685 ; CHECK-LIBCALL-NEXT:    pushq %rbx
686 ; CHECK-LIBCALL-NEXT:    subq $64, %rsp
687 ; CHECK-LIBCALL-NEXT:    movq %rdi, %rbx
688 ; CHECK-LIBCALL-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
689 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
690 ; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
691 ; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT
692 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
693 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
694 ; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
695 ; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT
696 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
697 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
698 ; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT
699 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
700 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
701 ; CHECK-LIBCALL-NEXT:    callq __truncdfhf2@PLT
702 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
703 ; CHECK-LIBCALL-NEXT:    movw %ax, 4(%rbx)
704 ; CHECK-LIBCALL-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload
705 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
706 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rbx)
707 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
708 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
709 ; CHECK-LIBCALL-NEXT:    movw %ax, 6(%rbx)
710 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
711 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
712 ; CHECK-LIBCALL-NEXT:    movw %ax, 2(%rbx)
713 ; CHECK-LIBCALL-NEXT:    addq $64, %rsp
714 ; CHECK-LIBCALL-NEXT:    popq %rbx
715 ; CHECK-LIBCALL-NEXT:    retq
717 ; BWON-F16C-LABEL: test_trunc64_vec4:
718 ; BWON-F16C:       # %bb.0:
719 ; BWON-F16C-NEXT:    pushq %rbx
720 ; BWON-F16C-NEXT:    subq $64, %rsp
721 ; BWON-F16C-NEXT:    movq %rdi, %rbx
722 ; BWON-F16C-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill
723 ; BWON-F16C-NEXT:    vextractf128 $1, %ymm0, %xmm0
724 ; BWON-F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
725 ; BWON-F16C-NEXT:    vzeroupper
726 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
727 ; BWON-F16C-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
728 ; BWON-F16C-NEXT:    vpermilpd $1, (%rsp), %xmm0 # 16-byte Folded Reload
729 ; BWON-F16C-NEXT:    # xmm0 = mem[1,0]
730 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
731 ; BWON-F16C-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
732 ; BWON-F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
733 ; BWON-F16C-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
734 ; BWON-F16C-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload
735 ; BWON-F16C-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0
736 ; BWON-F16C-NEXT:    vzeroupper
737 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
738 ; BWON-F16C-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill
739 ; BWON-F16C-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
740 ; BWON-F16C-NEXT:    # xmm0 = mem[1,0]
741 ; BWON-F16C-NEXT:    callq __truncdfhf2@PLT
742 ; BWON-F16C-NEXT:    vmovdqa (%rsp), %xmm1 # 16-byte Reload
743 ; BWON-F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
744 ; BWON-F16C-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload
745 ; BWON-F16C-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
746 ; BWON-F16C-NEXT:    vmovq %xmm0, (%rbx)
747 ; BWON-F16C-NEXT:    addq $64, %rsp
748 ; BWON-F16C-NEXT:    popq %rbx
749 ; BWON-F16C-NEXT:    retq
751 ; CHECK-I686-LABEL: test_trunc64_vec4:
752 ; CHECK-I686:       # %bb.0:
753 ; CHECK-I686-NEXT:    pushl %esi
754 ; CHECK-I686-NEXT:    subl $88, %esp
755 ; CHECK-I686-NEXT:    movaps %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
756 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
757 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %esi
758 ; CHECK-I686-NEXT:    movlps %xmm0, (%esp)
759 ; CHECK-I686-NEXT:    calll __truncdfhf2
760 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
761 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
762 ; CHECK-I686-NEXT:    movhps %xmm0, (%esp)
763 ; CHECK-I686-NEXT:    calll __truncdfhf2
764 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
765 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
766 ; CHECK-I686-NEXT:    movlps %xmm0, (%esp)
767 ; CHECK-I686-NEXT:    calll __truncdfhf2
768 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
769 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
770 ; CHECK-I686-NEXT:    movhps %xmm0, (%esp)
771 ; CHECK-I686-NEXT:    calll __truncdfhf2
772 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
773 ; CHECK-I686-NEXT:    movw %ax, 6(%esi)
774 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
775 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
776 ; CHECK-I686-NEXT:    movw %ax, 4(%esi)
777 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
778 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
779 ; CHECK-I686-NEXT:    movw %ax, 2(%esi)
780 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
781 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
782 ; CHECK-I686-NEXT:    movw %ax, (%esi)
783 ; CHECK-I686-NEXT:    addl $88, %esp
784 ; CHECK-I686-NEXT:    popl %esi
785 ; CHECK-I686-NEXT:    retl
786   %v = fptrunc <4 x double> %a to <4 x half>
787   store <4 x half> %v, ptr %p
788   ret void
791 declare float @test_floatret();
793 ; On i686, if SSE2 is available, the return value from test_floatret is loaded
794 ; to f80 and then rounded to f32.  The DAG combiner should not combine this
795 ; fp_round and the subsequent fptrunc from float to half.
796 define half @test_f80trunc_nodagcombine() #0 {
797 ; CHECK-LIBCALL-LABEL: test_f80trunc_nodagcombine:
798 ; CHECK-LIBCALL:       # %bb.0:
799 ; CHECK-LIBCALL-NEXT:    pushq %rax
800 ; CHECK-LIBCALL-NEXT:    callq test_floatret@PLT
801 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
802 ; CHECK-LIBCALL-NEXT:    popq %rax
803 ; CHECK-LIBCALL-NEXT:    retq
805 ; BWON-F16C-LABEL: test_f80trunc_nodagcombine:
806 ; BWON-F16C:       # %bb.0:
807 ; BWON-F16C-NEXT:    pushq %rax
808 ; BWON-F16C-NEXT:    callq test_floatret@PLT
809 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
810 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
811 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
812 ; BWON-F16C-NEXT:    popq %rax
813 ; BWON-F16C-NEXT:    retq
815 ; CHECK-I686-LABEL: test_f80trunc_nodagcombine:
816 ; CHECK-I686:       # %bb.0:
817 ; CHECK-I686-NEXT:    subl $12, %esp
818 ; CHECK-I686-NEXT:    calll test_floatret@PLT
819 ; CHECK-I686-NEXT:    fstps (%esp)
820 ; CHECK-I686-NEXT:    calll __truncsfhf2
821 ; CHECK-I686-NEXT:    addl $12, %esp
822 ; CHECK-I686-NEXT:    retl
823   %1 = call float @test_floatret()
824   %2 = fptrunc float %1 to half
825   ret half %2
831 define float @test_sitofp_fadd_i32(i32 %a, ptr %b) #0 {
832 ; CHECK-LIBCALL-LABEL: test_sitofp_fadd_i32:
833 ; CHECK-LIBCALL:       # %bb.0:
834 ; CHECK-LIBCALL-NEXT:    subq $40, %rsp
835 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rsi), %xmm0
836 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
837 ; CHECK-LIBCALL-NEXT:    xorps %xmm0, %xmm0
838 ; CHECK-LIBCALL-NEXT:    cvtsi2ss %edi, %xmm0
839 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
840 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
841 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
842 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
843 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
844 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
845 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
846 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
847 ; CHECK-LIBCALL-NEXT:    addss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
848 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
849 ; CHECK-LIBCALL-NEXT:    addq $40, %rsp
850 ; CHECK-LIBCALL-NEXT:    jmp __extendhfsf2@PLT # TAILCALL
852 ; BWON-F16C-LABEL: test_sitofp_fadd_i32:
853 ; BWON-F16C:       # %bb.0:
854 ; BWON-F16C-NEXT:    movzwl (%rsi), %eax
855 ; BWON-F16C-NEXT:    vcvtsi2ss %edi, %xmm0, %xmm0
856 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
857 ; BWON-F16C-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
858 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
859 ; BWON-F16C-NEXT:    vmovd %eax, %xmm1
860 ; BWON-F16C-NEXT:    vcvtph2ps %xmm1, %xmm1
861 ; BWON-F16C-NEXT:    vaddss %xmm0, %xmm1, %xmm0
862 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
863 ; BWON-F16C-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
864 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
865 ; BWON-F16C-NEXT:    retq
867 ; CHECK-I686-LABEL: test_sitofp_fadd_i32:
868 ; CHECK-I686:       # %bb.0:
869 ; CHECK-I686-NEXT:    subl $60, %esp
870 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
871 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
872 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
873 ; CHECK-I686-NEXT:    xorps %xmm0, %xmm0
874 ; CHECK-I686-NEXT:    cvtsi2ssl {{[0-9]+}}(%esp), %xmm0
875 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
876 ; CHECK-I686-NEXT:    calll __truncsfhf2
877 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
878 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
879 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
880 ; CHECK-I686-NEXT:    movw %ax, (%esp)
881 ; CHECK-I686-NEXT:    calll __extendhfsf2
882 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
883 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
884 ; CHECK-I686-NEXT:    movw %ax, (%esp)
885 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
886 ; CHECK-I686-NEXT:    calll __extendhfsf2
887 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
888 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
889 ; CHECK-I686-NEXT:    addss {{[0-9]+}}(%esp), %xmm0
890 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
891 ; CHECK-I686-NEXT:    calll __truncsfhf2
892 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
893 ; CHECK-I686-NEXT:    movw %ax, (%esp)
894 ; CHECK-I686-NEXT:    calll __extendhfsf2
895 ; CHECK-I686-NEXT:    addl $60, %esp
896 ; CHECK-I686-NEXT:    retl
897   %tmp0 = load half, ptr %b
898   %tmp1 = sitofp i32 %a to half
899   %tmp2 = fadd half %tmp0, %tmp1
900   %tmp3 = fpext half %tmp2 to float
901   ret float %tmp3
904 define half @PR40273(half) #0 {
905 ; CHECK-LIBCALL-LABEL: PR40273:
906 ; CHECK-LIBCALL:       # %bb.0:
907 ; CHECK-LIBCALL-NEXT:    pushq %rax
908 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
909 ; CHECK-LIBCALL-NEXT:    xorl %eax, %eax
910 ; CHECK-LIBCALL-NEXT:    xorps %xmm1, %xmm1
911 ; CHECK-LIBCALL-NEXT:    ucomiss %xmm1, %xmm0
912 ; CHECK-LIBCALL-NEXT:    movl $15360, %ecx # imm = 0x3C00
913 ; CHECK-LIBCALL-NEXT:    cmovnel %ecx, %eax
914 ; CHECK-LIBCALL-NEXT:    cmovpl %ecx, %eax
915 ; CHECK-LIBCALL-NEXT:    pinsrw $0, %eax, %xmm0
916 ; CHECK-LIBCALL-NEXT:    popq %rax
917 ; CHECK-LIBCALL-NEXT:    retq
919 ; BWON-F16C-LABEL: PR40273:
920 ; BWON-F16C:       # %bb.0:
921 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax
922 ; BWON-F16C-NEXT:    movzwl %ax, %eax
923 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
924 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
925 ; BWON-F16C-NEXT:    xorl %eax, %eax
926 ; BWON-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1
927 ; BWON-F16C-NEXT:    vucomiss %xmm1, %xmm0
928 ; BWON-F16C-NEXT:    movl $15360, %ecx # imm = 0x3C00
929 ; BWON-F16C-NEXT:    cmovnel %ecx, %eax
930 ; BWON-F16C-NEXT:    cmovpl %ecx, %eax
931 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
932 ; BWON-F16C-NEXT:    retq
934 ; CHECK-I686-LABEL: PR40273:
935 ; CHECK-I686:       # %bb.0:
936 ; CHECK-I686-NEXT:    subl $12, %esp
937 ; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
938 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
939 ; CHECK-I686-NEXT:    movw %ax, (%esp)
940 ; CHECK-I686-NEXT:    calll __extendhfsf2
941 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
942 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
943 ; CHECK-I686-NEXT:    xorl %eax, %eax
944 ; CHECK-I686-NEXT:    xorps %xmm1, %xmm1
945 ; CHECK-I686-NEXT:    ucomiss %xmm1, %xmm0
946 ; CHECK-I686-NEXT:    movl $15360, %ecx # imm = 0x3C00
947 ; CHECK-I686-NEXT:    cmovnel %ecx, %eax
948 ; CHECK-I686-NEXT:    cmovpl %ecx, %eax
949 ; CHECK-I686-NEXT:    pinsrw $0, %eax, %xmm0
950 ; CHECK-I686-NEXT:    addl $12, %esp
951 ; CHECK-I686-NEXT:    retl
952   %2 = fcmp une half %0, 0xH0000
953   %3 = uitofp i1 %2 to half
954   ret half %3
957 define void @brcond(half %0) #0 {
958 ; CHECK-LIBCALL-LABEL: brcond:
959 ; CHECK-LIBCALL:       # %bb.0: # %entry
960 ; CHECK-LIBCALL-NEXT:    pushq %rax
961 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
962 ; CHECK-LIBCALL-NEXT:    xorps %xmm1, %xmm1
963 ; CHECK-LIBCALL-NEXT:    ucomiss %xmm1, %xmm0
964 ; CHECK-LIBCALL-NEXT:    setp %al
965 ; CHECK-LIBCALL-NEXT:    setne %cl
966 ; CHECK-LIBCALL-NEXT:    orb %al, %cl
967 ; CHECK-LIBCALL-NEXT:    jne .LBB18_2
968 ; CHECK-LIBCALL-NEXT:  # %bb.1: # %if.then
969 ; CHECK-LIBCALL-NEXT:    popq %rax
970 ; CHECK-LIBCALL-NEXT:    retq
971 ; CHECK-LIBCALL-NEXT:  .LBB18_2: # %if.end
973 ; BWON-F16C-LABEL: brcond:
974 ; BWON-F16C:       # %bb.0: # %entry
975 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax
976 ; BWON-F16C-NEXT:    movzwl %ax, %eax
977 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
978 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
979 ; BWON-F16C-NEXT:    vxorps %xmm1, %xmm1, %xmm1
980 ; BWON-F16C-NEXT:    vucomiss %xmm1, %xmm0
981 ; BWON-F16C-NEXT:    setp %al
982 ; BWON-F16C-NEXT:    setne %cl
983 ; BWON-F16C-NEXT:    orb %al, %cl
984 ; BWON-F16C-NEXT:    jne .LBB18_2
985 ; BWON-F16C-NEXT:  # %bb.1: # %if.then
986 ; BWON-F16C-NEXT:    retq
987 ; BWON-F16C-NEXT:  .LBB18_2: # %if.end
989 ; CHECK-I686-LABEL: brcond:
990 ; CHECK-I686:       # %bb.0: # %entry
991 ; CHECK-I686-NEXT:    subl $12, %esp
992 ; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
993 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
994 ; CHECK-I686-NEXT:    movw %ax, (%esp)
995 ; CHECK-I686-NEXT:    calll __extendhfsf2
996 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
997 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
998 ; CHECK-I686-NEXT:    xorps %xmm1, %xmm1
999 ; CHECK-I686-NEXT:    ucomiss %xmm1, %xmm0
1000 ; CHECK-I686-NEXT:    setp %al
1001 ; CHECK-I686-NEXT:    setne %cl
1002 ; CHECK-I686-NEXT:    orb %al, %cl
1003 ; CHECK-I686-NEXT:    jne .LBB18_2
1004 ; CHECK-I686-NEXT:  # %bb.1: # %if.then
1005 ; CHECK-I686-NEXT:    addl $12, %esp
1006 ; CHECK-I686-NEXT:    retl
1007 ; CHECK-I686-NEXT:  .LBB18_2: # %if.end
1008 entry:
1009   %cmp = fcmp oeq half 0xH0000, %0
1010   br i1 %cmp, label %if.then, label %if.end
1012 if.then:                                          ; preds = %entry
1013   ret void
1015 if.end:                                           ; preds = %entry
1016   unreachable
1019 define half @test_sqrt(half %0) #0 {
1020 ; CHECK-LIBCALL-LABEL: test_sqrt:
1021 ; CHECK-LIBCALL:       # %bb.0: # %entry
1022 ; CHECK-LIBCALL-NEXT:    pushq %rax
1023 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1024 ; CHECK-LIBCALL-NEXT:    sqrtss %xmm0, %xmm0
1025 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1026 ; CHECK-LIBCALL-NEXT:    popq %rax
1027 ; CHECK-LIBCALL-NEXT:    retq
1029 ; BWON-F16C-LABEL: test_sqrt:
1030 ; BWON-F16C:       # %bb.0: # %entry
1031 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax
1032 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1033 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
1034 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1035 ; BWON-F16C-NEXT:    vsqrtss %xmm0, %xmm0, %xmm0
1036 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
1037 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
1038 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1039 ; BWON-F16C-NEXT:    retq
1041 ; CHECK-I686-LABEL: test_sqrt:
1042 ; CHECK-I686:       # %bb.0: # %entry
1043 ; CHECK-I686-NEXT:    subl $12, %esp
1044 ; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
1045 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
1046 ; CHECK-I686-NEXT:    movw %ax, (%esp)
1047 ; CHECK-I686-NEXT:    calll __extendhfsf2
1048 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1049 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1050 ; CHECK-I686-NEXT:    sqrtss %xmm0, %xmm0
1051 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1052 ; CHECK-I686-NEXT:    calll __truncsfhf2
1053 ; CHECK-I686-NEXT:    addl $12, %esp
1054 ; CHECK-I686-NEXT:    retl
1055 entry:
1056   %1 = call half @llvm.sqrt.f16(half %0)
1057   ret half %1
1060 declare half @llvm.sqrt.f16(half)
1062 define void @main.158() #0 {
1063 ; CHECK-LIBCALL-LABEL: main.158:
1064 ; CHECK-LIBCALL:       # %bb.0: # %entry
1065 ; CHECK-LIBCALL-NEXT:    pushq %rax
1066 ; CHECK-LIBCALL-NEXT:    xorps %xmm0, %xmm0
1067 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1068 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1069 ; CHECK-LIBCALL-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1070 ; CHECK-LIBCALL-NEXT:    ucomiss %xmm0, %xmm1
1071 ; CHECK-LIBCALL-NEXT:    xorps %xmm0, %xmm0
1072 ; CHECK-LIBCALL-NEXT:    jae .LBB20_2
1073 ; CHECK-LIBCALL-NEXT:  # %bb.1: # %entry
1074 ; CHECK-LIBCALL-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1075 ; CHECK-LIBCALL-NEXT:  .LBB20_2: # %entry
1076 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1077 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
1078 ; CHECK-LIBCALL-NEXT:    movw %ax, (%rax)
1079 ; CHECK-LIBCALL-NEXT:    popq %rax
1080 ; CHECK-LIBCALL-NEXT:    retq
1082 ; BWON-F16C-LABEL: main.158:
1083 ; BWON-F16C:       # %bb.0: # %entry
1084 ; BWON-F16C-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1085 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
1086 ; BWON-F16C-NEXT:    vpmovzxwq {{.*#+}} xmm0 = xmm0[0],zero,zero,zero,xmm0[1],zero,zero,zero
1087 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1088 ; BWON-F16C-NEXT:    vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
1089 ; BWON-F16C-NEXT:    vucomiss %xmm0, %xmm1
1090 ; BWON-F16C-NEXT:    vxorps %xmm0, %xmm0, %xmm0
1091 ; BWON-F16C-NEXT:    jae .LBB20_2
1092 ; BWON-F16C-NEXT:  # %bb.1: # %entry
1093 ; BWON-F16C-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1094 ; BWON-F16C-NEXT:  .LBB20_2: # %entry
1095 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
1096 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
1097 ; BWON-F16C-NEXT:    movw %ax, (%rax)
1098 ; BWON-F16C-NEXT:    retq
1100 ; CHECK-I686-LABEL: main.158:
1101 ; CHECK-I686:       # %bb.0: # %entry
1102 ; CHECK-I686-NEXT:    subl $12, %esp
1103 ; CHECK-I686-NEXT:    pxor %xmm0, %xmm0
1104 ; CHECK-I686-NEXT:    movd %xmm0, (%esp)
1105 ; CHECK-I686-NEXT:    calll __truncsfhf2
1106 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
1107 ; CHECK-I686-NEXT:    movw %ax, (%esp)
1108 ; CHECK-I686-NEXT:    calll __extendhfsf2
1109 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1110 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1111 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
1112 ; CHECK-I686-NEXT:    xorps %xmm0, %xmm0
1113 ; CHECK-I686-NEXT:    jae .LBB20_2
1114 ; CHECK-I686-NEXT:  # %bb.1: # %entry
1115 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1116 ; CHECK-I686-NEXT:  .LBB20_2: # %entry
1117 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1118 ; CHECK-I686-NEXT:    calll __truncsfhf2
1119 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
1120 ; CHECK-I686-NEXT:    movw %ax, (%eax)
1121 ; CHECK-I686-NEXT:    addl $12, %esp
1122 ; CHECK-I686-NEXT:    retl
1123 entry:
1124   %0 = tail call half @llvm.fabs.f16(half undef)
1125   %1 = fpext half %0 to float
1126   %compare.2 = fcmp ole half %0, 0xH4800
1127   %multiply.95 = fmul float %1, 5.000000e-01
1128   %add.82 = fadd float %multiply.95, -2.000000e+00
1129   %multiply.68 = fmul float %add.82, 0.000000e+00
1130   %subtract.65 = fsub float %multiply.68, 0.000000e+00
1131   %multiply.57 = fmul float undef, 0.000000e+00
1132   %2 = select i1 %compare.2, float 0.000000e+00, float %multiply.57
1133   %3 = fptrunc float %2 to half
1134   store half %3, ptr undef, align 2
1135   ret void
1138 define void @main.45() #0 {
1139 ; CHECK-LIBCALL-LABEL: main.45:
1140 ; CHECK-LIBCALL:       # %bb.0: # %entry
1141 ; CHECK-LIBCALL-NEXT:    pushq %rbp
1142 ; CHECK-LIBCALL-NEXT:    pushq %r15
1143 ; CHECK-LIBCALL-NEXT:    pushq %r14
1144 ; CHECK-LIBCALL-NEXT:    pushq %rbx
1145 ; CHECK-LIBCALL-NEXT:    pushq %rax
1146 ; CHECK-LIBCALL-NEXT:    pinsrw $0, (%rax), %xmm0
1147 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %eax
1148 ; CHECK-LIBCALL-NEXT:    movd %eax, %xmm1
1149 ; CHECK-LIBCALL-NEXT:    pshuflw {{.*#+}} xmm1 = xmm1[0,0,0,0,4,5,6,7]
1150 ; CHECK-LIBCALL-NEXT:    movq %xmm1, %rbx
1151 ; CHECK-LIBCALL-NEXT:    movq %rbx, %r14
1152 ; CHECK-LIBCALL-NEXT:    shrq $48, %r14
1153 ; CHECK-LIBCALL-NEXT:    movq %rbx, %r15
1154 ; CHECK-LIBCALL-NEXT:    shrq $32, %r15
1155 ; CHECK-LIBCALL-NEXT:    movl %ebx, %ebp
1156 ; CHECK-LIBCALL-NEXT:    shrl $16, %ebp
1157 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1158 ; CHECK-LIBCALL-NEXT:    ucomiss %xmm0, %xmm0
1159 ; CHECK-LIBCALL-NEXT:    movl $32256, %eax # imm = 0x7E00
1160 ; CHECK-LIBCALL-NEXT:    cmovpl %eax, %ebp
1161 ; CHECK-LIBCALL-NEXT:    cmovpl %eax, %r15d
1162 ; CHECK-LIBCALL-NEXT:    cmovpl %eax, %r14d
1163 ; CHECK-LIBCALL-NEXT:    cmovpl %eax, %ebx
1164 ; CHECK-LIBCALL-NEXT:    movw %bx, (%rax)
1165 ; CHECK-LIBCALL-NEXT:    movw %r14w, (%rax)
1166 ; CHECK-LIBCALL-NEXT:    movw %r15w, (%rax)
1167 ; CHECK-LIBCALL-NEXT:    movw %bp, (%rax)
1168 ; CHECK-LIBCALL-NEXT:    addq $8, %rsp
1169 ; CHECK-LIBCALL-NEXT:    popq %rbx
1170 ; CHECK-LIBCALL-NEXT:    popq %r14
1171 ; CHECK-LIBCALL-NEXT:    popq %r15
1172 ; CHECK-LIBCALL-NEXT:    popq %rbp
1173 ; CHECK-LIBCALL-NEXT:    retq
1175 ; BWON-F16C-LABEL: main.45:
1176 ; BWON-F16C:       # %bb.0: # %entry
1177 ; BWON-F16C-NEXT:    movzwl (%rax), %eax
1178 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
1179 ; BWON-F16C-NEXT:    vpshuflw {{.*#+}} xmm1 = xmm0[0,0,0,0,4,5,6,7]
1180 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1181 ; BWON-F16C-NEXT:    xorl %eax, %eax
1182 ; BWON-F16C-NEXT:    vucomiss %xmm0, %xmm0
1183 ; BWON-F16C-NEXT:    movl $65535, %ecx # imm = 0xFFFF
1184 ; BWON-F16C-NEXT:    cmovnpl %eax, %ecx
1185 ; BWON-F16C-NEXT:    vmovd %ecx, %xmm0
1186 ; BWON-F16C-NEXT:    vpshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1187 ; BWON-F16C-NEXT:    vpblendvb %xmm0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1, %xmm0
1188 ; BWON-F16C-NEXT:    vmovq %xmm0, (%rax)
1189 ; BWON-F16C-NEXT:    retq
1191 ; CHECK-I686-LABEL: main.45:
1192 ; CHECK-I686:       # %bb.0: # %entry
1193 ; CHECK-I686-NEXT:    pushl %edi
1194 ; CHECK-I686-NEXT:    pushl %esi
1195 ; CHECK-I686-NEXT:    subl $20, %esp
1196 ; CHECK-I686-NEXT:    pinsrw $0, (%eax), %xmm0
1197 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
1198 ; CHECK-I686-NEXT:    movd %eax, %xmm0
1199 ; CHECK-I686-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,0,0,0,4,5,6,7]
1200 ; CHECK-I686-NEXT:    movd %xmm0, %esi
1201 ; CHECK-I686-NEXT:    movl %esi, %edi
1202 ; CHECK-I686-NEXT:    shrl $16, %edi
1203 ; CHECK-I686-NEXT:    movw %ax, (%esp)
1204 ; CHECK-I686-NEXT:    calll __extendhfsf2
1205 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1206 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1207 ; CHECK-I686-NEXT:    ucomiss %xmm0, %xmm0
1208 ; CHECK-I686-NEXT:    movl $32256, %eax # imm = 0x7E00
1209 ; CHECK-I686-NEXT:    cmovpl %eax, %esi
1210 ; CHECK-I686-NEXT:    cmovpl %eax, %edi
1211 ; CHECK-I686-NEXT:    movw %di, (%eax)
1212 ; CHECK-I686-NEXT:    movw %si, (%eax)
1213 ; CHECK-I686-NEXT:    addl $20, %esp
1214 ; CHECK-I686-NEXT:    popl %esi
1215 ; CHECK-I686-NEXT:    popl %edi
1216 ; CHECK-I686-NEXT:    retl
1217 entry:
1218   %0 = load half, ptr undef, align 8
1219   %1 = bitcast half %0 to i16
1220   %broadcast.splatinsert = insertelement <4 x half> poison, half %0, i64 0
1221   %broadcast.splat = shufflevector <4 x half> %broadcast.splatinsert, <4 x half> poison, <4 x i32> zeroinitializer
1222   %broadcast.splatinsert13 = insertelement <4 x i16> poison, i16 %1, i64 0
1223   %broadcast.splat14 = shufflevector <4 x i16> %broadcast.splatinsert13, <4 x i16> poison, <4 x i32> zeroinitializer
1224   %2 = fcmp uno <4 x half> %broadcast.splat, zeroinitializer
1225   %3 = add <4 x i16> zeroinitializer, %broadcast.splat14
1226   %4 = select i1 undef, <4 x i16> undef, <4 x i16> %3
1227   %5 = select <4 x i1> undef, <4 x i16> undef, <4 x i16> %4
1228   %6 = bitcast <4 x i16> %5 to <4 x half>
1229   %7 = select <4 x i1> %2, <4 x half> <half 0xH7E00, half 0xH7E00, half 0xH7E00, half 0xH7E00>, <4 x half> %6
1230   store <4 x half> %7, ptr undef, align 16
1231   ret void
1234 define half @fcopysign(half %x, half %y) {
1235 ; CHECK-LIBCALL-LABEL: fcopysign:
1236 ; CHECK-LIBCALL:       # %bb.0:
1237 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm1, %eax
1238 ; CHECK-LIBCALL-NEXT:    andl $-32768, %eax # imm = 0x8000
1239 ; CHECK-LIBCALL-NEXT:    pextrw $0, %xmm0, %ecx
1240 ; CHECK-LIBCALL-NEXT:    andl $32767, %ecx # imm = 0x7FFF
1241 ; CHECK-LIBCALL-NEXT:    orl %eax, %ecx
1242 ; CHECK-LIBCALL-NEXT:    pinsrw $0, %ecx, %xmm0
1243 ; CHECK-LIBCALL-NEXT:    retq
1245 ; BWON-F16C-LABEL: fcopysign:
1246 ; BWON-F16C:       # %bb.0:
1247 ; BWON-F16C-NEXT:    vpextrw $0, %xmm1, %eax
1248 ; BWON-F16C-NEXT:    andl $-32768, %eax # imm = 0x8000
1249 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %ecx
1250 ; BWON-F16C-NEXT:    andl $32767, %ecx # imm = 0x7FFF
1251 ; BWON-F16C-NEXT:    orl %eax, %ecx
1252 ; BWON-F16C-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm0
1253 ; BWON-F16C-NEXT:    retq
1255 ; CHECK-I686-LABEL: fcopysign:
1256 ; CHECK-I686:       # %bb.0:
1257 ; CHECK-I686-NEXT:    movl $-32768, %eax # imm = 0x8000
1258 ; CHECK-I686-NEXT:    andl {{[0-9]+}}(%esp), %eax
1259 ; CHECK-I686-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1260 ; CHECK-I686-NEXT:    andl $32767, %ecx # imm = 0x7FFF
1261 ; CHECK-I686-NEXT:    orl %eax, %ecx
1262 ; CHECK-I686-NEXT:    pinsrw $0, %ecx, %xmm0
1263 ; CHECK-I686-NEXT:    retl
1264   %a = call half @llvm.copysign.f16(half %x, half %y)
1265   ret half %a
1268 declare half @llvm.fabs.f16(half)
1269 declare half @llvm.copysign.f16(half, half)
1271 define <8 x half> @select(i1 %c, <8 x half> %x, <8 x half> %y) {
1272 ; CHECK-LIBCALL-LABEL: select:
1273 ; CHECK-LIBCALL:       # %bb.0:
1274 ; CHECK-LIBCALL-NEXT:    testb $1, %dil
1275 ; CHECK-LIBCALL-NEXT:    jne .LBB23_2
1276 ; CHECK-LIBCALL-NEXT:  # %bb.1:
1277 ; CHECK-LIBCALL-NEXT:    movaps %xmm1, %xmm0
1278 ; CHECK-LIBCALL-NEXT:  .LBB23_2:
1279 ; CHECK-LIBCALL-NEXT:    retq
1281 ; BWON-F16C-LABEL: select:
1282 ; BWON-F16C:       # %bb.0:
1283 ; BWON-F16C-NEXT:    testb $1, %dil
1284 ; BWON-F16C-NEXT:    jne .LBB23_2
1285 ; BWON-F16C-NEXT:  # %bb.1:
1286 ; BWON-F16C-NEXT:    vmovaps %xmm1, %xmm0
1287 ; BWON-F16C-NEXT:  .LBB23_2:
1288 ; BWON-F16C-NEXT:    retq
1290 ; CHECK-I686-LABEL: select:
1291 ; CHECK-I686:       # %bb.0:
1292 ; CHECK-I686-NEXT:    testb $1, {{[0-9]+}}(%esp)
1293 ; CHECK-I686-NEXT:    jne .LBB23_2
1294 ; CHECK-I686-NEXT:  # %bb.1:
1295 ; CHECK-I686-NEXT:    movaps %xmm1, %xmm0
1296 ; CHECK-I686-NEXT:  .LBB23_2:
1297 ; CHECK-I686-NEXT:    retl
1298   %s = select i1 %c, <8 x half> %x, <8 x half> %y
1299   ret <8 x half> %s
1302 define <8 x half> @shuffle(ptr %p) {
1303 ; CHECK-LIBCALL-LABEL: shuffle:
1304 ; CHECK-LIBCALL:       # %bb.0:
1305 ; CHECK-LIBCALL-NEXT:    movdqu (%rdi), %xmm0
1306 ; CHECK-LIBCALL-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
1307 ; CHECK-LIBCALL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,2,2]
1308 ; CHECK-LIBCALL-NEXT:    retq
1310 ; BWON-F16C-LABEL: shuffle:
1311 ; BWON-F16C:       # %bb.0:
1312 ; BWON-F16C-NEXT:    vpshufhw {{.*#+}} xmm0 = mem[0,1,2,3,4,4,4,4]
1313 ; BWON-F16C-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[2,2,2,2]
1314 ; BWON-F16C-NEXT:    retq
1316 ; CHECK-I686-LABEL: shuffle:
1317 ; CHECK-I686:       # %bb.0:
1318 ; CHECK-I686-NEXT:    movl {{[0-9]+}}(%esp), %eax
1319 ; CHECK-I686-NEXT:    movdqu (%eax), %xmm0
1320 ; CHECK-I686-NEXT:    pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,4,4,4]
1321 ; CHECK-I686-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[2,2,2,2]
1322 ; CHECK-I686-NEXT:    retl
1323   %1 = load <8 x half>, ptr %p, align 8
1324   %2 = shufflevector <8 x half> %1, <8 x half> poison, <8 x i32> <i32 4, i32 4, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
1325   ret <8 x half> %2
1328 declare half @llvm.minnum.f16(half, half)
1330 define half @pr61271(half %0, half %1) #0 {
1331 ; CHECK-LIBCALL-LABEL: pr61271:
1332 ; CHECK-LIBCALL:       # %bb.0:
1333 ; CHECK-LIBCALL-NEXT:    pushq %rax
1334 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1335 ; CHECK-LIBCALL-NEXT:    movaps %xmm1, %xmm0
1336 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1337 ; CHECK-LIBCALL-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
1338 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1339 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1340 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1341 ; CHECK-LIBCALL-NEXT:    minss (%rsp), %xmm0 # 4-byte Folded Reload
1342 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1343 ; CHECK-LIBCALL-NEXT:    popq %rax
1344 ; CHECK-LIBCALL-NEXT:    retq
1346 ; BWON-F16C-LABEL: pr61271:
1347 ; BWON-F16C:       # %bb.0:
1348 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax
1349 ; BWON-F16C-NEXT:    vpextrw $0, %xmm1, %ecx
1350 ; BWON-F16C-NEXT:    movzwl %cx, %ecx
1351 ; BWON-F16C-NEXT:    vmovd %ecx, %xmm0
1352 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1353 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1354 ; BWON-F16C-NEXT:    vmovd %eax, %xmm1
1355 ; BWON-F16C-NEXT:    vcvtph2ps %xmm1, %xmm1
1356 ; BWON-F16C-NEXT:    vminss %xmm0, %xmm1, %xmm0
1357 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
1358 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
1359 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1360 ; BWON-F16C-NEXT:    retq
1362 ; CHECK-I686-LABEL: pr61271:
1363 ; CHECK-I686:       # %bb.0:
1364 ; CHECK-I686-NEXT:    subl $44, %esp
1365 ; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
1366 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
1367 ; CHECK-I686-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
1368 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
1369 ; CHECK-I686-NEXT:    movw %ax, (%esp)
1370 ; CHECK-I686-NEXT:    calll __extendhfsf2
1371 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1372 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %eax
1373 ; CHECK-I686-NEXT:    movw %ax, (%esp)
1374 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1375 ; CHECK-I686-NEXT:    calll __extendhfsf2
1376 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1377 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1378 ; CHECK-I686-NEXT:    minss {{[0-9]+}}(%esp), %xmm0
1379 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1380 ; CHECK-I686-NEXT:    calll __truncsfhf2
1381 ; CHECK-I686-NEXT:    addl $44, %esp
1382 ; CHECK-I686-NEXT:    retl
1383   %3 = call fast half @llvm.minnum.f16(half %0, half %1)
1384   ret half %3
1387 declare <8 x half> @llvm.maxnum.v8f16(<8 x half>, <8 x half>)
1389 define <8 x half> @maxnum_v8f16(<8 x half> %0, <8 x half> %1) #0 {
1390 ; CHECK-LIBCALL-LABEL: maxnum_v8f16:
1391 ; CHECK-LIBCALL:       # %bb.0:
1392 ; CHECK-LIBCALL-NEXT:    subq $184, %rsp
1393 ; CHECK-LIBCALL-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1394 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1395 ; CHECK-LIBCALL-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1396 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1397 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1398 ; CHECK-LIBCALL-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
1399 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1400 ; CHECK-LIBCALL-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1401 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1402 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1403 ; CHECK-LIBCALL-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
1404 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1405 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1406 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1407 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1408 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1409 ; CHECK-LIBCALL-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1410 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1411 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1412 ; CHECK-LIBCALL-NEXT:    ja .LBB26_2
1413 ; CHECK-LIBCALL-NEXT:  # %bb.1:
1414 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1415 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1416 ; CHECK-LIBCALL-NEXT:  .LBB26_2:
1417 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1418 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1419 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1420 ; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1421 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1422 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1423 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1424 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1425 ; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1426 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1427 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1428 ; CHECK-LIBCALL-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
1429 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1430 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1431 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1432 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1433 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1434 ; CHECK-LIBCALL-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1435 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1436 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1437 ; CHECK-LIBCALL-NEXT:    ja .LBB26_4
1438 ; CHECK-LIBCALL-NEXT:  # %bb.3:
1439 ; CHECK-LIBCALL-NEXT:    movss (%rsp), %xmm0 # 4-byte Reload
1440 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1441 ; CHECK-LIBCALL-NEXT:  .LBB26_4:
1442 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1443 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1444 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1445 ; CHECK-LIBCALL-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1446 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1447 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1448 ; CHECK-LIBCALL-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
1449 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1450 ; CHECK-LIBCALL-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1451 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill
1452 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1453 ; CHECK-LIBCALL-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
1454 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1455 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1456 ; CHECK-LIBCALL-NEXT:    movss %xmm0, (%rsp) # 4-byte Spill
1457 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1458 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1459 ; CHECK-LIBCALL-NEXT:    ucomiss (%rsp), %xmm0 # 4-byte Folded Reload
1460 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1461 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1462 ; CHECK-LIBCALL-NEXT:    ja .LBB26_6
1463 ; CHECK-LIBCALL-NEXT:  # %bb.5:
1464 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1465 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1466 ; CHECK-LIBCALL-NEXT:  .LBB26_6:
1467 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1468 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1469 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1470 ; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1471 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
1472 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1473 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1474 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1475 ; CHECK-LIBCALL-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
1476 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1477 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1478 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1479 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1480 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1481 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1482 ; CHECK-LIBCALL-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
1483 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1484 ; CHECK-LIBCALL-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1485 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1486 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1487 ; CHECK-LIBCALL-NEXT:    ja .LBB26_8
1488 ; CHECK-LIBCALL-NEXT:  # %bb.7:
1489 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1490 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1491 ; CHECK-LIBCALL-NEXT:  .LBB26_8:
1492 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1493 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1494 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1495 ; CHECK-LIBCALL-NEXT:    psrlq $48, %xmm0
1496 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1497 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1498 ; CHECK-LIBCALL-NEXT:    movd %xmm0, (%rsp) # 4-byte Folded Spill
1499 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1500 ; CHECK-LIBCALL-NEXT:    psrlq $48, %xmm0
1501 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1502 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1503 ; CHECK-LIBCALL-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
1504 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1505 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1506 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1507 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1508 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1509 ; CHECK-LIBCALL-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1510 ; CHECK-LIBCALL-NEXT:    movss (%rsp), %xmm0 # 4-byte Reload
1511 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1512 ; CHECK-LIBCALL-NEXT:    ja .LBB26_10
1513 ; CHECK-LIBCALL-NEXT:  # %bb.9:
1514 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1515 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1516 ; CHECK-LIBCALL-NEXT:  .LBB26_10:
1517 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1518 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
1519 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1520 ; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
1521 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1522 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1523 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1524 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1525 ; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
1526 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1527 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1528 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1529 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1530 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1531 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1532 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1533 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1534 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload
1535 ; CHECK-LIBCALL-NEXT:    # xmm1 = mem[0],zero,zero,zero
1536 ; CHECK-LIBCALL-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1537 ; CHECK-LIBCALL-NEXT:    ja .LBB26_12
1538 ; CHECK-LIBCALL-NEXT:  # %bb.11:
1539 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload
1540 ; CHECK-LIBCALL-NEXT:    # xmm1 = mem[0],zero,zero,zero
1541 ; CHECK-LIBCALL-NEXT:  .LBB26_12:
1542 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1543 ; CHECK-LIBCALL-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1544 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
1545 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1546 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1547 ; CHECK-LIBCALL-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1548 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
1549 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1550 ; CHECK-LIBCALL-NEXT:    movaps %xmm1, %xmm0
1551 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1552 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1553 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1554 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1555 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1556 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1557 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1558 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1559 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1560 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1561 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1562 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1563 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1564 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload
1565 ; CHECK-LIBCALL-NEXT:    # xmm1 = mem[0],zero,zero,zero
1566 ; CHECK-LIBCALL-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1567 ; CHECK-LIBCALL-NEXT:    ja .LBB26_14
1568 ; CHECK-LIBCALL-NEXT:  # %bb.13:
1569 ; CHECK-LIBCALL-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 4-byte Reload
1570 ; CHECK-LIBCALL-NEXT:    # xmm1 = mem[0],zero,zero,zero
1571 ; CHECK-LIBCALL-NEXT:  .LBB26_14:
1572 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1573 ; CHECK-LIBCALL-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
1574 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
1575 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1576 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1577 ; CHECK-LIBCALL-NEXT:    punpcklwd (%rsp), %xmm0 # 16-byte Folded Reload
1578 ; CHECK-LIBCALL-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
1579 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1580 ; CHECK-LIBCALL-NEXT:    movaps %xmm1, %xmm0
1581 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1582 ; CHECK-LIBCALL-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1583 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1584 ; CHECK-LIBCALL-NEXT:    psrld $16, %xmm0
1585 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1586 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1587 ; CHECK-LIBCALL-NEXT:    movd %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Folded Spill
1588 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1589 ; CHECK-LIBCALL-NEXT:    psrld $16, %xmm0
1590 ; CHECK-LIBCALL-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
1591 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1592 ; CHECK-LIBCALL-NEXT:    movd %xmm0, (%rsp) # 4-byte Folded Spill
1593 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1594 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1595 ; CHECK-LIBCALL-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1596 ; CHECK-LIBCALL-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
1597 ; CHECK-LIBCALL-NEXT:    callq __extendhfsf2@PLT
1598 ; CHECK-LIBCALL-NEXT:    ucomiss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1599 ; CHECK-LIBCALL-NEXT:    movd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Folded Reload
1600 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1601 ; CHECK-LIBCALL-NEXT:    ja .LBB26_16
1602 ; CHECK-LIBCALL-NEXT:  # %bb.15:
1603 ; CHECK-LIBCALL-NEXT:    movd (%rsp), %xmm0 # 4-byte Folded Reload
1604 ; CHECK-LIBCALL-NEXT:    # xmm0 = mem[0],zero,zero,zero
1605 ; CHECK-LIBCALL-NEXT:  .LBB26_16:
1606 ; CHECK-LIBCALL-NEXT:    callq __truncsfhf2@PLT
1607 ; CHECK-LIBCALL-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
1608 ; CHECK-LIBCALL-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
1609 ; CHECK-LIBCALL-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
1610 ; CHECK-LIBCALL-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
1611 ; CHECK-LIBCALL-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
1612 ; CHECK-LIBCALL-NEXT:    # xmm1 = xmm1[0],mem[0]
1613 ; CHECK-LIBCALL-NEXT:    movdqa %xmm1, %xmm0
1614 ; CHECK-LIBCALL-NEXT:    addq $184, %rsp
1615 ; CHECK-LIBCALL-NEXT:    retq
1617 ; BWON-F16C-LABEL: maxnum_v8f16:
1618 ; BWON-F16C:       # %bb.0:
1619 ; BWON-F16C-NEXT:    vpsrldq {{.*#+}} xmm2 = xmm1[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1620 ; BWON-F16C-NEXT:    vpextrw $0, %xmm2, %eax
1621 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1622 ; BWON-F16C-NEXT:    vmovd %eax, %xmm2
1623 ; BWON-F16C-NEXT:    vcvtph2ps %xmm2, %xmm2
1624 ; BWON-F16C-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1625 ; BWON-F16C-NEXT:    vpextrw $0, %xmm3, %eax
1626 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1627 ; BWON-F16C-NEXT:    vmovd %eax, %xmm3
1628 ; BWON-F16C-NEXT:    vcvtph2ps %xmm3, %xmm3
1629 ; BWON-F16C-NEXT:    vucomiss %xmm2, %xmm3
1630 ; BWON-F16C-NEXT:    ja .LBB26_2
1631 ; BWON-F16C-NEXT:  # %bb.1:
1632 ; BWON-F16C-NEXT:    vmovaps %xmm2, %xmm3
1633 ; BWON-F16C-NEXT:  .LBB26_2:
1634 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm3, %xmm2
1635 ; BWON-F16C-NEXT:    vpshufd {{.*#+}} xmm3 = xmm1[3,3,3,3]
1636 ; BWON-F16C-NEXT:    vpextrw $0, %xmm3, %eax
1637 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1638 ; BWON-F16C-NEXT:    vmovd %eax, %xmm3
1639 ; BWON-F16C-NEXT:    vcvtph2ps %xmm3, %xmm3
1640 ; BWON-F16C-NEXT:    vpshufd {{.*#+}} xmm4 = xmm0[3,3,3,3]
1641 ; BWON-F16C-NEXT:    vpextrw $0, %xmm4, %eax
1642 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1643 ; BWON-F16C-NEXT:    vmovd %eax, %xmm4
1644 ; BWON-F16C-NEXT:    vcvtph2ps %xmm4, %xmm4
1645 ; BWON-F16C-NEXT:    vucomiss %xmm3, %xmm4
1646 ; BWON-F16C-NEXT:    ja .LBB26_4
1647 ; BWON-F16C-NEXT:  # %bb.3:
1648 ; BWON-F16C-NEXT:    vmovaps %xmm3, %xmm4
1649 ; BWON-F16C-NEXT:  .LBB26_4:
1650 ; BWON-F16C-NEXT:    vmovd %xmm2, %eax
1651 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm4, %xmm2
1652 ; BWON-F16C-NEXT:    vmovd %xmm2, %ecx
1653 ; BWON-F16C-NEXT:    vpsrldq {{.*#+}} xmm2 = xmm1[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1654 ; BWON-F16C-NEXT:    vpextrw $0, %xmm2, %edx
1655 ; BWON-F16C-NEXT:    movzwl %dx, %edx
1656 ; BWON-F16C-NEXT:    vmovd %edx, %xmm2
1657 ; BWON-F16C-NEXT:    vcvtph2ps %xmm2, %xmm2
1658 ; BWON-F16C-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1659 ; BWON-F16C-NEXT:    vpextrw $0, %xmm3, %edx
1660 ; BWON-F16C-NEXT:    movzwl %dx, %edx
1661 ; BWON-F16C-NEXT:    vmovd %edx, %xmm3
1662 ; BWON-F16C-NEXT:    vcvtph2ps %xmm3, %xmm3
1663 ; BWON-F16C-NEXT:    vucomiss %xmm2, %xmm3
1664 ; BWON-F16C-NEXT:    ja .LBB26_6
1665 ; BWON-F16C-NEXT:  # %bb.5:
1666 ; BWON-F16C-NEXT:    vmovaps %xmm2, %xmm3
1667 ; BWON-F16C-NEXT:  .LBB26_6:
1668 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm3, %xmm2
1669 ; BWON-F16C-NEXT:    vmovd %xmm2, %edx
1670 ; BWON-F16C-NEXT:    vshufpd {{.*#+}} xmm2 = xmm1[1,0]
1671 ; BWON-F16C-NEXT:    vpextrw $0, %xmm2, %esi
1672 ; BWON-F16C-NEXT:    movzwl %si, %esi
1673 ; BWON-F16C-NEXT:    vmovd %esi, %xmm2
1674 ; BWON-F16C-NEXT:    vcvtph2ps %xmm2, %xmm2
1675 ; BWON-F16C-NEXT:    vshufpd {{.*#+}} xmm3 = xmm0[1,0]
1676 ; BWON-F16C-NEXT:    vpextrw $0, %xmm3, %esi
1677 ; BWON-F16C-NEXT:    movzwl %si, %esi
1678 ; BWON-F16C-NEXT:    vmovd %esi, %xmm3
1679 ; BWON-F16C-NEXT:    vcvtph2ps %xmm3, %xmm3
1680 ; BWON-F16C-NEXT:    vucomiss %xmm2, %xmm3
1681 ; BWON-F16C-NEXT:    ja .LBB26_8
1682 ; BWON-F16C-NEXT:  # %bb.7:
1683 ; BWON-F16C-NEXT:    vmovaps %xmm2, %xmm3
1684 ; BWON-F16C-NEXT:  .LBB26_8:
1685 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm3, %xmm2
1686 ; BWON-F16C-NEXT:    vmovd %xmm2, %esi
1687 ; BWON-F16C-NEXT:    vpsrlq $48, %xmm1, %xmm2
1688 ; BWON-F16C-NEXT:    vpextrw $0, %xmm2, %edi
1689 ; BWON-F16C-NEXT:    movzwl %di, %edi
1690 ; BWON-F16C-NEXT:    vmovd %edi, %xmm2
1691 ; BWON-F16C-NEXT:    vcvtph2ps %xmm2, %xmm2
1692 ; BWON-F16C-NEXT:    vpsrlq $48, %xmm0, %xmm3
1693 ; BWON-F16C-NEXT:    vpextrw $0, %xmm3, %edi
1694 ; BWON-F16C-NEXT:    movzwl %di, %edi
1695 ; BWON-F16C-NEXT:    vmovd %edi, %xmm3
1696 ; BWON-F16C-NEXT:    vcvtph2ps %xmm3, %xmm6
1697 ; BWON-F16C-NEXT:    vucomiss %xmm2, %xmm6
1698 ; BWON-F16C-NEXT:    ja .LBB26_10
1699 ; BWON-F16C-NEXT:  # %bb.9:
1700 ; BWON-F16C-NEXT:    vmovaps %xmm2, %xmm6
1701 ; BWON-F16C-NEXT:  .LBB26_10:
1702 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm2
1703 ; BWON-F16C-NEXT:    vpinsrw $0, %ecx, %xmm0, %xmm3
1704 ; BWON-F16C-NEXT:    vpinsrw $0, %edx, %xmm0, %xmm4
1705 ; BWON-F16C-NEXT:    vpinsrw $0, %esi, %xmm0, %xmm5
1706 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm6, %xmm6
1707 ; BWON-F16C-NEXT:    vmovd %xmm6, %eax
1708 ; BWON-F16C-NEXT:    vmovshdup {{.*#+}} xmm6 = xmm1[1,1,3,3]
1709 ; BWON-F16C-NEXT:    vpextrw $0, %xmm6, %ecx
1710 ; BWON-F16C-NEXT:    movzwl %cx, %ecx
1711 ; BWON-F16C-NEXT:    vmovd %ecx, %xmm6
1712 ; BWON-F16C-NEXT:    vcvtph2ps %xmm6, %xmm6
1713 ; BWON-F16C-NEXT:    vmovshdup {{.*#+}} xmm7 = xmm0[1,1,3,3]
1714 ; BWON-F16C-NEXT:    vpextrw $0, %xmm7, %ecx
1715 ; BWON-F16C-NEXT:    movzwl %cx, %ecx
1716 ; BWON-F16C-NEXT:    vmovd %ecx, %xmm7
1717 ; BWON-F16C-NEXT:    vcvtph2ps %xmm7, %xmm7
1718 ; BWON-F16C-NEXT:    vucomiss %xmm6, %xmm7
1719 ; BWON-F16C-NEXT:    ja .LBB26_12
1720 ; BWON-F16C-NEXT:  # %bb.11:
1721 ; BWON-F16C-NEXT:    vmovaps %xmm6, %xmm7
1722 ; BWON-F16C-NEXT:  .LBB26_12:
1723 ; BWON-F16C-NEXT:    vpunpcklwd {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1],xmm3[2],xmm2[2],xmm3[3],xmm2[3]
1724 ; BWON-F16C-NEXT:    vpunpcklwd {{.*#+}} xmm3 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]
1725 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm4
1726 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm7, %xmm5
1727 ; BWON-F16C-NEXT:    vmovd %xmm5, %eax
1728 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm5
1729 ; BWON-F16C-NEXT:    vpextrw $0, %xmm1, %eax
1730 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1731 ; BWON-F16C-NEXT:    vmovd %eax, %xmm6
1732 ; BWON-F16C-NEXT:    vcvtph2ps %xmm6, %xmm6
1733 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax
1734 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1735 ; BWON-F16C-NEXT:    vmovd %eax, %xmm7
1736 ; BWON-F16C-NEXT:    vcvtph2ps %xmm7, %xmm7
1737 ; BWON-F16C-NEXT:    vucomiss %xmm6, %xmm7
1738 ; BWON-F16C-NEXT:    ja .LBB26_14
1739 ; BWON-F16C-NEXT:  # %bb.13:
1740 ; BWON-F16C-NEXT:    vmovaps %xmm6, %xmm7
1741 ; BWON-F16C-NEXT:  .LBB26_14:
1742 ; BWON-F16C-NEXT:    vpunpckldq {{.*#+}} xmm2 = xmm3[0],xmm2[0],xmm3[1],xmm2[1]
1743 ; BWON-F16C-NEXT:    vpunpcklwd {{.*#+}} xmm3 = xmm5[0],xmm4[0],xmm5[1],xmm4[1],xmm5[2],xmm4[2],xmm5[3],xmm4[3]
1744 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm7, %xmm4
1745 ; BWON-F16C-NEXT:    vmovd %xmm4, %eax
1746 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm4
1747 ; BWON-F16C-NEXT:    vpsrld $16, %xmm1, %xmm1
1748 ; BWON-F16C-NEXT:    vpextrw $0, %xmm1, %eax
1749 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1750 ; BWON-F16C-NEXT:    vmovd %eax, %xmm1
1751 ; BWON-F16C-NEXT:    vcvtph2ps %xmm1, %xmm1
1752 ; BWON-F16C-NEXT:    vpsrld $16, %xmm0, %xmm0
1753 ; BWON-F16C-NEXT:    vpextrw $0, %xmm0, %eax
1754 ; BWON-F16C-NEXT:    movzwl %ax, %eax
1755 ; BWON-F16C-NEXT:    vmovd %eax, %xmm0
1756 ; BWON-F16C-NEXT:    vcvtph2ps %xmm0, %xmm0
1757 ; BWON-F16C-NEXT:    vucomiss %xmm1, %xmm0
1758 ; BWON-F16C-NEXT:    ja .LBB26_16
1759 ; BWON-F16C-NEXT:  # %bb.15:
1760 ; BWON-F16C-NEXT:    vmovaps %xmm1, %xmm0
1761 ; BWON-F16C-NEXT:  .LBB26_16:
1762 ; BWON-F16C-NEXT:    vcvtps2ph $4, %xmm0, %xmm0
1763 ; BWON-F16C-NEXT:    vmovd %xmm0, %eax
1764 ; BWON-F16C-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm0
1765 ; BWON-F16C-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm4[0],xmm0[0],xmm4[1],xmm0[1],xmm4[2],xmm0[2],xmm4[3],xmm0[3]
1766 ; BWON-F16C-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1]
1767 ; BWON-F16C-NEXT:    vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0]
1768 ; BWON-F16C-NEXT:    retq
1770 ; CHECK-I686-LABEL: maxnum_v8f16:
1771 ; CHECK-I686:       # %bb.0:
1772 ; CHECK-I686-NEXT:    pushl %ebx
1773 ; CHECK-I686-NEXT:    pushl %edi
1774 ; CHECK-I686-NEXT:    pushl %esi
1775 ; CHECK-I686-NEXT:    subl $336, %esp # imm = 0x150
1776 ; CHECK-I686-NEXT:    movaps %xmm1, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
1777 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
1778 ; CHECK-I686-NEXT:    movaps %xmm1, %xmm0
1779 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[1,1]
1780 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
1781 ; CHECK-I686-NEXT:    movw %di, (%esp)
1782 ; CHECK-I686-NEXT:    calll __extendhfsf2
1783 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1784 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1785 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
1786 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
1787 ; CHECK-I686-NEXT:    movw %si, (%esp)
1788 ; CHECK-I686-NEXT:    calll __extendhfsf2
1789 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1790 ; CHECK-I686-NEXT:    movw %di, (%esp)
1791 ; CHECK-I686-NEXT:    calll __extendhfsf2
1792 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1793 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1794 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
1795 ; CHECK-I686-NEXT:    movw %di, (%esp)
1796 ; CHECK-I686-NEXT:    calll __extendhfsf2
1797 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1798 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1799 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %ebx
1800 ; CHECK-I686-NEXT:    movw %bx, (%esp)
1801 ; CHECK-I686-NEXT:    calll __extendhfsf2
1802 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1803 ; CHECK-I686-NEXT:    movw %di, (%esp)
1804 ; CHECK-I686-NEXT:    calll __extendhfsf2
1805 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1806 ; CHECK-I686-NEXT:    movw %bx, (%esp)
1807 ; CHECK-I686-NEXT:    calll __extendhfsf2
1808 ; CHECK-I686-NEXT:    movw %si, (%esp)
1809 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1810 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1811 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1812 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1813 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1814 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1815 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1816 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1817 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
1818 ; CHECK-I686-NEXT:    ja .LBB26_1
1819 ; CHECK-I686-NEXT:  # %bb.2:
1820 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1821 ; CHECK-I686-NEXT:    jmp .LBB26_3
1822 ; CHECK-I686-NEXT:  .LBB26_1:
1823 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1824 ; CHECK-I686-NEXT:  .LBB26_3:
1825 ; CHECK-I686-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1826 ; CHECK-I686-NEXT:    calll __extendhfsf2
1827 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
1828 ; CHECK-I686-NEXT:    # xmm0 = mem[0],zero,zero,zero
1829 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1830 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1831 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1832 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1833 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1834 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1835 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1836 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1837 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1838 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
1839 ; CHECK-I686-NEXT:    ja .LBB26_4
1840 ; CHECK-I686-NEXT:  # %bb.5:
1841 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1842 ; CHECK-I686-NEXT:    jmp .LBB26_6
1843 ; CHECK-I686-NEXT:  .LBB26_4:
1844 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1845 ; CHECK-I686-NEXT:  .LBB26_6:
1846 ; CHECK-I686-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1847 ; CHECK-I686-NEXT:    calll __truncsfhf2
1848 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
1849 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
1850 ; CHECK-I686-NEXT:    # xmm0 = mem[0],zero,zero,zero
1851 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1852 ; CHECK-I686-NEXT:    calll __truncsfhf2
1853 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
1854 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1855 ; CHECK-I686-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
1856 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
1857 ; CHECK-I686-NEXT:    movw %di, (%esp)
1858 ; CHECK-I686-NEXT:    calll __extendhfsf2
1859 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1860 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1861 ; CHECK-I686-NEXT:    punpckhqdq {{.*#+}} xmm0 = xmm0[1,1]
1862 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
1863 ; CHECK-I686-NEXT:    movw %si, (%esp)
1864 ; CHECK-I686-NEXT:    calll __extendhfsf2
1865 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1866 ; CHECK-I686-NEXT:    movw %di, (%esp)
1867 ; CHECK-I686-NEXT:    calll __extendhfsf2
1868 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1869 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1870 ; CHECK-I686-NEXT:    psrlq $48, %xmm0
1871 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
1872 ; CHECK-I686-NEXT:    movw %di, (%esp)
1873 ; CHECK-I686-NEXT:    calll __extendhfsf2
1874 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1875 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1876 ; CHECK-I686-NEXT:    psrlq $48, %xmm0
1877 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %ebx
1878 ; CHECK-I686-NEXT:    movw %bx, (%esp)
1879 ; CHECK-I686-NEXT:    calll __extendhfsf2
1880 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1881 ; CHECK-I686-NEXT:    movw %di, (%esp)
1882 ; CHECK-I686-NEXT:    calll __extendhfsf2
1883 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1884 ; CHECK-I686-NEXT:    movw %bx, (%esp)
1885 ; CHECK-I686-NEXT:    calll __extendhfsf2
1886 ; CHECK-I686-NEXT:    movw %si, (%esp)
1887 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1888 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1889 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1890 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1891 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1892 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1893 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1894 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1895 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
1896 ; CHECK-I686-NEXT:    ja .LBB26_7
1897 ; CHECK-I686-NEXT:  # %bb.8:
1898 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1899 ; CHECK-I686-NEXT:    jmp .LBB26_9
1900 ; CHECK-I686-NEXT:  .LBB26_7:
1901 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1902 ; CHECK-I686-NEXT:  .LBB26_9:
1903 ; CHECK-I686-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1904 ; CHECK-I686-NEXT:    calll __extendhfsf2
1905 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
1906 ; CHECK-I686-NEXT:    # xmm0 = mem[0],zero,zero,zero
1907 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1908 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1909 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1910 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1911 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1912 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1913 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1914 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1915 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1916 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
1917 ; CHECK-I686-NEXT:    ja .LBB26_10
1918 ; CHECK-I686-NEXT:  # %bb.11:
1919 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1920 ; CHECK-I686-NEXT:    jmp .LBB26_12
1921 ; CHECK-I686-NEXT:  .LBB26_10:
1922 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1923 ; CHECK-I686-NEXT:  .LBB26_12:
1924 ; CHECK-I686-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1925 ; CHECK-I686-NEXT:    calll __truncsfhf2
1926 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
1927 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
1928 ; CHECK-I686-NEXT:    # xmm0 = mem[0],zero,zero,zero
1929 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1930 ; CHECK-I686-NEXT:    calll __truncsfhf2
1931 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
1932 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1933 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1934 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
1935 ; CHECK-I686-NEXT:    movw %di, (%esp)
1936 ; CHECK-I686-NEXT:    calll __extendhfsf2
1937 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1938 ; CHECK-I686-NEXT:    movaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1939 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
1940 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
1941 ; CHECK-I686-NEXT:    movw %si, (%esp)
1942 ; CHECK-I686-NEXT:    calll __extendhfsf2
1943 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1944 ; CHECK-I686-NEXT:    movw %di, (%esp)
1945 ; CHECK-I686-NEXT:    calll __extendhfsf2
1946 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1947 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1948 ; CHECK-I686-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1949 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
1950 ; CHECK-I686-NEXT:    movw %di, (%esp)
1951 ; CHECK-I686-NEXT:    calll __extendhfsf2
1952 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1953 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
1954 ; CHECK-I686-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
1955 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %ebx
1956 ; CHECK-I686-NEXT:    movw %bx, (%esp)
1957 ; CHECK-I686-NEXT:    calll __extendhfsf2
1958 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1959 ; CHECK-I686-NEXT:    movw %di, (%esp)
1960 ; CHECK-I686-NEXT:    calll __extendhfsf2
1961 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
1962 ; CHECK-I686-NEXT:    movw %bx, (%esp)
1963 ; CHECK-I686-NEXT:    calll __extendhfsf2
1964 ; CHECK-I686-NEXT:    movw %si, (%esp)
1965 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1966 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1967 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1968 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1969 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1970 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1971 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1972 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1973 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
1974 ; CHECK-I686-NEXT:    ja .LBB26_13
1975 ; CHECK-I686-NEXT:  # %bb.14:
1976 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1977 ; CHECK-I686-NEXT:    jmp .LBB26_15
1978 ; CHECK-I686-NEXT:  .LBB26_13:
1979 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1980 ; CHECK-I686-NEXT:  .LBB26_15:
1981 ; CHECK-I686-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1982 ; CHECK-I686-NEXT:    calll __extendhfsf2
1983 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
1984 ; CHECK-I686-NEXT:    # xmm0 = mem[0],zero,zero,zero
1985 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
1986 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1987 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1988 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1989 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1990 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1991 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
1992 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
1993 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1994 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
1995 ; CHECK-I686-NEXT:    ja .LBB26_16
1996 ; CHECK-I686-NEXT:  # %bb.17:
1997 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
1998 ; CHECK-I686-NEXT:    jmp .LBB26_18
1999 ; CHECK-I686-NEXT:  .LBB26_16:
2000 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2001 ; CHECK-I686-NEXT:  .LBB26_18:
2002 ; CHECK-I686-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
2003 ; CHECK-I686-NEXT:    calll __truncsfhf2
2004 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
2005 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
2006 ; CHECK-I686-NEXT:    # xmm0 = mem[0],zero,zero,zero
2007 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
2008 ; CHECK-I686-NEXT:    calll __truncsfhf2
2009 ; CHECK-I686-NEXT:    movaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
2010 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
2011 ; CHECK-I686-NEXT:    psrld $16, %xmm0
2012 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
2013 ; CHECK-I686-NEXT:    movw %di, (%esp)
2014 ; CHECK-I686-NEXT:    calll __extendhfsf2
2015 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
2016 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
2017 ; CHECK-I686-NEXT:    psrld $16, %xmm0
2018 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %esi
2019 ; CHECK-I686-NEXT:    movw %si, (%esp)
2020 ; CHECK-I686-NEXT:    calll __extendhfsf2
2021 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
2022 ; CHECK-I686-NEXT:    movw %di, (%esp)
2023 ; CHECK-I686-NEXT:    calll __extendhfsf2
2024 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
2025 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
2026 ; CHECK-I686-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2027 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %edi
2028 ; CHECK-I686-NEXT:    movw %di, (%esp)
2029 ; CHECK-I686-NEXT:    calll __extendhfsf2
2030 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
2031 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
2032 ; CHECK-I686-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2033 ; CHECK-I686-NEXT:    pextrw $0, %xmm0, %ebx
2034 ; CHECK-I686-NEXT:    movw %bx, (%esp)
2035 ; CHECK-I686-NEXT:    calll __extendhfsf2
2036 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
2037 ; CHECK-I686-NEXT:    movw %di, (%esp)
2038 ; CHECK-I686-NEXT:    calll __extendhfsf2
2039 ; CHECK-I686-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
2040 ; CHECK-I686-NEXT:    movw %bx, (%esp)
2041 ; CHECK-I686-NEXT:    calll __extendhfsf2
2042 ; CHECK-I686-NEXT:    movw %si, (%esp)
2043 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2044 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
2045 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2046 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
2047 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2048 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
2049 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2050 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2051 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
2052 ; CHECK-I686-NEXT:    ja .LBB26_19
2053 ; CHECK-I686-NEXT:  # %bb.20:
2054 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2055 ; CHECK-I686-NEXT:    jmp .LBB26_21
2056 ; CHECK-I686-NEXT:  .LBB26_19:
2057 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2058 ; CHECK-I686-NEXT:  .LBB26_21:
2059 ; CHECK-I686-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
2060 ; CHECK-I686-NEXT:    calll __extendhfsf2
2061 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
2062 ; CHECK-I686-NEXT:    # xmm0 = mem[0],zero,zero,zero
2063 ; CHECK-I686-NEXT:    movss %xmm0, (%esp)
2064 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2065 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
2066 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2067 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
2068 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2069 ; CHECK-I686-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
2070 ; CHECK-I686-NEXT:    fstps {{[0-9]+}}(%esp)
2071 ; CHECK-I686-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2072 ; CHECK-I686-NEXT:    ucomiss {{[0-9]+}}(%esp), %xmm0
2073 ; CHECK-I686-NEXT:    ja .LBB26_22
2074 ; CHECK-I686-NEXT:  # %bb.23:
2075 ; CHECK-I686-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2076 ; CHECK-I686-NEXT:    jmp .LBB26_24
2077 ; CHECK-I686-NEXT:  .LBB26_22:
2078 ; CHECK-I686-NEXT:    movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
2079 ; CHECK-I686-NEXT:  .LBB26_24:
2080 ; CHECK-I686-NEXT:    movd %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
2081 ; CHECK-I686-NEXT:    calll __truncsfhf2
2082 ; CHECK-I686-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 4-byte Reload
2083 ; CHECK-I686-NEXT:    # xmm1 = mem[0],zero,zero,zero
2084 ; CHECK-I686-NEXT:    movss %xmm1, (%esp)
2085 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload
2086 ; CHECK-I686-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2087 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
2088 ; CHECK-I686-NEXT:    punpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2089 ; CHECK-I686-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2090 ; CHECK-I686-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]
2091 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
2092 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
2093 ; CHECK-I686-NEXT:    punpcklwd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Folded Reload
2094 ; CHECK-I686-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]
2095 ; CHECK-I686-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
2096 ; CHECK-I686-NEXT:    calll __truncsfhf2
2097 ; CHECK-I686-NEXT:    movdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Reload
2098 ; CHECK-I686-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]
2099 ; CHECK-I686-NEXT:    punpckldq {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Folded Reload
2100 ; CHECK-I686-NEXT:    # xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]
2101 ; CHECK-I686-NEXT:    punpcklqdq {{[-0-9]+}}(%e{{[sb]}}p), %xmm1 # 16-byte Folded Reload
2102 ; CHECK-I686-NEXT:    # xmm1 = xmm1[0],mem[0]
2103 ; CHECK-I686-NEXT:    movdqa %xmm1, %xmm0
2104 ; CHECK-I686-NEXT:    addl $336, %esp # imm = 0x150
2105 ; CHECK-I686-NEXT:    popl %esi
2106 ; CHECK-I686-NEXT:    popl %edi
2107 ; CHECK-I686-NEXT:    popl %ebx
2108 ; CHECK-I686-NEXT:    retl
2109   %3 = call fast <8 x half> @llvm.maxnum.v8f16(<8 x half> %0, <8 x half> %1)
2110   ret <8 x half> %3
2113 define void @pr63114() {
2114 ; CHECK-LIBCALL-LABEL: pr63114:
2115 ; CHECK-LIBCALL:       # %bb.0:
2116 ; CHECK-LIBCALL-NEXT:    movdqu (%rax), %xmm4
2117 ; CHECK-LIBCALL-NEXT:    pshuflw {{.*#+}} xmm0 = xmm4[0,1,3,3,4,5,6,7]
2118 ; CHECK-LIBCALL-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,2,1]
2119 ; CHECK-LIBCALL-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,0,65535,65535,65535,65535]
2120 ; CHECK-LIBCALL-NEXT:    pand %xmm1, %xmm0
2121 ; CHECK-LIBCALL-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,15360,0,0,0,0]
2122 ; CHECK-LIBCALL-NEXT:    por %xmm2, %xmm0
2123 ; CHECK-LIBCALL-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535,65535,65535,65535,0]
2124 ; CHECK-LIBCALL-NEXT:    pand %xmm3, %xmm0
2125 ; CHECK-LIBCALL-NEXT:    movdqa {{.*#+}} xmm5 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60]
2126 ; CHECK-LIBCALL-NEXT:    por %xmm5, %xmm0
2127 ; CHECK-LIBCALL-NEXT:    pshufhw {{.*#+}} xmm6 = xmm4[0,1,2,3,4,5,7,7]
2128 ; CHECK-LIBCALL-NEXT:    pshufd {{.*#+}} xmm6 = xmm6[0,2,2,3]
2129 ; CHECK-LIBCALL-NEXT:    pand %xmm1, %xmm6
2130 ; CHECK-LIBCALL-NEXT:    por %xmm2, %xmm6
2131 ; CHECK-LIBCALL-NEXT:    pand %xmm3, %xmm6
2132 ; CHECK-LIBCALL-NEXT:    por %xmm5, %xmm6
2133 ; CHECK-LIBCALL-NEXT:    pshufhw {{.*#+}} xmm7 = xmm4[0,1,2,3,5,5,5,5]
2134 ; CHECK-LIBCALL-NEXT:    shufps {{.*#+}} xmm4 = xmm4[0,3,0,3]
2135 ; CHECK-LIBCALL-NEXT:    pshufhw {{.*#+}} xmm4 = xmm4[0,1,2,3,5,5,5,5]
2136 ; CHECK-LIBCALL-NEXT:    pand %xmm1, %xmm4
2137 ; CHECK-LIBCALL-NEXT:    por %xmm2, %xmm4
2138 ; CHECK-LIBCALL-NEXT:    pand %xmm3, %xmm4
2139 ; CHECK-LIBCALL-NEXT:    por %xmm5, %xmm4
2140 ; CHECK-LIBCALL-NEXT:    pand %xmm1, %xmm7
2141 ; CHECK-LIBCALL-NEXT:    por %xmm2, %xmm7
2142 ; CHECK-LIBCALL-NEXT:    pand %xmm3, %xmm7
2143 ; CHECK-LIBCALL-NEXT:    por %xmm5, %xmm7
2144 ; CHECK-LIBCALL-NEXT:    movdqu %xmm7, 0
2145 ; CHECK-LIBCALL-NEXT:    movdqu %xmm4, 32
2146 ; CHECK-LIBCALL-NEXT:    movdqu %xmm6, 48
2147 ; CHECK-LIBCALL-NEXT:    movdqu %xmm0, 16
2148 ; CHECK-LIBCALL-NEXT:    retq
2150 ; BWON-F16C-LABEL: pr63114:
2151 ; BWON-F16C:       # %bb.0:
2152 ; BWON-F16C-NEXT:    vmovdqu (%rax), %xmm0
2153 ; BWON-F16C-NEXT:    vpsrld $16, %xmm0, %xmm1
2154 ; BWON-F16C-NEXT:    vbroadcastss (%rax), %xmm2
2155 ; BWON-F16C-NEXT:    vpsrldq {{.*#+}} xmm3 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero
2156 ; BWON-F16C-NEXT:    vshufps {{.*#+}} xmm2 = xmm2[0,0],xmm3[0,0]
2157 ; BWON-F16C-NEXT:    vpinsrw $0, {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm3
2158 ; BWON-F16C-NEXT:    vpsllq $48, %xmm3, %xmm4
2159 ; BWON-F16C-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2],xmm4[3],xmm2[4,5,6,7]
2160 ; BWON-F16C-NEXT:    vpslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0,1]
2161 ; BWON-F16C-NEXT:    vpor %xmm3, %xmm2, %xmm2
2162 ; BWON-F16C-NEXT:    vshufps {{.*#+}} xmm1 = xmm0[0,3],xmm1[2,0]
2163 ; BWON-F16C-NEXT:    vpblendw {{.*#+}} xmm1 = xmm1[0,1,2],xmm4[3],xmm1[4,5,6,7]
2164 ; BWON-F16C-NEXT:    vpor %xmm3, %xmm1, %xmm1
2165 ; BWON-F16C-NEXT:    vinsertf128 $1, %xmm2, %ymm1, %ymm1
2166 ; BWON-F16C-NEXT:    vpshuflw {{.*#+}} xmm2 = xmm0[0,1,3,3,4,5,6,7]
2167 ; BWON-F16C-NEXT:    vpshufd {{.*#+}} xmm2 = xmm2[0,0,2,1]
2168 ; BWON-F16C-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2],xmm4[3],xmm2[4,5,6,7]
2169 ; BWON-F16C-NEXT:    vpblendw {{.*#+}} xmm2 = xmm2[0,1,2,3,4,5,6],xmm3[7]
2170 ; BWON-F16C-NEXT:    vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,5,5,5,5]
2171 ; BWON-F16C-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2],xmm4[3],xmm0[4,5,6,7]
2172 ; BWON-F16C-NEXT:    vpblendw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,5,6],xmm3[7]
2173 ; BWON-F16C-NEXT:    vinsertf128 $1, %xmm2, %ymm0, %ymm0
2174 ; BWON-F16C-NEXT:    vmovups %ymm0, 0
2175 ; BWON-F16C-NEXT:    vmovups %ymm1, 32
2176 ; BWON-F16C-NEXT:    vzeroupper
2177 ; BWON-F16C-NEXT:    retq
2179 ; CHECK-I686-LABEL: pr63114:
2180 ; CHECK-I686:       # %bb.0:
2181 ; CHECK-I686-NEXT:    movdqu (%eax), %xmm6
2182 ; CHECK-I686-NEXT:    pshuflw {{.*#+}} xmm0 = xmm6[0,1,3,3,4,5,6,7]
2183 ; CHECK-I686-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,0,2,1]
2184 ; CHECK-I686-NEXT:    movdqa {{.*#+}} xmm1 = [65535,65535,65535,0,65535,65535,65535,65535]
2185 ; CHECK-I686-NEXT:    pand %xmm1, %xmm0
2186 ; CHECK-I686-NEXT:    movdqa {{.*#+}} xmm2 = [0,0,0,15360,0,0,0,0]
2187 ; CHECK-I686-NEXT:    por %xmm2, %xmm0
2188 ; CHECK-I686-NEXT:    movdqa {{.*#+}} xmm3 = [65535,65535,65535,65535,65535,65535,65535,0]
2189 ; CHECK-I686-NEXT:    pand %xmm3, %xmm0
2190 ; CHECK-I686-NEXT:    movdqa {{.*#+}} xmm4 = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60]
2191 ; CHECK-I686-NEXT:    por %xmm4, %xmm0
2192 ; CHECK-I686-NEXT:    pshufhw {{.*#+}} xmm5 = xmm6[0,1,2,3,4,5,7,7]
2193 ; CHECK-I686-NEXT:    pshufd {{.*#+}} xmm5 = xmm5[0,2,2,3]
2194 ; CHECK-I686-NEXT:    pand %xmm1, %xmm5
2195 ; CHECK-I686-NEXT:    por %xmm2, %xmm5
2196 ; CHECK-I686-NEXT:    pand %xmm3, %xmm5
2197 ; CHECK-I686-NEXT:    por %xmm4, %xmm5
2198 ; CHECK-I686-NEXT:    pshufhw {{.*#+}} xmm7 = xmm6[0,1,2,3,5,5,5,5]
2199 ; CHECK-I686-NEXT:    shufps {{.*#+}} xmm6 = xmm6[0,3,0,3]
2200 ; CHECK-I686-NEXT:    pshufhw {{.*#+}} xmm6 = xmm6[0,1,2,3,5,5,5,5]
2201 ; CHECK-I686-NEXT:    pand %xmm1, %xmm6
2202 ; CHECK-I686-NEXT:    por %xmm2, %xmm6
2203 ; CHECK-I686-NEXT:    pand %xmm3, %xmm6
2204 ; CHECK-I686-NEXT:    por %xmm4, %xmm6
2205 ; CHECK-I686-NEXT:    pand %xmm1, %xmm7
2206 ; CHECK-I686-NEXT:    por %xmm2, %xmm7
2207 ; CHECK-I686-NEXT:    pand %xmm3, %xmm7
2208 ; CHECK-I686-NEXT:    por %xmm4, %xmm7
2209 ; CHECK-I686-NEXT:    movdqu %xmm7, 0
2210 ; CHECK-I686-NEXT:    movdqu %xmm6, 32
2211 ; CHECK-I686-NEXT:    movdqu %xmm5, 48
2212 ; CHECK-I686-NEXT:    movdqu %xmm0, 16
2213 ; CHECK-I686-NEXT:    retl
2214   %1 = load <24 x half>, ptr poison, align 2
2215   %2 = shufflevector <24 x half> %1, <24 x half> poison, <8 x i32> <i32 2, i32 5, i32 8, i32 11, i32 14, i32 17, i32 20, i32 23>
2216   %3 = shufflevector <8 x half> %2, <8 x half> <half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00, half 0xH3C00>, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15>
2217   %4 = shufflevector <16 x half> poison, <16 x half> %3, <32 x i32> <i32 0, i32 8, i32 16, i32 24, i32 1, i32 9, i32 17, i32 25, i32 2, i32 10, i32 18, i32 26, i32 3, i32 11, i32 19, i32 27, i32 4, i32 12, i32 20, i32 28, i32 5, i32 13, i32 21, i32 29, i32 6, i32 14, i32 22, i32 30, i32 7, i32 15, i32 23, i32 31>
2218   store <32 x half> %4, ptr null, align 2
2219   ret void
2222 attributes #0 = { nounwind }