Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / X86 / llvm.frexp.ll
blobbd0a1dce6946c64e0ae85c1831d2b20019bc42f5
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 < %s | FileCheck -check-prefixes=X64 %s
3 ; RUN: llc -mtriple=i386-pc-win32 < %s | FileCheck -check-prefix=WIN32 %s
5 ; FIXME
6 ; define { half, i32 } @test_frexp_f16_i32(half %a) {
7 ;   %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)
8 ;   ret { half, i32 } %result
9 ; }
11 ; define half @test_frexp_f16_i32_only_use_fract(half %a) {
12 ;   %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)
13 ;   %result.0 = extractvalue { half, i32 } %result, 0
14 ;   ret half %result.0
15 ; }
17 ; define i32 @test_frexp_f16_i32_only_use_exp(half %a) {
18 ;   %result = call { half, i32 } @llvm.frexp.f16.i32(half %a)
19 ;   %result.0 = extractvalue { half, i32 } %result, 1
20 ;   ret i32 %result.0
21 ; }
23 ; define { <2 x half>, <2 x i32> } @test_frexp_v2f16_v2i32(<2 x half> %a) {
24 ;   %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)
25 ;   ret { <2 x half>, <2 x i32> } %result
26 ; }
28 ; define <2 x half> @test_frexp_v2f16_v2i32_only_use_fract(<2 x half> %a) {
29 ;   %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)
30 ;   %result.0 = extractvalue { <2 x half>, <2 x i32> } %result, 0
31 ;   ret <2 x half> %result.0
32 ; }
34 ; define <2 x i32> @test_frexp_v2f16_v2i32_only_use_exp(<2 x half> %a) {
35 ;   %result = call { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half> %a)
36 ;   %result.1 = extractvalue { <2 x half>, <2 x i32> } %result, 1
37 ;   ret <2 x i32> %result.1
38 ; }
40 define { float, i32 } @test_frexp_f32_i32(float %a) {
41 ; X64-LABEL: test_frexp_f32_i32:
42 ; X64:       # %bb.0:
43 ; X64-NEXT:    pushq %rax
44 ; X64-NEXT:    .cfi_def_cfa_offset 16
45 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
46 ; X64-NEXT:    callq frexpf@PLT
47 ; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
48 ; X64-NEXT:    popq %rcx
49 ; X64-NEXT:    .cfi_def_cfa_offset 8
50 ; X64-NEXT:    retq
52 ; WIN32-LABEL: test_frexp_f32_i32:
53 ; WIN32:       # %bb.0:
54 ; WIN32-NEXT:    subl $12, %esp
55 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
56 ; WIN32-NEXT:    fld %st(0)
57 ; WIN32-NEXT:    fmuls __real@4c000000
58 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
59 ; WIN32-NEXT:    fsts (%esp)
60 ; WIN32-NEXT:    movl (%esp), %eax
61 ; WIN32-NEXT:    movl %eax, %ecx
62 ; WIN32-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
63 ; WIN32-NEXT:    cmpl $8388608, %ecx # imm = 0x800000
64 ; WIN32-NEXT:    jb LBB0_1
65 ; WIN32-NEXT:  # %bb.2:
66 ; WIN32-NEXT:    movl %ecx, %edx
67 ; WIN32-NEXT:    jmp LBB0_3
68 ; WIN32-NEXT:  LBB0_1:
69 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
70 ; WIN32-NEXT:    movl %eax, %edx
71 ; WIN32-NEXT:    andl $2139095040, %edx # imm = 0x7F800000
72 ; WIN32-NEXT:  LBB0_3:
73 ; WIN32-NEXT:    shrl $23, %edx
74 ; WIN32-NEXT:    cmpl $8388608, %ecx # imm = 0x800000
75 ; WIN32-NEXT:    jae LBB0_5
76 ; WIN32-NEXT:  # %bb.4:
77 ; WIN32-NEXT:    addl $-25, %edx
78 ; WIN32-NEXT:  LBB0_5:
79 ; WIN32-NEXT:    andl $-2139095041, %eax # imm = 0x807FFFFF
80 ; WIN32-NEXT:    orl $1056964608, %eax # imm = 0x3F000000
81 ; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
82 ; WIN32-NEXT:    addl $-126, %edx
83 ; WIN32-NEXT:    addl $-2139095040, %ecx # imm = 0x80800000
84 ; WIN32-NEXT:    xorl %eax, %eax
85 ; WIN32-NEXT:    cmpl $-2139095040, %ecx # imm = 0x80800000
86 ; WIN32-NEXT:    jbe LBB0_7
87 ; WIN32-NEXT:  # %bb.6:
88 ; WIN32-NEXT:    movl %edx, %eax
89 ; WIN32-NEXT:  LBB0_7:
90 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
91 ; WIN32-NEXT:    jbe LBB0_9
92 ; WIN32-NEXT:  # %bb.8:
93 ; WIN32-NEXT:    fstp %st(1)
94 ; WIN32-NEXT:    fldz
95 ; WIN32-NEXT:  LBB0_9:
96 ; WIN32-NEXT:    fstp %st(0)
97 ; WIN32-NEXT:    addl $12, %esp
98 ; WIN32-NEXT:    retl
99   %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)
100   ret { float, i32 } %result
103 define float @test_frexp_f32_i32_only_use_fract(float %a) {
104 ; X64-LABEL: test_frexp_f32_i32_only_use_fract:
105 ; X64:       # %bb.0:
106 ; X64-NEXT:    pushq %rax
107 ; X64-NEXT:    .cfi_def_cfa_offset 16
108 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
109 ; X64-NEXT:    callq frexpf@PLT
110 ; X64-NEXT:    popq %rax
111 ; X64-NEXT:    .cfi_def_cfa_offset 8
112 ; X64-NEXT:    retq
114 ; WIN32-LABEL: test_frexp_f32_i32_only_use_fract:
115 ; WIN32:       # %bb.0:
116 ; WIN32-NEXT:    subl $12, %esp
117 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
118 ; WIN32-NEXT:    fsts (%esp)
119 ; WIN32-NEXT:    fld %st(0)
120 ; WIN32-NEXT:    fmuls __real@4c000000
121 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
122 ; WIN32-NEXT:    movl (%esp), %ecx
123 ; WIN32-NEXT:    movl %ecx, %eax
124 ; WIN32-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
125 ; WIN32-NEXT:    cmpl $8388608, %eax # imm = 0x800000
126 ; WIN32-NEXT:    jae LBB1_2
127 ; WIN32-NEXT:  # %bb.1:
128 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
129 ; WIN32-NEXT:  LBB1_2:
130 ; WIN32-NEXT:    andl $-2139095041, %ecx # imm = 0x807FFFFF
131 ; WIN32-NEXT:    orl $1056964608, %ecx # imm = 0x3F000000
132 ; WIN32-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
133 ; WIN32-NEXT:    addl $-2139095040, %eax # imm = 0x80800000
134 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
135 ; WIN32-NEXT:    cmpl $-2139095040, %eax # imm = 0x80800000
136 ; WIN32-NEXT:    jbe LBB1_4
137 ; WIN32-NEXT:  # %bb.3:
138 ; WIN32-NEXT:    fstp %st(1)
139 ; WIN32-NEXT:    fldz
140 ; WIN32-NEXT:  LBB1_4:
141 ; WIN32-NEXT:    fstp %st(0)
142 ; WIN32-NEXT:    addl $12, %esp
143 ; WIN32-NEXT:    retl
144   %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)
145   %result.0 = extractvalue { float, i32 } %result, 0
146   ret float %result.0
149 define i32 @test_frexp_f32_i32_only_use_exp(float %a) {
150 ; X64-LABEL: test_frexp_f32_i32_only_use_exp:
151 ; X64:       # %bb.0:
152 ; X64-NEXT:    pushq %rax
153 ; X64-NEXT:    .cfi_def_cfa_offset 16
154 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
155 ; X64-NEXT:    callq frexpf@PLT
156 ; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
157 ; X64-NEXT:    popq %rcx
158 ; X64-NEXT:    .cfi_def_cfa_offset 8
159 ; X64-NEXT:    retq
161 ; WIN32-LABEL: test_frexp_f32_i32_only_use_exp:
162 ; WIN32:       # %bb.0:
163 ; WIN32-NEXT:    subl $8, %esp
164 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
165 ; WIN32-NEXT:    fld %st(0)
166 ; WIN32-NEXT:    fmuls __real@4c000000
167 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
168 ; WIN32-NEXT:    fstps (%esp)
169 ; WIN32-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
170 ; WIN32-NEXT:    andl (%esp), %ecx
171 ; WIN32-NEXT:    cmpl $8388608, %ecx # imm = 0x800000
172 ; WIN32-NEXT:    jb LBB2_1
173 ; WIN32-NEXT:  # %bb.2:
174 ; WIN32-NEXT:    movl %ecx, %edx
175 ; WIN32-NEXT:    jmp LBB2_3
176 ; WIN32-NEXT:  LBB2_1:
177 ; WIN32-NEXT:    movl $2139095040, %edx # imm = 0x7F800000
178 ; WIN32-NEXT:    andl {{[0-9]+}}(%esp), %edx
179 ; WIN32-NEXT:  LBB2_3:
180 ; WIN32-NEXT:    shrl $23, %edx
181 ; WIN32-NEXT:    cmpl $8388608, %ecx # imm = 0x800000
182 ; WIN32-NEXT:    jae LBB2_5
183 ; WIN32-NEXT:  # %bb.4:
184 ; WIN32-NEXT:    addl $-25, %edx
185 ; WIN32-NEXT:  LBB2_5:
186 ; WIN32-NEXT:    addl $-2139095040, %ecx # imm = 0x80800000
187 ; WIN32-NEXT:    xorl %eax, %eax
188 ; WIN32-NEXT:    cmpl $-2139095040, %ecx # imm = 0x80800000
189 ; WIN32-NEXT:    jbe LBB2_7
190 ; WIN32-NEXT:  # %bb.6:
191 ; WIN32-NEXT:    addl $-126, %edx
192 ; WIN32-NEXT:    movl %edx, %eax
193 ; WIN32-NEXT:  LBB2_7:
194 ; WIN32-NEXT:    addl $8, %esp
195 ; WIN32-NEXT:    retl
196   %result = call { float, i32 } @llvm.frexp.f32.i32(float %a)
197   %result.0 = extractvalue { float, i32 } %result, 1
198   ret i32 %result.0
201 ; FIXME: Widen vector result
202 ; define { <2 x float>, <2 x i32> } @test_frexp_v2f32_v2i32(<2 x float> %a) {
203 ;   %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)
204 ;   ret { <2 x float>, <2 x i32> } %result
205 ; }
207 ; define <2 x float> @test_frexp_v2f32_v2i32_only_use_fract(<2 x float> %a) {
208 ;   %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)
209 ;   %result.0 = extractvalue { <2 x float>, <2 x i32> } %result, 0
210 ;   ret <2 x float> %result.0
211 ; }
213 ; define <2 x i32> @test_frexp_v2f32_v2i32_only_use_exp(<2 x float> %a) {
214 ;   %result = call { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float> %a)
215 ;   %result.1 = extractvalue { <2 x float>, <2 x i32> } %result, 1
216 ;   ret <2 x i32> %result.1
217 ; }
219 define { <4 x float>, <4 x i32> } @test_frexp_v4f32_v4i32(<4 x float> %a) {
220 ; X64-LABEL: test_frexp_v4f32_v4i32:
221 ; X64:       # %bb.0:
222 ; X64-NEXT:    subq $72, %rsp
223 ; X64-NEXT:    .cfi_def_cfa_offset 80
224 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
225 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
226 ; X64-NEXT:    movq %rsp, %rdi
227 ; X64-NEXT:    callq frexpf@PLT
228 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
229 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
230 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
231 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
232 ; X64-NEXT:    callq frexpf@PLT
233 ; X64-NEXT:    unpcklps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload
234 ; X64-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
235 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
236 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
237 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
238 ; X64-NEXT:    callq frexpf@PLT
239 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
240 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
241 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
242 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
243 ; X64-NEXT:    callq frexpf@PLT
244 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
245 ; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
246 ; X64-NEXT:    unpcklpd {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
247 ; X64-NEXT:    # xmm1 = xmm1[0],mem[0]
248 ; X64-NEXT:    movaps %xmm1, %xmm0
249 ; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
250 ; X64-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
251 ; X64-NEXT:    unpcklps {{.*#+}} xmm2 = xmm2[0],xmm1[0],xmm2[1],xmm1[1]
252 ; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
253 ; X64-NEXT:    movss {{.*#+}} xmm3 = mem[0],zero,zero,zero
254 ; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1]
255 ; X64-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm2[0]
256 ; X64-NEXT:    addq $72, %rsp
257 ; X64-NEXT:    .cfi_def_cfa_offset 8
258 ; X64-NEXT:    retq
260 ; WIN32-LABEL: test_frexp_v4f32_v4i32:
261 ; WIN32:       # %bb.0:
262 ; WIN32-NEXT:    pushl %ebp
263 ; WIN32-NEXT:    pushl %ebx
264 ; WIN32-NEXT:    pushl %edi
265 ; WIN32-NEXT:    pushl %esi
266 ; WIN32-NEXT:    subl $68, %esp
267 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
268 ; WIN32-NEXT:    flds __real@4c000000
269 ; WIN32-NEXT:    fld %st(1)
270 ; WIN32-NEXT:    fmul %st(1), %st
271 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
272 ; WIN32-NEXT:    fxch %st(1)
273 ; WIN32-NEXT:    fsts {{[0-9]+}}(%esp)
274 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
275 ; WIN32-NEXT:    movl %ebx, %eax
276 ; WIN32-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
277 ; WIN32-NEXT:    cmpl $8388608, %eax # imm = 0x800000
278 ; WIN32-NEXT:    jb LBB3_1
279 ; WIN32-NEXT:  # %bb.2:
280 ; WIN32-NEXT:    movl %eax, %ecx
281 ; WIN32-NEXT:    jmp LBB3_3
282 ; WIN32-NEXT:  LBB3_1:
283 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
284 ; WIN32-NEXT:    movl %ebx, %ecx
285 ; WIN32-NEXT:    andl $2139095040, %ecx # imm = 0x7F800000
286 ; WIN32-NEXT:  LBB3_3:
287 ; WIN32-NEXT:    shrl $23, %ecx
288 ; WIN32-NEXT:    cmpl $8388608, %eax # imm = 0x800000
289 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
290 ; WIN32-NEXT:    fld %st(0)
291 ; WIN32-NEXT:    fmul %st(3), %st
292 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
293 ; WIN32-NEXT:    fsts {{[0-9]+}}(%esp)
294 ; WIN32-NEXT:    jae LBB3_5
295 ; WIN32-NEXT:  # %bb.4:
296 ; WIN32-NEXT:    addl $-25, %ecx
297 ; WIN32-NEXT:  LBB3_5:
298 ; WIN32-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
299 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
300 ; WIN32-NEXT:    movl %ecx, %edx
301 ; WIN32-NEXT:    andl $2147483647, %edx # imm = 0x7FFFFFFF
302 ; WIN32-NEXT:    cmpl $8388608, %edx # imm = 0x800000
303 ; WIN32-NEXT:    jb LBB3_6
304 ; WIN32-NEXT:  # %bb.7:
305 ; WIN32-NEXT:    movl %edx, %esi
306 ; WIN32-NEXT:    jmp LBB3_8
307 ; WIN32-NEXT:  LBB3_6:
308 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
309 ; WIN32-NEXT:    movl %ecx, %esi
310 ; WIN32-NEXT:    andl $2139095040, %esi # imm = 0x7F800000
311 ; WIN32-NEXT:  LBB3_8:
312 ; WIN32-NEXT:    shrl $23, %esi
313 ; WIN32-NEXT:    cmpl $8388608, %edx # imm = 0x800000
314 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
315 ; WIN32-NEXT:    fld %st(0)
316 ; WIN32-NEXT:    fmul %st(4), %st
317 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
318 ; WIN32-NEXT:    fsts {{[0-9]+}}(%esp)
319 ; WIN32-NEXT:    jae LBB3_10
320 ; WIN32-NEXT:  # %bb.9:
321 ; WIN32-NEXT:    addl $-25, %esi
322 ; WIN32-NEXT:  LBB3_10:
323 ; WIN32-NEXT:    movl %esi, (%esp) # 4-byte Spill
324 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
325 ; WIN32-NEXT:    movl %edi, %ebp
326 ; WIN32-NEXT:    andl $2147483647, %ebp # imm = 0x7FFFFFFF
327 ; WIN32-NEXT:    cmpl $8388608, %ebp # imm = 0x800000
328 ; WIN32-NEXT:    jb LBB3_11
329 ; WIN32-NEXT:  # %bb.12:
330 ; WIN32-NEXT:    movl %ebp, %esi
331 ; WIN32-NEXT:    jmp LBB3_13
332 ; WIN32-NEXT:  LBB3_11:
333 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
334 ; WIN32-NEXT:    movl %edi, %esi
335 ; WIN32-NEXT:    andl $2139095040, %esi # imm = 0x7F800000
336 ; WIN32-NEXT:  LBB3_13:
337 ; WIN32-NEXT:    shrl $23, %esi
338 ; WIN32-NEXT:    cmpl $8388608, %ebp # imm = 0x800000
339 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
340 ; WIN32-NEXT:    fmul %st, %st(4)
341 ; WIN32-NEXT:    fxch %st(4)
342 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
343 ; WIN32-NEXT:    fxch %st(3)
344 ; WIN32-NEXT:    fsts {{[0-9]+}}(%esp)
345 ; WIN32-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
346 ; WIN32-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
347 ; WIN32-NEXT:    jae LBB3_15
348 ; WIN32-NEXT:  # %bb.14:
349 ; WIN32-NEXT:    addl $-25, %esi
350 ; WIN32-NEXT:  LBB3_15:
351 ; WIN32-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
352 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
353 ; WIN32-NEXT:    movl %eax, %edx
354 ; WIN32-NEXT:    andl $2147483647, %edx # imm = 0x7FFFFFFF
355 ; WIN32-NEXT:    cmpl $8388608, %edx # imm = 0x800000
356 ; WIN32-NEXT:    jb LBB3_16
357 ; WIN32-NEXT:  # %bb.17:
358 ; WIN32-NEXT:    movl %edx, %esi
359 ; WIN32-NEXT:    jmp LBB3_18
360 ; WIN32-NEXT:  LBB3_16:
361 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
362 ; WIN32-NEXT:    movl %eax, %esi
363 ; WIN32-NEXT:    andl $2139095040, %esi # imm = 0x7F800000
364 ; WIN32-NEXT:  LBB3_18:
365 ; WIN32-NEXT:    shrl $23, %esi
366 ; WIN32-NEXT:    cmpl $8388608, %edx # imm = 0x800000
367 ; WIN32-NEXT:    jae LBB3_20
368 ; WIN32-NEXT:  # %bb.19:
369 ; WIN32-NEXT:    addl $-25, %esi
370 ; WIN32-NEXT:  LBB3_20:
371 ; WIN32-NEXT:    andl $-2139095041, %eax # imm = 0x807FFFFF
372 ; WIN32-NEXT:    orl $1056964608, %eax # imm = 0x3F000000
373 ; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
374 ; WIN32-NEXT:    andl $-2139095041, %ebx # imm = 0x807FFFFF
375 ; WIN32-NEXT:    orl $1056964608, %ebx # imm = 0x3F000000
376 ; WIN32-NEXT:    movl %ebx, {{[0-9]+}}(%esp)
377 ; WIN32-NEXT:    andl $-2139095041, %ecx # imm = 0x807FFFFF
378 ; WIN32-NEXT:    orl $1056964608, %ecx # imm = 0x3F000000
379 ; WIN32-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
380 ; WIN32-NEXT:    andl $-2139095041, %edi # imm = 0x807FFFFF
381 ; WIN32-NEXT:    orl $1056964608, %edi # imm = 0x3F000000
382 ; WIN32-NEXT:    movl %edi, {{[0-9]+}}(%esp)
383 ; WIN32-NEXT:    addl $-126, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
384 ; WIN32-NEXT:    addl $-126, (%esp) # 4-byte Folded Spill
385 ; WIN32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
386 ; WIN32-NEXT:    addl $-126, %ecx
387 ; WIN32-NEXT:    addl $-126, %esi
388 ; WIN32-NEXT:    addl $-2139095040, %edx # imm = 0x80800000
389 ; WIN32-NEXT:    xorl %edi, %edi
390 ; WIN32-NEXT:    cmpl $-2139095040, %edx # imm = 0x80800000
391 ; WIN32-NEXT:    movl $0, %ebx
392 ; WIN32-NEXT:    jbe LBB3_22
393 ; WIN32-NEXT:  # %bb.21:
394 ; WIN32-NEXT:    movl %esi, %ebx
395 ; WIN32-NEXT:  LBB3_22:
396 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
397 ; WIN32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
398 ; WIN32-NEXT:    jbe LBB3_24
399 ; WIN32-NEXT:  # %bb.23:
400 ; WIN32-NEXT:    fstp %st(1)
401 ; WIN32-NEXT:    fldz
402 ; WIN32-NEXT:  LBB3_24:
403 ; WIN32-NEXT:    fstp %st(0)
404 ; WIN32-NEXT:    addl $-2139095040, %eax # imm = 0x80800000
405 ; WIN32-NEXT:    cmpl $-2139095040, %eax # imm = 0x80800000
406 ; WIN32-NEXT:    movl $0, %edx
407 ; WIN32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
408 ; WIN32-NEXT:    jbe LBB3_26
409 ; WIN32-NEXT:  # %bb.25:
410 ; WIN32-NEXT:    movl %ecx, %edx
411 ; WIN32-NEXT:  LBB3_26:
412 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
413 ; WIN32-NEXT:    jbe LBB3_28
414 ; WIN32-NEXT:  # %bb.27:
415 ; WIN32-NEXT:    fstp %st(3)
416 ; WIN32-NEXT:    fldz
417 ; WIN32-NEXT:  LBB3_28:
418 ; WIN32-NEXT:    fstp %st(0)
419 ; WIN32-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
420 ; WIN32-NEXT:    addl $-2139095040, %eax # imm = 0x80800000
421 ; WIN32-NEXT:    cmpl $-2139095040, %eax # imm = 0x80800000
422 ; WIN32-NEXT:    movl $0, %ecx
423 ; WIN32-NEXT:    jbe LBB3_30
424 ; WIN32-NEXT:  # %bb.29:
425 ; WIN32-NEXT:    movl (%esp), %ecx # 4-byte Reload
426 ; WIN32-NEXT:  LBB3_30:
427 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
428 ; WIN32-NEXT:    jbe LBB3_32
429 ; WIN32-NEXT:  # %bb.31:
430 ; WIN32-NEXT:    fstp %st(2)
431 ; WIN32-NEXT:    fldz
432 ; WIN32-NEXT:  LBB3_32:
433 ; WIN32-NEXT:    fstp %st(0)
434 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
435 ; WIN32-NEXT:    addl $-2139095040, %ebp # imm = 0x80800000
436 ; WIN32-NEXT:    cmpl $-2139095040, %ebp # imm = 0x80800000
437 ; WIN32-NEXT:    jbe LBB3_34
438 ; WIN32-NEXT:  # %bb.33:
439 ; WIN32-NEXT:    movl %esi, %edi
440 ; WIN32-NEXT:  LBB3_34:
441 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
442 ; WIN32-NEXT:    jbe LBB3_36
443 ; WIN32-NEXT:  # %bb.35:
444 ; WIN32-NEXT:    fstp %st(4)
445 ; WIN32-NEXT:    fldz
446 ; WIN32-NEXT:  LBB3_36:
447 ; WIN32-NEXT:    fstp %st(0)
448 ; WIN32-NEXT:    movl %edi, 28(%eax)
449 ; WIN32-NEXT:    movl %ecx, 24(%eax)
450 ; WIN32-NEXT:    movl %edx, 20(%eax)
451 ; WIN32-NEXT:    movl %ebx, 16(%eax)
452 ; WIN32-NEXT:    fxch %st(3)
453 ; WIN32-NEXT:    fstps 12(%eax)
454 ; WIN32-NEXT:    fstps 8(%eax)
455 ; WIN32-NEXT:    fstps 4(%eax)
456 ; WIN32-NEXT:    fstps (%eax)
457 ; WIN32-NEXT:    addl $68, %esp
458 ; WIN32-NEXT:    popl %esi
459 ; WIN32-NEXT:    popl %edi
460 ; WIN32-NEXT:    popl %ebx
461 ; WIN32-NEXT:    popl %ebp
462 ; WIN32-NEXT:    retl
463   %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
464   ret { <4 x float>, <4 x i32> } %result
467 define <4 x float> @test_frexp_v4f32_v4i32_only_use_fract(<4 x float> %a) {
468 ; X64-LABEL: test_frexp_v4f32_v4i32_only_use_fract:
469 ; X64:       # %bb.0:
470 ; X64-NEXT:    subq $72, %rsp
471 ; X64-NEXT:    .cfi_def_cfa_offset 80
472 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
473 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
474 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
475 ; X64-NEXT:    callq frexpf@PLT
476 ; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
477 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
478 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
479 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
480 ; X64-NEXT:    callq frexpf@PLT
481 ; X64-NEXT:    unpcklps (%rsp), %xmm0 # 16-byte Folded Reload
482 ; X64-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
483 ; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill
484 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
485 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
486 ; X64-NEXT:    callq frexpf@PLT
487 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
488 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
489 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
490 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
491 ; X64-NEXT:    callq frexpf@PLT
492 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
493 ; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
494 ; X64-NEXT:    unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload
495 ; X64-NEXT:    # xmm1 = xmm1[0],mem[0]
496 ; X64-NEXT:    movaps %xmm1, %xmm0
497 ; X64-NEXT:    addq $72, %rsp
498 ; X64-NEXT:    .cfi_def_cfa_offset 8
499 ; X64-NEXT:    retq
501 ; WIN32-LABEL: test_frexp_v4f32_v4i32_only_use_fract:
502 ; WIN32:       # %bb.0:
503 ; WIN32-NEXT:    pushl %edi
504 ; WIN32-NEXT:    pushl %esi
505 ; WIN32-NEXT:    subl $48, %esp
506 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
507 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
508 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
509 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
510 ; WIN32-NEXT:    fsts {{[0-9]+}}(%esp)
511 ; WIN32-NEXT:    flds __real@4c000000
512 ; WIN32-NEXT:    fld %st(1)
513 ; WIN32-NEXT:    fmul %st(1), %st
514 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
515 ; WIN32-NEXT:    fxch %st(2)
516 ; WIN32-NEXT:    fsts {{[0-9]+}}(%esp)
517 ; WIN32-NEXT:    fld %st(0)
518 ; WIN32-NEXT:    fmul %st(3), %st
519 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
520 ; WIN32-NEXT:    fxch %st(3)
521 ; WIN32-NEXT:    fsts {{[0-9]+}}(%esp)
522 ; WIN32-NEXT:    fld %st(0)
523 ; WIN32-NEXT:    fmul %st(3), %st
524 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
525 ; WIN32-NEXT:    fxch %st(4)
526 ; WIN32-NEXT:    fsts (%esp)
527 ; WIN32-NEXT:    fmul %st, %st(2)
528 ; WIN32-NEXT:    fxch %st(2)
529 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
530 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
531 ; WIN32-NEXT:    movl %ecx, %eax
532 ; WIN32-NEXT:    andl $2147483647, %eax # imm = 0x7FFFFFFF
533 ; WIN32-NEXT:    cmpl $8388608, %eax # imm = 0x800000
534 ; WIN32-NEXT:    jae LBB4_2
535 ; WIN32-NEXT:  # %bb.1:
536 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ecx
537 ; WIN32-NEXT:  LBB4_2:
538 ; WIN32-NEXT:    andl $-2139095041, %ecx # imm = 0x807FFFFF
539 ; WIN32-NEXT:    orl $1056964608, %ecx # imm = 0x3F000000
540 ; WIN32-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
541 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edx
542 ; WIN32-NEXT:    movl %edx, %ecx
543 ; WIN32-NEXT:    andl $2147483647, %ecx # imm = 0x7FFFFFFF
544 ; WIN32-NEXT:    cmpl $8388608, %ecx # imm = 0x800000
545 ; WIN32-NEXT:    jae LBB4_4
546 ; WIN32-NEXT:  # %bb.3:
547 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edx
548 ; WIN32-NEXT:  LBB4_4:
549 ; WIN32-NEXT:    andl $-2139095041, %edx # imm = 0x807FFFFF
550 ; WIN32-NEXT:    orl $1056964608, %edx # imm = 0x3F000000
551 ; WIN32-NEXT:    movl %edx, {{[0-9]+}}(%esp)
552 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
553 ; WIN32-NEXT:    movl %esi, %edx
554 ; WIN32-NEXT:    andl $2147483647, %edx # imm = 0x7FFFFFFF
555 ; WIN32-NEXT:    cmpl $8388608, %edx # imm = 0x800000
556 ; WIN32-NEXT:    jae LBB4_6
557 ; WIN32-NEXT:  # %bb.5:
558 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
559 ; WIN32-NEXT:  LBB4_6:
560 ; WIN32-NEXT:    andl $-2139095041, %esi # imm = 0x807FFFFF
561 ; WIN32-NEXT:    orl $1056964608, %esi # imm = 0x3F000000
562 ; WIN32-NEXT:    movl %esi, {{[0-9]+}}(%esp)
563 ; WIN32-NEXT:    movl (%esp), %edi
564 ; WIN32-NEXT:    movl %edi, %esi
565 ; WIN32-NEXT:    andl $2147483647, %esi # imm = 0x7FFFFFFF
566 ; WIN32-NEXT:    cmpl $8388608, %esi # imm = 0x800000
567 ; WIN32-NEXT:    jae LBB4_8
568 ; WIN32-NEXT:  # %bb.7:
569 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
570 ; WIN32-NEXT:  LBB4_8:
571 ; WIN32-NEXT:    andl $-2139095041, %edi # imm = 0x807FFFFF
572 ; WIN32-NEXT:    orl $1056964608, %edi # imm = 0x3F000000
573 ; WIN32-NEXT:    movl %edi, {{[0-9]+}}(%esp)
574 ; WIN32-NEXT:    addl $-2139095040, %eax # imm = 0x80800000
575 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
576 ; WIN32-NEXT:    cmpl $-2139095040, %eax # imm = 0x80800000
577 ; WIN32-NEXT:    jbe LBB4_10
578 ; WIN32-NEXT:  # %bb.9:
579 ; WIN32-NEXT:    fstp %st(1)
580 ; WIN32-NEXT:    fldz
581 ; WIN32-NEXT:  LBB4_10:
582 ; WIN32-NEXT:    fstp %st(0)
583 ; WIN32-NEXT:    addl $-2139095040, %ecx # imm = 0x80800000
584 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
585 ; WIN32-NEXT:    cmpl $-2139095040, %ecx # imm = 0x80800000
586 ; WIN32-NEXT:    jbe LBB4_12
587 ; WIN32-NEXT:  # %bb.11:
588 ; WIN32-NEXT:    fstp %st(3)
589 ; WIN32-NEXT:    fldz
590 ; WIN32-NEXT:  LBB4_12:
591 ; WIN32-NEXT:    fstp %st(0)
592 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
593 ; WIN32-NEXT:    addl $-2139095040, %edx # imm = 0x80800000
594 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
595 ; WIN32-NEXT:    cmpl $-2139095040, %edx # imm = 0x80800000
596 ; WIN32-NEXT:    jbe LBB4_14
597 ; WIN32-NEXT:  # %bb.13:
598 ; WIN32-NEXT:    fstp %st(4)
599 ; WIN32-NEXT:    fldz
600 ; WIN32-NEXT:  LBB4_14:
601 ; WIN32-NEXT:    fstp %st(0)
602 ; WIN32-NEXT:    addl $-2139095040, %esi # imm = 0x80800000
603 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
604 ; WIN32-NEXT:    cmpl $-2139095040, %esi # imm = 0x80800000
605 ; WIN32-NEXT:    jbe LBB4_16
606 ; WIN32-NEXT:  # %bb.15:
607 ; WIN32-NEXT:    fstp %st(2)
608 ; WIN32-NEXT:    fldz
609 ; WIN32-NEXT:  LBB4_16:
610 ; WIN32-NEXT:    fstp %st(0)
611 ; WIN32-NEXT:    fxch %st(1)
612 ; WIN32-NEXT:    fstps 12(%eax)
613 ; WIN32-NEXT:    fxch %st(2)
614 ; WIN32-NEXT:    fstps 8(%eax)
615 ; WIN32-NEXT:    fstps 4(%eax)
616 ; WIN32-NEXT:    fstps (%eax)
617 ; WIN32-NEXT:    addl $48, %esp
618 ; WIN32-NEXT:    popl %esi
619 ; WIN32-NEXT:    popl %edi
620 ; WIN32-NEXT:    retl
621   %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
622   %result.0 = extractvalue { <4 x float>, <4 x i32> } %result, 0
623   ret <4 x float> %result.0
626 define <4 x i32> @test_frexp_v4f32_v4i32_only_use_exp(<4 x float> %a) {
627 ; X64-LABEL: test_frexp_v4f32_v4i32_only_use_exp:
628 ; X64:       # %bb.0:
629 ; X64-NEXT:    subq $40, %rsp
630 ; X64-NEXT:    .cfi_def_cfa_offset 48
631 ; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
632 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
633 ; X64-NEXT:    movq %rsp, %rdi
634 ; X64-NEXT:    callq frexpf@PLT
635 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
636 ; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]
637 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
638 ; X64-NEXT:    callq frexpf@PLT
639 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
640 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
641 ; X64-NEXT:    callq frexpf@PLT
642 ; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
643 ; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
644 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
645 ; X64-NEXT:    callq frexpf@PLT
646 ; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
647 ; X64-NEXT:    movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
648 ; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
649 ; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
650 ; X64-NEXT:    movss {{.*#+}} xmm2 = mem[0],zero,zero,zero
651 ; X64-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1]
652 ; X64-NEXT:    movlhps {{.*#+}} xmm0 = xmm0[0],xmm1[0]
653 ; X64-NEXT:    addq $40, %rsp
654 ; X64-NEXT:    .cfi_def_cfa_offset 8
655 ; X64-NEXT:    retq
657 ; WIN32-LABEL: test_frexp_v4f32_v4i32_only_use_exp:
658 ; WIN32:       # %bb.0:
659 ; WIN32-NEXT:    pushl %ebp
660 ; WIN32-NEXT:    pushl %ebx
661 ; WIN32-NEXT:    pushl %edi
662 ; WIN32-NEXT:    pushl %esi
663 ; WIN32-NEXT:    subl $36, %esp
664 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
665 ; WIN32-NEXT:    flds __real@4c000000
666 ; WIN32-NEXT:    fld %st(1)
667 ; WIN32-NEXT:    fmul %st(1), %st
668 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
669 ; WIN32-NEXT:    fxch %st(1)
670 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
671 ; WIN32-NEXT:    movl $2139095040, %ecx # imm = 0x7F800000
672 ; WIN32-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
673 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
674 ; WIN32-NEXT:    andl %edx, %eax
675 ; WIN32-NEXT:    cmpl $8388608, %eax # imm = 0x800000
676 ; WIN32-NEXT:    jb LBB5_1
677 ; WIN32-NEXT:  # %bb.2:
678 ; WIN32-NEXT:    movl %eax, %esi
679 ; WIN32-NEXT:    jmp LBB5_3
680 ; WIN32-NEXT:  LBB5_1:
681 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
682 ; WIN32-NEXT:    andl %ecx, %esi
683 ; WIN32-NEXT:  LBB5_3:
684 ; WIN32-NEXT:    shrl $23, %esi
685 ; WIN32-NEXT:    cmpl $8388608, %eax # imm = 0x800000
686 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
687 ; WIN32-NEXT:    fld %st(0)
688 ; WIN32-NEXT:    fmul %st(2), %st
689 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
690 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
691 ; WIN32-NEXT:    jae LBB5_5
692 ; WIN32-NEXT:  # %bb.4:
693 ; WIN32-NEXT:    addl $-25, %esi
694 ; WIN32-NEXT:  LBB5_5:
695 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi
696 ; WIN32-NEXT:    andl %edx, %edi
697 ; WIN32-NEXT:    cmpl $8388608, %edi # imm = 0x800000
698 ; WIN32-NEXT:    jb LBB5_6
699 ; WIN32-NEXT:  # %bb.7:
700 ; WIN32-NEXT:    movl %edi, %ebx
701 ; WIN32-NEXT:    jmp LBB5_8
702 ; WIN32-NEXT:  LBB5_6:
703 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebx
704 ; WIN32-NEXT:    andl %ecx, %ebx
705 ; WIN32-NEXT:  LBB5_8:
706 ; WIN32-NEXT:    shrl $23, %ebx
707 ; WIN32-NEXT:    cmpl $8388608, %edi # imm = 0x800000
708 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
709 ; WIN32-NEXT:    fld %st(0)
710 ; WIN32-NEXT:    fmul %st(2), %st
711 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
712 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
713 ; WIN32-NEXT:    jae LBB5_10
714 ; WIN32-NEXT:  # %bb.9:
715 ; WIN32-NEXT:    addl $-25, %ebx
716 ; WIN32-NEXT:  LBB5_10:
717 ; WIN32-NEXT:    movl %esi, (%esp) # 4-byte Spill
718 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebp
719 ; WIN32-NEXT:    andl %edx, %ebp
720 ; WIN32-NEXT:    cmpl $8388608, %ebp # imm = 0x800000
721 ; WIN32-NEXT:    jb LBB5_11
722 ; WIN32-NEXT:  # %bb.12:
723 ; WIN32-NEXT:    movl %ebp, %esi
724 ; WIN32-NEXT:    jmp LBB5_13
725 ; WIN32-NEXT:  LBB5_11:
726 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi
727 ; WIN32-NEXT:    andl %ecx, %esi
728 ; WIN32-NEXT:  LBB5_13:
729 ; WIN32-NEXT:    shrl $23, %esi
730 ; WIN32-NEXT:    cmpl $8388608, %ebp # imm = 0x800000
731 ; WIN32-NEXT:    flds {{[0-9]+}}(%esp)
732 ; WIN32-NEXT:    fmul %st, %st(1)
733 ; WIN32-NEXT:    fxch %st(1)
734 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
735 ; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)
736 ; WIN32-NEXT:    jae LBB5_15
737 ; WIN32-NEXT:  # %bb.14:
738 ; WIN32-NEXT:    addl $-25, %esi
739 ; WIN32-NEXT:  LBB5_15:
740 ; WIN32-NEXT:    andl {{[0-9]+}}(%esp), %edx
741 ; WIN32-NEXT:    cmpl $8388608, %edx # imm = 0x800000
742 ; WIN32-NEXT:    jb LBB5_16
743 ; WIN32-NEXT:  # %bb.17:
744 ; WIN32-NEXT:    movl %edx, %ecx
745 ; WIN32-NEXT:    jmp LBB5_18
746 ; WIN32-NEXT:  LBB5_16:
747 ; WIN32-NEXT:    andl {{[0-9]+}}(%esp), %ecx
748 ; WIN32-NEXT:  LBB5_18:
749 ; WIN32-NEXT:    shrl $23, %ecx
750 ; WIN32-NEXT:    cmpl $8388608, %edx # imm = 0x800000
751 ; WIN32-NEXT:    jae LBB5_20
752 ; WIN32-NEXT:  # %bb.19:
753 ; WIN32-NEXT:    addl $-25, %ecx
754 ; WIN32-NEXT:  LBB5_20:
755 ; WIN32-NEXT:    addl $-2139095040, %eax # imm = 0x80800000
756 ; WIN32-NEXT:    cmpl $-2139095040, %eax # imm = 0x80800000
757 ; WIN32-NEXT:    movl $0, %eax
758 ; WIN32-NEXT:    jbe LBB5_22
759 ; WIN32-NEXT:  # %bb.21:
760 ; WIN32-NEXT:    movl (%esp), %eax # 4-byte Reload
761 ; WIN32-NEXT:    addl $-126, %eax
762 ; WIN32-NEXT:  LBB5_22:
763 ; WIN32-NEXT:    movl %eax, (%esp) # 4-byte Spill
764 ; WIN32-NEXT:    addl $-2139095040, %edi # imm = 0x80800000
765 ; WIN32-NEXT:    cmpl $-2139095040, %edi # imm = 0x80800000
766 ; WIN32-NEXT:    movl $0, %edi
767 ; WIN32-NEXT:    jbe LBB5_24
768 ; WIN32-NEXT:  # %bb.23:
769 ; WIN32-NEXT:    addl $-126, %ebx
770 ; WIN32-NEXT:    movl %ebx, %edi
771 ; WIN32-NEXT:  LBB5_24:
772 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
773 ; WIN32-NEXT:    addl $-2139095040, %ebp # imm = 0x80800000
774 ; WIN32-NEXT:    cmpl $-2139095040, %ebp # imm = 0x80800000
775 ; WIN32-NEXT:    movl $0, %ebx
776 ; WIN32-NEXT:    jbe LBB5_26
777 ; WIN32-NEXT:  # %bb.25:
778 ; WIN32-NEXT:    addl $-126, %esi
779 ; WIN32-NEXT:    movl %esi, %ebx
780 ; WIN32-NEXT:  LBB5_26:
781 ; WIN32-NEXT:    addl $-2139095040, %edx # imm = 0x80800000
782 ; WIN32-NEXT:    cmpl $-2139095040, %edx # imm = 0x80800000
783 ; WIN32-NEXT:    movl $0, %edx
784 ; WIN32-NEXT:    jbe LBB5_28
785 ; WIN32-NEXT:  # %bb.27:
786 ; WIN32-NEXT:    addl $-126, %ecx
787 ; WIN32-NEXT:    movl %ecx, %edx
788 ; WIN32-NEXT:  LBB5_28:
789 ; WIN32-NEXT:    movl %edx, 12(%eax)
790 ; WIN32-NEXT:    movl %ebx, 8(%eax)
791 ; WIN32-NEXT:    movl %edi, 4(%eax)
792 ; WIN32-NEXT:    movl (%esp), %ecx # 4-byte Reload
793 ; WIN32-NEXT:    movl %ecx, (%eax)
794 ; WIN32-NEXT:    addl $36, %esp
795 ; WIN32-NEXT:    popl %esi
796 ; WIN32-NEXT:    popl %edi
797 ; WIN32-NEXT:    popl %ebx
798 ; WIN32-NEXT:    popl %ebp
799 ; WIN32-NEXT:    retl
800   %result = call { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float> %a)
801   %result.1 = extractvalue { <4 x float>, <4 x i32> } %result, 1
802   ret <4 x i32> %result.1
805 define { double, i32 } @test_frexp_f64_i32(double %a) {
806 ; X64-LABEL: test_frexp_f64_i32:
807 ; X64:       # %bb.0:
808 ; X64-NEXT:    pushq %rax
809 ; X64-NEXT:    .cfi_def_cfa_offset 16
810 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
811 ; X64-NEXT:    callq frexp@PLT
812 ; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
813 ; X64-NEXT:    popq %rcx
814 ; X64-NEXT:    .cfi_def_cfa_offset 8
815 ; X64-NEXT:    retq
817 ; WIN32-LABEL: test_frexp_f64_i32:
818 ; WIN32:       # %bb.0:
819 ; WIN32-NEXT:    subl $16, %esp
820 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
821 ; WIN32-NEXT:    leal {{[0-9]+}}(%esp), %eax
822 ; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
823 ; WIN32-NEXT:    fstpl (%esp)
824 ; WIN32-NEXT:    calll _frexp
825 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
826 ; WIN32-NEXT:    addl $16, %esp
827 ; WIN32-NEXT:    retl
828   %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)
829   ret { double, i32 } %result
832 define double @test_frexp_f64_i32_only_use_fract(double %a) {
833 ; X64-LABEL: test_frexp_f64_i32_only_use_fract:
834 ; X64:       # %bb.0:
835 ; X64-NEXT:    pushq %rax
836 ; X64-NEXT:    .cfi_def_cfa_offset 16
837 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
838 ; X64-NEXT:    callq frexp@PLT
839 ; X64-NEXT:    popq %rax
840 ; X64-NEXT:    .cfi_def_cfa_offset 8
841 ; X64-NEXT:    retq
843 ; WIN32-LABEL: test_frexp_f64_i32_only_use_fract:
844 ; WIN32:       # %bb.0:
845 ; WIN32-NEXT:    subl $16, %esp
846 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
847 ; WIN32-NEXT:    leal {{[0-9]+}}(%esp), %eax
848 ; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
849 ; WIN32-NEXT:    fstpl (%esp)
850 ; WIN32-NEXT:    calll _frexp
851 ; WIN32-NEXT:    addl $16, %esp
852 ; WIN32-NEXT:    retl
853   %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)
854   %result.0 = extractvalue { double, i32 } %result, 0
855   ret double %result.0
858 define i32 @test_frexp_f64_i32_only_use_exp(double %a) {
859 ; X64-LABEL: test_frexp_f64_i32_only_use_exp:
860 ; X64:       # %bb.0:
861 ; X64-NEXT:    pushq %rax
862 ; X64-NEXT:    .cfi_def_cfa_offset 16
863 ; X64-NEXT:    leaq {{[0-9]+}}(%rsp), %rdi
864 ; X64-NEXT:    callq frexp@PLT
865 ; X64-NEXT:    movl {{[0-9]+}}(%rsp), %eax
866 ; X64-NEXT:    popq %rcx
867 ; X64-NEXT:    .cfi_def_cfa_offset 8
868 ; X64-NEXT:    retq
870 ; WIN32-LABEL: test_frexp_f64_i32_only_use_exp:
871 ; WIN32:       # %bb.0:
872 ; WIN32-NEXT:    subl $16, %esp
873 ; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)
874 ; WIN32-NEXT:    leal {{[0-9]+}}(%esp), %eax
875 ; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)
876 ; WIN32-NEXT:    fstpl (%esp)
877 ; WIN32-NEXT:    calll _frexp
878 ; WIN32-NEXT:    fstp %st(0)
879 ; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax
880 ; WIN32-NEXT:    addl $16, %esp
881 ; WIN32-NEXT:    retl
882   %result = call { double, i32 } @llvm.frexp.f64.i32(double %a)
883   %result.0 = extractvalue { double, i32 } %result, 1
884   ret i32 %result.0
887 ; FIXME: Widen vector result
888 ; define { <2 x double>, <2 x i32> } @test_frexp_v2f64_v2i32(<2 x double> %a) {
889 ;   %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)
890 ;   ret { <2 x double>, <2 x i32> } %result
891 ; }
893 ; define <2 x double> @test_frexp_v2f64_v2i32_only_use_fract(<2 x double> %a) {
894 ;   %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)
895 ;   %result.0 = extractvalue { <2 x double>, <2 x i32> } %result, 0
896 ;   ret <2 x double> %result.0
897 ; }
899 ; define <2 x i32> @test_frexp_v2f64_v2i32_only_use_exp(<2 x double> %a) {
900 ;   %result = call { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double> %a)
901 ;   %result.1 = extractvalue { <2 x double>, <2 x i32> } %result, 1
902 ;   ret <2 x i32> %result.1
903 ; }
905 declare { float, i32 } @llvm.frexp.f32.i32(float) #0
906 declare { <2 x float>, <2 x i32> } @llvm.frexp.v2f32.v2i32(<2 x float>) #0
907 declare { <4 x float>, <4 x i32> } @llvm.frexp.v4f32.v4i32(<4 x float>) #0
909 declare { half, i32 } @llvm.frexp.f16.i32(half) #0
910 declare { <2 x half>, <2 x i32> } @llvm.frexp.v2f16.v2i32(<2 x half>) #0
912 declare { double, i32 } @llvm.frexp.f64.i32(double) #0
913 declare { <2 x double>, <2 x i32> } @llvm.frexp.v2f64.v2i32(<2 x double>) #0
915 declare { half, i16 } @llvm.frexp.f16.i16(half) #0
916 declare { <2 x half>, <2 x i16> } @llvm.frexp.v2f16.v2i16(<2 x half>) #0
918 attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }