Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / ldexp.ll
blob44c57c54ba0233a38d1c26e5e53d540c4ce4b550
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=x86_64-unknown-unknown -verify-machineinstrs < %s | FileCheck -check-prefixes=X64 %s
3 ; RUN: llc -mtriple=i386-pc-win32 -verify-machineinstrs < %s | FileCheck -check-prefix=WIN32 %s
5 define float @ldexp_f32(i8 zeroext %x) {
6 ; X64-LABEL: ldexp_f32:
7 ; X64:       # %bb.0:
8 ; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
9 ; X64-NEXT:    jmp ldexpf@PLT # TAILCALL
11 ; WIN32-LABEL: ldexp_f32:
12 ; WIN32:       # %bb.0:
13 ; WIN32-NEXT:    pushl %eax
14 ; WIN32-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
15 ; WIN32-NEXT:    cmpl $381, %ecx # imm = 0x17D
16 ; WIN32-NEXT:    movl %ecx, %eax
17 ; WIN32-NEXT:    jl LBB0_2
18 ; WIN32-NEXT:  # %bb.1:
19 ; WIN32-NEXT:    movl $381, %eax # imm = 0x17D
20 ; WIN32-NEXT:  LBB0_2:
21 ; WIN32-NEXT:    addl $-254, %eax
22 ; WIN32-NEXT:    leal -127(%ecx), %edx
23 ; WIN32-NEXT:    cmpl $255, %ecx
24 ; WIN32-NEXT:    jae LBB0_4
25 ; WIN32-NEXT:  # %bb.3:
26 ; WIN32-NEXT:    movl %edx, %eax
27 ; WIN32-NEXT:  LBB0_4:
28 ; WIN32-NEXT:    flds __real@7f800000
29 ; WIN32-NEXT:    flds __real@7f000000
30 ; WIN32-NEXT:    jae LBB0_6
31 ; WIN32-NEXT:  # %bb.5:
32 ; WIN32-NEXT:    fstp %st(1)
33 ; WIN32-NEXT:    fldz
34 ; WIN32-NEXT:  LBB0_6:
35 ; WIN32-NEXT:    fstp %st(0)
36 ; WIN32-NEXT:    cmpl $-329, %ecx # imm = 0xFEB7
37 ; WIN32-NEXT:    movl %ecx, %edx
38 ; WIN32-NEXT:    jge LBB0_8
39 ; WIN32-NEXT:  # %bb.7:
40 ; WIN32-NEXT:    movl $-330, %edx # imm = 0xFEB6
41 ; WIN32-NEXT:  LBB0_8:
42 ; WIN32-NEXT:    cmpl $-228, %ecx
43 ; WIN32-NEXT:    fldz
44 ; WIN32-NEXT:    flds __real@0c800000
45 ; WIN32-NEXT:    jb LBB0_9
46 ; WIN32-NEXT:  # %bb.10:
47 ; WIN32-NEXT:    fstp %st(1)
48 ; WIN32-NEXT:    leal 102(%ecx), %edx
49 ; WIN32-NEXT:    cmpl $-126, %ecx
50 ; WIN32-NEXT:    jge LBB0_12
51 ; WIN32-NEXT:    jmp LBB0_13
52 ; WIN32-NEXT:  LBB0_9:
53 ; WIN32-NEXT:    fstp %st(0)
54 ; WIN32-NEXT:    addl $204, %edx
55 ; WIN32-NEXT:    cmpl $-126, %ecx
56 ; WIN32-NEXT:    jl LBB0_13
57 ; WIN32-NEXT:  LBB0_12:
58 ; WIN32-NEXT:    movl %ecx, %edx
59 ; WIN32-NEXT:  LBB0_13:
60 ; WIN32-NEXT:    fld1
61 ; WIN32-NEXT:    jl LBB0_15
62 ; WIN32-NEXT:  # %bb.14:
63 ; WIN32-NEXT:    fstp %st(1)
64 ; WIN32-NEXT:    fldz
65 ; WIN32-NEXT:  LBB0_15:
66 ; WIN32-NEXT:    fstp %st(0)
67 ; WIN32-NEXT:    cmpl $127, %ecx
68 ; WIN32-NEXT:    jg LBB0_17
69 ; WIN32-NEXT:  # %bb.16:
70 ; WIN32-NEXT:    fstp %st(1)
71 ; WIN32-NEXT:    movl %edx, %eax
72 ; WIN32-NEXT:    fldz
73 ; WIN32-NEXT:  LBB0_17:
74 ; WIN32-NEXT:    fstp %st(0)
75 ; WIN32-NEXT:    shll $23, %eax
76 ; WIN32-NEXT:    addl $1065353216, %eax # imm = 0x3F800000
77 ; WIN32-NEXT:    movl %eax, (%esp)
78 ; WIN32-NEXT:    fmuls (%esp)
79 ; WIN32-NEXT:    popl %eax
80 ; WIN32-NEXT:    retl
81   %zext = zext i8 %x to i32
82   %ldexp = call float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 %zext)
83   ret float %ldexp
86 define double @ldexp_f64(i8 zeroext %x) {
87 ; X64-LABEL: ldexp_f64:
88 ; X64:       # %bb.0:
89 ; X64-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
90 ; X64-NEXT:    jmp ldexp@PLT # TAILCALL
92 ; WIN32-LABEL: ldexp_f64:
93 ; WIN32:       # %bb.0:
94 ; WIN32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
95 ; WIN32-NEXT:    pushl %eax
96 ; WIN32-NEXT:    pushl $1072693248 # imm = 0x3FF00000
97 ; WIN32-NEXT:    pushl $0
98 ; WIN32-NEXT:    calll _ldexp
99 ; WIN32-NEXT:    addl $12, %esp
100 ; WIN32-NEXT:    retl
101   %zext = zext i8 %x to i32
102   %ldexp = call double @llvm.ldexp.f64.i32(double 1.000000e+00, i32 %zext)
103   ret double %ldexp
106 define <2 x float> @ldexp_v2f32(<2 x float> %val, <2 x i32> %exp) {
107 ; X64-LABEL: ldexp_v2f32:
108 ; X64:       # %bb.0:
109 ; X64-NEXT:    subq $56, %rsp
110 ; X64-NEXT:    .cfi_def_cfa_offset 64
111 ; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
112 ; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
113 ; X64-NEXT:    movd %xmm1, %edi
114 ; X64-NEXT:    callq ldexpf@PLT
115 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
116 ; X64-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
117 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
118 ; X64-NEXT:    pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
119 ; X64-NEXT:    # xmm1 = mem[1,1,1,1]
120 ; X64-NEXT:    movd %xmm1, %edi
121 ; X64-NEXT:    callq ldexpf@PLT
122 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
123 ; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
124 ; X64-NEXT:    movaps %xmm1, %xmm0
125 ; X64-NEXT:    addq $56, %rsp
126 ; X64-NEXT:    .cfi_def_cfa_offset 8
127 ; X64-NEXT:    retq
129 ; WIN32-LABEL: ldexp_v2f32:
130 ; WIN32:       # %bb.0:
131 ; WIN32-NEXT:    pushl %edi
132 ; WIN32-NEXT:    pushl %esi
133 ; WIN32-NEXT:    subl $8, %esp
134 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
135 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
136 ; WIN32-NEXT:    cmpl $-329, %eax # imm = 0xFEB7
137 ; WIN32-NEXT:    movl %eax, %edx
138 ; WIN32-NEXT:    jge LBB2_2
139 ; WIN32-NEXT:  # %bb.1:
140 ; WIN32-NEXT:    movl $-330, %edx # imm = 0xFEB6
141 ; WIN32-NEXT:  LBB2_2:
142 ; WIN32-NEXT:    addl $204, %edx
143 ; WIN32-NEXT:    leal 102(%eax), %ecx
144 ; WIN32-NEXT:    cmpl $-228, %eax
145 ; WIN32-NEXT:    jb LBB2_4
146 ; WIN32-NEXT:  # %bb.3:
147 ; WIN32-NEXT:    movl %ecx, %edx
148 ; WIN32-NEXT:  LBB2_4:
149 ; WIN32-NEXT:    flds __real@0c800000
150 ; WIN32-NEXT:    fld %st(1)
151 ; WIN32-NEXT:    fmul %st(1), %st
152 ; WIN32-NEXT:    fld %st(0)
153 ; WIN32-NEXT:    fmul %st(2), %st
154 ; WIN32-NEXT:    jb LBB2_6
155 ; WIN32-NEXT:  # %bb.5:
156 ; WIN32-NEXT:    fstp %st(0)
157 ; WIN32-NEXT:    fldz
158 ; WIN32-NEXT:    fxch %st(1)
159 ; WIN32-NEXT:  LBB2_6:
160 ; WIN32-NEXT:    fstp %st(1)
161 ; WIN32-NEXT:    cmpl $-126, %eax
162 ; WIN32-NEXT:    jl LBB2_8
163 ; WIN32-NEXT:  # %bb.7:
164 ; WIN32-NEXT:    fstp %st(0)
165 ; WIN32-NEXT:    fld %st(1)
166 ; WIN32-NEXT:    movl %eax, %edx
167 ; WIN32-NEXT:  LBB2_8:
168 ; WIN32-NEXT:    cmpl $381, %eax # imm = 0x17D
169 ; WIN32-NEXT:    movl %eax, %esi
170 ; WIN32-NEXT:    jl LBB2_10
171 ; WIN32-NEXT:  # %bb.9:
172 ; WIN32-NEXT:    movl $381, %esi # imm = 0x17D
173 ; WIN32-NEXT:  LBB2_10:
174 ; WIN32-NEXT:    flds __real@7f000000
175 ; WIN32-NEXT:    fmul %st, %st(3)
176 ; WIN32-NEXT:    fld %st(3)
177 ; WIN32-NEXT:    fmul %st(1), %st
178 ; WIN32-NEXT:    leal -127(%eax), %ecx
179 ; WIN32-NEXT:    cmpl $255, %eax
180 ; WIN32-NEXT:    jae LBB2_11
181 ; WIN32-NEXT:  # %bb.12:
182 ; WIN32-NEXT:    fstp %st(0)
183 ; WIN32-NEXT:    jmp LBB2_13
184 ; WIN32-NEXT:  LBB2_11:
185 ; WIN32-NEXT:    fstp %st(4)
186 ; WIN32-NEXT:    addl $-254, %esi
187 ; WIN32-NEXT:    movl %esi, %ecx
188 ; WIN32-NEXT:  LBB2_13:
189 ; WIN32-NEXT:    cmpl $127, %eax
190 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
191 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
192 ; WIN32-NEXT:    jg LBB2_15
193 ; WIN32-NEXT:  # %bb.14:
194 ; WIN32-NEXT:    movl %edx, %ecx
195 ; WIN32-NEXT:  LBB2_15:
196 ; WIN32-NEXT:    cmpl $381, %esi # imm = 0x17D
197 ; WIN32-NEXT:    movl %esi, %edx
198 ; WIN32-NEXT:    jl LBB2_17
199 ; WIN32-NEXT:  # %bb.16:
200 ; WIN32-NEXT:    movl $381, %edx # imm = 0x17D
201 ; WIN32-NEXT:  LBB2_17:
202 ; WIN32-NEXT:    addl $-254, %edx
203 ; WIN32-NEXT:    leal -127(%esi), %edi
204 ; WIN32-NEXT:    cmpl $255, %esi
205 ; WIN32-NEXT:    jae LBB2_19
206 ; WIN32-NEXT:  # %bb.18:
207 ; WIN32-NEXT:    movl %edi, %edx
208 ; WIN32-NEXT:  LBB2_19:
209 ; WIN32-NEXT:    fld %st(0)
210 ; WIN32-NEXT:    fmul %st(2), %st
211 ; WIN32-NEXT:    fmul %st, %st(2)
212 ; WIN32-NEXT:    jae LBB2_21
213 ; WIN32-NEXT:  # %bb.20:
214 ; WIN32-NEXT:    fstp %st(2)
215 ; WIN32-NEXT:    fldz
216 ; WIN32-NEXT:  LBB2_21:
217 ; WIN32-NEXT:    fstp %st(0)
218 ; WIN32-NEXT:    cmpl $-329, %esi # imm = 0xFEB7
219 ; WIN32-NEXT:    movl %esi, %edi
220 ; WIN32-NEXT:    jge LBB2_23
221 ; WIN32-NEXT:  # %bb.22:
222 ; WIN32-NEXT:    movl $-330, %edi # imm = 0xFEB6
223 ; WIN32-NEXT:  LBB2_23:
224 ; WIN32-NEXT:    fld %st(0)
225 ; WIN32-NEXT:    fmul %st(4), %st
226 ; WIN32-NEXT:    fmul %st, %st(4)
227 ; WIN32-NEXT:    cmpl $-228, %esi
228 ; WIN32-NEXT:    jb LBB2_24
229 ; WIN32-NEXT:  # %bb.25:
230 ; WIN32-NEXT:    fstp %st(4)
231 ; WIN32-NEXT:    leal 102(%esi), %edi
232 ; WIN32-NEXT:    cmpl $-126, %esi
233 ; WIN32-NEXT:    jge LBB2_27
234 ; WIN32-NEXT:    jmp LBB2_28
235 ; WIN32-NEXT:  LBB2_24:
236 ; WIN32-NEXT:    fstp %st(0)
237 ; WIN32-NEXT:    addl $204, %edi
238 ; WIN32-NEXT:    cmpl $-126, %esi
239 ; WIN32-NEXT:    jl LBB2_28
240 ; WIN32-NEXT:  LBB2_27:
241 ; WIN32-NEXT:    fstp %st(3)
242 ; WIN32-NEXT:    movl %esi, %edi
243 ; WIN32-NEXT:    fldz
244 ; WIN32-NEXT:  LBB2_28:
245 ; WIN32-NEXT:    fstp %st(0)
246 ; WIN32-NEXT:    cmpl $127, %esi
247 ; WIN32-NEXT:    jg LBB2_30
248 ; WIN32-NEXT:  # %bb.29:
249 ; WIN32-NEXT:    fstp %st(0)
250 ; WIN32-NEXT:    movl %edi, %edx
251 ; WIN32-NEXT:    fldz
252 ; WIN32-NEXT:    fxch %st(2)
253 ; WIN32-NEXT:  LBB2_30:
254 ; WIN32-NEXT:    fstp %st(2)
255 ; WIN32-NEXT:    cmpl $127, %eax
256 ; WIN32-NEXT:    jg LBB2_32
257 ; WIN32-NEXT:  # %bb.31:
258 ; WIN32-NEXT:    fstp %st(2)
259 ; WIN32-NEXT:    fldz
260 ; WIN32-NEXT:  LBB2_32:
261 ; WIN32-NEXT:    fstp %st(0)
262 ; WIN32-NEXT:    shll $23, %ecx
263 ; WIN32-NEXT:    addl $1065353216, %ecx # imm = 0x3F800000
264 ; WIN32-NEXT:    movl %ecx, (%esp)
265 ; WIN32-NEXT:    shll $23, %edx
266 ; WIN32-NEXT:    addl $1065353216, %edx # imm = 0x3F800000
267 ; WIN32-NEXT:    movl %edx, {{[0-9]+}}(%esp)
268 ; WIN32-NEXT:    fxch %st(1)
269 ; WIN32-NEXT:    fmuls (%esp)
270 ; WIN32-NEXT:    fxch %st(1)
271 ; WIN32-NEXT:    fmuls {{[0-9]+}}(%esp)
272 ; WIN32-NEXT:    addl $8, %esp
273 ; WIN32-NEXT:    popl %esi
274 ; WIN32-NEXT:    popl %edi
275 ; WIN32-NEXT:    retl
276   %1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val, <2 x i32> %exp)
277   ret <2 x float> %1
280 define <4 x float> @ldexp_v4f32(<4 x float> %val, <4 x i32> %exp) {
281 ; X64-LABEL: ldexp_v4f32:
282 ; X64:       # %bb.0:
283 ; X64-NEXT:    subq $72, %rsp
284 ; X64-NEXT:    .cfi_def_cfa_offset 80
285 ; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
286 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
287 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
288 ; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
289 ; X64-NEXT:    movd %xmm2, %edi
290 ; X64-NEXT:    callq ldexpf@PLT
291 ; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
292 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
293 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
294 ; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
295 ; X64-NEXT:    # xmm1 = mem[2,3,2,3]
296 ; X64-NEXT:    movd %xmm1, %edi
297 ; X64-NEXT:    callq ldexpf@PLT
298 ; X64-NEXT:    unpcklps (%rsp), %xmm0 # 16-byte Folded Reload
299 ; X64-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
300 ; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
301 ; X64-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
302 ; X64-NEXT:    movd %xmm0, %edi
303 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
304 ; X64-NEXT:    callq ldexpf@PLT
305 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
306 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
307 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
308 ; X64-NEXT:    pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
309 ; X64-NEXT:    # xmm1 = mem[1,1,1,1]
310 ; X64-NEXT:    movd %xmm1, %edi
311 ; X64-NEXT:    callq ldexpf@PLT
312 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
313 ; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
314 ; X64-NEXT:    unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload
315 ; X64-NEXT:    # xmm1 = xmm1[0],mem[0]
316 ; X64-NEXT:    movaps %xmm1, %xmm0
317 ; X64-NEXT:    addq $72, %rsp
318 ; X64-NEXT:    .cfi_def_cfa_offset 8
319 ; X64-NEXT:    retq
321 ; WIN32-LABEL: ldexp_v4f32:
322 ; WIN32:       # %bb.0:
323 ; WIN32-NEXT:    pushl %ebp
324 ; WIN32-NEXT:    pushl %ebx
325 ; WIN32-NEXT:    pushl %edi
326 ; WIN32-NEXT:    pushl %esi
327 ; WIN32-NEXT:    subl $32, %esp
328 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
329 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
330 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
331 ; WIN32-NEXT:    flds __real@7f000000
332 ; WIN32-NEXT:    fld %st(1)
333 ; WIN32-NEXT:    fmul %st(1), %st
334 ; WIN32-NEXT:    fld %st(0)
335 ; WIN32-NEXT:    fmul %st(2), %st
336 ; WIN32-NEXT:    cmpl $255, %ecx
337 ; WIN32-NEXT:    jae LBB3_2
338 ; WIN32-NEXT:  # %bb.1:
339 ; WIN32-NEXT:    fstp %st(0)
340 ; WIN32-NEXT:    fldz
341 ; WIN32-NEXT:    fxch %st(1)
342 ; WIN32-NEXT:  LBB3_2:
343 ; WIN32-NEXT:    fstp %st(1)
344 ; WIN32-NEXT:    cmpl $-329, %ecx # imm = 0xFEB7
345 ; WIN32-NEXT:    movl %ecx, %esi
346 ; WIN32-NEXT:    jge LBB3_4
347 ; WIN32-NEXT:  # %bb.3:
348 ; WIN32-NEXT:    movl $-330, %esi # imm = 0xFEB6
349 ; WIN32-NEXT:  LBB3_4:
350 ; WIN32-NEXT:    addl $204, %esi
351 ; WIN32-NEXT:    leal 102(%ecx), %eax
352 ; WIN32-NEXT:    cmpl $-228, %ecx
353 ; WIN32-NEXT:    jb LBB3_6
354 ; WIN32-NEXT:  # %bb.5:
355 ; WIN32-NEXT:    movl %eax, %esi
356 ; WIN32-NEXT:  LBB3_6:
357 ; WIN32-NEXT:    flds __real@0c800000
358 ; WIN32-NEXT:    fld %st(3)
359 ; WIN32-NEXT:    fmul %st(1), %st
360 ; WIN32-NEXT:    fld %st(0)
361 ; WIN32-NEXT:    fmul %st(2), %st
362 ; WIN32-NEXT:    jb LBB3_8
363 ; WIN32-NEXT:  # %bb.7:
364 ; WIN32-NEXT:    fstp %st(0)
365 ; WIN32-NEXT:    fldz
366 ; WIN32-NEXT:    fxch %st(1)
367 ; WIN32-NEXT:  LBB3_8:
368 ; WIN32-NEXT:    fstp %st(1)
369 ; WIN32-NEXT:    cmpl $-126, %ecx
370 ; WIN32-NEXT:    jl LBB3_10
371 ; WIN32-NEXT:  # %bb.9:
372 ; WIN32-NEXT:    fstp %st(0)
373 ; WIN32-NEXT:    fldz
374 ; WIN32-NEXT:    fxch %st(4)
375 ; WIN32-NEXT:  LBB3_10:
376 ; WIN32-NEXT:    fstp %st(4)
377 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
378 ; WIN32-NEXT:    movl %ecx, %edx
379 ; WIN32-NEXT:    subl $127, %edx
380 ; WIN32-NEXT:    jg LBB3_12
381 ; WIN32-NEXT:  # %bb.11:
382 ; WIN32-NEXT:    fstp %st(1)
383 ; WIN32-NEXT:    fldz
384 ; WIN32-NEXT:    fxch %st(3)
385 ; WIN32-NEXT:    fxch %st(1)
386 ; WIN32-NEXT:  LBB3_12:
387 ; WIN32-NEXT:    fstp %st(3)
388 ; WIN32-NEXT:    fld %st(3)
389 ; WIN32-NEXT:    fmul %st(2), %st
390 ; WIN32-NEXT:    fld %st(0)
391 ; WIN32-NEXT:    fmul %st(3), %st
392 ; WIN32-NEXT:    cmpl $255, %edi
393 ; WIN32-NEXT:    jae LBB3_14
394 ; WIN32-NEXT:  # %bb.13:
395 ; WIN32-NEXT:    fstp %st(0)
396 ; WIN32-NEXT:    fldz
397 ; WIN32-NEXT:    fxch %st(1)
398 ; WIN32-NEXT:  LBB3_14:
399 ; WIN32-NEXT:    fstp %st(1)
400 ; WIN32-NEXT:    fxch %st(1)
401 ; WIN32-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
402 ; WIN32-NEXT:    cmpl $-329, %edi # imm = 0xFEB7
403 ; WIN32-NEXT:    movl %edi, %eax
404 ; WIN32-NEXT:    jge LBB3_16
405 ; WIN32-NEXT:  # %bb.15:
406 ; WIN32-NEXT:    movl $-330, %eax # imm = 0xFEB6
407 ; WIN32-NEXT:  LBB3_16:
408 ; WIN32-NEXT:    fld %st(3)
409 ; WIN32-NEXT:    fmul %st(3), %st
410 ; WIN32-NEXT:    fld %st(0)
411 ; WIN32-NEXT:    fmul %st(4), %st
412 ; WIN32-NEXT:    cmpl $-228, %edi
413 ; WIN32-NEXT:    jb LBB3_17
414 ; WIN32-NEXT:  # %bb.18:
415 ; WIN32-NEXT:    fstp %st(0)
416 ; WIN32-NEXT:    leal 102(%edi), %eax
417 ; WIN32-NEXT:    cmpl $-126, %edi
418 ; WIN32-NEXT:    jge LBB3_20
419 ; WIN32-NEXT:    jmp LBB3_21
420 ; WIN32-NEXT:  LBB3_17:
421 ; WIN32-NEXT:    fstp %st(1)
422 ; WIN32-NEXT:    addl $204, %eax
423 ; WIN32-NEXT:    cmpl $-126, %edi
424 ; WIN32-NEXT:    jl LBB3_21
425 ; WIN32-NEXT:  LBB3_20:
426 ; WIN32-NEXT:    fstp %st(0)
427 ; WIN32-NEXT:    movl %edi, %eax
428 ; WIN32-NEXT:    fldz
429 ; WIN32-NEXT:    fxch %st(4)
430 ; WIN32-NEXT:  LBB3_21:
431 ; WIN32-NEXT:    fstp %st(4)
432 ; WIN32-NEXT:    movl %eax, (%esp) # 4-byte Spill
433 ; WIN32-NEXT:    movl %edi, %ebx
434 ; WIN32-NEXT:    subl $127, %ebx
435 ; WIN32-NEXT:    jg LBB3_23
436 ; WIN32-NEXT:  # %bb.22:
437 ; WIN32-NEXT:    fstp %st(0)
438 ; WIN32-NEXT:    fldz
439 ; WIN32-NEXT:    fxch %st(3)
440 ; WIN32-NEXT:  LBB3_23:
441 ; WIN32-NEXT:    fstp %st(3)
442 ; WIN32-NEXT:    cmpl $381, %edi # imm = 0x17D
443 ; WIN32-NEXT:    movl %edi, %eax
444 ; WIN32-NEXT:    jge LBB3_24
445 ; WIN32-NEXT:  # %bb.25:
446 ; WIN32-NEXT:    cmpl $255, %edi
447 ; WIN32-NEXT:    jae LBB3_26
448 ; WIN32-NEXT:  LBB3_27:
449 ; WIN32-NEXT:    cmpl $-126, %ecx
450 ; WIN32-NEXT:    jl LBB3_29
451 ; WIN32-NEXT:  LBB3_28:
452 ; WIN32-NEXT:    movl %ecx, %esi
453 ; WIN32-NEXT:  LBB3_29:
454 ; WIN32-NEXT:    cmpl $381, %ecx # imm = 0x17D
455 ; WIN32-NEXT:    movl %ecx, %eax
456 ; WIN32-NEXT:    jl LBB3_31
457 ; WIN32-NEXT:  # %bb.30:
458 ; WIN32-NEXT:    movl $381, %eax # imm = 0x17D
459 ; WIN32-NEXT:  LBB3_31:
460 ; WIN32-NEXT:    cmpl $255, %ecx
461 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
462 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebp
463 ; WIN32-NEXT:    jb LBB3_33
464 ; WIN32-NEXT:  # %bb.32:
465 ; WIN32-NEXT:    addl $-254, %eax
466 ; WIN32-NEXT:    movl %eax, %edx
467 ; WIN32-NEXT:  LBB3_33:
468 ; WIN32-NEXT:    fxch %st(3)
469 ; WIN32-NEXT:    fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
470 ; WIN32-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
471 ; WIN32-NEXT:    cmpl $381, %ebp # imm = 0x17D
472 ; WIN32-NEXT:    movl %ebp, %eax
473 ; WIN32-NEXT:    jl LBB3_35
474 ; WIN32-NEXT:  # %bb.34:
475 ; WIN32-NEXT:    movl $381, %eax # imm = 0x17D
476 ; WIN32-NEXT:  LBB3_35:
477 ; WIN32-NEXT:    fld %st(2)
478 ; WIN32-NEXT:    fmul %st(1), %st
479 ; WIN32-NEXT:    fld %st(0)
480 ; WIN32-NEXT:    fmul %st(2), %st
481 ; WIN32-NEXT:    leal -127(%ebp), %edi
482 ; WIN32-NEXT:    cmpl $255, %ebp
483 ; WIN32-NEXT:    jae LBB3_36
484 ; WIN32-NEXT:  # %bb.37:
485 ; WIN32-NEXT:    fstp %st(0)
486 ; WIN32-NEXT:    jmp LBB3_38
487 ; WIN32-NEXT:  LBB3_24:
488 ; WIN32-NEXT:    movl $381, %eax # imm = 0x17D
489 ; WIN32-NEXT:    cmpl $255, %edi
490 ; WIN32-NEXT:    jb LBB3_27
491 ; WIN32-NEXT:  LBB3_26:
492 ; WIN32-NEXT:    addl $-254, %eax
493 ; WIN32-NEXT:    movl %eax, %ebx
494 ; WIN32-NEXT:    cmpl $-126, %ecx
495 ; WIN32-NEXT:    jge LBB3_28
496 ; WIN32-NEXT:    jmp LBB3_29
497 ; WIN32-NEXT:  LBB3_36:
498 ; WIN32-NEXT:    fstp %st(1)
499 ; WIN32-NEXT:    addl $-254, %eax
500 ; WIN32-NEXT:    movl %eax, %edi
501 ; WIN32-NEXT:  LBB3_38:
502 ; WIN32-NEXT:    cmpl $-329, %ebp # imm = 0xFEB7
503 ; WIN32-NEXT:    movl %ebp, %ecx
504 ; WIN32-NEXT:    jge LBB3_40
505 ; WIN32-NEXT:  # %bb.39:
506 ; WIN32-NEXT:    movl $-330, %ecx # imm = 0xFEB6
507 ; WIN32-NEXT:  LBB3_40:
508 ; WIN32-NEXT:    addl $204, %ecx
509 ; WIN32-NEXT:    leal 102(%ebp), %eax
510 ; WIN32-NEXT:    cmpl $-228, %ebp
511 ; WIN32-NEXT:    jb LBB3_42
512 ; WIN32-NEXT:  # %bb.41:
513 ; WIN32-NEXT:    movl %eax, %ecx
514 ; WIN32-NEXT:  LBB3_42:
515 ; WIN32-NEXT:    fld %st(3)
516 ; WIN32-NEXT:    fmul %st(3), %st
517 ; WIN32-NEXT:    fld %st(0)
518 ; WIN32-NEXT:    fmul %st(4), %st
519 ; WIN32-NEXT:    jb LBB3_44
520 ; WIN32-NEXT:  # %bb.43:
521 ; WIN32-NEXT:    fstp %st(0)
522 ; WIN32-NEXT:    fldz
523 ; WIN32-NEXT:    fxch %st(1)
524 ; WIN32-NEXT:  LBB3_44:
525 ; WIN32-NEXT:    fstp %st(1)
526 ; WIN32-NEXT:    cmpl $-126, %ebp
527 ; WIN32-NEXT:    jl LBB3_46
528 ; WIN32-NEXT:  # %bb.45:
529 ; WIN32-NEXT:    fstp %st(0)
530 ; WIN32-NEXT:    movl %ebp, %ecx
531 ; WIN32-NEXT:    fldz
532 ; WIN32-NEXT:    fxch %st(4)
533 ; WIN32-NEXT:  LBB3_46:
534 ; WIN32-NEXT:    fstp %st(4)
535 ; WIN32-NEXT:    cmpl $127, %ebp
536 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
537 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
538 ; WIN32-NEXT:    jg LBB3_48
539 ; WIN32-NEXT:  # %bb.47:
540 ; WIN32-NEXT:    movl %ecx, %edi
541 ; WIN32-NEXT:  LBB3_48:
542 ; WIN32-NEXT:    cmpl $381, %esi # imm = 0x17D
543 ; WIN32-NEXT:    movl %esi, %ecx
544 ; WIN32-NEXT:    jl LBB3_50
545 ; WIN32-NEXT:  # %bb.49:
546 ; WIN32-NEXT:    movl $381, %ecx # imm = 0x17D
547 ; WIN32-NEXT:  LBB3_50:
548 ; WIN32-NEXT:    addl $-254, %ecx
549 ; WIN32-NEXT:    leal -127(%esi), %eax
550 ; WIN32-NEXT:    cmpl $255, %esi
551 ; WIN32-NEXT:    jae LBB3_52
552 ; WIN32-NEXT:  # %bb.51:
553 ; WIN32-NEXT:    movl %eax, %ecx
554 ; WIN32-NEXT:  LBB3_52:
555 ; WIN32-NEXT:    fld %st(0)
556 ; WIN32-NEXT:    fmul %st(3), %st
557 ; WIN32-NEXT:    fmul %st, %st(3)
558 ; WIN32-NEXT:    jae LBB3_54
559 ; WIN32-NEXT:  # %bb.53:
560 ; WIN32-NEXT:    fstp %st(3)
561 ; WIN32-NEXT:    fldz
562 ; WIN32-NEXT:  LBB3_54:
563 ; WIN32-NEXT:    fstp %st(0)
564 ; WIN32-NEXT:    cmpl $-329, %esi # imm = 0xFEB7
565 ; WIN32-NEXT:    movl %esi, %eax
566 ; WIN32-NEXT:    jge LBB3_56
567 ; WIN32-NEXT:  # %bb.55:
568 ; WIN32-NEXT:    movl $-330, %eax # imm = 0xFEB6
569 ; WIN32-NEXT:  LBB3_56:
570 ; WIN32-NEXT:    fld %st(0)
571 ; WIN32-NEXT:    fmul %st(4), %st
572 ; WIN32-NEXT:    fmul %st, %st(4)
573 ; WIN32-NEXT:    cmpl $-228, %esi
574 ; WIN32-NEXT:    jb LBB3_57
575 ; WIN32-NEXT:  # %bb.58:
576 ; WIN32-NEXT:    fstp %st(4)
577 ; WIN32-NEXT:    leal 102(%esi), %eax
578 ; WIN32-NEXT:    cmpl $-126, %esi
579 ; WIN32-NEXT:    jge LBB3_60
580 ; WIN32-NEXT:    jmp LBB3_61
581 ; WIN32-NEXT:  LBB3_57:
582 ; WIN32-NEXT:    fstp %st(0)
583 ; WIN32-NEXT:    addl $204, %eax
584 ; WIN32-NEXT:    cmpl $-126, %esi
585 ; WIN32-NEXT:    jl LBB3_61
586 ; WIN32-NEXT:  LBB3_60:
587 ; WIN32-NEXT:    fstp %st(3)
588 ; WIN32-NEXT:    movl %esi, %eax
589 ; WIN32-NEXT:    fldz
590 ; WIN32-NEXT:  LBB3_61:
591 ; WIN32-NEXT:    fstp %st(0)
592 ; WIN32-NEXT:    cmpl $127, %esi
593 ; WIN32-NEXT:    jg LBB3_63
594 ; WIN32-NEXT:  # %bb.62:
595 ; WIN32-NEXT:    fstp %st(1)
596 ; WIN32-NEXT:    movl %eax, %ecx
597 ; WIN32-NEXT:    fldz
598 ; WIN32-NEXT:    fxch %st(2)
599 ; WIN32-NEXT:    fxch %st(1)
600 ; WIN32-NEXT:  LBB3_63:
601 ; WIN32-NEXT:    fstp %st(2)
602 ; WIN32-NEXT:    cmpl $127, {{[0-9]+}}(%esp)
603 ; WIN32-NEXT:    jg LBB3_65
604 ; WIN32-NEXT:  # %bb.64:
605 ; WIN32-NEXT:    movl (%esp), %ebx # 4-byte Reload
606 ; WIN32-NEXT:  LBB3_65:
607 ; WIN32-NEXT:    cmpl $127, {{[0-9]+}}(%esp)
608 ; WIN32-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
609 ; WIN32-NEXT:    jg LBB3_67
610 ; WIN32-NEXT:  # %bb.66:
611 ; WIN32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
612 ; WIN32-NEXT:  LBB3_67:
613 ; WIN32-NEXT:    cmpl $127, %ebp
614 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
615 ; WIN32-NEXT:    jg LBB3_69
616 ; WIN32-NEXT:  # %bb.68:
617 ; WIN32-NEXT:    fstp %st(2)
618 ; WIN32-NEXT:    fldz
619 ; WIN32-NEXT:    fxch %st(3)
620 ; WIN32-NEXT:    fxch %st(2)
621 ; WIN32-NEXT:  LBB3_69:
622 ; WIN32-NEXT:    fstp %st(3)
623 ; WIN32-NEXT:    shll $23, %edi
624 ; WIN32-NEXT:    addl $1065353216, %edi # imm = 0x3F800000
625 ; WIN32-NEXT:    movl %edi, {{[0-9]+}}(%esp)
626 ; WIN32-NEXT:    shll $23, %ecx
627 ; WIN32-NEXT:    addl $1065353216, %ecx # imm = 0x3F800000
628 ; WIN32-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
629 ; WIN32-NEXT:    shll $23, %ebx
630 ; WIN32-NEXT:    addl $1065353216, %ebx # imm = 0x3F800000
631 ; WIN32-NEXT:    movl %ebx, {{[0-9]+}}(%esp)
632 ; WIN32-NEXT:    shll $23, %edx
633 ; WIN32-NEXT:    addl $1065353216, %edx # imm = 0x3F800000
634 ; WIN32-NEXT:    movl %edx, {{[0-9]+}}(%esp)
635 ; WIN32-NEXT:    fxch %st(1)
636 ; WIN32-NEXT:    fmuls {{[0-9]+}}(%esp)
637 ; WIN32-NEXT:    fxch %st(1)
638 ; WIN32-NEXT:    fmuls {{[0-9]+}}(%esp)
639 ; WIN32-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
640 ; WIN32-NEXT:    fmuls {{[0-9]+}}(%esp)
641 ; WIN32-NEXT:    fxch %st(3)
642 ; WIN32-NEXT:    fmuls {{[0-9]+}}(%esp)
643 ; WIN32-NEXT:    fstps 12(%eax)
644 ; WIN32-NEXT:    fxch %st(2)
645 ; WIN32-NEXT:    fstps 8(%eax)
646 ; WIN32-NEXT:    fxch %st(1)
647 ; WIN32-NEXT:    fstps 4(%eax)
648 ; WIN32-NEXT:    fstps (%eax)
649 ; WIN32-NEXT:    addl $32, %esp
650 ; WIN32-NEXT:    popl %esi
651 ; WIN32-NEXT:    popl %edi
652 ; WIN32-NEXT:    popl %ebx
653 ; WIN32-NEXT:    popl %ebp
654 ; WIN32-NEXT:    retl
655   %1 = call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> %val, <4 x i32> %exp)
656   ret <4 x float> %1
659 define <2 x double> @ldexp_v2f64(<2 x double> %val, <2 x i32> %exp) {
660 ; X64-LABEL: ldexp_v2f64:
661 ; X64:       # %bb.0:
662 ; X64-NEXT:    subq $56, %rsp
663 ; X64-NEXT:    .cfi_def_cfa_offset 64
664 ; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
665 ; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
666 ; X64-NEXT:    movd %xmm1, %edi
667 ; X64-NEXT:    callq ldexp@PLT
668 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
669 ; X64-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload
670 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
671 ; X64-NEXT:    pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
672 ; X64-NEXT:    # xmm1 = mem[1,1,1,1]
673 ; X64-NEXT:    movd %xmm1, %edi
674 ; X64-NEXT:    callq ldexp@PLT
675 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
676 ; X64-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
677 ; X64-NEXT:    movaps %xmm1, %xmm0
678 ; X64-NEXT:    addq $56, %rsp
679 ; X64-NEXT:    .cfi_def_cfa_offset 8
680 ; X64-NEXT:    retq
682 ; WIN32-LABEL: ldexp_v2f64:
683 ; WIN32:       # %bb.0:
684 ; WIN32-NEXT:    pushl %esi
685 ; WIN32-NEXT:    subl $28, %esp
686 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
687 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
688 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
689 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
690 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
691 ; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
692 ; WIN32-NEXT:    fstpl (%esp)
693 ; WIN32-NEXT:    calll _ldexp
694 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
695 ; WIN32-NEXT:    movl %esi, {{[0-9]+}}(%esp)
696 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
697 ; WIN32-NEXT:    fstpl (%esp)
698 ; WIN32-NEXT:    calll _ldexp
699 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
700 ; WIN32-NEXT:    fxch %st(1)
701 ; WIN32-NEXT:    addl $28, %esp
702 ; WIN32-NEXT:    popl %esi
703 ; WIN32-NEXT:    retl
704   %1 = call <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double> %val, <2 x i32> %exp)
705   ret <2 x double> %1
708 define <4 x double> @ldexp_v4f64(<4 x double> %val, <4 x i32> %exp) {
709 ; X64-LABEL: ldexp_v4f64:
710 ; X64:       # %bb.0:
711 ; X64-NEXT:    pushq %rbp
712 ; X64-NEXT:    .cfi_def_cfa_offset 16
713 ; X64-NEXT:    pushq %rbx
714 ; X64-NEXT:    .cfi_def_cfa_offset 24
715 ; X64-NEXT:    subq $72, %rsp
716 ; X64-NEXT:    .cfi_def_cfa_offset 96
717 ; X64-NEXT:    .cfi_offset %rbx, -24
718 ; X64-NEXT:    .cfi_offset %rbp, -16
719 ; X64-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
720 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
721 ; X64-NEXT:    movdqa %xmm2, (%rsp) # 16-byte Spill
722 ; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
723 ; X64-NEXT:    movd %xmm1, %ebx
724 ; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]
725 ; X64-NEXT:    movd %xmm1, %ebp
726 ; X64-NEXT:    movd %xmm2, %edi
727 ; X64-NEXT:    callq ldexp@PLT
728 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
729 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
730 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
731 ; X64-NEXT:    pshufd $85, (%rsp), %xmm1 # 16-byte Folded Reload
732 ; X64-NEXT:    # xmm1 = mem[1,1,1,1]
733 ; X64-NEXT:    movd %xmm1, %edi
734 ; X64-NEXT:    callq ldexp@PLT
735 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
736 ; X64-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
737 ; X64-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
738 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
739 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
740 ; X64-NEXT:    movl %ebp, %edi
741 ; X64-NEXT:    callq ldexp@PLT
742 ; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
743 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
744 ; X64-NEXT:    movl %ebx, %edi
745 ; X64-NEXT:    callq ldexp@PLT
746 ; X64-NEXT:    movaps %xmm0, %xmm1
747 ; X64-NEXT:    unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload
748 ; X64-NEXT:    # xmm1 = xmm1[0],mem[0]
749 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
750 ; X64-NEXT:    addq $72, %rsp
751 ; X64-NEXT:    .cfi_def_cfa_offset 24
752 ; X64-NEXT:    popq %rbx
753 ; X64-NEXT:    .cfi_def_cfa_offset 16
754 ; X64-NEXT:    popq %rbp
755 ; X64-NEXT:    .cfi_def_cfa_offset 8
756 ; X64-NEXT:    retq
758 ; WIN32-LABEL: ldexp_v4f64:
759 ; WIN32:       # %bb.0:
760 ; WIN32-NEXT:    pushl %ebp
761 ; WIN32-NEXT:    pushl %ebx
762 ; WIN32-NEXT:    pushl %edi
763 ; WIN32-NEXT:    pushl %esi
764 ; WIN32-NEXT:    subl $44, %esp
765 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
766 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
767 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
768 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
769 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
770 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
771 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
772 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
773 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
774 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebp
775 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
776 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
777 ; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
778 ; WIN32-NEXT:    fstpl (%esp)
779 ; WIN32-NEXT:    calll _ldexp
780 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
781 ; WIN32-NEXT:    movl %ebp, {{[0-9]+}}(%esp)
782 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
783 ; WIN32-NEXT:    fstpl (%esp)
784 ; WIN32-NEXT:    calll _ldexp
785 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
786 ; WIN32-NEXT:    movl %ebx, {{[0-9]+}}(%esp)
787 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
788 ; WIN32-NEXT:    fstpl (%esp)
789 ; WIN32-NEXT:    calll _ldexp
790 ; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
791 ; WIN32-NEXT:    movl %edi, {{[0-9]+}}(%esp)
792 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
793 ; WIN32-NEXT:    fstpl (%esp)
794 ; WIN32-NEXT:    calll _ldexp
795 ; WIN32-NEXT:    fstpl 24(%esi)
796 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
797 ; WIN32-NEXT:    fstpl 16(%esi)
798 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
799 ; WIN32-NEXT:    fstpl 8(%esi)
800 ; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
801 ; WIN32-NEXT:    fstpl (%esi)
802 ; WIN32-NEXT:    movl %esi, %eax
803 ; WIN32-NEXT:    addl $44, %esp
804 ; WIN32-NEXT:    popl %esi
805 ; WIN32-NEXT:    popl %edi
806 ; WIN32-NEXT:    popl %ebx
807 ; WIN32-NEXT:    popl %ebp
808 ; WIN32-NEXT:    retl
809   %1 = call <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double> %val, <4 x i32> %exp)
810   ret <4 x double> %1
813 define half @ldexp_f16(half %arg0, i32 %arg1) {
814 ; X64-LABEL: ldexp_f16:
815 ; X64:       # %bb.0:
816 ; X64-NEXT:    pushq %rbx
817 ; X64-NEXT:    .cfi_def_cfa_offset 16
818 ; X64-NEXT:    .cfi_offset %rbx, -16
819 ; X64-NEXT:    movl %edi, %ebx
820 ; X64-NEXT:    callq __extendhfsf2@PLT
821 ; X64-NEXT:    movl %ebx, %edi
822 ; X64-NEXT:    callq ldexpf@PLT
823 ; X64-NEXT:    callq __truncsfhf2@PLT
824 ; X64-NEXT:    popq %rbx
825 ; X64-NEXT:    .cfi_def_cfa_offset 8
826 ; X64-NEXT:    retq
828 ; WIN32-LABEL: ldexp_f16:
829 ; WIN32:       # %bb.0:
830 ; WIN32-NEXT:    pushl %edi
831 ; WIN32-NEXT:    pushl %esi
832 ; WIN32-NEXT:    subl $8, %esp
833 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
834 ; WIN32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
835 ; WIN32-NEXT:    movl %eax, (%esp)
836 ; WIN32-NEXT:    cmpl $381, %edi # imm = 0x17D
837 ; WIN32-NEXT:    movl %edi, %esi
838 ; WIN32-NEXT:    jl LBB6_2
839 ; WIN32-NEXT:  # %bb.1:
840 ; WIN32-NEXT:    movl $381, %esi # imm = 0x17D
841 ; WIN32-NEXT:  LBB6_2:
842 ; WIN32-NEXT:    addl $-254, %esi
843 ; WIN32-NEXT:    calll ___gnu_h2f_ieee
844 ; WIN32-NEXT:    leal -127(%edi), %eax
845 ; WIN32-NEXT:    cmpl $255, %edi
846 ; WIN32-NEXT:    jae LBB6_4
847 ; WIN32-NEXT:  # %bb.3:
848 ; WIN32-NEXT:    movl %eax, %esi
849 ; WIN32-NEXT:  LBB6_4:
850 ; WIN32-NEXT:    flds __real@7f000000
851 ; WIN32-NEXT:    fld %st(1)
852 ; WIN32-NEXT:    fmul %st(1), %st
853 ; WIN32-NEXT:    fmul %st, %st(1)
854 ; WIN32-NEXT:    jae LBB6_6
855 ; WIN32-NEXT:  # %bb.5:
856 ; WIN32-NEXT:    fstp %st(1)
857 ; WIN32-NEXT:    fldz
858 ; WIN32-NEXT:  LBB6_6:
859 ; WIN32-NEXT:    fstp %st(0)
860 ; WIN32-NEXT:    cmpl $-329, %edi # imm = 0xFEB7
861 ; WIN32-NEXT:    movl %edi, %eax
862 ; WIN32-NEXT:    jge LBB6_8
863 ; WIN32-NEXT:  # %bb.7:
864 ; WIN32-NEXT:    movl $-330, %eax # imm = 0xFEB6
865 ; WIN32-NEXT:  LBB6_8:
866 ; WIN32-NEXT:    flds __real@0c800000
867 ; WIN32-NEXT:    fld %st(2)
868 ; WIN32-NEXT:    fmul %st(1), %st
869 ; WIN32-NEXT:    fmul %st, %st(1)
870 ; WIN32-NEXT:    cmpl $-228, %edi
871 ; WIN32-NEXT:    jb LBB6_9
872 ; WIN32-NEXT:  # %bb.10:
873 ; WIN32-NEXT:    fstp %st(1)
874 ; WIN32-NEXT:    leal 102(%edi), %eax
875 ; WIN32-NEXT:    cmpl $-126, %edi
876 ; WIN32-NEXT:    jge LBB6_12
877 ; WIN32-NEXT:    jmp LBB6_13
878 ; WIN32-NEXT:  LBB6_9:
879 ; WIN32-NEXT:    fstp %st(0)
880 ; WIN32-NEXT:    addl $204, %eax
881 ; WIN32-NEXT:    cmpl $-126, %edi
882 ; WIN32-NEXT:    jl LBB6_13
883 ; WIN32-NEXT:  LBB6_12:
884 ; WIN32-NEXT:    fstp %st(0)
885 ; WIN32-NEXT:    movl %edi, %eax
886 ; WIN32-NEXT:    fldz
887 ; WIN32-NEXT:    fxch %st(2)
888 ; WIN32-NEXT:  LBB6_13:
889 ; WIN32-NEXT:    fstp %st(2)
890 ; WIN32-NEXT:    cmpl $127, %edi
891 ; WIN32-NEXT:    jg LBB6_15
892 ; WIN32-NEXT:  # %bb.14:
893 ; WIN32-NEXT:    fstp %st(0)
894 ; WIN32-NEXT:    movl %eax, %esi
895 ; WIN32-NEXT:    fldz
896 ; WIN32-NEXT:    fxch %st(1)
897 ; WIN32-NEXT:  LBB6_15:
898 ; WIN32-NEXT:    fstp %st(1)
899 ; WIN32-NEXT:    shll $23, %esi
900 ; WIN32-NEXT:    addl $1065353216, %esi # imm = 0x3F800000
901 ; WIN32-NEXT:    movl %esi, {{[0-9]+}}(%esp)
902 ; WIN32-NEXT:    fmuls {{[0-9]+}}(%esp)
903 ; WIN32-NEXT:    fstps (%esp)
904 ; WIN32-NEXT:    calll ___gnu_f2h_ieee
905 ; WIN32-NEXT:    addl $8, %esp
906 ; WIN32-NEXT:    popl %esi
907 ; WIN32-NEXT:    popl %edi
908 ; WIN32-NEXT:    retl
909   %ldexp = call half @llvm.ldexp.f16.i32(half %arg0, i32 %arg1)
910   ret half %ldexp
913 declare double @llvm.ldexp.f64.i32(double, i32) #0
914 declare float @llvm.ldexp.f32.i32(float, i32) #0
915 declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) #0
916 declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>) #0
917 declare <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double>, <2 x i32>) #0
918 declare <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double>, <4 x i32>) #0
919 declare half @llvm.ldexp.f16.i32(half, i32) #0
921 attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
922 attributes #1 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }