xref: /llvm-project/llvm/test/CodeGen/X86/fp80-strict-scalar.ll (revision f0dd12ec5c0169ba5b4363b62d59511181cf954a)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-unknown-unknown -O3 | FileCheck %s --check-prefixes=X86
3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -O3 | FileCheck %s --check-prefixes=X64
4
5declare x86_fp80 @llvm.experimental.constrained.fadd.f80(x86_fp80, x86_fp80, metadata, metadata)
6declare x86_fp80 @llvm.experimental.constrained.fsub.f80(x86_fp80, x86_fp80, metadata, metadata)
7declare x86_fp80 @llvm.experimental.constrained.fmul.f80(x86_fp80, x86_fp80, metadata, metadata)
8declare x86_fp80 @llvm.experimental.constrained.fdiv.f80(x86_fp80, x86_fp80, metadata, metadata)
9declare x86_fp80 @llvm.experimental.constrained.fpext.f80.f32(float, metadata)
10declare x86_fp80 @llvm.experimental.constrained.fpext.f80.f64(double, metadata)
11declare x86_fp80 @llvm.experimental.constrained.sqrt.f80(x86_fp80, metadata, metadata)
12declare float @llvm.experimental.constrained.fptrunc.f32.f80(x86_fp80, metadata, metadata)
13declare double @llvm.experimental.constrained.fptrunc.f64.f80(x86_fp80, metadata, metadata)
14declare i1  @llvm.experimental.constrained.fptosi.i1.f80(x86_fp80, metadata)
15declare i8  @llvm.experimental.constrained.fptosi.i8.f80(x86_fp80, metadata)
16declare i16 @llvm.experimental.constrained.fptosi.i16.f80(x86_fp80, metadata)
17declare i32 @llvm.experimental.constrained.fptosi.i32.f80(x86_fp80, metadata)
18declare i64 @llvm.experimental.constrained.fptosi.i64.f80(x86_fp80, metadata)
19declare i1 @llvm.experimental.constrained.fptoui.i1.f80(x86_fp80, metadata)
20declare i8  @llvm.experimental.constrained.fptoui.i8.f80(x86_fp80, metadata)
21declare i16 @llvm.experimental.constrained.fptoui.i16.f80(x86_fp80, metadata)
22declare i32 @llvm.experimental.constrained.fptoui.i32.f80(x86_fp80, metadata)
23declare i64 @llvm.experimental.constrained.fptoui.i64.f80(x86_fp80, metadata)
24declare x86_fp80 @llvm.experimental.constrained.sitofp.f80.i1(i1, metadata, metadata)
25declare x86_fp80 @llvm.experimental.constrained.sitofp.f80.i8(i8, metadata, metadata)
26declare x86_fp80 @llvm.experimental.constrained.sitofp.f80.i16(i16, metadata, metadata)
27declare x86_fp80 @llvm.experimental.constrained.sitofp.f80.i32(i32, metadata, metadata)
28declare x86_fp80 @llvm.experimental.constrained.sitofp.f80.i64(i64, metadata, metadata)
29declare x86_fp80 @llvm.experimental.constrained.uitofp.f80.i1(i1, metadata, metadata)
30declare x86_fp80 @llvm.experimental.constrained.uitofp.f80.i8(i8, metadata, metadata)
31declare x86_fp80 @llvm.experimental.constrained.uitofp.f80.i16(i16, metadata, metadata)
32declare x86_fp80 @llvm.experimental.constrained.uitofp.f80.i32(i32, metadata, metadata)
33declare x86_fp80 @llvm.experimental.constrained.uitofp.f80.i64(i64, metadata, metadata)
34
35define x86_fp80 @fadd_fp80(x86_fp80 %a, x86_fp80 %b) nounwind strictfp {
36; X86-LABEL: fadd_fp80:
37; X86:       # %bb.0:
38; X86-NEXT:    fldt {{[0-9]+}}(%esp)
39; X86-NEXT:    fldt {{[0-9]+}}(%esp)
40; X86-NEXT:    faddp %st, %st(1)
41; X86-NEXT:    wait
42; X86-NEXT:    retl
43;
44; X64-LABEL: fadd_fp80:
45; X64:       # %bb.0:
46; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
47; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
48; X64-NEXT:    faddp %st, %st(1)
49; X64-NEXT:    wait
50; X64-NEXT:    retq
51  %ret = call x86_fp80 @llvm.experimental.constrained.fadd.f80(x86_fp80 %a, x86_fp80 %b,
52                                                                    metadata !"round.dynamic",
53                                                                    metadata !"fpexcept.strict") #0
54  ret x86_fp80 %ret
55}
56
57define x86_fp80 @fsub_fp80(x86_fp80 %a, x86_fp80 %b) nounwind strictfp {
58; X86-LABEL: fsub_fp80:
59; X86:       # %bb.0:
60; X86-NEXT:    fldt {{[0-9]+}}(%esp)
61; X86-NEXT:    fldt {{[0-9]+}}(%esp)
62; X86-NEXT:    fsubp %st, %st(1)
63; X86-NEXT:    wait
64; X86-NEXT:    retl
65;
66; X64-LABEL: fsub_fp80:
67; X64:       # %bb.0:
68; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
69; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
70; X64-NEXT:    fsubp %st, %st(1)
71; X64-NEXT:    wait
72; X64-NEXT:    retq
73  %ret = call x86_fp80 @llvm.experimental.constrained.fsub.f80(x86_fp80 %a, x86_fp80 %b,
74                                                                    metadata !"round.dynamic",
75                                                                    metadata !"fpexcept.strict") #0
76  ret x86_fp80 %ret
77}
78
79define x86_fp80 @fmul_fp80(x86_fp80 %a, x86_fp80 %b) nounwind strictfp {
80; X86-LABEL: fmul_fp80:
81; X86:       # %bb.0:
82; X86-NEXT:    fldt {{[0-9]+}}(%esp)
83; X86-NEXT:    fldt {{[0-9]+}}(%esp)
84; X86-NEXT:    fmulp %st, %st(1)
85; X86-NEXT:    wait
86; X86-NEXT:    retl
87;
88; X64-LABEL: fmul_fp80:
89; X64:       # %bb.0:
90; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
91; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
92; X64-NEXT:    fmulp %st, %st(1)
93; X64-NEXT:    wait
94; X64-NEXT:    retq
95  %ret = call x86_fp80 @llvm.experimental.constrained.fmul.f80(x86_fp80 %a, x86_fp80 %b,
96                                                                    metadata !"round.dynamic",
97                                                                    metadata !"fpexcept.strict") #0
98  ret x86_fp80 %ret
99}
100
101define x86_fp80 @fdiv_fp80(x86_fp80 %a, x86_fp80 %b) nounwind strictfp {
102; X86-LABEL: fdiv_fp80:
103; X86:       # %bb.0:
104; X86-NEXT:    fldt {{[0-9]+}}(%esp)
105; X86-NEXT:    fldt {{[0-9]+}}(%esp)
106; X86-NEXT:    fdivp %st, %st(1)
107; X86-NEXT:    wait
108; X86-NEXT:    retl
109;
110; X64-LABEL: fdiv_fp80:
111; X64:       # %bb.0:
112; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
113; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
114; X64-NEXT:    fdivp %st, %st(1)
115; X64-NEXT:    wait
116; X64-NEXT:    retq
117  %ret = call x86_fp80 @llvm.experimental.constrained.fdiv.f80(x86_fp80 %a, x86_fp80 %b,
118                                                                    metadata !"round.dynamic",
119                                                                    metadata !"fpexcept.strict") #0
120  ret x86_fp80 %ret
121}
122
123define x86_fp80 @fpext_f32_to_fp80(float %a) nounwind strictfp {
124; X86-LABEL: fpext_f32_to_fp80:
125; X86:       # %bb.0:
126; X86-NEXT:    flds {{[0-9]+}}(%esp)
127; X86-NEXT:    wait
128; X86-NEXT:    retl
129;
130; X64-LABEL: fpext_f32_to_fp80:
131; X64:       # %bb.0:
132; X64-NEXT:    movss %xmm0, -{{[0-9]+}}(%rsp)
133; X64-NEXT:    flds -{{[0-9]+}}(%rsp)
134; X64-NEXT:    wait
135; X64-NEXT:    retq
136  %ret = call x86_fp80 @llvm.experimental.constrained.fpext.f80.f32(float %a,
137                                                                         metadata !"fpexcept.strict") #0
138  ret x86_fp80 %ret
139}
140
141define x86_fp80 @fpext_f64_to_fp80(double %a) nounwind strictfp {
142; X86-LABEL: fpext_f64_to_fp80:
143; X86:       # %bb.0:
144; X86-NEXT:    fldl {{[0-9]+}}(%esp)
145; X86-NEXT:    wait
146; X86-NEXT:    retl
147;
148; X64-LABEL: fpext_f64_to_fp80:
149; X64:       # %bb.0:
150; X64-NEXT:    movsd %xmm0, -{{[0-9]+}}(%rsp)
151; X64-NEXT:    fldl -{{[0-9]+}}(%rsp)
152; X64-NEXT:    wait
153; X64-NEXT:    retq
154  %ret = call x86_fp80 @llvm.experimental.constrained.fpext.f80.f64(double %a,
155                                                                         metadata !"fpexcept.strict") #0
156  ret x86_fp80 %ret
157}
158
159define float @fptrunc_fp80_to_f32(x86_fp80 %a) nounwind strictfp {
160; X86-LABEL: fptrunc_fp80_to_f32:
161; X86:       # %bb.0:
162; X86-NEXT:    pushl %eax
163; X86-NEXT:    fldt {{[0-9]+}}(%esp)
164; X86-NEXT:    fstps (%esp)
165; X86-NEXT:    flds (%esp)
166; X86-NEXT:    wait
167; X86-NEXT:    popl %eax
168; X86-NEXT:    retl
169;
170; X64-LABEL: fptrunc_fp80_to_f32:
171; X64:       # %bb.0:
172; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
173; X64-NEXT:    fstps -{{[0-9]+}}(%rsp)
174; X64-NEXT:    wait
175; X64-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
176; X64-NEXT:    retq
177  %ret = call float @llvm.experimental.constrained.fptrunc.f32.f80(x86_fp80 %a,
178                                                                        metadata !"round.dynamic",
179                                                                        metadata !"fpexcept.strict") #0
180  ret float %ret
181}
182
183define double @fptrunc_fp80_to_f64(x86_fp80 %a) nounwind strictfp {
184; X86-LABEL: fptrunc_fp80_to_f64:
185; X86:       # %bb.0:
186; X86-NEXT:    pushl %ebp
187; X86-NEXT:    movl %esp, %ebp
188; X86-NEXT:    andl $-8, %esp
189; X86-NEXT:    subl $8, %esp
190; X86-NEXT:    fldt 8(%ebp)
191; X86-NEXT:    fstpl (%esp)
192; X86-NEXT:    fldl (%esp)
193; X86-NEXT:    wait
194; X86-NEXT:    movl %ebp, %esp
195; X86-NEXT:    popl %ebp
196; X86-NEXT:    retl
197;
198; X64-LABEL: fptrunc_fp80_to_f64:
199; X64:       # %bb.0:
200; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
201; X64-NEXT:    fstpl -{{[0-9]+}}(%rsp)
202; X64-NEXT:    wait
203; X64-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
204; X64-NEXT:    retq
205  %ret = call double @llvm.experimental.constrained.fptrunc.f64.f80(x86_fp80 %a,
206                                                                         metadata !"round.dynamic",
207                                                                         metadata !"fpexcept.strict") #0
208  ret double %ret
209}
210
211define x86_fp80 @fsqrt_fp80(x86_fp80 %a) nounwind strictfp {
212; X86-LABEL: fsqrt_fp80:
213; X86:       # %bb.0:
214; X86-NEXT:    fldt {{[0-9]+}}(%esp)
215; X86-NEXT:    fsqrt
216; X86-NEXT:    wait
217; X86-NEXT:    retl
218;
219; X64-LABEL: fsqrt_fp80:
220; X64:       # %bb.0:
221; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
222; X64-NEXT:    fsqrt
223; X64-NEXT:    wait
224; X64-NEXT:    retq
225  %ret = call x86_fp80 @llvm.experimental.constrained.sqrt.f80(x86_fp80 %a,
226                                                                    metadata !"round.dynamic",
227                                                                    metadata !"fpexcept.strict") #0
228  ret x86_fp80 %ret
229}
230
231define i1 @fp80_to_sint1(x86_fp80 %x) #0 {
232; X86-LABEL: fp80_to_sint1:
233; X86:       # %bb.0:
234; X86-NEXT:    subl $8, %esp
235; X86-NEXT:    .cfi_def_cfa_offset 12
236; X86-NEXT:    fldt {{[0-9]+}}(%esp)
237; X86-NEXT:    wait
238; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
239; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
240; X86-NEXT:    orl $3072, %eax # imm = 0xC00
241; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
242; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
243; X86-NEXT:    fistps {{[0-9]+}}(%esp)
244; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
245; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
246; X86-NEXT:    addl $8, %esp
247; X86-NEXT:    .cfi_def_cfa_offset 4
248; X86-NEXT:    retl
249;
250; X64-LABEL: fp80_to_sint1:
251; X64:       # %bb.0:
252; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
253; X64-NEXT:    wait
254; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
255; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
256; X64-NEXT:    orl $3072, %eax # imm = 0xC00
257; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
258; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
259; X64-NEXT:    fistps -{{[0-9]+}}(%rsp)
260; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
261; X64-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
262; X64-NEXT:    retq
263  %result = call i1 @llvm.experimental.constrained.fptosi.i1.f80(x86_fp80 %x,
264                                               metadata !"fpexcept.strict") #0
265  ret i1 %result
266}
267
268define i8 @fp80_to_sint8(x86_fp80 %x) #0 {
269; X86-LABEL: fp80_to_sint8:
270; X86:       # %bb.0:
271; X86-NEXT:    subl $8, %esp
272; X86-NEXT:    .cfi_def_cfa_offset 12
273; X86-NEXT:    fldt {{[0-9]+}}(%esp)
274; X86-NEXT:    wait
275; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
276; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
277; X86-NEXT:    orl $3072, %eax # imm = 0xC00
278; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
279; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
280; X86-NEXT:    fistps {{[0-9]+}}(%esp)
281; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
282; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
283; X86-NEXT:    addl $8, %esp
284; X86-NEXT:    .cfi_def_cfa_offset 4
285; X86-NEXT:    retl
286;
287; X64-LABEL: fp80_to_sint8:
288; X64:       # %bb.0:
289; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
290; X64-NEXT:    wait
291; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
292; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
293; X64-NEXT:    orl $3072, %eax # imm = 0xC00
294; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
295; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
296; X64-NEXT:    fistps -{{[0-9]+}}(%rsp)
297; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
298; X64-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
299; X64-NEXT:    retq
300  %result = call i8 @llvm.experimental.constrained.fptosi.i8.f80(x86_fp80 %x,
301                                               metadata !"fpexcept.strict") #0
302  ret i8 %result
303}
304
305define i16 @fp80_to_sint16(x86_fp80 %x) #0 {
306; X86-LABEL: fp80_to_sint16:
307; X86:       # %bb.0:
308; X86-NEXT:    subl $8, %esp
309; X86-NEXT:    .cfi_def_cfa_offset 12
310; X86-NEXT:    fldt {{[0-9]+}}(%esp)
311; X86-NEXT:    wait
312; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
313; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
314; X86-NEXT:    orl $3072, %eax # imm = 0xC00
315; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
316; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
317; X86-NEXT:    fistps {{[0-9]+}}(%esp)
318; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
319; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
320; X86-NEXT:    addl $8, %esp
321; X86-NEXT:    .cfi_def_cfa_offset 4
322; X86-NEXT:    retl
323;
324; X64-LABEL: fp80_to_sint16:
325; X64:       # %bb.0:
326; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
327; X64-NEXT:    wait
328; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
329; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
330; X64-NEXT:    orl $3072, %eax # imm = 0xC00
331; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
332; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
333; X64-NEXT:    fistps -{{[0-9]+}}(%rsp)
334; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
335; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
336; X64-NEXT:    retq
337  %result = call i16 @llvm.experimental.constrained.fptosi.i16.f80(x86_fp80 %x,
338                                               metadata !"fpexcept.strict") #0
339  ret i16 %result
340}
341
342define i32 @fp80_to_sint32(x86_fp80 %x) #0 {
343; X86-LABEL: fp80_to_sint32:
344; X86:       # %bb.0: # %entry
345; X86-NEXT:    subl $8, %esp
346; X86-NEXT:    .cfi_def_cfa_offset 12
347; X86-NEXT:    fldt {{[0-9]+}}(%esp)
348; X86-NEXT:    wait
349; X86-NEXT:    fnstcw (%esp)
350; X86-NEXT:    movzwl (%esp), %eax
351; X86-NEXT:    orl $3072, %eax # imm = 0xC00
352; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
353; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
354; X86-NEXT:    fistpl {{[0-9]+}}(%esp)
355; X86-NEXT:    fldcw (%esp)
356; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
357; X86-NEXT:    addl $8, %esp
358; X86-NEXT:    .cfi_def_cfa_offset 4
359; X86-NEXT:    retl
360;
361; X64-LABEL: fp80_to_sint32:
362; X64:       # %bb.0: # %entry
363; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
364; X64-NEXT:    wait
365; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
366; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
367; X64-NEXT:    orl $3072, %eax # imm = 0xC00
368; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
369; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
370; X64-NEXT:    fistpl -{{[0-9]+}}(%rsp)
371; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
372; X64-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
373; X64-NEXT:    retq
374entry:
375  %result = call i32 @llvm.experimental.constrained.fptosi.i32.f80(x86_fp80 %x,
376                                               metadata !"fpexcept.strict") #0
377  ret i32 %result
378}
379
380define i64 @fp80_to_sint64(x86_fp80 %x) #0 {
381; X86-LABEL: fp80_to_sint64:
382; X86:       # %bb.0:
383; X86-NEXT:    pushl %ebp
384; X86-NEXT:    .cfi_def_cfa_offset 8
385; X86-NEXT:    .cfi_offset %ebp, -8
386; X86-NEXT:    movl %esp, %ebp
387; X86-NEXT:    .cfi_def_cfa_register %ebp
388; X86-NEXT:    andl $-8, %esp
389; X86-NEXT:    subl $16, %esp
390; X86-NEXT:    fldt 8(%ebp)
391; X86-NEXT:    wait
392; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
393; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
394; X86-NEXT:    orl $3072, %eax # imm = 0xC00
395; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
396; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
397; X86-NEXT:    fistpll {{[0-9]+}}(%esp)
398; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
399; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
400; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
401; X86-NEXT:    movl %ebp, %esp
402; X86-NEXT:    popl %ebp
403; X86-NEXT:    .cfi_def_cfa %esp, 4
404; X86-NEXT:    retl
405;
406; X64-LABEL: fp80_to_sint64:
407; X64:       # %bb.0:
408; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
409; X64-NEXT:    wait
410; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
411; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
412; X64-NEXT:    orl $3072, %eax # imm = 0xC00
413; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
414; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
415; X64-NEXT:    fistpll -{{[0-9]+}}(%rsp)
416; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
417; X64-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
418; X64-NEXT:    retq
419  %result = call i64 @llvm.experimental.constrained.fptosi.i64.f80(x86_fp80 %x,
420                                               metadata !"fpexcept.strict") #0
421  ret i64 %result
422}
423
424define i1 @fp80_to_uint1(x86_fp80 %x) #0 {
425; X86-LABEL: fp80_to_uint1:
426; X86:       # %bb.0:
427; X86-NEXT:    subl $8, %esp
428; X86-NEXT:    .cfi_def_cfa_offset 12
429; X86-NEXT:    fldt {{[0-9]+}}(%esp)
430; X86-NEXT:    wait
431; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
432; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
433; X86-NEXT:    orl $3072, %eax # imm = 0xC00
434; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
435; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
436; X86-NEXT:    fistps {{[0-9]+}}(%esp)
437; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
438; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
439; X86-NEXT:    addl $8, %esp
440; X86-NEXT:    .cfi_def_cfa_offset 4
441; X86-NEXT:    retl
442;
443; X64-LABEL: fp80_to_uint1:
444; X64:       # %bb.0:
445; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
446; X64-NEXT:    wait
447; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
448; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
449; X64-NEXT:    orl $3072, %eax # imm = 0xC00
450; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
451; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
452; X64-NEXT:    fistps -{{[0-9]+}}(%rsp)
453; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
454; X64-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
455; X64-NEXT:    retq
456  %result = call i1 @llvm.experimental.constrained.fptoui.i1.f80(x86_fp80 %x,
457                                               metadata !"fpexcept.strict") #0
458  ret i1 %result
459}
460
461define i8 @fp80_to_uint8(x86_fp80 %x) #0 {
462; X86-LABEL: fp80_to_uint8:
463; X86:       # %bb.0:
464; X86-NEXT:    subl $8, %esp
465; X86-NEXT:    .cfi_def_cfa_offset 12
466; X86-NEXT:    fldt {{[0-9]+}}(%esp)
467; X86-NEXT:    wait
468; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
469; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
470; X86-NEXT:    orl $3072, %eax # imm = 0xC00
471; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
472; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
473; X86-NEXT:    fistps {{[0-9]+}}(%esp)
474; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
475; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
476; X86-NEXT:    addl $8, %esp
477; X86-NEXT:    .cfi_def_cfa_offset 4
478; X86-NEXT:    retl
479;
480; X64-LABEL: fp80_to_uint8:
481; X64:       # %bb.0:
482; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
483; X64-NEXT:    wait
484; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
485; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
486; X64-NEXT:    orl $3072, %eax # imm = 0xC00
487; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
488; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
489; X64-NEXT:    fistps -{{[0-9]+}}(%rsp)
490; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
491; X64-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
492; X64-NEXT:    retq
493  %result = call i8 @llvm.experimental.constrained.fptoui.i8.f80(x86_fp80 %x,
494                                               metadata !"fpexcept.strict") #0
495  ret i8 %result
496}
497
498define i16 @fp80_to_uint16(x86_fp80 %x) #0 {
499; X86-LABEL: fp80_to_uint16:
500; X86:       # %bb.0:
501; X86-NEXT:    subl $8, %esp
502; X86-NEXT:    .cfi_def_cfa_offset 12
503; X86-NEXT:    fldt {{[0-9]+}}(%esp)
504; X86-NEXT:    wait
505; X86-NEXT:    fnstcw (%esp)
506; X86-NEXT:    movzwl (%esp), %eax
507; X86-NEXT:    orl $3072, %eax # imm = 0xC00
508; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
509; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
510; X86-NEXT:    fistpl {{[0-9]+}}(%esp)
511; X86-NEXT:    fldcw (%esp)
512; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
513; X86-NEXT:    # kill: def $ax killed $ax killed $eax
514; X86-NEXT:    addl $8, %esp
515; X86-NEXT:    .cfi_def_cfa_offset 4
516; X86-NEXT:    retl
517;
518; X64-LABEL: fp80_to_uint16:
519; X64:       # %bb.0:
520; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
521; X64-NEXT:    wait
522; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
523; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
524; X64-NEXT:    orl $3072, %eax # imm = 0xC00
525; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
526; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
527; X64-NEXT:    fistpl -{{[0-9]+}}(%rsp)
528; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
529; X64-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
530; X64-NEXT:    # kill: def $ax killed $ax killed $eax
531; X64-NEXT:    retq
532  %result = call i16 @llvm.experimental.constrained.fptoui.i16.f80(x86_fp80 %x,
533                                               metadata !"fpexcept.strict") #0
534  ret i16 %result
535}
536
537define i32 @fp80_to_uint32(x86_fp80 %x) #0 {
538; X86-LABEL: fp80_to_uint32:
539; X86:       # %bb.0:
540; X86-NEXT:    pushl %ebp
541; X86-NEXT:    .cfi_def_cfa_offset 8
542; X86-NEXT:    .cfi_offset %ebp, -8
543; X86-NEXT:    movl %esp, %ebp
544; X86-NEXT:    .cfi_def_cfa_register %ebp
545; X86-NEXT:    andl $-8, %esp
546; X86-NEXT:    subl $16, %esp
547; X86-NEXT:    fldt 8(%ebp)
548; X86-NEXT:    wait
549; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
550; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
551; X86-NEXT:    orl $3072, %eax # imm = 0xC00
552; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
553; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
554; X86-NEXT:    fistpll {{[0-9]+}}(%esp)
555; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
556; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
557; X86-NEXT:    movl %ebp, %esp
558; X86-NEXT:    popl %ebp
559; X86-NEXT:    .cfi_def_cfa %esp, 4
560; X86-NEXT:    retl
561;
562; X64-LABEL: fp80_to_uint32:
563; X64:       # %bb.0:
564; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
565; X64-NEXT:    wait
566; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
567; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
568; X64-NEXT:    orl $3072, %eax # imm = 0xC00
569; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
570; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
571; X64-NEXT:    fistpll -{{[0-9]+}}(%rsp)
572; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
573; X64-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
574; X64-NEXT:    retq
575  %result = call i32 @llvm.experimental.constrained.fptoui.i32.f80(x86_fp80 %x,
576                                               metadata !"fpexcept.strict") #0
577  ret i32 %result
578}
579
580define i64 @fp80_to_uint64(x86_fp80 %x) #0 {
581; X86-LABEL: fp80_to_uint64:
582; X86:       # %bb.0:
583; X86-NEXT:    pushl %ebp
584; X86-NEXT:    .cfi_def_cfa_offset 8
585; X86-NEXT:    .cfi_offset %ebp, -8
586; X86-NEXT:    movl %esp, %ebp
587; X86-NEXT:    .cfi_def_cfa_register %ebp
588; X86-NEXT:    andl $-8, %esp
589; X86-NEXT:    subl $16, %esp
590; X86-NEXT:    fldt 8(%ebp)
591; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
592; X86-NEXT:    fcom %st(1)
593; X86-NEXT:    wait
594; X86-NEXT:    fnstsw %ax
595; X86-NEXT:    xorl %edx, %edx
596; X86-NEXT:    # kill: def $ah killed $ah killed $ax
597; X86-NEXT:    sahf
598; X86-NEXT:    setbe %al
599; X86-NEXT:    fldz
600; X86-NEXT:    jbe .LBB18_2
601; X86-NEXT:  # %bb.1:
602; X86-NEXT:    fstp %st(1)
603; X86-NEXT:    fldz
604; X86-NEXT:  .LBB18_2:
605; X86-NEXT:    fstp %st(0)
606; X86-NEXT:    fsubrp %st, %st(1)
607; X86-NEXT:    wait
608; X86-NEXT:    fnstcw {{[0-9]+}}(%esp)
609; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
610; X86-NEXT:    orl $3072, %ecx # imm = 0xC00
611; X86-NEXT:    movw %cx, {{[0-9]+}}(%esp)
612; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
613; X86-NEXT:    fistpll {{[0-9]+}}(%esp)
614; X86-NEXT:    fldcw {{[0-9]+}}(%esp)
615; X86-NEXT:    movb %al, %dl
616; X86-NEXT:    shll $31, %edx
617; X86-NEXT:    xorl {{[0-9]+}}(%esp), %edx
618; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
619; X86-NEXT:    movl %ebp, %esp
620; X86-NEXT:    popl %ebp
621; X86-NEXT:    .cfi_def_cfa %esp, 4
622; X86-NEXT:    retl
623;
624; X64-LABEL: fp80_to_uint64:
625; X64:       # %bb.0:
626; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
627; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
628; X64-NEXT:    wait
629; X64-NEXT:    xorl %eax, %eax
630; X64-NEXT:    fcomi %st(1), %st
631; X64-NEXT:    wait
632; X64-NEXT:    setbe %al
633; X64-NEXT:    fldz
634; X64-NEXT:    fcmovbe %st(1), %st
635; X64-NEXT:    fstp %st(1)
636; X64-NEXT:    fsubrp %st, %st(1)
637; X64-NEXT:    wait
638; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
639; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %ecx
640; X64-NEXT:    orl $3072, %ecx # imm = 0xC00
641; X64-NEXT:    movw %cx, -{{[0-9]+}}(%rsp)
642; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
643; X64-NEXT:    fistpll -{{[0-9]+}}(%rsp)
644; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
645; X64-NEXT:    shlq $63, %rax
646; X64-NEXT:    xorq -{{[0-9]+}}(%rsp), %rax
647; X64-NEXT:    retq
648  %result = call i64 @llvm.experimental.constrained.fptoui.i64.f80(x86_fp80 %x,
649                                               metadata !"fpexcept.strict") #0
650  ret i64 %result
651}
652
653define x86_fp80 @sint1_to_fp80(i1 %x) #0 {
654; X86-LABEL: sint1_to_fp80:
655; X86:       # %bb.0:
656; X86-NEXT:    pushl %eax
657; X86-NEXT:    .cfi_def_cfa_offset 8
658; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
659; X86-NEXT:    andb $1, %al
660; X86-NEXT:    negb %al
661; X86-NEXT:    movsbl %al, %eax
662; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
663; X86-NEXT:    filds {{[0-9]+}}(%esp)
664; X86-NEXT:    wait
665; X86-NEXT:    popl %eax
666; X86-NEXT:    .cfi_def_cfa_offset 4
667; X86-NEXT:    retl
668;
669; X64-LABEL: sint1_to_fp80:
670; X64:       # %bb.0:
671; X64-NEXT:    andb $1, %dil
672; X64-NEXT:    negb %dil
673; X64-NEXT:    movsbl %dil, %eax
674; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
675; X64-NEXT:    filds -{{[0-9]+}}(%rsp)
676; X64-NEXT:    wait
677; X64-NEXT:    retq
678  %result = call x86_fp80 @llvm.experimental.constrained.sitofp.f80.i1(i1 %x,
679                                               metadata !"round.dynamic",
680                                               metadata !"fpexcept.strict") #0
681  ret x86_fp80 %result
682}
683
684define x86_fp80 @sint8_to_fp80(i8 %x) #0 {
685; X86-LABEL: sint8_to_fp80:
686; X86:       # %bb.0:
687; X86-NEXT:    pushl %eax
688; X86-NEXT:    .cfi_def_cfa_offset 8
689; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax
690; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
691; X86-NEXT:    filds {{[0-9]+}}(%esp)
692; X86-NEXT:    wait
693; X86-NEXT:    popl %eax
694; X86-NEXT:    .cfi_def_cfa_offset 4
695; X86-NEXT:    retl
696;
697; X64-LABEL: sint8_to_fp80:
698; X64:       # %bb.0:
699; X64-NEXT:    movsbl %dil, %eax
700; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
701; X64-NEXT:    filds -{{[0-9]+}}(%rsp)
702; X64-NEXT:    wait
703; X64-NEXT:    retq
704  %result = call x86_fp80 @llvm.experimental.constrained.sitofp.f80.i8(i8 %x,
705                                               metadata !"round.dynamic",
706                                               metadata !"fpexcept.strict") #0
707  ret x86_fp80 %result
708}
709
710define x86_fp80 @sint16_to_fp80(i16 %x) #0 {
711; X86-LABEL: sint16_to_fp80:
712; X86:       # %bb.0:
713; X86-NEXT:    pushl %eax
714; X86-NEXT:    .cfi_def_cfa_offset 8
715; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
716; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
717; X86-NEXT:    filds {{[0-9]+}}(%esp)
718; X86-NEXT:    wait
719; X86-NEXT:    popl %eax
720; X86-NEXT:    .cfi_def_cfa_offset 4
721; X86-NEXT:    retl
722;
723; X64-LABEL: sint16_to_fp80:
724; X64:       # %bb.0:
725; X64-NEXT:    movw %di, -{{[0-9]+}}(%rsp)
726; X64-NEXT:    filds -{{[0-9]+}}(%rsp)
727; X64-NEXT:    wait
728; X64-NEXT:    retq
729  %result = call x86_fp80 @llvm.experimental.constrained.sitofp.f80.i16(i16 %x,
730                                               metadata !"round.dynamic",
731                                               metadata !"fpexcept.strict") #0
732  ret x86_fp80 %result
733}
734
735define x86_fp80 @sint32_to_fp80(i32 %x) #0 {
736; X86-LABEL: sint32_to_fp80:
737; X86:       # %bb.0:
738; X86-NEXT:    pushl %eax
739; X86-NEXT:    .cfi_def_cfa_offset 8
740; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
741; X86-NEXT:    movl %eax, (%esp)
742; X86-NEXT:    fildl (%esp)
743; X86-NEXT:    wait
744; X86-NEXT:    popl %eax
745; X86-NEXT:    .cfi_def_cfa_offset 4
746; X86-NEXT:    retl
747;
748; X64-LABEL: sint32_to_fp80:
749; X64:       # %bb.0:
750; X64-NEXT:    movl %edi, -{{[0-9]+}}(%rsp)
751; X64-NEXT:    fildl -{{[0-9]+}}(%rsp)
752; X64-NEXT:    wait
753; X64-NEXT:    retq
754  %result = call x86_fp80 @llvm.experimental.constrained.sitofp.f80.i32(i32 %x,
755                                               metadata !"round.dynamic",
756                                               metadata !"fpexcept.strict") #0
757  ret x86_fp80 %result
758}
759
760define x86_fp80 @sint64_to_fp80(i64 %x) #0 {
761; X86-LABEL: sint64_to_fp80:
762; X86:       # %bb.0:
763; X86-NEXT:    fildll {{[0-9]+}}(%esp)
764; X86-NEXT:    wait
765; X86-NEXT:    retl
766;
767; X64-LABEL: sint64_to_fp80:
768; X64:       # %bb.0:
769; X64-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
770; X64-NEXT:    fildll -{{[0-9]+}}(%rsp)
771; X64-NEXT:    wait
772; X64-NEXT:    retq
773  %result = call x86_fp80 @llvm.experimental.constrained.sitofp.f80.i64(i64 %x,
774                                               metadata !"round.dynamic",
775                                               metadata !"fpexcept.strict") #0
776  ret x86_fp80 %result
777}
778
779define x86_fp80 @uint1_to_fp80(i1 %x) #0 {
780; X86-LABEL: uint1_to_fp80:
781; X86:       # %bb.0:
782; X86-NEXT:    pushl %eax
783; X86-NEXT:    .cfi_def_cfa_offset 8
784; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
785; X86-NEXT:    andb $1, %al
786; X86-NEXT:    movzbl %al, %eax
787; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
788; X86-NEXT:    filds {{[0-9]+}}(%esp)
789; X86-NEXT:    wait
790; X86-NEXT:    popl %eax
791; X86-NEXT:    .cfi_def_cfa_offset 4
792; X86-NEXT:    retl
793;
794; X64-LABEL: uint1_to_fp80:
795; X64:       # %bb.0:
796; X64-NEXT:    andl $1, %edi
797; X64-NEXT:    movw %di, -{{[0-9]+}}(%rsp)
798; X64-NEXT:    filds -{{[0-9]+}}(%rsp)
799; X64-NEXT:    wait
800; X64-NEXT:    retq
801  %result = call x86_fp80 @llvm.experimental.constrained.uitofp.f80.i1(i1 %x,
802                                               metadata !"round.dynamic",
803                                               metadata !"fpexcept.strict") #0
804  ret x86_fp80 %result
805}
806
807define x86_fp80 @uint8_to_fp80(i8 %x) #0 {
808; X86-LABEL: uint8_to_fp80:
809; X86:       # %bb.0:
810; X86-NEXT:    pushl %eax
811; X86-NEXT:    .cfi_def_cfa_offset 8
812; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
813; X86-NEXT:    movw %ax, {{[0-9]+}}(%esp)
814; X86-NEXT:    filds {{[0-9]+}}(%esp)
815; X86-NEXT:    wait
816; X86-NEXT:    popl %eax
817; X86-NEXT:    .cfi_def_cfa_offset 4
818; X86-NEXT:    retl
819;
820; X64-LABEL: uint8_to_fp80:
821; X64:       # %bb.0:
822; X64-NEXT:    movzbl %dil, %eax
823; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
824; X64-NEXT:    filds -{{[0-9]+}}(%rsp)
825; X64-NEXT:    wait
826; X64-NEXT:    retq
827  %result = call x86_fp80 @llvm.experimental.constrained.uitofp.f80.i8(i8 %x,
828                                               metadata !"round.dynamic",
829                                               metadata !"fpexcept.strict") #0
830  ret x86_fp80 %result
831}
832
833define x86_fp80 @uint16_to_fp80(i16 %x) #0 {
834; X86-LABEL: uint16_to_fp80:
835; X86:       # %bb.0:
836; X86-NEXT:    pushl %eax
837; X86-NEXT:    .cfi_def_cfa_offset 8
838; X86-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
839; X86-NEXT:    movl %eax, (%esp)
840; X86-NEXT:    fildl (%esp)
841; X86-NEXT:    wait
842; X86-NEXT:    popl %eax
843; X86-NEXT:    .cfi_def_cfa_offset 4
844; X86-NEXT:    retl
845;
846; X64-LABEL: uint16_to_fp80:
847; X64:       # %bb.0:
848; X64-NEXT:    movzwl %di, %eax
849; X64-NEXT:    movl %eax, -{{[0-9]+}}(%rsp)
850; X64-NEXT:    fildl -{{[0-9]+}}(%rsp)
851; X64-NEXT:    wait
852; X64-NEXT:    retq
853  %result = call x86_fp80 @llvm.experimental.constrained.uitofp.f80.i16(i16 %x,
854                                               metadata !"round.dynamic",
855                                               metadata !"fpexcept.strict") #0
856  ret x86_fp80 %result
857}
858
859define x86_fp80 @uint32_to_fp80(i32 %x) #0 {
860; X86-LABEL: uint32_to_fp80:
861; X86:       # %bb.0:
862; X86-NEXT:    pushl %ebp
863; X86-NEXT:    .cfi_def_cfa_offset 8
864; X86-NEXT:    .cfi_offset %ebp, -8
865; X86-NEXT:    movl %esp, %ebp
866; X86-NEXT:    .cfi_def_cfa_register %ebp
867; X86-NEXT:    andl $-8, %esp
868; X86-NEXT:    subl $8, %esp
869; X86-NEXT:    movl 8(%ebp), %eax
870; X86-NEXT:    movl %eax, (%esp)
871; X86-NEXT:    movl $0, {{[0-9]+}}(%esp)
872; X86-NEXT:    fildll (%esp)
873; X86-NEXT:    wait
874; X86-NEXT:    movl %ebp, %esp
875; X86-NEXT:    popl %ebp
876; X86-NEXT:    .cfi_def_cfa %esp, 4
877; X86-NEXT:    retl
878;
879; X64-LABEL: uint32_to_fp80:
880; X64:       # %bb.0:
881; X64-NEXT:    movl %edi, %eax
882; X64-NEXT:    movq %rax, -{{[0-9]+}}(%rsp)
883; X64-NEXT:    fildll -{{[0-9]+}}(%rsp)
884; X64-NEXT:    wait
885; X64-NEXT:    retq
886  %result = call x86_fp80 @llvm.experimental.constrained.uitofp.f80.i32(i32 %x,
887                                               metadata !"round.dynamic",
888                                               metadata !"fpexcept.strict") #0
889  ret x86_fp80 %result
890}
891
892define x86_fp80 @uint64_to_fp80(i64 %x) #0 {
893; X86-LABEL: uint64_to_fp80:
894; X86:       # %bb.0:
895; X86-NEXT:    pushl %ebp
896; X86-NEXT:    .cfi_def_cfa_offset 8
897; X86-NEXT:    .cfi_offset %ebp, -8
898; X86-NEXT:    movl %esp, %ebp
899; X86-NEXT:    .cfi_def_cfa_register %ebp
900; X86-NEXT:    andl $-8, %esp
901; X86-NEXT:    subl $8, %esp
902; X86-NEXT:    movl 8(%ebp), %eax
903; X86-NEXT:    movl 12(%ebp), %ecx
904; X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)
905; X86-NEXT:    movl %eax, (%esp)
906; X86-NEXT:    shrl $31, %ecx
907; X86-NEXT:    fildll (%esp)
908; X86-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%ecx,4)
909; X86-NEXT:    wait
910; X86-NEXT:    movl %ebp, %esp
911; X86-NEXT:    popl %ebp
912; X86-NEXT:    .cfi_def_cfa %esp, 4
913; X86-NEXT:    retl
914;
915; X64-LABEL: uint64_to_fp80:
916; X64:       # %bb.0:
917; X64-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)
918; X64-NEXT:    xorl %eax, %eax
919; X64-NEXT:    testq %rdi, %rdi
920; X64-NEXT:    sets %al
921; X64-NEXT:    fildll -{{[0-9]+}}(%rsp)
922; X64-NEXT:    fadds {{\.?LCPI[0-9]+_[0-9]+}}(,%rax,4)
923; X64-NEXT:    wait
924; X64-NEXT:    retq
925  %result = call x86_fp80 @llvm.experimental.constrained.uitofp.f80.i64(i64 %x,
926                                               metadata !"round.dynamic",
927                                               metadata !"fpexcept.strict") #0
928  ret x86_fp80 %result
929}
930
931attributes #0 = { strictfp }
932