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