xref: /llvm-project/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll (revision a2a0089ac3a5781ba74d4d319c87c9e8b46d4eda)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc < %s -mtriple=i686-linux | FileCheck %s --check-prefix=X86-X87
3; RUN: llc < %s -mtriple=i686-linux -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE
4; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X64
5
6;
7; 32-bit float to signed integer
8;
9
10declare   i1 @llvm.fptosi.sat.i1.f32  (float)
11declare   i8 @llvm.fptosi.sat.i8.f32  (float)
12declare  i13 @llvm.fptosi.sat.i13.f32 (float)
13declare  i16 @llvm.fptosi.sat.i16.f32 (float)
14declare  i19 @llvm.fptosi.sat.i19.f32 (float)
15declare  i32 @llvm.fptosi.sat.i32.f32 (float)
16declare  i50 @llvm.fptosi.sat.i50.f32 (float)
17declare  i64 @llvm.fptosi.sat.i64.f32 (float)
18declare i100 @llvm.fptosi.sat.i100.f32(float)
19declare i128 @llvm.fptosi.sat.i128.f32(float)
20
21define i1 @test_signed_i1_f32(float %f) nounwind {
22; X86-X87-LABEL: test_signed_i1_f32:
23; X86-X87:       # %bb.0:
24; X86-X87-NEXT:    pushl %ebx
25; X86-X87-NEXT:    subl $8, %esp
26; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
27; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
28; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
29; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
30; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
31; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
32; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
33; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
34; X86-X87-NEXT:    fld1
35; X86-X87-NEXT:    fchs
36; X86-X87-NEXT:    fxch %st(1)
37; X86-X87-NEXT:    fucom %st(1)
38; X86-X87-NEXT:    fstp %st(1)
39; X86-X87-NEXT:    fnstsw %ax
40; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
41; X86-X87-NEXT:    sahf
42; X86-X87-NEXT:    movb $-1, %dl
43; X86-X87-NEXT:    jb .LBB0_2
44; X86-X87-NEXT:  # %bb.1:
45; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
46; X86-X87-NEXT:  .LBB0_2:
47; X86-X87-NEXT:    fldz
48; X86-X87-NEXT:    fxch %st(1)
49; X86-X87-NEXT:    fucom %st(1)
50; X86-X87-NEXT:    fstp %st(1)
51; X86-X87-NEXT:    fnstsw %ax
52; X86-X87-NEXT:    xorl %ecx, %ecx
53; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
54; X86-X87-NEXT:    sahf
55; X86-X87-NEXT:    movl $0, %ebx
56; X86-X87-NEXT:    ja .LBB0_4
57; X86-X87-NEXT:  # %bb.3:
58; X86-X87-NEXT:    movl %edx, %ebx
59; X86-X87-NEXT:  .LBB0_4:
60; X86-X87-NEXT:    fucomp %st(0)
61; X86-X87-NEXT:    fnstsw %ax
62; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
63; X86-X87-NEXT:    sahf
64; X86-X87-NEXT:    jp .LBB0_6
65; X86-X87-NEXT:  # %bb.5:
66; X86-X87-NEXT:    movl %ebx, %ecx
67; X86-X87-NEXT:  .LBB0_6:
68; X86-X87-NEXT:    movl %ecx, %eax
69; X86-X87-NEXT:    addl $8, %esp
70; X86-X87-NEXT:    popl %ebx
71; X86-X87-NEXT:    retl
72;
73; X86-SSE-LABEL: test_signed_i1_f32:
74; X86-SSE:       # %bb.0:
75; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]
76; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0
77; X86-SSE-NEXT:    xorps %xmm1, %xmm1
78; X86-SSE-NEXT:    minss %xmm0, %xmm1
79; X86-SSE-NEXT:    cvttss2si %xmm1, %eax
80; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
81; X86-SSE-NEXT:    retl
82;
83; X64-LABEL: test_signed_i1_f32:
84; X64:       # %bb.0:
85; X64-NEXT:    movss {{.*#+}} xmm1 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0]
86; X64-NEXT:    maxss %xmm0, %xmm1
87; X64-NEXT:    xorps %xmm0, %xmm0
88; X64-NEXT:    minss %xmm1, %xmm0
89; X64-NEXT:    cvttss2si %xmm0, %eax
90; X64-NEXT:    # kill: def $al killed $al killed $eax
91; X64-NEXT:    retq
92    %x = call i1 @llvm.fptosi.sat.i1.f32(float %f)
93    ret i1 %x
94}
95
96define i8 @test_signed_i8_f32(float %f) nounwind {
97; X86-X87-LABEL: test_signed_i8_f32:
98; X86-X87:       # %bb.0:
99; X86-X87-NEXT:    subl $8, %esp
100; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
101; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
102; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
103; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
104; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
105; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
106; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
107; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
108; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
109; X86-X87-NEXT:    fxch %st(1)
110; X86-X87-NEXT:    fucom %st(1)
111; X86-X87-NEXT:    fstp %st(1)
112; X86-X87-NEXT:    fnstsw %ax
113; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
114; X86-X87-NEXT:    sahf
115; X86-X87-NEXT:    movb $-128, %dl
116; X86-X87-NEXT:    jb .LBB1_2
117; X86-X87-NEXT:  # %bb.1:
118; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
119; X86-X87-NEXT:  .LBB1_2:
120; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
121; X86-X87-NEXT:    fxch %st(1)
122; X86-X87-NEXT:    fucom %st(1)
123; X86-X87-NEXT:    fstp %st(1)
124; X86-X87-NEXT:    fnstsw %ax
125; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
126; X86-X87-NEXT:    sahf
127; X86-X87-NEXT:    movb $127, %cl
128; X86-X87-NEXT:    ja .LBB1_4
129; X86-X87-NEXT:  # %bb.3:
130; X86-X87-NEXT:    movl %edx, %ecx
131; X86-X87-NEXT:  .LBB1_4:
132; X86-X87-NEXT:    fucomp %st(0)
133; X86-X87-NEXT:    fnstsw %ax
134; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
135; X86-X87-NEXT:    sahf
136; X86-X87-NEXT:    jnp .LBB1_6
137; X86-X87-NEXT:  # %bb.5:
138; X86-X87-NEXT:    xorl %ecx, %ecx
139; X86-X87-NEXT:  .LBB1_6:
140; X86-X87-NEXT:    movl %ecx, %eax
141; X86-X87-NEXT:    addl $8, %esp
142; X86-X87-NEXT:    retl
143;
144; X86-SSE-LABEL: test_signed_i8_f32:
145; X86-SSE:       # %bb.0:
146; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = [-1.28E+2,0.0E+0,0.0E+0,0.0E+0]
147; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0
148; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = [1.27E+2,0.0E+0,0.0E+0,0.0E+0]
149; X86-SSE-NEXT:    minss %xmm0, %xmm1
150; X86-SSE-NEXT:    cvttss2si %xmm1, %eax
151; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
152; X86-SSE-NEXT:    retl
153;
154; X64-LABEL: test_signed_i8_f32:
155; X64:       # %bb.0:
156; X64-NEXT:    movss {{.*#+}} xmm1 = [-1.28E+2,0.0E+0,0.0E+0,0.0E+0]
157; X64-NEXT:    maxss %xmm0, %xmm1
158; X64-NEXT:    movss {{.*#+}} xmm0 = [1.27E+2,0.0E+0,0.0E+0,0.0E+0]
159; X64-NEXT:    minss %xmm1, %xmm0
160; X64-NEXT:    cvttss2si %xmm0, %eax
161; X64-NEXT:    # kill: def $al killed $al killed $eax
162; X64-NEXT:    retq
163    %x = call i8 @llvm.fptosi.sat.i8.f32(float %f)
164    ret i8 %x
165}
166
167define i13 @test_signed_i13_f32(float %f) nounwind {
168; X86-X87-LABEL: test_signed_i13_f32:
169; X86-X87:       # %bb.0:
170; X86-X87-NEXT:    subl $8, %esp
171; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
172; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
173; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
174; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
175; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
176; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
177; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
178; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
179; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
180; X86-X87-NEXT:    fxch %st(1)
181; X86-X87-NEXT:    fucom %st(1)
182; X86-X87-NEXT:    fstp %st(1)
183; X86-X87-NEXT:    fnstsw %ax
184; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
185; X86-X87-NEXT:    sahf
186; X86-X87-NEXT:    movl $61440, %ecx # imm = 0xF000
187; X86-X87-NEXT:    jb .LBB2_2
188; X86-X87-NEXT:  # %bb.1:
189; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
190; X86-X87-NEXT:  .LBB2_2:
191; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
192; X86-X87-NEXT:    fxch %st(1)
193; X86-X87-NEXT:    fucom %st(1)
194; X86-X87-NEXT:    fstp %st(1)
195; X86-X87-NEXT:    fnstsw %ax
196; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
197; X86-X87-NEXT:    sahf
198; X86-X87-NEXT:    movl $4095, %edx # imm = 0xFFF
199; X86-X87-NEXT:    ja .LBB2_4
200; X86-X87-NEXT:  # %bb.3:
201; X86-X87-NEXT:    movl %ecx, %edx
202; X86-X87-NEXT:  .LBB2_4:
203; X86-X87-NEXT:    fucomp %st(0)
204; X86-X87-NEXT:    fnstsw %ax
205; X86-X87-NEXT:    xorl %ecx, %ecx
206; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
207; X86-X87-NEXT:    sahf
208; X86-X87-NEXT:    jp .LBB2_6
209; X86-X87-NEXT:  # %bb.5:
210; X86-X87-NEXT:    movl %edx, %ecx
211; X86-X87-NEXT:  .LBB2_6:
212; X86-X87-NEXT:    movl %ecx, %eax
213; X86-X87-NEXT:    addl $8, %esp
214; X86-X87-NEXT:    retl
215;
216; X86-SSE-LABEL: test_signed_i13_f32:
217; X86-SSE:       # %bb.0:
218; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = [-4.096E+3,0.0E+0,0.0E+0,0.0E+0]
219; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0
220; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = [4.095E+3,0.0E+0,0.0E+0,0.0E+0]
221; X86-SSE-NEXT:    minss %xmm0, %xmm1
222; X86-SSE-NEXT:    cvttss2si %xmm1, %eax
223; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
224; X86-SSE-NEXT:    retl
225;
226; X64-LABEL: test_signed_i13_f32:
227; X64:       # %bb.0:
228; X64-NEXT:    movss {{.*#+}} xmm1 = [-4.096E+3,0.0E+0,0.0E+0,0.0E+0]
229; X64-NEXT:    maxss %xmm0, %xmm1
230; X64-NEXT:    movss {{.*#+}} xmm0 = [4.095E+3,0.0E+0,0.0E+0,0.0E+0]
231; X64-NEXT:    minss %xmm1, %xmm0
232; X64-NEXT:    cvttss2si %xmm0, %eax
233; X64-NEXT:    # kill: def $ax killed $ax killed $eax
234; X64-NEXT:    retq
235    %x = call i13 @llvm.fptosi.sat.i13.f32(float %f)
236    ret i13 %x
237}
238
239define i16 @test_signed_i16_f32(float %f) nounwind {
240; X86-X87-LABEL: test_signed_i16_f32:
241; X86-X87:       # %bb.0:
242; X86-X87-NEXT:    subl $8, %esp
243; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
244; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
245; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
246; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
247; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
248; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
249; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
250; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
251; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
252; X86-X87-NEXT:    fxch %st(1)
253; X86-X87-NEXT:    fucom %st(1)
254; X86-X87-NEXT:    fstp %st(1)
255; X86-X87-NEXT:    fnstsw %ax
256; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
257; X86-X87-NEXT:    sahf
258; X86-X87-NEXT:    movl $32768, %ecx # imm = 0x8000
259; X86-X87-NEXT:    jb .LBB3_2
260; X86-X87-NEXT:  # %bb.1:
261; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
262; X86-X87-NEXT:  .LBB3_2:
263; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
264; X86-X87-NEXT:    fxch %st(1)
265; X86-X87-NEXT:    fucom %st(1)
266; X86-X87-NEXT:    fstp %st(1)
267; X86-X87-NEXT:    fnstsw %ax
268; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
269; X86-X87-NEXT:    sahf
270; X86-X87-NEXT:    movl $32767, %edx # imm = 0x7FFF
271; X86-X87-NEXT:    ja .LBB3_4
272; X86-X87-NEXT:  # %bb.3:
273; X86-X87-NEXT:    movl %ecx, %edx
274; X86-X87-NEXT:  .LBB3_4:
275; X86-X87-NEXT:    fucomp %st(0)
276; X86-X87-NEXT:    fnstsw %ax
277; X86-X87-NEXT:    xorl %ecx, %ecx
278; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
279; X86-X87-NEXT:    sahf
280; X86-X87-NEXT:    jp .LBB3_6
281; X86-X87-NEXT:  # %bb.5:
282; X86-X87-NEXT:    movl %edx, %ecx
283; X86-X87-NEXT:  .LBB3_6:
284; X86-X87-NEXT:    movl %ecx, %eax
285; X86-X87-NEXT:    addl $8, %esp
286; X86-X87-NEXT:    retl
287;
288; X86-SSE-LABEL: test_signed_i16_f32:
289; X86-SSE:       # %bb.0:
290; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = [-3.2768E+4,0.0E+0,0.0E+0,0.0E+0]
291; X86-SSE-NEXT:    maxss {{[0-9]+}}(%esp), %xmm0
292; X86-SSE-NEXT:    movss {{.*#+}} xmm1 = [3.2767E+4,0.0E+0,0.0E+0,0.0E+0]
293; X86-SSE-NEXT:    minss %xmm0, %xmm1
294; X86-SSE-NEXT:    cvttss2si %xmm1, %eax
295; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
296; X86-SSE-NEXT:    retl
297;
298; X64-LABEL: test_signed_i16_f32:
299; X64:       # %bb.0:
300; X64-NEXT:    movss {{.*#+}} xmm1 = [-3.2768E+4,0.0E+0,0.0E+0,0.0E+0]
301; X64-NEXT:    maxss %xmm0, %xmm1
302; X64-NEXT:    movss {{.*#+}} xmm0 = [3.2767E+4,0.0E+0,0.0E+0,0.0E+0]
303; X64-NEXT:    minss %xmm1, %xmm0
304; X64-NEXT:    cvttss2si %xmm0, %eax
305; X64-NEXT:    # kill: def $ax killed $ax killed $eax
306; X64-NEXT:    retq
307    %x = call i16 @llvm.fptosi.sat.i16.f32(float %f)
308    ret i16 %x
309}
310
311define i19 @test_signed_i19_f32(float %f) nounwind {
312; X86-X87-LABEL: test_signed_i19_f32:
313; X86-X87:       # %bb.0:
314; X86-X87-NEXT:    subl $8, %esp
315; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
316; X86-X87-NEXT:    fnstcw (%esp)
317; X86-X87-NEXT:    movzwl (%esp), %eax
318; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
319; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
320; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
321; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
322; X86-X87-NEXT:    fldcw (%esp)
323; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
324; X86-X87-NEXT:    fxch %st(1)
325; X86-X87-NEXT:    fucom %st(1)
326; X86-X87-NEXT:    fstp %st(1)
327; X86-X87-NEXT:    fnstsw %ax
328; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
329; X86-X87-NEXT:    sahf
330; X86-X87-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000
331; X86-X87-NEXT:    jb .LBB4_2
332; X86-X87-NEXT:  # %bb.1:
333; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
334; X86-X87-NEXT:  .LBB4_2:
335; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
336; X86-X87-NEXT:    fxch %st(1)
337; X86-X87-NEXT:    fucom %st(1)
338; X86-X87-NEXT:    fstp %st(1)
339; X86-X87-NEXT:    fnstsw %ax
340; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
341; X86-X87-NEXT:    sahf
342; X86-X87-NEXT:    movl $262143, %edx # imm = 0x3FFFF
343; X86-X87-NEXT:    ja .LBB4_4
344; X86-X87-NEXT:  # %bb.3:
345; X86-X87-NEXT:    movl %ecx, %edx
346; X86-X87-NEXT:  .LBB4_4:
347; X86-X87-NEXT:    fucomp %st(0)
348; X86-X87-NEXT:    fnstsw %ax
349; X86-X87-NEXT:    xorl %ecx, %ecx
350; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
351; X86-X87-NEXT:    sahf
352; X86-X87-NEXT:    jp .LBB4_6
353; X86-X87-NEXT:  # %bb.5:
354; X86-X87-NEXT:    movl %edx, %ecx
355; X86-X87-NEXT:  .LBB4_6:
356; X86-X87-NEXT:    movl %ecx, %eax
357; X86-X87-NEXT:    addl $8, %esp
358; X86-X87-NEXT:    retl
359;
360; X86-SSE-LABEL: test_signed_i19_f32:
361; X86-SSE:       # %bb.0:
362; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
363; X86-SSE-NEXT:    xorl %eax, %eax
364; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
365; X86-SSE-NEXT:    maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
366; X86-SSE-NEXT:    minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
367; X86-SSE-NEXT:    cvttss2si %xmm0, %ecx
368; X86-SSE-NEXT:    cmovnpl %ecx, %eax
369; X86-SSE-NEXT:    retl
370;
371; X64-LABEL: test_signed_i19_f32:
372; X64:       # %bb.0:
373; X64-NEXT:    xorl %eax, %eax
374; X64-NEXT:    ucomiss %xmm0, %xmm0
375; X64-NEXT:    maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
376; X64-NEXT:    minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
377; X64-NEXT:    cvttss2si %xmm0, %ecx
378; X64-NEXT:    cmovnpl %ecx, %eax
379; X64-NEXT:    retq
380    %x = call i19 @llvm.fptosi.sat.i19.f32(float %f)
381    ret i19 %x
382}
383
384define i32 @test_signed_i32_f32(float %f) nounwind {
385; X86-X87-LABEL: test_signed_i32_f32:
386; X86-X87:       # %bb.0:
387; X86-X87-NEXT:    subl $8, %esp
388; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
389; X86-X87-NEXT:    fnstcw (%esp)
390; X86-X87-NEXT:    movzwl (%esp), %eax
391; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
392; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
393; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
394; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
395; X86-X87-NEXT:    fldcw (%esp)
396; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
397; X86-X87-NEXT:    fxch %st(1)
398; X86-X87-NEXT:    fucom %st(1)
399; X86-X87-NEXT:    fstp %st(1)
400; X86-X87-NEXT:    fnstsw %ax
401; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
402; X86-X87-NEXT:    sahf
403; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
404; X86-X87-NEXT:    jb .LBB5_2
405; X86-X87-NEXT:  # %bb.1:
406; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
407; X86-X87-NEXT:  .LBB5_2:
408; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
409; X86-X87-NEXT:    fxch %st(1)
410; X86-X87-NEXT:    fucom %st(1)
411; X86-X87-NEXT:    fstp %st(1)
412; X86-X87-NEXT:    fnstsw %ax
413; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
414; X86-X87-NEXT:    sahf
415; X86-X87-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
416; X86-X87-NEXT:    ja .LBB5_4
417; X86-X87-NEXT:  # %bb.3:
418; X86-X87-NEXT:    movl %ecx, %edx
419; X86-X87-NEXT:  .LBB5_4:
420; X86-X87-NEXT:    fucomp %st(0)
421; X86-X87-NEXT:    fnstsw %ax
422; X86-X87-NEXT:    xorl %ecx, %ecx
423; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
424; X86-X87-NEXT:    sahf
425; X86-X87-NEXT:    jp .LBB5_6
426; X86-X87-NEXT:  # %bb.5:
427; X86-X87-NEXT:    movl %edx, %ecx
428; X86-X87-NEXT:  .LBB5_6:
429; X86-X87-NEXT:    movl %ecx, %eax
430; X86-X87-NEXT:    addl $8, %esp
431; X86-X87-NEXT:    retl
432;
433; X86-SSE-LABEL: test_signed_i32_f32:
434; X86-SSE:       # %bb.0:
435; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
436; X86-SSE-NEXT:    cvttss2si %xmm0, %eax
437; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
438; X86-SSE-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
439; X86-SSE-NEXT:    cmovbel %eax, %ecx
440; X86-SSE-NEXT:    xorl %eax, %eax
441; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
442; X86-SSE-NEXT:    cmovnpl %ecx, %eax
443; X86-SSE-NEXT:    retl
444;
445; X64-LABEL: test_signed_i32_f32:
446; X64:       # %bb.0:
447; X64-NEXT:    cvttss2si %xmm0, %eax
448; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
449; X64-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
450; X64-NEXT:    cmovbel %eax, %ecx
451; X64-NEXT:    xorl %eax, %eax
452; X64-NEXT:    ucomiss %xmm0, %xmm0
453; X64-NEXT:    cmovnpl %ecx, %eax
454; X64-NEXT:    retq
455    %x = call i32 @llvm.fptosi.sat.i32.f32(float %f)
456    ret i32 %x
457}
458
459define i50 @test_signed_i50_f32(float %f) nounwind {
460; X86-X87-LABEL: test_signed_i50_f32:
461; X86-X87:       # %bb.0:
462; X86-X87-NEXT:    pushl %edi
463; X86-X87-NEXT:    pushl %esi
464; X86-X87-NEXT:    subl $20, %esp
465; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
466; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
467; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
468; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
469; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
470; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
471; X86-X87-NEXT:    fld %st(0)
472; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
473; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
474; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
475; X86-X87-NEXT:    fxch %st(1)
476; X86-X87-NEXT:    fucom %st(1)
477; X86-X87-NEXT:    fstp %st(1)
478; X86-X87-NEXT:    fnstsw %ax
479; X86-X87-NEXT:    xorl %ecx, %ecx
480; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
481; X86-X87-NEXT:    sahf
482; X86-X87-NEXT:    movl $0, %edx
483; X86-X87-NEXT:    jb .LBB6_2
484; X86-X87-NEXT:  # %bb.1:
485; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
486; X86-X87-NEXT:  .LBB6_2:
487; X86-X87-NEXT:    movl $-131072, %edi # imm = 0xFFFE0000
488; X86-X87-NEXT:    jb .LBB6_4
489; X86-X87-NEXT:  # %bb.3:
490; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
491; X86-X87-NEXT:  .LBB6_4:
492; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
493; X86-X87-NEXT:    fxch %st(1)
494; X86-X87-NEXT:    fucom %st(1)
495; X86-X87-NEXT:    fstp %st(1)
496; X86-X87-NEXT:    fnstsw %ax
497; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
498; X86-X87-NEXT:    sahf
499; X86-X87-NEXT:    movl $131071, %esi # imm = 0x1FFFF
500; X86-X87-NEXT:    ja .LBB6_6
501; X86-X87-NEXT:  # %bb.5:
502; X86-X87-NEXT:    movl %edi, %esi
503; X86-X87-NEXT:  .LBB6_6:
504; X86-X87-NEXT:    movl $-1, %edi
505; X86-X87-NEXT:    ja .LBB6_8
506; X86-X87-NEXT:  # %bb.7:
507; X86-X87-NEXT:    movl %edx, %edi
508; X86-X87-NEXT:  .LBB6_8:
509; X86-X87-NEXT:    fucomp %st(0)
510; X86-X87-NEXT:    fnstsw %ax
511; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
512; X86-X87-NEXT:    sahf
513; X86-X87-NEXT:    movl $0, %edx
514; X86-X87-NEXT:    jp .LBB6_10
515; X86-X87-NEXT:  # %bb.9:
516; X86-X87-NEXT:    movl %edi, %ecx
517; X86-X87-NEXT:    movl %esi, %edx
518; X86-X87-NEXT:  .LBB6_10:
519; X86-X87-NEXT:    movl %ecx, %eax
520; X86-X87-NEXT:    addl $20, %esp
521; X86-X87-NEXT:    popl %esi
522; X86-X87-NEXT:    popl %edi
523; X86-X87-NEXT:    retl
524;
525; X86-SSE-LABEL: test_signed_i50_f32:
526; X86-SSE:       # %bb.0:
527; X86-SSE-NEXT:    pushl %esi
528; X86-SSE-NEXT:    subl $16, %esp
529; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
530; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
531; X86-SSE-NEXT:    flds {{[0-9]+}}(%esp)
532; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
533; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
534; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
535; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
536; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
537; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
538; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
539; X86-SSE-NEXT:    xorl %ecx, %ecx
540; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
541; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
542; X86-SSE-NEXT:    cmovbl %ecx, %esi
543; X86-SSE-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
544; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
545; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
546; X86-SSE-NEXT:    movl $131071, %edx # imm = 0x1FFFF
547; X86-SSE-NEXT:    cmovbel %eax, %edx
548; X86-SSE-NEXT:    movl $-1, %eax
549; X86-SSE-NEXT:    cmovbel %esi, %eax
550; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
551; X86-SSE-NEXT:    cmovpl %ecx, %eax
552; X86-SSE-NEXT:    cmovpl %ecx, %edx
553; X86-SSE-NEXT:    addl $16, %esp
554; X86-SSE-NEXT:    popl %esi
555; X86-SSE-NEXT:    retl
556;
557; X64-LABEL: test_signed_i50_f32:
558; X64:       # %bb.0:
559; X64-NEXT:    cvttss2si %xmm0, %rax
560; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
561; X64-NEXT:    movabsq $-562949953421312, %rcx # imm = 0xFFFE000000000000
562; X64-NEXT:    cmovaeq %rax, %rcx
563; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
564; X64-NEXT:    movabsq $562949953421311, %rdx # imm = 0x1FFFFFFFFFFFF
565; X64-NEXT:    cmovbeq %rcx, %rdx
566; X64-NEXT:    xorl %eax, %eax
567; X64-NEXT:    ucomiss %xmm0, %xmm0
568; X64-NEXT:    cmovnpq %rdx, %rax
569; X64-NEXT:    retq
570    %x = call i50 @llvm.fptosi.sat.i50.f32(float %f)
571    ret i50 %x
572}
573
574define i64 @test_signed_i64_f32(float %f) nounwind {
575; X86-X87-LABEL: test_signed_i64_f32:
576; X86-X87:       # %bb.0:
577; X86-X87-NEXT:    pushl %edi
578; X86-X87-NEXT:    pushl %esi
579; X86-X87-NEXT:    subl $20, %esp
580; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
581; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
582; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
583; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
584; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
585; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
586; X86-X87-NEXT:    fld %st(0)
587; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
588; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
589; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
590; X86-X87-NEXT:    fxch %st(1)
591; X86-X87-NEXT:    fucom %st(1)
592; X86-X87-NEXT:    fstp %st(1)
593; X86-X87-NEXT:    fnstsw %ax
594; X86-X87-NEXT:    xorl %ecx, %ecx
595; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
596; X86-X87-NEXT:    sahf
597; X86-X87-NEXT:    movl $0, %edx
598; X86-X87-NEXT:    jb .LBB7_2
599; X86-X87-NEXT:  # %bb.1:
600; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
601; X86-X87-NEXT:  .LBB7_2:
602; X86-X87-NEXT:    movl $-2147483648, %edi # imm = 0x80000000
603; X86-X87-NEXT:    jb .LBB7_4
604; X86-X87-NEXT:  # %bb.3:
605; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
606; X86-X87-NEXT:  .LBB7_4:
607; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
608; X86-X87-NEXT:    fxch %st(1)
609; X86-X87-NEXT:    fucom %st(1)
610; X86-X87-NEXT:    fstp %st(1)
611; X86-X87-NEXT:    fnstsw %ax
612; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
613; X86-X87-NEXT:    sahf
614; X86-X87-NEXT:    movl $2147483647, %esi # imm = 0x7FFFFFFF
615; X86-X87-NEXT:    ja .LBB7_6
616; X86-X87-NEXT:  # %bb.5:
617; X86-X87-NEXT:    movl %edi, %esi
618; X86-X87-NEXT:  .LBB7_6:
619; X86-X87-NEXT:    movl $-1, %edi
620; X86-X87-NEXT:    ja .LBB7_8
621; X86-X87-NEXT:  # %bb.7:
622; X86-X87-NEXT:    movl %edx, %edi
623; X86-X87-NEXT:  .LBB7_8:
624; X86-X87-NEXT:    fucomp %st(0)
625; X86-X87-NEXT:    fnstsw %ax
626; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
627; X86-X87-NEXT:    sahf
628; X86-X87-NEXT:    movl $0, %edx
629; X86-X87-NEXT:    jp .LBB7_10
630; X86-X87-NEXT:  # %bb.9:
631; X86-X87-NEXT:    movl %edi, %ecx
632; X86-X87-NEXT:    movl %esi, %edx
633; X86-X87-NEXT:  .LBB7_10:
634; X86-X87-NEXT:    movl %ecx, %eax
635; X86-X87-NEXT:    addl $20, %esp
636; X86-X87-NEXT:    popl %esi
637; X86-X87-NEXT:    popl %edi
638; X86-X87-NEXT:    retl
639;
640; X86-SSE-LABEL: test_signed_i64_f32:
641; X86-SSE:       # %bb.0:
642; X86-SSE-NEXT:    pushl %esi
643; X86-SSE-NEXT:    subl $16, %esp
644; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
645; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
646; X86-SSE-NEXT:    flds {{[0-9]+}}(%esp)
647; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
648; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
649; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
650; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
651; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
652; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
653; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
654; X86-SSE-NEXT:    xorl %ecx, %ecx
655; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
656; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
657; X86-SSE-NEXT:    cmovbl %ecx, %esi
658; X86-SSE-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
659; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
660; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
661; X86-SSE-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
662; X86-SSE-NEXT:    cmovbel %eax, %edx
663; X86-SSE-NEXT:    movl $-1, %eax
664; X86-SSE-NEXT:    cmovbel %esi, %eax
665; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
666; X86-SSE-NEXT:    cmovpl %ecx, %eax
667; X86-SSE-NEXT:    cmovpl %ecx, %edx
668; X86-SSE-NEXT:    addl $16, %esp
669; X86-SSE-NEXT:    popl %esi
670; X86-SSE-NEXT:    retl
671;
672; X64-LABEL: test_signed_i64_f32:
673; X64:       # %bb.0:
674; X64-NEXT:    cvttss2si %xmm0, %rax
675; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
676; X64-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
677; X64-NEXT:    cmovbeq %rax, %rcx
678; X64-NEXT:    xorl %eax, %eax
679; X64-NEXT:    ucomiss %xmm0, %xmm0
680; X64-NEXT:    cmovnpq %rcx, %rax
681; X64-NEXT:    retq
682    %x = call i64 @llvm.fptosi.sat.i64.f32(float %f)
683    ret i64 %x
684}
685
686define i100 @test_signed_i100_f32(float %f) nounwind {
687; X86-X87-LABEL: test_signed_i100_f32:
688; X86-X87:       # %bb.0:
689; X86-X87-NEXT:    pushl %ebp
690; X86-X87-NEXT:    pushl %ebx
691; X86-X87-NEXT:    pushl %edi
692; X86-X87-NEXT:    pushl %esi
693; X86-X87-NEXT:    subl $60, %esp
694; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
695; X86-X87-NEXT:    fsts {{[0-9]+}}(%esp)
696; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
697; X86-X87-NEXT:    movl %eax, (%esp)
698; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
699; X86-X87-NEXT:    fxch %st(1)
700; X86-X87-NEXT:    fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
701; X86-X87-NEXT:    fucompp
702; X86-X87-NEXT:    fnstsw %ax
703; X86-X87-NEXT:    movl %eax, %ebx
704; X86-X87-NEXT:    calll __fixsfti
705; X86-X87-NEXT:    subl $4, %esp
706; X86-X87-NEXT:    xorl %edx, %edx
707; X86-X87-NEXT:    movb %bh, %ah
708; X86-X87-NEXT:    sahf
709; X86-X87-NEXT:    movl $-8, %ebx
710; X86-X87-NEXT:    jb .LBB8_2
711; X86-X87-NEXT:  # %bb.1:
712; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
713; X86-X87-NEXT:  .LBB8_2:
714; X86-X87-NEXT:    movl $0, %ecx
715; X86-X87-NEXT:    movl $0, %ebp
716; X86-X87-NEXT:    jb .LBB8_4
717; X86-X87-NEXT:  # %bb.3:
718; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
719; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebp
720; X86-X87-NEXT:  .LBB8_4:
721; X86-X87-NEXT:    movl $0, %edi
722; X86-X87-NEXT:    jb .LBB8_6
723; X86-X87-NEXT:  # %bb.5:
724; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
725; X86-X87-NEXT:  .LBB8_6:
726; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
727; X86-X87-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
728; X86-X87-NEXT:    fucom %st(1)
729; X86-X87-NEXT:    fstp %st(1)
730; X86-X87-NEXT:    fnstsw %ax
731; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
732; X86-X87-NEXT:    sahf
733; X86-X87-NEXT:    movl $-1, %eax
734; X86-X87-NEXT:    movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
735; X86-X87-NEXT:    movl $-1, %esi
736; X86-X87-NEXT:    ja .LBB8_8
737; X86-X87-NEXT:  # %bb.7:
738; X86-X87-NEXT:    movl %edi, %eax
739; X86-X87-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
740; X86-X87-NEXT:    movl %ecx, %esi
741; X86-X87-NEXT:  .LBB8_8:
742; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
743; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
744; X86-X87-NEXT:    movl $7, %edi
745; X86-X87-NEXT:    ja .LBB8_10
746; X86-X87-NEXT:  # %bb.9:
747; X86-X87-NEXT:    movl %ebx, %edi
748; X86-X87-NEXT:  .LBB8_10:
749; X86-X87-NEXT:    fucomp %st(0)
750; X86-X87-NEXT:    fnstsw %ax
751; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
752; X86-X87-NEXT:    sahf
753; X86-X87-NEXT:    movl $0, %eax
754; X86-X87-NEXT:    movl $0, %ebp
755; X86-X87-NEXT:    movl $0, %ebx
756; X86-X87-NEXT:    jp .LBB8_12
757; X86-X87-NEXT:  # %bb.11:
758; X86-X87-NEXT:    movl %edi, %edx
759; X86-X87-NEXT:    movl %esi, %eax
760; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
761; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
762; X86-X87-NEXT:  .LBB8_12:
763; X86-X87-NEXT:    movl %ebx, 8(%ecx)
764; X86-X87-NEXT:    movl %ebp, 4(%ecx)
765; X86-X87-NEXT:    movl %eax, (%ecx)
766; X86-X87-NEXT:    andl $15, %edx
767; X86-X87-NEXT:    movb %dl, 12(%ecx)
768; X86-X87-NEXT:    movl %ecx, %eax
769; X86-X87-NEXT:    addl $60, %esp
770; X86-X87-NEXT:    popl %esi
771; X86-X87-NEXT:    popl %edi
772; X86-X87-NEXT:    popl %ebx
773; X86-X87-NEXT:    popl %ebp
774; X86-X87-NEXT:    retl $4
775;
776; X86-SSE-LABEL: test_signed_i100_f32:
777; X86-SSE:       # %bb.0:
778; X86-SSE-NEXT:    pushl %ebp
779; X86-SSE-NEXT:    pushl %ebx
780; X86-SSE-NEXT:    pushl %edi
781; X86-SSE-NEXT:    pushl %esi
782; X86-SSE-NEXT:    subl $44, %esp
783; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
784; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
785; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
786; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
787; X86-SSE-NEXT:    movl %eax, (%esp)
788; X86-SSE-NEXT:    calll __fixsfti
789; X86-SSE-NEXT:    subl $4, %esp
790; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
791; X86-SSE-NEXT:    xorl %ebp, %ebp
792; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
793; X86-SSE-NEXT:    movl $-8, %ebx
794; X86-SSE-NEXT:    movl $0, %ecx
795; X86-SSE-NEXT:    movl $0, %edx
796; X86-SSE-NEXT:    movl $0, %edi
797; X86-SSE-NEXT:    jb .LBB8_2
798; X86-SSE-NEXT:  # %bb.1:
799; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ebx
800; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
801; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
802; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
803; X86-SSE-NEXT:  .LBB8_2:
804; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
805; X86-SSE-NEXT:    movl $-1, %eax
806; X86-SSE-NEXT:    cmoval %eax, %edi
807; X86-SSE-NEXT:    cmoval %eax, %edx
808; X86-SSE-NEXT:    cmoval %eax, %ecx
809; X86-SSE-NEXT:    movl $7, %eax
810; X86-SSE-NEXT:    cmovbel %ebx, %eax
811; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
812; X86-SSE-NEXT:    cmovpl %ebp, %eax
813; X86-SSE-NEXT:    cmovpl %ebp, %ecx
814; X86-SSE-NEXT:    cmovpl %ebp, %edx
815; X86-SSE-NEXT:    cmovpl %ebp, %edi
816; X86-SSE-NEXT:    movl %edi, 8(%esi)
817; X86-SSE-NEXT:    movl %edx, 4(%esi)
818; X86-SSE-NEXT:    movl %ecx, (%esi)
819; X86-SSE-NEXT:    andl $15, %eax
820; X86-SSE-NEXT:    movb %al, 12(%esi)
821; X86-SSE-NEXT:    movl %esi, %eax
822; X86-SSE-NEXT:    addl $44, %esp
823; X86-SSE-NEXT:    popl %esi
824; X86-SSE-NEXT:    popl %edi
825; X86-SSE-NEXT:    popl %ebx
826; X86-SSE-NEXT:    popl %ebp
827; X86-SSE-NEXT:    retl $4
828;
829; X64-LABEL: test_signed_i100_f32:
830; X64:       # %bb.0:
831; X64-NEXT:    pushq %rax
832; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
833; X64-NEXT:    callq __fixsfti@PLT
834; X64-NEXT:    xorl %ecx, %ecx
835; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
836; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero
837; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
838; X64-NEXT:    cmovbq %rcx, %rax
839; X64-NEXT:    movabsq $-34359738368, %rsi # imm = 0xFFFFFFF800000000
840; X64-NEXT:    cmovbq %rsi, %rdx
841; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
842; X64-NEXT:    movabsq $34359738367, %rsi # imm = 0x7FFFFFFFF
843; X64-NEXT:    cmovaq %rsi, %rdx
844; X64-NEXT:    movq $-1, %rsi
845; X64-NEXT:    cmovaq %rsi, %rax
846; X64-NEXT:    ucomiss %xmm0, %xmm0
847; X64-NEXT:    cmovpq %rcx, %rax
848; X64-NEXT:    cmovpq %rcx, %rdx
849; X64-NEXT:    popq %rcx
850; X64-NEXT:    retq
851    %x = call i100 @llvm.fptosi.sat.i100.f32(float %f)
852    ret i100 %x
853}
854
855define i128 @test_signed_i128_f32(float %f) nounwind {
856; X86-X87-LABEL: test_signed_i128_f32:
857; X86-X87:       # %bb.0:
858; X86-X87-NEXT:    pushl %ebp
859; X86-X87-NEXT:    pushl %ebx
860; X86-X87-NEXT:    pushl %edi
861; X86-X87-NEXT:    pushl %esi
862; X86-X87-NEXT:    subl $60, %esp
863; X86-X87-NEXT:    flds {{[0-9]+}}(%esp)
864; X86-X87-NEXT:    fsts {{[0-9]+}}(%esp)
865; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
866; X86-X87-NEXT:    movl %eax, (%esp)
867; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
868; X86-X87-NEXT:    fxch %st(1)
869; X86-X87-NEXT:    fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
870; X86-X87-NEXT:    fucompp
871; X86-X87-NEXT:    fnstsw %ax
872; X86-X87-NEXT:    movl %eax, %ebx
873; X86-X87-NEXT:    calll __fixsfti
874; X86-X87-NEXT:    subl $4, %esp
875; X86-X87-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
876; X86-X87-NEXT:    movb %bh, %ah
877; X86-X87-NEXT:    sahf
878; X86-X87-NEXT:    movl $0, %eax
879; X86-X87-NEXT:    movl $0, %ebx
880; X86-X87-NEXT:    jae .LBB9_1
881; X86-X87-NEXT:  # %bb.2:
882; X86-X87-NEXT:    movl $0, %edx
883; X86-X87-NEXT:    jae .LBB9_3
884; X86-X87-NEXT:  .LBB9_4:
885; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
886; X86-X87-NEXT:    jb .LBB9_6
887; X86-X87-NEXT:  .LBB9_5:
888; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
889; X86-X87-NEXT:  .LBB9_6:
890; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
891; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
892; X86-X87-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
893; X86-X87-NEXT:    fucom %st(1)
894; X86-X87-NEXT:    fstp %st(1)
895; X86-X87-NEXT:    fnstsw %ax
896; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
897; X86-X87-NEXT:    sahf
898; X86-X87-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
899; X86-X87-NEXT:    ja .LBB9_8
900; X86-X87-NEXT:  # %bb.7:
901; X86-X87-NEXT:    movl %ecx, %eax
902; X86-X87-NEXT:  .LBB9_8:
903; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
904; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
905; X86-X87-NEXT:    movl $-1, %ebp
906; X86-X87-NEXT:    movl $-1, %edi
907; X86-X87-NEXT:    movl $-1, %esi
908; X86-X87-NEXT:    ja .LBB9_10
909; X86-X87-NEXT:  # %bb.9:
910; X86-X87-NEXT:    movl %edx, %ebp
911; X86-X87-NEXT:    movl %ebx, %edi
912; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
913; X86-X87-NEXT:  .LBB9_10:
914; X86-X87-NEXT:    fucomp %st(0)
915; X86-X87-NEXT:    fnstsw %ax
916; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
917; X86-X87-NEXT:    sahf
918; X86-X87-NEXT:    movl $0, %eax
919; X86-X87-NEXT:    movl $0, %edx
920; X86-X87-NEXT:    movl $0, %ebx
921; X86-X87-NEXT:    jp .LBB9_12
922; X86-X87-NEXT:  # %bb.11:
923; X86-X87-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
924; X86-X87-NEXT:    movl %edi, %eax
925; X86-X87-NEXT:    movl %ebp, %edx
926; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
927; X86-X87-NEXT:  .LBB9_12:
928; X86-X87-NEXT:    movl %ebx, 12(%ecx)
929; X86-X87-NEXT:    movl %edx, 8(%ecx)
930; X86-X87-NEXT:    movl %eax, 4(%ecx)
931; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
932; X86-X87-NEXT:    movl %eax, (%ecx)
933; X86-X87-NEXT:    movl %ecx, %eax
934; X86-X87-NEXT:    addl $60, %esp
935; X86-X87-NEXT:    popl %esi
936; X86-X87-NEXT:    popl %edi
937; X86-X87-NEXT:    popl %ebx
938; X86-X87-NEXT:    popl %ebp
939; X86-X87-NEXT:    retl $4
940; X86-X87-NEXT:  .LBB9_1:
941; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
942; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
943; X86-X87-NEXT:    movl $0, %edx
944; X86-X87-NEXT:    jb .LBB9_4
945; X86-X87-NEXT:  .LBB9_3:
946; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
947; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
948; X86-X87-NEXT:    jae .LBB9_5
949; X86-X87-NEXT:    jmp .LBB9_6
950;
951; X86-SSE-LABEL: test_signed_i128_f32:
952; X86-SSE:       # %bb.0:
953; X86-SSE-NEXT:    pushl %ebp
954; X86-SSE-NEXT:    pushl %ebx
955; X86-SSE-NEXT:    pushl %edi
956; X86-SSE-NEXT:    pushl %esi
957; X86-SSE-NEXT:    subl $44, %esp
958; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
959; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
960; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
961; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
962; X86-SSE-NEXT:    movl %eax, (%esp)
963; X86-SSE-NEXT:    calll __fixsfti
964; X86-SSE-NEXT:    subl $4, %esp
965; X86-SSE-NEXT:    xorl %ecx, %ecx
966; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
967; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
968; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
969; X86-SSE-NEXT:    cmovbl %ecx, %eax
970; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
971; X86-SSE-NEXT:    cmovbl %ecx, %edx
972; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
973; X86-SSE-NEXT:    cmovbl %ecx, %edi
974; X86-SSE-NEXT:    movl $-2147483648, %ebp # imm = 0x80000000
975; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %ebp
976; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
977; X86-SSE-NEXT:    movl $2147483647, %ebx # imm = 0x7FFFFFFF
978; X86-SSE-NEXT:    cmovbel %ebp, %ebx
979; X86-SSE-NEXT:    movl $-1, %ebp
980; X86-SSE-NEXT:    cmoval %ebp, %edi
981; X86-SSE-NEXT:    cmoval %ebp, %edx
982; X86-SSE-NEXT:    cmoval %ebp, %eax
983; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
984; X86-SSE-NEXT:    cmovpl %ecx, %eax
985; X86-SSE-NEXT:    cmovpl %ecx, %edx
986; X86-SSE-NEXT:    cmovpl %ecx, %edi
987; X86-SSE-NEXT:    cmovpl %ecx, %ebx
988; X86-SSE-NEXT:    movl %ebx, 12(%esi)
989; X86-SSE-NEXT:    movl %edi, 8(%esi)
990; X86-SSE-NEXT:    movl %edx, 4(%esi)
991; X86-SSE-NEXT:    movl %eax, (%esi)
992; X86-SSE-NEXT:    movl %esi, %eax
993; X86-SSE-NEXT:    addl $44, %esp
994; X86-SSE-NEXT:    popl %esi
995; X86-SSE-NEXT:    popl %edi
996; X86-SSE-NEXT:    popl %ebx
997; X86-SSE-NEXT:    popl %ebp
998; X86-SSE-NEXT:    retl $4
999;
1000; X64-LABEL: test_signed_i128_f32:
1001; X64:       # %bb.0:
1002; X64-NEXT:    pushq %rax
1003; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
1004; X64-NEXT:    callq __fixsfti@PLT
1005; X64-NEXT:    xorl %ecx, %ecx
1006; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
1007; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero
1008; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1009; X64-NEXT:    cmovbq %rcx, %rax
1010; X64-NEXT:    movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000
1011; X64-NEXT:    cmovbq %rsi, %rdx
1012; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1013; X64-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
1014; X64-NEXT:    cmovaq %rsi, %rdx
1015; X64-NEXT:    movq $-1, %rsi
1016; X64-NEXT:    cmovaq %rsi, %rax
1017; X64-NEXT:    ucomiss %xmm0, %xmm0
1018; X64-NEXT:    cmovpq %rcx, %rax
1019; X64-NEXT:    cmovpq %rcx, %rdx
1020; X64-NEXT:    popq %rcx
1021; X64-NEXT:    retq
1022    %x = call i128 @llvm.fptosi.sat.i128.f32(float %f)
1023    ret i128 %x
1024}
1025
1026;
1027; 64-bit float to signed integer
1028;
1029
1030declare   i1 @llvm.fptosi.sat.i1.f64  (double)
1031declare   i8 @llvm.fptosi.sat.i8.f64  (double)
1032declare  i13 @llvm.fptosi.sat.i13.f64 (double)
1033declare  i16 @llvm.fptosi.sat.i16.f64 (double)
1034declare  i19 @llvm.fptosi.sat.i19.f64 (double)
1035declare  i32 @llvm.fptosi.sat.i32.f64 (double)
1036declare  i50 @llvm.fptosi.sat.i50.f64 (double)
1037declare  i64 @llvm.fptosi.sat.i64.f64 (double)
1038declare i100 @llvm.fptosi.sat.i100.f64(double)
1039declare i128 @llvm.fptosi.sat.i128.f64(double)
1040
1041define i1 @test_signed_i1_f64(double %f) nounwind {
1042; X86-X87-LABEL: test_signed_i1_f64:
1043; X86-X87:       # %bb.0:
1044; X86-X87-NEXT:    pushl %ebx
1045; X86-X87-NEXT:    subl $8, %esp
1046; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1047; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
1048; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1049; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1050; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1051; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1052; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
1053; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1054; X86-X87-NEXT:    fld1
1055; X86-X87-NEXT:    fchs
1056; X86-X87-NEXT:    fxch %st(1)
1057; X86-X87-NEXT:    fucom %st(1)
1058; X86-X87-NEXT:    fstp %st(1)
1059; X86-X87-NEXT:    fnstsw %ax
1060; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1061; X86-X87-NEXT:    sahf
1062; X86-X87-NEXT:    movb $-1, %dl
1063; X86-X87-NEXT:    jb .LBB10_2
1064; X86-X87-NEXT:  # %bb.1:
1065; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
1066; X86-X87-NEXT:  .LBB10_2:
1067; X86-X87-NEXT:    fldz
1068; X86-X87-NEXT:    fxch %st(1)
1069; X86-X87-NEXT:    fucom %st(1)
1070; X86-X87-NEXT:    fstp %st(1)
1071; X86-X87-NEXT:    fnstsw %ax
1072; X86-X87-NEXT:    xorl %ecx, %ecx
1073; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1074; X86-X87-NEXT:    sahf
1075; X86-X87-NEXT:    movl $0, %ebx
1076; X86-X87-NEXT:    ja .LBB10_4
1077; X86-X87-NEXT:  # %bb.3:
1078; X86-X87-NEXT:    movl %edx, %ebx
1079; X86-X87-NEXT:  .LBB10_4:
1080; X86-X87-NEXT:    fucomp %st(0)
1081; X86-X87-NEXT:    fnstsw %ax
1082; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1083; X86-X87-NEXT:    sahf
1084; X86-X87-NEXT:    jp .LBB10_6
1085; X86-X87-NEXT:  # %bb.5:
1086; X86-X87-NEXT:    movl %ebx, %ecx
1087; X86-X87-NEXT:  .LBB10_6:
1088; X86-X87-NEXT:    movl %ecx, %eax
1089; X86-X87-NEXT:    addl $8, %esp
1090; X86-X87-NEXT:    popl %ebx
1091; X86-X87-NEXT:    retl
1092;
1093; X86-SSE-LABEL: test_signed_i1_f64:
1094; X86-SSE:       # %bb.0:
1095; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [-1.0E+0,0.0E+0]
1096; X86-SSE-NEXT:    maxsd {{[0-9]+}}(%esp), %xmm0
1097; X86-SSE-NEXT:    xorpd %xmm1, %xmm1
1098; X86-SSE-NEXT:    minsd %xmm0, %xmm1
1099; X86-SSE-NEXT:    cvttsd2si %xmm1, %eax
1100; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
1101; X86-SSE-NEXT:    retl
1102;
1103; X64-LABEL: test_signed_i1_f64:
1104; X64:       # %bb.0:
1105; X64-NEXT:    movsd {{.*#+}} xmm1 = [-1.0E+0,0.0E+0]
1106; X64-NEXT:    maxsd %xmm0, %xmm1
1107; X64-NEXT:    xorpd %xmm0, %xmm0
1108; X64-NEXT:    minsd %xmm1, %xmm0
1109; X64-NEXT:    cvttsd2si %xmm0, %eax
1110; X64-NEXT:    # kill: def $al killed $al killed $eax
1111; X64-NEXT:    retq
1112    %x = call i1 @llvm.fptosi.sat.i1.f64(double %f)
1113    ret i1 %x
1114}
1115
1116define i8 @test_signed_i8_f64(double %f) nounwind {
1117; X86-X87-LABEL: test_signed_i8_f64:
1118; X86-X87:       # %bb.0:
1119; X86-X87-NEXT:    subl $8, %esp
1120; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1121; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
1122; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1123; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1124; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1125; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1126; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
1127; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1128; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1129; X86-X87-NEXT:    fxch %st(1)
1130; X86-X87-NEXT:    fucom %st(1)
1131; X86-X87-NEXT:    fstp %st(1)
1132; X86-X87-NEXT:    fnstsw %ax
1133; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1134; X86-X87-NEXT:    sahf
1135; X86-X87-NEXT:    movb $-128, %dl
1136; X86-X87-NEXT:    jb .LBB11_2
1137; X86-X87-NEXT:  # %bb.1:
1138; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
1139; X86-X87-NEXT:  .LBB11_2:
1140; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1141; X86-X87-NEXT:    fxch %st(1)
1142; X86-X87-NEXT:    fucom %st(1)
1143; X86-X87-NEXT:    fstp %st(1)
1144; X86-X87-NEXT:    fnstsw %ax
1145; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1146; X86-X87-NEXT:    sahf
1147; X86-X87-NEXT:    movb $127, %cl
1148; X86-X87-NEXT:    ja .LBB11_4
1149; X86-X87-NEXT:  # %bb.3:
1150; X86-X87-NEXT:    movl %edx, %ecx
1151; X86-X87-NEXT:  .LBB11_4:
1152; X86-X87-NEXT:    fucomp %st(0)
1153; X86-X87-NEXT:    fnstsw %ax
1154; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1155; X86-X87-NEXT:    sahf
1156; X86-X87-NEXT:    jnp .LBB11_6
1157; X86-X87-NEXT:  # %bb.5:
1158; X86-X87-NEXT:    xorl %ecx, %ecx
1159; X86-X87-NEXT:  .LBB11_6:
1160; X86-X87-NEXT:    movl %ecx, %eax
1161; X86-X87-NEXT:    addl $8, %esp
1162; X86-X87-NEXT:    retl
1163;
1164; X86-SSE-LABEL: test_signed_i8_f64:
1165; X86-SSE:       # %bb.0:
1166; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [-1.28E+2,0.0E+0]
1167; X86-SSE-NEXT:    maxsd {{[0-9]+}}(%esp), %xmm0
1168; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = [1.27E+2,0.0E+0]
1169; X86-SSE-NEXT:    minsd %xmm0, %xmm1
1170; X86-SSE-NEXT:    cvttsd2si %xmm1, %eax
1171; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
1172; X86-SSE-NEXT:    retl
1173;
1174; X64-LABEL: test_signed_i8_f64:
1175; X64:       # %bb.0:
1176; X64-NEXT:    movsd {{.*#+}} xmm1 = [-1.28E+2,0.0E+0]
1177; X64-NEXT:    maxsd %xmm0, %xmm1
1178; X64-NEXT:    movsd {{.*#+}} xmm0 = [1.27E+2,0.0E+0]
1179; X64-NEXT:    minsd %xmm1, %xmm0
1180; X64-NEXT:    cvttsd2si %xmm0, %eax
1181; X64-NEXT:    # kill: def $al killed $al killed $eax
1182; X64-NEXT:    retq
1183    %x = call i8 @llvm.fptosi.sat.i8.f64(double %f)
1184    ret i8 %x
1185}
1186
1187define i13 @test_signed_i13_f64(double %f) nounwind {
1188; X86-X87-LABEL: test_signed_i13_f64:
1189; X86-X87:       # %bb.0:
1190; X86-X87-NEXT:    subl $8, %esp
1191; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1192; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
1193; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1194; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1195; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1196; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1197; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
1198; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1199; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1200; X86-X87-NEXT:    fxch %st(1)
1201; X86-X87-NEXT:    fucom %st(1)
1202; X86-X87-NEXT:    fstp %st(1)
1203; X86-X87-NEXT:    fnstsw %ax
1204; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1205; X86-X87-NEXT:    sahf
1206; X86-X87-NEXT:    movl $61440, %ecx # imm = 0xF000
1207; X86-X87-NEXT:    jb .LBB12_2
1208; X86-X87-NEXT:  # %bb.1:
1209; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1210; X86-X87-NEXT:  .LBB12_2:
1211; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1212; X86-X87-NEXT:    fxch %st(1)
1213; X86-X87-NEXT:    fucom %st(1)
1214; X86-X87-NEXT:    fstp %st(1)
1215; X86-X87-NEXT:    fnstsw %ax
1216; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1217; X86-X87-NEXT:    sahf
1218; X86-X87-NEXT:    movl $4095, %edx # imm = 0xFFF
1219; X86-X87-NEXT:    ja .LBB12_4
1220; X86-X87-NEXT:  # %bb.3:
1221; X86-X87-NEXT:    movl %ecx, %edx
1222; X86-X87-NEXT:  .LBB12_4:
1223; X86-X87-NEXT:    fucomp %st(0)
1224; X86-X87-NEXT:    fnstsw %ax
1225; X86-X87-NEXT:    xorl %ecx, %ecx
1226; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1227; X86-X87-NEXT:    sahf
1228; X86-X87-NEXT:    jp .LBB12_6
1229; X86-X87-NEXT:  # %bb.5:
1230; X86-X87-NEXT:    movl %edx, %ecx
1231; X86-X87-NEXT:  .LBB12_6:
1232; X86-X87-NEXT:    movl %ecx, %eax
1233; X86-X87-NEXT:    addl $8, %esp
1234; X86-X87-NEXT:    retl
1235;
1236; X86-SSE-LABEL: test_signed_i13_f64:
1237; X86-SSE:       # %bb.0:
1238; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [-4.096E+3,0.0E+0]
1239; X86-SSE-NEXT:    maxsd {{[0-9]+}}(%esp), %xmm0
1240; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = [4.095E+3,0.0E+0]
1241; X86-SSE-NEXT:    minsd %xmm0, %xmm1
1242; X86-SSE-NEXT:    cvttsd2si %xmm1, %eax
1243; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1244; X86-SSE-NEXT:    retl
1245;
1246; X64-LABEL: test_signed_i13_f64:
1247; X64:       # %bb.0:
1248; X64-NEXT:    movsd {{.*#+}} xmm1 = [-4.096E+3,0.0E+0]
1249; X64-NEXT:    maxsd %xmm0, %xmm1
1250; X64-NEXT:    movsd {{.*#+}} xmm0 = [4.095E+3,0.0E+0]
1251; X64-NEXT:    minsd %xmm1, %xmm0
1252; X64-NEXT:    cvttsd2si %xmm0, %eax
1253; X64-NEXT:    # kill: def $ax killed $ax killed $eax
1254; X64-NEXT:    retq
1255    %x = call i13 @llvm.fptosi.sat.i13.f64(double %f)
1256    ret i13 %x
1257}
1258
1259define i16 @test_signed_i16_f64(double %f) nounwind {
1260; X86-X87-LABEL: test_signed_i16_f64:
1261; X86-X87:       # %bb.0:
1262; X86-X87-NEXT:    subl $8, %esp
1263; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1264; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
1265; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1266; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1267; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1268; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1269; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
1270; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1271; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1272; X86-X87-NEXT:    fxch %st(1)
1273; X86-X87-NEXT:    fucom %st(1)
1274; X86-X87-NEXT:    fstp %st(1)
1275; X86-X87-NEXT:    fnstsw %ax
1276; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1277; X86-X87-NEXT:    sahf
1278; X86-X87-NEXT:    movl $32768, %ecx # imm = 0x8000
1279; X86-X87-NEXT:    jb .LBB13_2
1280; X86-X87-NEXT:  # %bb.1:
1281; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
1282; X86-X87-NEXT:  .LBB13_2:
1283; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1284; X86-X87-NEXT:    fxch %st(1)
1285; X86-X87-NEXT:    fucom %st(1)
1286; X86-X87-NEXT:    fstp %st(1)
1287; X86-X87-NEXT:    fnstsw %ax
1288; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1289; X86-X87-NEXT:    sahf
1290; X86-X87-NEXT:    movl $32767, %edx # imm = 0x7FFF
1291; X86-X87-NEXT:    ja .LBB13_4
1292; X86-X87-NEXT:  # %bb.3:
1293; X86-X87-NEXT:    movl %ecx, %edx
1294; X86-X87-NEXT:  .LBB13_4:
1295; X86-X87-NEXT:    fucomp %st(0)
1296; X86-X87-NEXT:    fnstsw %ax
1297; X86-X87-NEXT:    xorl %ecx, %ecx
1298; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1299; X86-X87-NEXT:    sahf
1300; X86-X87-NEXT:    jp .LBB13_6
1301; X86-X87-NEXT:  # %bb.5:
1302; X86-X87-NEXT:    movl %edx, %ecx
1303; X86-X87-NEXT:  .LBB13_6:
1304; X86-X87-NEXT:    movl %ecx, %eax
1305; X86-X87-NEXT:    addl $8, %esp
1306; X86-X87-NEXT:    retl
1307;
1308; X86-SSE-LABEL: test_signed_i16_f64:
1309; X86-SSE:       # %bb.0:
1310; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = [-3.2768E+4,0.0E+0]
1311; X86-SSE-NEXT:    maxsd {{[0-9]+}}(%esp), %xmm0
1312; X86-SSE-NEXT:    movsd {{.*#+}} xmm1 = [3.2767E+4,0.0E+0]
1313; X86-SSE-NEXT:    minsd %xmm0, %xmm1
1314; X86-SSE-NEXT:    cvttsd2si %xmm1, %eax
1315; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
1316; X86-SSE-NEXT:    retl
1317;
1318; X64-LABEL: test_signed_i16_f64:
1319; X64:       # %bb.0:
1320; X64-NEXT:    movsd {{.*#+}} xmm1 = [-3.2768E+4,0.0E+0]
1321; X64-NEXT:    maxsd %xmm0, %xmm1
1322; X64-NEXT:    movsd {{.*#+}} xmm0 = [3.2767E+4,0.0E+0]
1323; X64-NEXT:    minsd %xmm1, %xmm0
1324; X64-NEXT:    cvttsd2si %xmm0, %eax
1325; X64-NEXT:    # kill: def $ax killed $ax killed $eax
1326; X64-NEXT:    retq
1327    %x = call i16 @llvm.fptosi.sat.i16.f64(double %f)
1328    ret i16 %x
1329}
1330
1331define i19 @test_signed_i19_f64(double %f) nounwind {
1332; X86-X87-LABEL: test_signed_i19_f64:
1333; X86-X87:       # %bb.0:
1334; X86-X87-NEXT:    subl $8, %esp
1335; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1336; X86-X87-NEXT:    fnstcw (%esp)
1337; X86-X87-NEXT:    movzwl (%esp), %eax
1338; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1339; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1340; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1341; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
1342; X86-X87-NEXT:    fldcw (%esp)
1343; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1344; X86-X87-NEXT:    fxch %st(1)
1345; X86-X87-NEXT:    fucom %st(1)
1346; X86-X87-NEXT:    fstp %st(1)
1347; X86-X87-NEXT:    fnstsw %ax
1348; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1349; X86-X87-NEXT:    sahf
1350; X86-X87-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000
1351; X86-X87-NEXT:    jb .LBB14_2
1352; X86-X87-NEXT:  # %bb.1:
1353; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1354; X86-X87-NEXT:  .LBB14_2:
1355; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1356; X86-X87-NEXT:    fxch %st(1)
1357; X86-X87-NEXT:    fucom %st(1)
1358; X86-X87-NEXT:    fstp %st(1)
1359; X86-X87-NEXT:    fnstsw %ax
1360; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1361; X86-X87-NEXT:    sahf
1362; X86-X87-NEXT:    movl $262143, %edx # imm = 0x3FFFF
1363; X86-X87-NEXT:    ja .LBB14_4
1364; X86-X87-NEXT:  # %bb.3:
1365; X86-X87-NEXT:    movl %ecx, %edx
1366; X86-X87-NEXT:  .LBB14_4:
1367; X86-X87-NEXT:    fucomp %st(0)
1368; X86-X87-NEXT:    fnstsw %ax
1369; X86-X87-NEXT:    xorl %ecx, %ecx
1370; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1371; X86-X87-NEXT:    sahf
1372; X86-X87-NEXT:    jp .LBB14_6
1373; X86-X87-NEXT:  # %bb.5:
1374; X86-X87-NEXT:    movl %edx, %ecx
1375; X86-X87-NEXT:  .LBB14_6:
1376; X86-X87-NEXT:    movl %ecx, %eax
1377; X86-X87-NEXT:    addl $8, %esp
1378; X86-X87-NEXT:    retl
1379;
1380; X86-SSE-LABEL: test_signed_i19_f64:
1381; X86-SSE:       # %bb.0:
1382; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1383; X86-SSE-NEXT:    xorl %eax, %eax
1384; X86-SSE-NEXT:    ucomisd %xmm0, %xmm0
1385; X86-SSE-NEXT:    maxsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1386; X86-SSE-NEXT:    minsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1387; X86-SSE-NEXT:    cvttsd2si %xmm0, %ecx
1388; X86-SSE-NEXT:    cmovnpl %ecx, %eax
1389; X86-SSE-NEXT:    retl
1390;
1391; X64-LABEL: test_signed_i19_f64:
1392; X64:       # %bb.0:
1393; X64-NEXT:    xorl %eax, %eax
1394; X64-NEXT:    ucomisd %xmm0, %xmm0
1395; X64-NEXT:    maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1396; X64-NEXT:    minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1397; X64-NEXT:    cvttsd2si %xmm0, %ecx
1398; X64-NEXT:    cmovnpl %ecx, %eax
1399; X64-NEXT:    retq
1400    %x = call i19 @llvm.fptosi.sat.i19.f64(double %f)
1401    ret i19 %x
1402}
1403
1404define i32 @test_signed_i32_f64(double %f) nounwind {
1405; X86-X87-LABEL: test_signed_i32_f64:
1406; X86-X87:       # %bb.0:
1407; X86-X87-NEXT:    subl $8, %esp
1408; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1409; X86-X87-NEXT:    fnstcw (%esp)
1410; X86-X87-NEXT:    movzwl (%esp), %eax
1411; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1412; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1413; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1414; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
1415; X86-X87-NEXT:    fldcw (%esp)
1416; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1417; X86-X87-NEXT:    fxch %st(1)
1418; X86-X87-NEXT:    fucom %st(1)
1419; X86-X87-NEXT:    fstp %st(1)
1420; X86-X87-NEXT:    fnstsw %ax
1421; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1422; X86-X87-NEXT:    sahf
1423; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
1424; X86-X87-NEXT:    jb .LBB15_2
1425; X86-X87-NEXT:  # %bb.1:
1426; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1427; X86-X87-NEXT:  .LBB15_2:
1428; X86-X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
1429; X86-X87-NEXT:    fxch %st(1)
1430; X86-X87-NEXT:    fucom %st(1)
1431; X86-X87-NEXT:    fstp %st(1)
1432; X86-X87-NEXT:    fnstsw %ax
1433; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1434; X86-X87-NEXT:    sahf
1435; X86-X87-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
1436; X86-X87-NEXT:    ja .LBB15_4
1437; X86-X87-NEXT:  # %bb.3:
1438; X86-X87-NEXT:    movl %ecx, %edx
1439; X86-X87-NEXT:  .LBB15_4:
1440; X86-X87-NEXT:    fucomp %st(0)
1441; X86-X87-NEXT:    fnstsw %ax
1442; X86-X87-NEXT:    xorl %ecx, %ecx
1443; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1444; X86-X87-NEXT:    sahf
1445; X86-X87-NEXT:    jp .LBB15_6
1446; X86-X87-NEXT:  # %bb.5:
1447; X86-X87-NEXT:    movl %edx, %ecx
1448; X86-X87-NEXT:  .LBB15_6:
1449; X86-X87-NEXT:    movl %ecx, %eax
1450; X86-X87-NEXT:    addl $8, %esp
1451; X86-X87-NEXT:    retl
1452;
1453; X86-SSE-LABEL: test_signed_i32_f64:
1454; X86-SSE:       # %bb.0:
1455; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1456; X86-SSE-NEXT:    xorl %eax, %eax
1457; X86-SSE-NEXT:    ucomisd %xmm0, %xmm0
1458; X86-SSE-NEXT:    maxsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1459; X86-SSE-NEXT:    minsd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1460; X86-SSE-NEXT:    cvttsd2si %xmm0, %ecx
1461; X86-SSE-NEXT:    cmovnpl %ecx, %eax
1462; X86-SSE-NEXT:    retl
1463;
1464; X64-LABEL: test_signed_i32_f64:
1465; X64:       # %bb.0:
1466; X64-NEXT:    xorl %eax, %eax
1467; X64-NEXT:    ucomisd %xmm0, %xmm0
1468; X64-NEXT:    maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1469; X64-NEXT:    minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1470; X64-NEXT:    cvttsd2si %xmm0, %ecx
1471; X64-NEXT:    cmovnpl %ecx, %eax
1472; X64-NEXT:    retq
1473    %x = call i32 @llvm.fptosi.sat.i32.f64(double %f)
1474    ret i32 %x
1475}
1476
1477define i50 @test_signed_i50_f64(double %f) nounwind {
1478; X86-X87-LABEL: test_signed_i50_f64:
1479; X86-X87:       # %bb.0:
1480; X86-X87-NEXT:    pushl %edi
1481; X86-X87-NEXT:    pushl %esi
1482; X86-X87-NEXT:    subl $20, %esp
1483; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1484; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
1485; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1486; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1487; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1488; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1489; X86-X87-NEXT:    fld %st(0)
1490; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
1491; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1492; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1493; X86-X87-NEXT:    fxch %st(1)
1494; X86-X87-NEXT:    fucom %st(1)
1495; X86-X87-NEXT:    fstp %st(1)
1496; X86-X87-NEXT:    fnstsw %ax
1497; X86-X87-NEXT:    xorl %ecx, %ecx
1498; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1499; X86-X87-NEXT:    sahf
1500; X86-X87-NEXT:    movl $0, %edx
1501; X86-X87-NEXT:    jb .LBB16_2
1502; X86-X87-NEXT:  # %bb.1:
1503; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
1504; X86-X87-NEXT:  .LBB16_2:
1505; X86-X87-NEXT:    movl $-131072, %edi # imm = 0xFFFE0000
1506; X86-X87-NEXT:    jb .LBB16_4
1507; X86-X87-NEXT:  # %bb.3:
1508; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
1509; X86-X87-NEXT:  .LBB16_4:
1510; X86-X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
1511; X86-X87-NEXT:    fxch %st(1)
1512; X86-X87-NEXT:    fucom %st(1)
1513; X86-X87-NEXT:    fstp %st(1)
1514; X86-X87-NEXT:    fnstsw %ax
1515; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1516; X86-X87-NEXT:    sahf
1517; X86-X87-NEXT:    movl $131071, %esi # imm = 0x1FFFF
1518; X86-X87-NEXT:    ja .LBB16_6
1519; X86-X87-NEXT:  # %bb.5:
1520; X86-X87-NEXT:    movl %edi, %esi
1521; X86-X87-NEXT:  .LBB16_6:
1522; X86-X87-NEXT:    movl $-1, %edi
1523; X86-X87-NEXT:    ja .LBB16_8
1524; X86-X87-NEXT:  # %bb.7:
1525; X86-X87-NEXT:    movl %edx, %edi
1526; X86-X87-NEXT:  .LBB16_8:
1527; X86-X87-NEXT:    fucomp %st(0)
1528; X86-X87-NEXT:    fnstsw %ax
1529; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1530; X86-X87-NEXT:    sahf
1531; X86-X87-NEXT:    movl $0, %edx
1532; X86-X87-NEXT:    jp .LBB16_10
1533; X86-X87-NEXT:  # %bb.9:
1534; X86-X87-NEXT:    movl %edi, %ecx
1535; X86-X87-NEXT:    movl %esi, %edx
1536; X86-X87-NEXT:  .LBB16_10:
1537; X86-X87-NEXT:    movl %ecx, %eax
1538; X86-X87-NEXT:    addl $20, %esp
1539; X86-X87-NEXT:    popl %esi
1540; X86-X87-NEXT:    popl %edi
1541; X86-X87-NEXT:    retl
1542;
1543; X86-SSE-LABEL: test_signed_i50_f64:
1544; X86-SSE:       # %bb.0:
1545; X86-SSE-NEXT:    pushl %esi
1546; X86-SSE-NEXT:    subl $16, %esp
1547; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1548; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
1549; X86-SSE-NEXT:    fldl {{[0-9]+}}(%esp)
1550; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
1551; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1552; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
1553; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1554; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
1555; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
1556; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
1557; X86-SSE-NEXT:    xorl %ecx, %ecx
1558; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1559; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
1560; X86-SSE-NEXT:    cmovbl %ecx, %esi
1561; X86-SSE-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
1562; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
1563; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1564; X86-SSE-NEXT:    movl $131071, %edx # imm = 0x1FFFF
1565; X86-SSE-NEXT:    cmovbel %eax, %edx
1566; X86-SSE-NEXT:    movl $-1, %eax
1567; X86-SSE-NEXT:    cmovbel %esi, %eax
1568; X86-SSE-NEXT:    ucomisd %xmm0, %xmm0
1569; X86-SSE-NEXT:    cmovpl %ecx, %eax
1570; X86-SSE-NEXT:    cmovpl %ecx, %edx
1571; X86-SSE-NEXT:    addl $16, %esp
1572; X86-SSE-NEXT:    popl %esi
1573; X86-SSE-NEXT:    retl
1574;
1575; X64-LABEL: test_signed_i50_f64:
1576; X64:       # %bb.0:
1577; X64-NEXT:    xorl %eax, %eax
1578; X64-NEXT:    ucomisd %xmm0, %xmm0
1579; X64-NEXT:    maxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1580; X64-NEXT:    minsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1581; X64-NEXT:    cvttsd2si %xmm0, %rcx
1582; X64-NEXT:    cmovnpq %rcx, %rax
1583; X64-NEXT:    retq
1584    %x = call i50 @llvm.fptosi.sat.i50.f64(double %f)
1585    ret i50 %x
1586}
1587
1588define i64 @test_signed_i64_f64(double %f) nounwind {
1589; X86-X87-LABEL: test_signed_i64_f64:
1590; X86-X87:       # %bb.0:
1591; X86-X87-NEXT:    pushl %edi
1592; X86-X87-NEXT:    pushl %esi
1593; X86-X87-NEXT:    subl $20, %esp
1594; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1595; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
1596; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1597; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
1598; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1599; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1600; X86-X87-NEXT:    fld %st(0)
1601; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
1602; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
1603; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1604; X86-X87-NEXT:    fxch %st(1)
1605; X86-X87-NEXT:    fucom %st(1)
1606; X86-X87-NEXT:    fstp %st(1)
1607; X86-X87-NEXT:    fnstsw %ax
1608; X86-X87-NEXT:    xorl %ecx, %ecx
1609; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1610; X86-X87-NEXT:    sahf
1611; X86-X87-NEXT:    movl $0, %edx
1612; X86-X87-NEXT:    jb .LBB17_2
1613; X86-X87-NEXT:  # %bb.1:
1614; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
1615; X86-X87-NEXT:  .LBB17_2:
1616; X86-X87-NEXT:    movl $-2147483648, %edi # imm = 0x80000000
1617; X86-X87-NEXT:    jb .LBB17_4
1618; X86-X87-NEXT:  # %bb.3:
1619; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
1620; X86-X87-NEXT:  .LBB17_4:
1621; X86-X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
1622; X86-X87-NEXT:    fxch %st(1)
1623; X86-X87-NEXT:    fucom %st(1)
1624; X86-X87-NEXT:    fstp %st(1)
1625; X86-X87-NEXT:    fnstsw %ax
1626; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1627; X86-X87-NEXT:    sahf
1628; X86-X87-NEXT:    movl $2147483647, %esi # imm = 0x7FFFFFFF
1629; X86-X87-NEXT:    ja .LBB17_6
1630; X86-X87-NEXT:  # %bb.5:
1631; X86-X87-NEXT:    movl %edi, %esi
1632; X86-X87-NEXT:  .LBB17_6:
1633; X86-X87-NEXT:    movl $-1, %edi
1634; X86-X87-NEXT:    ja .LBB17_8
1635; X86-X87-NEXT:  # %bb.7:
1636; X86-X87-NEXT:    movl %edx, %edi
1637; X86-X87-NEXT:  .LBB17_8:
1638; X86-X87-NEXT:    fucomp %st(0)
1639; X86-X87-NEXT:    fnstsw %ax
1640; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1641; X86-X87-NEXT:    sahf
1642; X86-X87-NEXT:    movl $0, %edx
1643; X86-X87-NEXT:    jp .LBB17_10
1644; X86-X87-NEXT:  # %bb.9:
1645; X86-X87-NEXT:    movl %edi, %ecx
1646; X86-X87-NEXT:    movl %esi, %edx
1647; X86-X87-NEXT:  .LBB17_10:
1648; X86-X87-NEXT:    movl %ecx, %eax
1649; X86-X87-NEXT:    addl $20, %esp
1650; X86-X87-NEXT:    popl %esi
1651; X86-X87-NEXT:    popl %edi
1652; X86-X87-NEXT:    retl
1653;
1654; X86-SSE-LABEL: test_signed_i64_f64:
1655; X86-SSE:       # %bb.0:
1656; X86-SSE-NEXT:    pushl %esi
1657; X86-SSE-NEXT:    subl $16, %esp
1658; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1659; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
1660; X86-SSE-NEXT:    fldl {{[0-9]+}}(%esp)
1661; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
1662; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
1663; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
1664; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
1665; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
1666; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
1667; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
1668; X86-SSE-NEXT:    xorl %ecx, %ecx
1669; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1670; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
1671; X86-SSE-NEXT:    cmovbl %ecx, %esi
1672; X86-SSE-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
1673; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
1674; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1675; X86-SSE-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
1676; X86-SSE-NEXT:    cmovbel %eax, %edx
1677; X86-SSE-NEXT:    movl $-1, %eax
1678; X86-SSE-NEXT:    cmovbel %esi, %eax
1679; X86-SSE-NEXT:    ucomisd %xmm0, %xmm0
1680; X86-SSE-NEXT:    cmovpl %ecx, %eax
1681; X86-SSE-NEXT:    cmovpl %ecx, %edx
1682; X86-SSE-NEXT:    addl $16, %esp
1683; X86-SSE-NEXT:    popl %esi
1684; X86-SSE-NEXT:    retl
1685;
1686; X64-LABEL: test_signed_i64_f64:
1687; X64:       # %bb.0:
1688; X64-NEXT:    cvttsd2si %xmm0, %rax
1689; X64-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1690; X64-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
1691; X64-NEXT:    cmovbeq %rax, %rcx
1692; X64-NEXT:    xorl %eax, %eax
1693; X64-NEXT:    ucomisd %xmm0, %xmm0
1694; X64-NEXT:    cmovnpq %rcx, %rax
1695; X64-NEXT:    retq
1696    %x = call i64 @llvm.fptosi.sat.i64.f64(double %f)
1697    ret i64 %x
1698}
1699
1700define i100 @test_signed_i100_f64(double %f) nounwind {
1701; X86-X87-LABEL: test_signed_i100_f64:
1702; X86-X87:       # %bb.0:
1703; X86-X87-NEXT:    pushl %ebp
1704; X86-X87-NEXT:    pushl %ebx
1705; X86-X87-NEXT:    pushl %edi
1706; X86-X87-NEXT:    pushl %esi
1707; X86-X87-NEXT:    subl $60, %esp
1708; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1709; X86-X87-NEXT:    fstl {{[0-9]+}}(%esp)
1710; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
1711; X86-X87-NEXT:    movl %eax, (%esp)
1712; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1713; X86-X87-NEXT:    fxch %st(1)
1714; X86-X87-NEXT:    fstl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
1715; X86-X87-NEXT:    fucompp
1716; X86-X87-NEXT:    fnstsw %ax
1717; X86-X87-NEXT:    movl %eax, %ebx
1718; X86-X87-NEXT:    calll __fixdfti
1719; X86-X87-NEXT:    subl $4, %esp
1720; X86-X87-NEXT:    xorl %edx, %edx
1721; X86-X87-NEXT:    movb %bh, %ah
1722; X86-X87-NEXT:    sahf
1723; X86-X87-NEXT:    movl $-8, %ebx
1724; X86-X87-NEXT:    jb .LBB18_2
1725; X86-X87-NEXT:  # %bb.1:
1726; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
1727; X86-X87-NEXT:  .LBB18_2:
1728; X86-X87-NEXT:    movl $0, %ecx
1729; X86-X87-NEXT:    movl $0, %ebp
1730; X86-X87-NEXT:    jb .LBB18_4
1731; X86-X87-NEXT:  # %bb.3:
1732; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1733; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebp
1734; X86-X87-NEXT:  .LBB18_4:
1735; X86-X87-NEXT:    movl $0, %edi
1736; X86-X87-NEXT:    jb .LBB18_6
1737; X86-X87-NEXT:  # %bb.5:
1738; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
1739; X86-X87-NEXT:  .LBB18_6:
1740; X86-X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
1741; X86-X87-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
1742; X86-X87-NEXT:    fucom %st(1)
1743; X86-X87-NEXT:    fstp %st(1)
1744; X86-X87-NEXT:    fnstsw %ax
1745; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1746; X86-X87-NEXT:    sahf
1747; X86-X87-NEXT:    movl $-1, %eax
1748; X86-X87-NEXT:    movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
1749; X86-X87-NEXT:    movl $-1, %esi
1750; X86-X87-NEXT:    ja .LBB18_8
1751; X86-X87-NEXT:  # %bb.7:
1752; X86-X87-NEXT:    movl %edi, %eax
1753; X86-X87-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1754; X86-X87-NEXT:    movl %ecx, %esi
1755; X86-X87-NEXT:  .LBB18_8:
1756; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1757; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1758; X86-X87-NEXT:    movl $7, %edi
1759; X86-X87-NEXT:    ja .LBB18_10
1760; X86-X87-NEXT:  # %bb.9:
1761; X86-X87-NEXT:    movl %ebx, %edi
1762; X86-X87-NEXT:  .LBB18_10:
1763; X86-X87-NEXT:    fucomp %st(0)
1764; X86-X87-NEXT:    fnstsw %ax
1765; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1766; X86-X87-NEXT:    sahf
1767; X86-X87-NEXT:    movl $0, %eax
1768; X86-X87-NEXT:    movl $0, %ebp
1769; X86-X87-NEXT:    movl $0, %ebx
1770; X86-X87-NEXT:    jp .LBB18_12
1771; X86-X87-NEXT:  # %bb.11:
1772; X86-X87-NEXT:    movl %edi, %edx
1773; X86-X87-NEXT:    movl %esi, %eax
1774; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
1775; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
1776; X86-X87-NEXT:  .LBB18_12:
1777; X86-X87-NEXT:    movl %ebx, 8(%ecx)
1778; X86-X87-NEXT:    movl %ebp, 4(%ecx)
1779; X86-X87-NEXT:    movl %eax, (%ecx)
1780; X86-X87-NEXT:    andl $15, %edx
1781; X86-X87-NEXT:    movb %dl, 12(%ecx)
1782; X86-X87-NEXT:    movl %ecx, %eax
1783; X86-X87-NEXT:    addl $60, %esp
1784; X86-X87-NEXT:    popl %esi
1785; X86-X87-NEXT:    popl %edi
1786; X86-X87-NEXT:    popl %ebx
1787; X86-X87-NEXT:    popl %ebp
1788; X86-X87-NEXT:    retl $4
1789;
1790; X86-SSE-LABEL: test_signed_i100_f64:
1791; X86-SSE:       # %bb.0:
1792; X86-SSE-NEXT:    pushl %ebp
1793; X86-SSE-NEXT:    pushl %ebx
1794; X86-SSE-NEXT:    pushl %edi
1795; X86-SSE-NEXT:    pushl %esi
1796; X86-SSE-NEXT:    subl $44, %esp
1797; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
1798; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1799; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
1800; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
1801; X86-SSE-NEXT:    movl %eax, (%esp)
1802; X86-SSE-NEXT:    calll __fixdfti
1803; X86-SSE-NEXT:    subl $4, %esp
1804; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1805; X86-SSE-NEXT:    xorl %ebp, %ebp
1806; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1807; X86-SSE-NEXT:    movl $-8, %ebx
1808; X86-SSE-NEXT:    movl $0, %ecx
1809; X86-SSE-NEXT:    movl $0, %edx
1810; X86-SSE-NEXT:    movl $0, %edi
1811; X86-SSE-NEXT:    jb .LBB18_2
1812; X86-SSE-NEXT:  # %bb.1:
1813; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ebx
1814; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1815; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
1816; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
1817; X86-SSE-NEXT:  .LBB18_2:
1818; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1819; X86-SSE-NEXT:    movl $-1, %eax
1820; X86-SSE-NEXT:    cmoval %eax, %edi
1821; X86-SSE-NEXT:    cmoval %eax, %edx
1822; X86-SSE-NEXT:    cmoval %eax, %ecx
1823; X86-SSE-NEXT:    movl $7, %eax
1824; X86-SSE-NEXT:    cmovbel %ebx, %eax
1825; X86-SSE-NEXT:    ucomisd %xmm0, %xmm0
1826; X86-SSE-NEXT:    cmovpl %ebp, %eax
1827; X86-SSE-NEXT:    cmovpl %ebp, %ecx
1828; X86-SSE-NEXT:    cmovpl %ebp, %edx
1829; X86-SSE-NEXT:    cmovpl %ebp, %edi
1830; X86-SSE-NEXT:    movl %edi, 8(%esi)
1831; X86-SSE-NEXT:    movl %edx, 4(%esi)
1832; X86-SSE-NEXT:    movl %ecx, (%esi)
1833; X86-SSE-NEXT:    andl $15, %eax
1834; X86-SSE-NEXT:    movb %al, 12(%esi)
1835; X86-SSE-NEXT:    movl %esi, %eax
1836; X86-SSE-NEXT:    addl $44, %esp
1837; X86-SSE-NEXT:    popl %esi
1838; X86-SSE-NEXT:    popl %edi
1839; X86-SSE-NEXT:    popl %ebx
1840; X86-SSE-NEXT:    popl %ebp
1841; X86-SSE-NEXT:    retl $4
1842;
1843; X64-LABEL: test_signed_i100_f64:
1844; X64:       # %bb.0:
1845; X64-NEXT:    pushq %rax
1846; X64-NEXT:    movsd %xmm0, (%rsp) # 8-byte Spill
1847; X64-NEXT:    callq __fixdfti@PLT
1848; X64-NEXT:    xorl %ecx, %ecx
1849; X64-NEXT:    movsd (%rsp), %xmm0 # 8-byte Reload
1850; X64-NEXT:    # xmm0 = mem[0],zero
1851; X64-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1852; X64-NEXT:    cmovbq %rcx, %rax
1853; X64-NEXT:    movabsq $-34359738368, %rsi # imm = 0xFFFFFFF800000000
1854; X64-NEXT:    cmovbq %rsi, %rdx
1855; X64-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
1856; X64-NEXT:    movabsq $34359738367, %rsi # imm = 0x7FFFFFFFF
1857; X64-NEXT:    cmovaq %rsi, %rdx
1858; X64-NEXT:    movq $-1, %rsi
1859; X64-NEXT:    cmovaq %rsi, %rax
1860; X64-NEXT:    ucomisd %xmm0, %xmm0
1861; X64-NEXT:    cmovpq %rcx, %rax
1862; X64-NEXT:    cmovpq %rcx, %rdx
1863; X64-NEXT:    popq %rcx
1864; X64-NEXT:    retq
1865    %x = call i100 @llvm.fptosi.sat.i100.f64(double %f)
1866    ret i100 %x
1867}
1868
1869define i128 @test_signed_i128_f64(double %f) nounwind {
1870; X86-X87-LABEL: test_signed_i128_f64:
1871; X86-X87:       # %bb.0:
1872; X86-X87-NEXT:    pushl %ebp
1873; X86-X87-NEXT:    pushl %ebx
1874; X86-X87-NEXT:    pushl %edi
1875; X86-X87-NEXT:    pushl %esi
1876; X86-X87-NEXT:    subl $60, %esp
1877; X86-X87-NEXT:    fldl {{[0-9]+}}(%esp)
1878; X86-X87-NEXT:    fstl {{[0-9]+}}(%esp)
1879; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
1880; X86-X87-NEXT:    movl %eax, (%esp)
1881; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
1882; X86-X87-NEXT:    fxch %st(1)
1883; X86-X87-NEXT:    fstl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
1884; X86-X87-NEXT:    fucompp
1885; X86-X87-NEXT:    fnstsw %ax
1886; X86-X87-NEXT:    movl %eax, %ebx
1887; X86-X87-NEXT:    calll __fixdfti
1888; X86-X87-NEXT:    subl $4, %esp
1889; X86-X87-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
1890; X86-X87-NEXT:    movb %bh, %ah
1891; X86-X87-NEXT:    sahf
1892; X86-X87-NEXT:    movl $0, %eax
1893; X86-X87-NEXT:    movl $0, %ebx
1894; X86-X87-NEXT:    jae .LBB19_1
1895; X86-X87-NEXT:  # %bb.2:
1896; X86-X87-NEXT:    movl $0, %edx
1897; X86-X87-NEXT:    jae .LBB19_3
1898; X86-X87-NEXT:  .LBB19_4:
1899; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
1900; X86-X87-NEXT:    jb .LBB19_6
1901; X86-X87-NEXT:  .LBB19_5:
1902; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1903; X86-X87-NEXT:  .LBB19_6:
1904; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1905; X86-X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
1906; X86-X87-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
1907; X86-X87-NEXT:    fucom %st(1)
1908; X86-X87-NEXT:    fstp %st(1)
1909; X86-X87-NEXT:    fnstsw %ax
1910; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1911; X86-X87-NEXT:    sahf
1912; X86-X87-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
1913; X86-X87-NEXT:    ja .LBB19_8
1914; X86-X87-NEXT:  # %bb.7:
1915; X86-X87-NEXT:    movl %ecx, %eax
1916; X86-X87-NEXT:  .LBB19_8:
1917; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1918; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
1919; X86-X87-NEXT:    movl $-1, %ebp
1920; X86-X87-NEXT:    movl $-1, %edi
1921; X86-X87-NEXT:    movl $-1, %esi
1922; X86-X87-NEXT:    ja .LBB19_10
1923; X86-X87-NEXT:  # %bb.9:
1924; X86-X87-NEXT:    movl %edx, %ebp
1925; X86-X87-NEXT:    movl %ebx, %edi
1926; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
1927; X86-X87-NEXT:  .LBB19_10:
1928; X86-X87-NEXT:    fucomp %st(0)
1929; X86-X87-NEXT:    fnstsw %ax
1930; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
1931; X86-X87-NEXT:    sahf
1932; X86-X87-NEXT:    movl $0, %eax
1933; X86-X87-NEXT:    movl $0, %edx
1934; X86-X87-NEXT:    movl $0, %ebx
1935; X86-X87-NEXT:    jp .LBB19_12
1936; X86-X87-NEXT:  # %bb.11:
1937; X86-X87-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
1938; X86-X87-NEXT:    movl %edi, %eax
1939; X86-X87-NEXT:    movl %ebp, %edx
1940; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
1941; X86-X87-NEXT:  .LBB19_12:
1942; X86-X87-NEXT:    movl %ebx, 12(%ecx)
1943; X86-X87-NEXT:    movl %edx, 8(%ecx)
1944; X86-X87-NEXT:    movl %eax, 4(%ecx)
1945; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
1946; X86-X87-NEXT:    movl %eax, (%ecx)
1947; X86-X87-NEXT:    movl %ecx, %eax
1948; X86-X87-NEXT:    addl $60, %esp
1949; X86-X87-NEXT:    popl %esi
1950; X86-X87-NEXT:    popl %edi
1951; X86-X87-NEXT:    popl %ebx
1952; X86-X87-NEXT:    popl %ebp
1953; X86-X87-NEXT:    retl $4
1954; X86-X87-NEXT:  .LBB19_1:
1955; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
1956; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
1957; X86-X87-NEXT:    movl $0, %edx
1958; X86-X87-NEXT:    jb .LBB19_4
1959; X86-X87-NEXT:  .LBB19_3:
1960; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
1961; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
1962; X86-X87-NEXT:    jae .LBB19_5
1963; X86-X87-NEXT:    jmp .LBB19_6
1964;
1965; X86-SSE-LABEL: test_signed_i128_f64:
1966; X86-SSE:       # %bb.0:
1967; X86-SSE-NEXT:    pushl %ebp
1968; X86-SSE-NEXT:    pushl %ebx
1969; X86-SSE-NEXT:    pushl %edi
1970; X86-SSE-NEXT:    pushl %esi
1971; X86-SSE-NEXT:    subl $44, %esp
1972; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
1973; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1974; X86-SSE-NEXT:    movsd %xmm0, {{[0-9]+}}(%esp)
1975; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
1976; X86-SSE-NEXT:    movl %eax, (%esp)
1977; X86-SSE-NEXT:    calll __fixdfti
1978; X86-SSE-NEXT:    subl $4, %esp
1979; X86-SSE-NEXT:    xorl %ecx, %ecx
1980; X86-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero
1981; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1982; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
1983; X86-SSE-NEXT:    cmovbl %ecx, %eax
1984; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
1985; X86-SSE-NEXT:    cmovbl %ecx, %edx
1986; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
1987; X86-SSE-NEXT:    cmovbl %ecx, %edi
1988; X86-SSE-NEXT:    movl $-2147483648, %ebp # imm = 0x80000000
1989; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %ebp
1990; X86-SSE-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
1991; X86-SSE-NEXT:    movl $2147483647, %ebx # imm = 0x7FFFFFFF
1992; X86-SSE-NEXT:    cmovbel %ebp, %ebx
1993; X86-SSE-NEXT:    movl $-1, %ebp
1994; X86-SSE-NEXT:    cmoval %ebp, %edi
1995; X86-SSE-NEXT:    cmoval %ebp, %edx
1996; X86-SSE-NEXT:    cmoval %ebp, %eax
1997; X86-SSE-NEXT:    ucomisd %xmm0, %xmm0
1998; X86-SSE-NEXT:    cmovpl %ecx, %eax
1999; X86-SSE-NEXT:    cmovpl %ecx, %edx
2000; X86-SSE-NEXT:    cmovpl %ecx, %edi
2001; X86-SSE-NEXT:    cmovpl %ecx, %ebx
2002; X86-SSE-NEXT:    movl %ebx, 12(%esi)
2003; X86-SSE-NEXT:    movl %edi, 8(%esi)
2004; X86-SSE-NEXT:    movl %edx, 4(%esi)
2005; X86-SSE-NEXT:    movl %eax, (%esi)
2006; X86-SSE-NEXT:    movl %esi, %eax
2007; X86-SSE-NEXT:    addl $44, %esp
2008; X86-SSE-NEXT:    popl %esi
2009; X86-SSE-NEXT:    popl %edi
2010; X86-SSE-NEXT:    popl %ebx
2011; X86-SSE-NEXT:    popl %ebp
2012; X86-SSE-NEXT:    retl $4
2013;
2014; X64-LABEL: test_signed_i128_f64:
2015; X64:       # %bb.0:
2016; X64-NEXT:    pushq %rax
2017; X64-NEXT:    movsd %xmm0, (%rsp) # 8-byte Spill
2018; X64-NEXT:    callq __fixdfti@PLT
2019; X64-NEXT:    xorl %ecx, %ecx
2020; X64-NEXT:    movsd (%rsp), %xmm0 # 8-byte Reload
2021; X64-NEXT:    # xmm0 = mem[0],zero
2022; X64-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2023; X64-NEXT:    cmovbq %rcx, %rax
2024; X64-NEXT:    movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000
2025; X64-NEXT:    cmovbq %rsi, %rdx
2026; X64-NEXT:    ucomisd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2027; X64-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
2028; X64-NEXT:    cmovaq %rsi, %rdx
2029; X64-NEXT:    movq $-1, %rsi
2030; X64-NEXT:    cmovaq %rsi, %rax
2031; X64-NEXT:    ucomisd %xmm0, %xmm0
2032; X64-NEXT:    cmovpq %rcx, %rax
2033; X64-NEXT:    cmovpq %rcx, %rdx
2034; X64-NEXT:    popq %rcx
2035; X64-NEXT:    retq
2036    %x = call i128 @llvm.fptosi.sat.i128.f64(double %f)
2037    ret i128 %x
2038}
2039
2040;
2041; 16-bit float to signed integer
2042;
2043
2044declare   i1 @llvm.fptosi.sat.i1.f16  (half)
2045declare   i8 @llvm.fptosi.sat.i8.f16  (half)
2046declare  i13 @llvm.fptosi.sat.i13.f16 (half)
2047declare  i16 @llvm.fptosi.sat.i16.f16 (half)
2048declare  i19 @llvm.fptosi.sat.i19.f16 (half)
2049declare  i32 @llvm.fptosi.sat.i32.f16 (half)
2050declare  i50 @llvm.fptosi.sat.i50.f16 (half)
2051declare  i64 @llvm.fptosi.sat.i64.f16 (half)
2052declare i100 @llvm.fptosi.sat.i100.f16(half)
2053declare i128 @llvm.fptosi.sat.i128.f16(half)
2054
2055; FIXME: Can be optimizated with maxss + minss
2056define i1 @test_signed_i1_f16(half %f) nounwind {
2057; X86-X87-LABEL: test_signed_i1_f16:
2058; X86-X87:       # %bb.0:
2059; X86-X87-NEXT:    pushl %ebx
2060; X86-X87-NEXT:    subl $24, %esp
2061; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2062; X86-X87-NEXT:    movl %eax, (%esp)
2063; X86-X87-NEXT:    calll __gnu_h2f_ieee
2064; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2065; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2066; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2067; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2068; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2069; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
2070; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2071; X86-X87-NEXT:    fld1
2072; X86-X87-NEXT:    fchs
2073; X86-X87-NEXT:    fxch %st(1)
2074; X86-X87-NEXT:    fucom %st(1)
2075; X86-X87-NEXT:    fstp %st(1)
2076; X86-X87-NEXT:    fnstsw %ax
2077; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2078; X86-X87-NEXT:    sahf
2079; X86-X87-NEXT:    movb $-1, %dl
2080; X86-X87-NEXT:    jb .LBB20_2
2081; X86-X87-NEXT:  # %bb.1:
2082; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
2083; X86-X87-NEXT:  .LBB20_2:
2084; X86-X87-NEXT:    fldz
2085; X86-X87-NEXT:    fxch %st(1)
2086; X86-X87-NEXT:    fucom %st(1)
2087; X86-X87-NEXT:    fstp %st(1)
2088; X86-X87-NEXT:    fnstsw %ax
2089; X86-X87-NEXT:    xorl %ecx, %ecx
2090; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2091; X86-X87-NEXT:    sahf
2092; X86-X87-NEXT:    movl $0, %ebx
2093; X86-X87-NEXT:    ja .LBB20_4
2094; X86-X87-NEXT:  # %bb.3:
2095; X86-X87-NEXT:    movl %edx, %ebx
2096; X86-X87-NEXT:  .LBB20_4:
2097; X86-X87-NEXT:    fucomp %st(0)
2098; X86-X87-NEXT:    fnstsw %ax
2099; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2100; X86-X87-NEXT:    sahf
2101; X86-X87-NEXT:    jp .LBB20_6
2102; X86-X87-NEXT:  # %bb.5:
2103; X86-X87-NEXT:    movl %ebx, %ecx
2104; X86-X87-NEXT:  .LBB20_6:
2105; X86-X87-NEXT:    movl %ecx, %eax
2106; X86-X87-NEXT:    addl $24, %esp
2107; X86-X87-NEXT:    popl %ebx
2108; X86-X87-NEXT:    retl
2109;
2110; X86-SSE-LABEL: test_signed_i1_f16:
2111; X86-SSE:       # %bb.0:
2112; X86-SSE-NEXT:    subl $12, %esp
2113; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2114; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2115; X86-SSE-NEXT:    movw %ax, (%esp)
2116; X86-SSE-NEXT:    calll __extendhfsf2
2117; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2118; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2119; X86-SSE-NEXT:    cvttss2si %xmm0, %ecx
2120; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2121; X86-SSE-NEXT:    movl $255, %eax
2122; X86-SSE-NEXT:    cmovael %ecx, %eax
2123; X86-SSE-NEXT:    xorl %ecx, %ecx
2124; X86-SSE-NEXT:    xorps %xmm1, %xmm1
2125; X86-SSE-NEXT:    ucomiss %xmm1, %xmm0
2126; X86-SSE-NEXT:    cmoval %ecx, %eax
2127; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2128; X86-SSE-NEXT:    cmovpl %ecx, %eax
2129; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
2130; X86-SSE-NEXT:    addl $12, %esp
2131; X86-SSE-NEXT:    retl
2132;
2133; X64-LABEL: test_signed_i1_f16:
2134; X64:       # %bb.0:
2135; X64-NEXT:    pushq %rax
2136; X64-NEXT:    callq __extendhfsf2@PLT
2137; X64-NEXT:    cvttss2si %xmm0, %ecx
2138; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2139; X64-NEXT:    movl $255, %eax
2140; X64-NEXT:    cmovael %ecx, %eax
2141; X64-NEXT:    xorl %ecx, %ecx
2142; X64-NEXT:    xorps %xmm1, %xmm1
2143; X64-NEXT:    ucomiss %xmm1, %xmm0
2144; X64-NEXT:    cmoval %ecx, %eax
2145; X64-NEXT:    ucomiss %xmm0, %xmm0
2146; X64-NEXT:    cmovpl %ecx, %eax
2147; X64-NEXT:    # kill: def $al killed $al killed $eax
2148; X64-NEXT:    popq %rcx
2149; X64-NEXT:    retq
2150    %x = call i1 @llvm.fptosi.sat.i1.f16(half %f)
2151    ret i1 %x
2152}
2153
2154; FIXME: Can be optimizated with maxss + minss
2155define i8 @test_signed_i8_f16(half %f) nounwind {
2156; X86-X87-LABEL: test_signed_i8_f16:
2157; X86-X87:       # %bb.0:
2158; X86-X87-NEXT:    subl $12, %esp
2159; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2160; X86-X87-NEXT:    movl %eax, (%esp)
2161; X86-X87-NEXT:    calll __gnu_h2f_ieee
2162; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2163; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2164; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2165; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2166; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2167; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
2168; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2169; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2170; X86-X87-NEXT:    fxch %st(1)
2171; X86-X87-NEXT:    fucom %st(1)
2172; X86-X87-NEXT:    fstp %st(1)
2173; X86-X87-NEXT:    fnstsw %ax
2174; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2175; X86-X87-NEXT:    sahf
2176; X86-X87-NEXT:    movb $-128, %dl
2177; X86-X87-NEXT:    jb .LBB21_2
2178; X86-X87-NEXT:  # %bb.1:
2179; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
2180; X86-X87-NEXT:  .LBB21_2:
2181; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2182; X86-X87-NEXT:    fxch %st(1)
2183; X86-X87-NEXT:    fucom %st(1)
2184; X86-X87-NEXT:    fstp %st(1)
2185; X86-X87-NEXT:    fnstsw %ax
2186; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2187; X86-X87-NEXT:    sahf
2188; X86-X87-NEXT:    movb $127, %cl
2189; X86-X87-NEXT:    ja .LBB21_4
2190; X86-X87-NEXT:  # %bb.3:
2191; X86-X87-NEXT:    movl %edx, %ecx
2192; X86-X87-NEXT:  .LBB21_4:
2193; X86-X87-NEXT:    fucomp %st(0)
2194; X86-X87-NEXT:    fnstsw %ax
2195; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2196; X86-X87-NEXT:    sahf
2197; X86-X87-NEXT:    jnp .LBB21_6
2198; X86-X87-NEXT:  # %bb.5:
2199; X86-X87-NEXT:    xorl %ecx, %ecx
2200; X86-X87-NEXT:  .LBB21_6:
2201; X86-X87-NEXT:    movl %ecx, %eax
2202; X86-X87-NEXT:    addl $12, %esp
2203; X86-X87-NEXT:    retl
2204;
2205; X86-SSE-LABEL: test_signed_i8_f16:
2206; X86-SSE:       # %bb.0:
2207; X86-SSE-NEXT:    subl $12, %esp
2208; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2209; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2210; X86-SSE-NEXT:    movw %ax, (%esp)
2211; X86-SSE-NEXT:    calll __extendhfsf2
2212; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2213; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2214; X86-SSE-NEXT:    cvttss2si %xmm0, %eax
2215; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2216; X86-SSE-NEXT:    movl $128, %ecx
2217; X86-SSE-NEXT:    cmovael %eax, %ecx
2218; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2219; X86-SSE-NEXT:    movl $127, %edx
2220; X86-SSE-NEXT:    cmovbel %ecx, %edx
2221; X86-SSE-NEXT:    xorl %eax, %eax
2222; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2223; X86-SSE-NEXT:    cmovnpl %edx, %eax
2224; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
2225; X86-SSE-NEXT:    addl $12, %esp
2226; X86-SSE-NEXT:    retl
2227;
2228; X64-LABEL: test_signed_i8_f16:
2229; X64:       # %bb.0:
2230; X64-NEXT:    pushq %rax
2231; X64-NEXT:    callq __extendhfsf2@PLT
2232; X64-NEXT:    cvttss2si %xmm0, %eax
2233; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2234; X64-NEXT:    movl $128, %ecx
2235; X64-NEXT:    cmovael %eax, %ecx
2236; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2237; X64-NEXT:    movl $127, %edx
2238; X64-NEXT:    cmovbel %ecx, %edx
2239; X64-NEXT:    xorl %eax, %eax
2240; X64-NEXT:    ucomiss %xmm0, %xmm0
2241; X64-NEXT:    cmovnpl %edx, %eax
2242; X64-NEXT:    # kill: def $al killed $al killed $eax
2243; X64-NEXT:    popq %rcx
2244; X64-NEXT:    retq
2245    %x = call i8 @llvm.fptosi.sat.i8.f16(half %f)
2246    ret i8 %x
2247}
2248
2249; FIXME: Can be optimizated with maxss + minss
2250define i13 @test_signed_i13_f16(half %f) nounwind {
2251; X86-X87-LABEL: test_signed_i13_f16:
2252; X86-X87:       # %bb.0:
2253; X86-X87-NEXT:    subl $12, %esp
2254; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2255; X86-X87-NEXT:    movl %eax, (%esp)
2256; X86-X87-NEXT:    calll __gnu_h2f_ieee
2257; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2258; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2259; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2260; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2261; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2262; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
2263; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2264; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2265; X86-X87-NEXT:    fxch %st(1)
2266; X86-X87-NEXT:    fucom %st(1)
2267; X86-X87-NEXT:    fstp %st(1)
2268; X86-X87-NEXT:    fnstsw %ax
2269; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2270; X86-X87-NEXT:    sahf
2271; X86-X87-NEXT:    movl $61440, %ecx # imm = 0xF000
2272; X86-X87-NEXT:    jb .LBB22_2
2273; X86-X87-NEXT:  # %bb.1:
2274; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
2275; X86-X87-NEXT:  .LBB22_2:
2276; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2277; X86-X87-NEXT:    fxch %st(1)
2278; X86-X87-NEXT:    fucom %st(1)
2279; X86-X87-NEXT:    fstp %st(1)
2280; X86-X87-NEXT:    fnstsw %ax
2281; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2282; X86-X87-NEXT:    sahf
2283; X86-X87-NEXT:    movl $4095, %edx # imm = 0xFFF
2284; X86-X87-NEXT:    ja .LBB22_4
2285; X86-X87-NEXT:  # %bb.3:
2286; X86-X87-NEXT:    movl %ecx, %edx
2287; X86-X87-NEXT:  .LBB22_4:
2288; X86-X87-NEXT:    fucomp %st(0)
2289; X86-X87-NEXT:    fnstsw %ax
2290; X86-X87-NEXT:    xorl %ecx, %ecx
2291; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2292; X86-X87-NEXT:    sahf
2293; X86-X87-NEXT:    jp .LBB22_6
2294; X86-X87-NEXT:  # %bb.5:
2295; X86-X87-NEXT:    movl %edx, %ecx
2296; X86-X87-NEXT:  .LBB22_6:
2297; X86-X87-NEXT:    movl %ecx, %eax
2298; X86-X87-NEXT:    addl $12, %esp
2299; X86-X87-NEXT:    retl
2300;
2301; X86-SSE-LABEL: test_signed_i13_f16:
2302; X86-SSE:       # %bb.0:
2303; X86-SSE-NEXT:    subl $12, %esp
2304; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2305; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2306; X86-SSE-NEXT:    movw %ax, (%esp)
2307; X86-SSE-NEXT:    calll __extendhfsf2
2308; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2309; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2310; X86-SSE-NEXT:    cvttss2si %xmm0, %eax
2311; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2312; X86-SSE-NEXT:    movl $61440, %ecx # imm = 0xF000
2313; X86-SSE-NEXT:    cmovael %eax, %ecx
2314; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2315; X86-SSE-NEXT:    movl $4095, %edx # imm = 0xFFF
2316; X86-SSE-NEXT:    cmovbel %ecx, %edx
2317; X86-SSE-NEXT:    xorl %eax, %eax
2318; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2319; X86-SSE-NEXT:    cmovnpl %edx, %eax
2320; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
2321; X86-SSE-NEXT:    addl $12, %esp
2322; X86-SSE-NEXT:    retl
2323;
2324; X64-LABEL: test_signed_i13_f16:
2325; X64:       # %bb.0:
2326; X64-NEXT:    pushq %rax
2327; X64-NEXT:    callq __extendhfsf2@PLT
2328; X64-NEXT:    cvttss2si %xmm0, %eax
2329; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2330; X64-NEXT:    movl $61440, %ecx # imm = 0xF000
2331; X64-NEXT:    cmovael %eax, %ecx
2332; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2333; X64-NEXT:    movl $4095, %edx # imm = 0xFFF
2334; X64-NEXT:    cmovbel %ecx, %edx
2335; X64-NEXT:    xorl %eax, %eax
2336; X64-NEXT:    ucomiss %xmm0, %xmm0
2337; X64-NEXT:    cmovnpl %edx, %eax
2338; X64-NEXT:    # kill: def $ax killed $ax killed $eax
2339; X64-NEXT:    popq %rcx
2340; X64-NEXT:    retq
2341    %x = call i13 @llvm.fptosi.sat.i13.f16(half %f)
2342    ret i13 %x
2343}
2344
2345; FIXME: Can be optimizated with maxss + minss
2346define i16 @test_signed_i16_f16(half %f) nounwind {
2347; X86-X87-LABEL: test_signed_i16_f16:
2348; X86-X87:       # %bb.0:
2349; X86-X87-NEXT:    subl $12, %esp
2350; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2351; X86-X87-NEXT:    movl %eax, (%esp)
2352; X86-X87-NEXT:    calll __gnu_h2f_ieee
2353; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2354; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2355; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2356; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2357; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2358; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
2359; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2360; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2361; X86-X87-NEXT:    fxch %st(1)
2362; X86-X87-NEXT:    fucom %st(1)
2363; X86-X87-NEXT:    fstp %st(1)
2364; X86-X87-NEXT:    fnstsw %ax
2365; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2366; X86-X87-NEXT:    sahf
2367; X86-X87-NEXT:    movl $32768, %ecx # imm = 0x8000
2368; X86-X87-NEXT:    jb .LBB23_2
2369; X86-X87-NEXT:  # %bb.1:
2370; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
2371; X86-X87-NEXT:  .LBB23_2:
2372; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2373; X86-X87-NEXT:    fxch %st(1)
2374; X86-X87-NEXT:    fucom %st(1)
2375; X86-X87-NEXT:    fstp %st(1)
2376; X86-X87-NEXT:    fnstsw %ax
2377; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2378; X86-X87-NEXT:    sahf
2379; X86-X87-NEXT:    movl $32767, %edx # imm = 0x7FFF
2380; X86-X87-NEXT:    ja .LBB23_4
2381; X86-X87-NEXT:  # %bb.3:
2382; X86-X87-NEXT:    movl %ecx, %edx
2383; X86-X87-NEXT:  .LBB23_4:
2384; X86-X87-NEXT:    fucomp %st(0)
2385; X86-X87-NEXT:    fnstsw %ax
2386; X86-X87-NEXT:    xorl %ecx, %ecx
2387; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2388; X86-X87-NEXT:    sahf
2389; X86-X87-NEXT:    jp .LBB23_6
2390; X86-X87-NEXT:  # %bb.5:
2391; X86-X87-NEXT:    movl %edx, %ecx
2392; X86-X87-NEXT:  .LBB23_6:
2393; X86-X87-NEXT:    movl %ecx, %eax
2394; X86-X87-NEXT:    addl $12, %esp
2395; X86-X87-NEXT:    retl
2396;
2397; X86-SSE-LABEL: test_signed_i16_f16:
2398; X86-SSE:       # %bb.0:
2399; X86-SSE-NEXT:    subl $12, %esp
2400; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2401; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2402; X86-SSE-NEXT:    movw %ax, (%esp)
2403; X86-SSE-NEXT:    calll __extendhfsf2
2404; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2405; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2406; X86-SSE-NEXT:    cvttss2si %xmm0, %eax
2407; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2408; X86-SSE-NEXT:    movl $32768, %ecx # imm = 0x8000
2409; X86-SSE-NEXT:    cmovael %eax, %ecx
2410; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2411; X86-SSE-NEXT:    movl $32767, %edx # imm = 0x7FFF
2412; X86-SSE-NEXT:    cmovbel %ecx, %edx
2413; X86-SSE-NEXT:    xorl %eax, %eax
2414; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2415; X86-SSE-NEXT:    cmovnpl %edx, %eax
2416; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
2417; X86-SSE-NEXT:    addl $12, %esp
2418; X86-SSE-NEXT:    retl
2419;
2420; X64-LABEL: test_signed_i16_f16:
2421; X64:       # %bb.0:
2422; X64-NEXT:    pushq %rax
2423; X64-NEXT:    callq __extendhfsf2@PLT
2424; X64-NEXT:    cvttss2si %xmm0, %eax
2425; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2426; X64-NEXT:    movl $32768, %ecx # imm = 0x8000
2427; X64-NEXT:    cmovael %eax, %ecx
2428; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2429; X64-NEXT:    movl $32767, %edx # imm = 0x7FFF
2430; X64-NEXT:    cmovbel %ecx, %edx
2431; X64-NEXT:    xorl %eax, %eax
2432; X64-NEXT:    ucomiss %xmm0, %xmm0
2433; X64-NEXT:    cmovnpl %edx, %eax
2434; X64-NEXT:    # kill: def $ax killed $ax killed $eax
2435; X64-NEXT:    popq %rcx
2436; X64-NEXT:    retq
2437    %x = call i16 @llvm.fptosi.sat.i16.f16(half %f)
2438    ret i16 %x
2439}
2440
2441; FIXME: Can be optimizated with maxss + minss
2442define i19 @test_signed_i19_f16(half %f) nounwind {
2443; X86-X87-LABEL: test_signed_i19_f16:
2444; X86-X87:       # %bb.0:
2445; X86-X87-NEXT:    subl $12, %esp
2446; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2447; X86-X87-NEXT:    movl %eax, (%esp)
2448; X86-X87-NEXT:    calll __gnu_h2f_ieee
2449; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2450; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2451; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2452; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2453; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2454; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
2455; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2456; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2457; X86-X87-NEXT:    fxch %st(1)
2458; X86-X87-NEXT:    fucom %st(1)
2459; X86-X87-NEXT:    fstp %st(1)
2460; X86-X87-NEXT:    fnstsw %ax
2461; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2462; X86-X87-NEXT:    sahf
2463; X86-X87-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000
2464; X86-X87-NEXT:    jb .LBB24_2
2465; X86-X87-NEXT:  # %bb.1:
2466; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2467; X86-X87-NEXT:  .LBB24_2:
2468; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2469; X86-X87-NEXT:    fxch %st(1)
2470; X86-X87-NEXT:    fucom %st(1)
2471; X86-X87-NEXT:    fstp %st(1)
2472; X86-X87-NEXT:    fnstsw %ax
2473; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2474; X86-X87-NEXT:    sahf
2475; X86-X87-NEXT:    movl $262143, %edx # imm = 0x3FFFF
2476; X86-X87-NEXT:    ja .LBB24_4
2477; X86-X87-NEXT:  # %bb.3:
2478; X86-X87-NEXT:    movl %ecx, %edx
2479; X86-X87-NEXT:  .LBB24_4:
2480; X86-X87-NEXT:    fucomp %st(0)
2481; X86-X87-NEXT:    fnstsw %ax
2482; X86-X87-NEXT:    xorl %ecx, %ecx
2483; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2484; X86-X87-NEXT:    sahf
2485; X86-X87-NEXT:    jp .LBB24_6
2486; X86-X87-NEXT:  # %bb.5:
2487; X86-X87-NEXT:    movl %edx, %ecx
2488; X86-X87-NEXT:  .LBB24_6:
2489; X86-X87-NEXT:    movl %ecx, %eax
2490; X86-X87-NEXT:    addl $12, %esp
2491; X86-X87-NEXT:    retl
2492;
2493; X86-SSE-LABEL: test_signed_i19_f16:
2494; X86-SSE:       # %bb.0:
2495; X86-SSE-NEXT:    subl $12, %esp
2496; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2497; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2498; X86-SSE-NEXT:    movw %ax, (%esp)
2499; X86-SSE-NEXT:    calll __extendhfsf2
2500; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2501; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2502; X86-SSE-NEXT:    cvttss2si %xmm0, %eax
2503; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2504; X86-SSE-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000
2505; X86-SSE-NEXT:    cmovael %eax, %ecx
2506; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2507; X86-SSE-NEXT:    movl $262143, %edx # imm = 0x3FFFF
2508; X86-SSE-NEXT:    cmovbel %ecx, %edx
2509; X86-SSE-NEXT:    xorl %eax, %eax
2510; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2511; X86-SSE-NEXT:    cmovnpl %edx, %eax
2512; X86-SSE-NEXT:    addl $12, %esp
2513; X86-SSE-NEXT:    retl
2514;
2515; X64-LABEL: test_signed_i19_f16:
2516; X64:       # %bb.0:
2517; X64-NEXT:    pushq %rax
2518; X64-NEXT:    callq __extendhfsf2@PLT
2519; X64-NEXT:    cvttss2si %xmm0, %eax
2520; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2521; X64-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000
2522; X64-NEXT:    cmovael %eax, %ecx
2523; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2524; X64-NEXT:    movl $262143, %edx # imm = 0x3FFFF
2525; X64-NEXT:    cmovbel %ecx, %edx
2526; X64-NEXT:    xorl %eax, %eax
2527; X64-NEXT:    ucomiss %xmm0, %xmm0
2528; X64-NEXT:    cmovnpl %edx, %eax
2529; X64-NEXT:    popq %rcx
2530; X64-NEXT:    retq
2531    %x = call i19 @llvm.fptosi.sat.i19.f16(half %f)
2532    ret i19 %x
2533}
2534
2535define i32 @test_signed_i32_f16(half %f) nounwind {
2536; X86-X87-LABEL: test_signed_i32_f16:
2537; X86-X87:       # %bb.0:
2538; X86-X87-NEXT:    subl $12, %esp
2539; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2540; X86-X87-NEXT:    movl %eax, (%esp)
2541; X86-X87-NEXT:    calll __gnu_h2f_ieee
2542; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2543; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2544; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2545; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2546; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2547; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
2548; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2549; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2550; X86-X87-NEXT:    fxch %st(1)
2551; X86-X87-NEXT:    fucom %st(1)
2552; X86-X87-NEXT:    fstp %st(1)
2553; X86-X87-NEXT:    fnstsw %ax
2554; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2555; X86-X87-NEXT:    sahf
2556; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
2557; X86-X87-NEXT:    jb .LBB25_2
2558; X86-X87-NEXT:  # %bb.1:
2559; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2560; X86-X87-NEXT:  .LBB25_2:
2561; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2562; X86-X87-NEXT:    fxch %st(1)
2563; X86-X87-NEXT:    fucom %st(1)
2564; X86-X87-NEXT:    fstp %st(1)
2565; X86-X87-NEXT:    fnstsw %ax
2566; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2567; X86-X87-NEXT:    sahf
2568; X86-X87-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
2569; X86-X87-NEXT:    ja .LBB25_4
2570; X86-X87-NEXT:  # %bb.3:
2571; X86-X87-NEXT:    movl %ecx, %edx
2572; X86-X87-NEXT:  .LBB25_4:
2573; X86-X87-NEXT:    fucomp %st(0)
2574; X86-X87-NEXT:    fnstsw %ax
2575; X86-X87-NEXT:    xorl %ecx, %ecx
2576; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2577; X86-X87-NEXT:    sahf
2578; X86-X87-NEXT:    jp .LBB25_6
2579; X86-X87-NEXT:  # %bb.5:
2580; X86-X87-NEXT:    movl %edx, %ecx
2581; X86-X87-NEXT:  .LBB25_6:
2582; X86-X87-NEXT:    movl %ecx, %eax
2583; X86-X87-NEXT:    addl $12, %esp
2584; X86-X87-NEXT:    retl
2585;
2586; X86-SSE-LABEL: test_signed_i32_f16:
2587; X86-SSE:       # %bb.0:
2588; X86-SSE-NEXT:    subl $12, %esp
2589; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2590; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2591; X86-SSE-NEXT:    movw %ax, (%esp)
2592; X86-SSE-NEXT:    calll __extendhfsf2
2593; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2594; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2595; X86-SSE-NEXT:    cvttss2si %xmm0, %eax
2596; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2597; X86-SSE-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
2598; X86-SSE-NEXT:    cmovael %eax, %ecx
2599; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2600; X86-SSE-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
2601; X86-SSE-NEXT:    cmovbel %ecx, %edx
2602; X86-SSE-NEXT:    xorl %eax, %eax
2603; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2604; X86-SSE-NEXT:    cmovnpl %edx, %eax
2605; X86-SSE-NEXT:    addl $12, %esp
2606; X86-SSE-NEXT:    retl
2607;
2608; X64-LABEL: test_signed_i32_f16:
2609; X64:       # %bb.0:
2610; X64-NEXT:    pushq %rax
2611; X64-NEXT:    callq __extendhfsf2@PLT
2612; X64-NEXT:    cvttss2si %xmm0, %eax
2613; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2614; X64-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
2615; X64-NEXT:    cmovael %eax, %ecx
2616; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2617; X64-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
2618; X64-NEXT:    cmovbel %ecx, %edx
2619; X64-NEXT:    xorl %eax, %eax
2620; X64-NEXT:    ucomiss %xmm0, %xmm0
2621; X64-NEXT:    cmovnpl %edx, %eax
2622; X64-NEXT:    popq %rcx
2623; X64-NEXT:    retq
2624    %x = call i32 @llvm.fptosi.sat.i32.f16(half %f)
2625    ret i32 %x
2626}
2627
2628define i50 @test_signed_i50_f16(half %f) nounwind {
2629; X86-X87-LABEL: test_signed_i50_f16:
2630; X86-X87:       # %bb.0:
2631; X86-X87-NEXT:    pushl %edi
2632; X86-X87-NEXT:    pushl %esi
2633; X86-X87-NEXT:    subl $20, %esp
2634; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2635; X86-X87-NEXT:    movl %eax, (%esp)
2636; X86-X87-NEXT:    calll __gnu_h2f_ieee
2637; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2638; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2639; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2640; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2641; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2642; X86-X87-NEXT:    fld %st(0)
2643; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
2644; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2645; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2646; X86-X87-NEXT:    fxch %st(1)
2647; X86-X87-NEXT:    fucom %st(1)
2648; X86-X87-NEXT:    fstp %st(1)
2649; X86-X87-NEXT:    fnstsw %ax
2650; X86-X87-NEXT:    xorl %ecx, %ecx
2651; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2652; X86-X87-NEXT:    sahf
2653; X86-X87-NEXT:    movl $0, %edx
2654; X86-X87-NEXT:    jb .LBB26_2
2655; X86-X87-NEXT:  # %bb.1:
2656; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
2657; X86-X87-NEXT:  .LBB26_2:
2658; X86-X87-NEXT:    movl $-131072, %edi # imm = 0xFFFE0000
2659; X86-X87-NEXT:    jb .LBB26_4
2660; X86-X87-NEXT:  # %bb.3:
2661; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
2662; X86-X87-NEXT:  .LBB26_4:
2663; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2664; X86-X87-NEXT:    fxch %st(1)
2665; X86-X87-NEXT:    fucom %st(1)
2666; X86-X87-NEXT:    fstp %st(1)
2667; X86-X87-NEXT:    fnstsw %ax
2668; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2669; X86-X87-NEXT:    sahf
2670; X86-X87-NEXT:    movl $131071, %esi # imm = 0x1FFFF
2671; X86-X87-NEXT:    ja .LBB26_6
2672; X86-X87-NEXT:  # %bb.5:
2673; X86-X87-NEXT:    movl %edi, %esi
2674; X86-X87-NEXT:  .LBB26_6:
2675; X86-X87-NEXT:    movl $-1, %edi
2676; X86-X87-NEXT:    ja .LBB26_8
2677; X86-X87-NEXT:  # %bb.7:
2678; X86-X87-NEXT:    movl %edx, %edi
2679; X86-X87-NEXT:  .LBB26_8:
2680; X86-X87-NEXT:    fucomp %st(0)
2681; X86-X87-NEXT:    fnstsw %ax
2682; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2683; X86-X87-NEXT:    sahf
2684; X86-X87-NEXT:    movl $0, %edx
2685; X86-X87-NEXT:    jp .LBB26_10
2686; X86-X87-NEXT:  # %bb.9:
2687; X86-X87-NEXT:    movl %edi, %ecx
2688; X86-X87-NEXT:    movl %esi, %edx
2689; X86-X87-NEXT:  .LBB26_10:
2690; X86-X87-NEXT:    movl %ecx, %eax
2691; X86-X87-NEXT:    addl $20, %esp
2692; X86-X87-NEXT:    popl %esi
2693; X86-X87-NEXT:    popl %edi
2694; X86-X87-NEXT:    retl
2695;
2696; X86-SSE-LABEL: test_signed_i50_f16:
2697; X86-SSE:       # %bb.0:
2698; X86-SSE-NEXT:    pushl %esi
2699; X86-SSE-NEXT:    subl $24, %esp
2700; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2701; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2702; X86-SSE-NEXT:    movw %ax, (%esp)
2703; X86-SSE-NEXT:    calll __extendhfsf2
2704; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2705; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2706; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
2707; X86-SSE-NEXT:    flds {{[0-9]+}}(%esp)
2708; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
2709; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2710; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
2711; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2712; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
2713; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
2714; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
2715; X86-SSE-NEXT:    xorl %ecx, %ecx
2716; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2717; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
2718; X86-SSE-NEXT:    cmovbl %ecx, %esi
2719; X86-SSE-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
2720; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
2721; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2722; X86-SSE-NEXT:    movl $131071, %edx # imm = 0x1FFFF
2723; X86-SSE-NEXT:    cmovbel %eax, %edx
2724; X86-SSE-NEXT:    movl $-1, %eax
2725; X86-SSE-NEXT:    cmovbel %esi, %eax
2726; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2727; X86-SSE-NEXT:    cmovpl %ecx, %eax
2728; X86-SSE-NEXT:    cmovpl %ecx, %edx
2729; X86-SSE-NEXT:    addl $24, %esp
2730; X86-SSE-NEXT:    popl %esi
2731; X86-SSE-NEXT:    retl
2732;
2733; X64-LABEL: test_signed_i50_f16:
2734; X64:       # %bb.0:
2735; X64-NEXT:    pushq %rax
2736; X64-NEXT:    callq __extendhfsf2@PLT
2737; X64-NEXT:    cvttss2si %xmm0, %rax
2738; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2739; X64-NEXT:    movabsq $-562949953421312, %rcx # imm = 0xFFFE000000000000
2740; X64-NEXT:    cmovaeq %rax, %rcx
2741; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2742; X64-NEXT:    movabsq $562949953421311, %rdx # imm = 0x1FFFFFFFFFFFF
2743; X64-NEXT:    cmovbeq %rcx, %rdx
2744; X64-NEXT:    xorl %eax, %eax
2745; X64-NEXT:    ucomiss %xmm0, %xmm0
2746; X64-NEXT:    cmovnpq %rdx, %rax
2747; X64-NEXT:    popq %rcx
2748; X64-NEXT:    retq
2749    %x = call i50 @llvm.fptosi.sat.i50.f16(half %f)
2750    ret i50 %x
2751}
2752
2753define i64 @test_signed_i64_f16(half %f) nounwind {
2754; X86-X87-LABEL: test_signed_i64_f16:
2755; X86-X87:       # %bb.0:
2756; X86-X87-NEXT:    pushl %edi
2757; X86-X87-NEXT:    pushl %esi
2758; X86-X87-NEXT:    subl $20, %esp
2759; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2760; X86-X87-NEXT:    movl %eax, (%esp)
2761; X86-X87-NEXT:    calll __gnu_h2f_ieee
2762; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
2763; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2764; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
2765; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2766; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2767; X86-X87-NEXT:    fld %st(0)
2768; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
2769; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
2770; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2771; X86-X87-NEXT:    fxch %st(1)
2772; X86-X87-NEXT:    fucom %st(1)
2773; X86-X87-NEXT:    fstp %st(1)
2774; X86-X87-NEXT:    fnstsw %ax
2775; X86-X87-NEXT:    xorl %ecx, %ecx
2776; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2777; X86-X87-NEXT:    sahf
2778; X86-X87-NEXT:    movl $0, %edx
2779; X86-X87-NEXT:    jb .LBB27_2
2780; X86-X87-NEXT:  # %bb.1:
2781; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
2782; X86-X87-NEXT:  .LBB27_2:
2783; X86-X87-NEXT:    movl $-2147483648, %edi # imm = 0x80000000
2784; X86-X87-NEXT:    jb .LBB27_4
2785; X86-X87-NEXT:  # %bb.3:
2786; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
2787; X86-X87-NEXT:  .LBB27_4:
2788; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2789; X86-X87-NEXT:    fxch %st(1)
2790; X86-X87-NEXT:    fucom %st(1)
2791; X86-X87-NEXT:    fstp %st(1)
2792; X86-X87-NEXT:    fnstsw %ax
2793; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2794; X86-X87-NEXT:    sahf
2795; X86-X87-NEXT:    movl $2147483647, %esi # imm = 0x7FFFFFFF
2796; X86-X87-NEXT:    ja .LBB27_6
2797; X86-X87-NEXT:  # %bb.5:
2798; X86-X87-NEXT:    movl %edi, %esi
2799; X86-X87-NEXT:  .LBB27_6:
2800; X86-X87-NEXT:    movl $-1, %edi
2801; X86-X87-NEXT:    ja .LBB27_8
2802; X86-X87-NEXT:  # %bb.7:
2803; X86-X87-NEXT:    movl %edx, %edi
2804; X86-X87-NEXT:  .LBB27_8:
2805; X86-X87-NEXT:    fucomp %st(0)
2806; X86-X87-NEXT:    fnstsw %ax
2807; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2808; X86-X87-NEXT:    sahf
2809; X86-X87-NEXT:    movl $0, %edx
2810; X86-X87-NEXT:    jp .LBB27_10
2811; X86-X87-NEXT:  # %bb.9:
2812; X86-X87-NEXT:    movl %edi, %ecx
2813; X86-X87-NEXT:    movl %esi, %edx
2814; X86-X87-NEXT:  .LBB27_10:
2815; X86-X87-NEXT:    movl %ecx, %eax
2816; X86-X87-NEXT:    addl $20, %esp
2817; X86-X87-NEXT:    popl %esi
2818; X86-X87-NEXT:    popl %edi
2819; X86-X87-NEXT:    retl
2820;
2821; X86-SSE-LABEL: test_signed_i64_f16:
2822; X86-SSE:       # %bb.0:
2823; X86-SSE-NEXT:    pushl %esi
2824; X86-SSE-NEXT:    subl $24, %esp
2825; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2826; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2827; X86-SSE-NEXT:    movw %ax, (%esp)
2828; X86-SSE-NEXT:    calll __extendhfsf2
2829; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2830; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2831; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
2832; X86-SSE-NEXT:    flds {{[0-9]+}}(%esp)
2833; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
2834; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2835; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
2836; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
2837; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
2838; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
2839; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
2840; X86-SSE-NEXT:    xorl %ecx, %ecx
2841; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2842; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
2843; X86-SSE-NEXT:    cmovbl %ecx, %esi
2844; X86-SSE-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
2845; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
2846; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2847; X86-SSE-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
2848; X86-SSE-NEXT:    cmovbel %eax, %edx
2849; X86-SSE-NEXT:    movl $-1, %eax
2850; X86-SSE-NEXT:    cmovbel %esi, %eax
2851; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
2852; X86-SSE-NEXT:    cmovpl %ecx, %eax
2853; X86-SSE-NEXT:    cmovpl %ecx, %edx
2854; X86-SSE-NEXT:    addl $24, %esp
2855; X86-SSE-NEXT:    popl %esi
2856; X86-SSE-NEXT:    retl
2857;
2858; X64-LABEL: test_signed_i64_f16:
2859; X64:       # %bb.0:
2860; X64-NEXT:    pushq %rax
2861; X64-NEXT:    callq __extendhfsf2@PLT
2862; X64-NEXT:    cvttss2si %xmm0, %rax
2863; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2864; X64-NEXT:    movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000
2865; X64-NEXT:    cmovaeq %rax, %rcx
2866; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
2867; X64-NEXT:    movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF
2868; X64-NEXT:    cmovbeq %rcx, %rdx
2869; X64-NEXT:    xorl %eax, %eax
2870; X64-NEXT:    ucomiss %xmm0, %xmm0
2871; X64-NEXT:    cmovnpq %rdx, %rax
2872; X64-NEXT:    popq %rcx
2873; X64-NEXT:    retq
2874    %x = call i64 @llvm.fptosi.sat.i64.f16(half %f)
2875    ret i64 %x
2876}
2877
2878define i100 @test_signed_i100_f16(half %f) nounwind {
2879; X86-X87-LABEL: test_signed_i100_f16:
2880; X86-X87:       # %bb.0:
2881; X86-X87-NEXT:    pushl %ebp
2882; X86-X87-NEXT:    pushl %ebx
2883; X86-X87-NEXT:    pushl %edi
2884; X86-X87-NEXT:    pushl %esi
2885; X86-X87-NEXT:    subl $60, %esp
2886; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
2887; X86-X87-NEXT:    movl %eax, (%esp)
2888; X86-X87-NEXT:    calll __gnu_h2f_ieee
2889; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
2890; X86-X87-NEXT:    movl %eax, (%esp)
2891; X86-X87-NEXT:    fsts {{[0-9]+}}(%esp)
2892; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2893; X86-X87-NEXT:    fxch %st(1)
2894; X86-X87-NEXT:    fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
2895; X86-X87-NEXT:    fucompp
2896; X86-X87-NEXT:    fnstsw %ax
2897; X86-X87-NEXT:    movl %eax, %ebx
2898; X86-X87-NEXT:    calll __fixsfti
2899; X86-X87-NEXT:    subl $4, %esp
2900; X86-X87-NEXT:    xorl %edx, %edx
2901; X86-X87-NEXT:    movb %bh, %ah
2902; X86-X87-NEXT:    sahf
2903; X86-X87-NEXT:    movl $-8, %ebx
2904; X86-X87-NEXT:    jb .LBB28_2
2905; X86-X87-NEXT:  # %bb.1:
2906; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
2907; X86-X87-NEXT:  .LBB28_2:
2908; X86-X87-NEXT:    movl $0, %ecx
2909; X86-X87-NEXT:    movl $0, %ebp
2910; X86-X87-NEXT:    jb .LBB28_4
2911; X86-X87-NEXT:  # %bb.3:
2912; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2913; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebp
2914; X86-X87-NEXT:  .LBB28_4:
2915; X86-X87-NEXT:    movl $0, %edi
2916; X86-X87-NEXT:    jb .LBB28_6
2917; X86-X87-NEXT:  # %bb.5:
2918; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
2919; X86-X87-NEXT:  .LBB28_6:
2920; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
2921; X86-X87-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
2922; X86-X87-NEXT:    fucom %st(1)
2923; X86-X87-NEXT:    fstp %st(1)
2924; X86-X87-NEXT:    fnstsw %ax
2925; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2926; X86-X87-NEXT:    sahf
2927; X86-X87-NEXT:    movl $-1, %eax
2928; X86-X87-NEXT:    movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
2929; X86-X87-NEXT:    movl $-1, %esi
2930; X86-X87-NEXT:    ja .LBB28_8
2931; X86-X87-NEXT:  # %bb.7:
2932; X86-X87-NEXT:    movl %edi, %eax
2933; X86-X87-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
2934; X86-X87-NEXT:    movl %ecx, %esi
2935; X86-X87-NEXT:  .LBB28_8:
2936; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
2937; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
2938; X86-X87-NEXT:    movl $7, %edi
2939; X86-X87-NEXT:    ja .LBB28_10
2940; X86-X87-NEXT:  # %bb.9:
2941; X86-X87-NEXT:    movl %ebx, %edi
2942; X86-X87-NEXT:  .LBB28_10:
2943; X86-X87-NEXT:    fucomp %st(0)
2944; X86-X87-NEXT:    fnstsw %ax
2945; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
2946; X86-X87-NEXT:    sahf
2947; X86-X87-NEXT:    movl $0, %eax
2948; X86-X87-NEXT:    movl $0, %ebp
2949; X86-X87-NEXT:    movl $0, %ebx
2950; X86-X87-NEXT:    jp .LBB28_12
2951; X86-X87-NEXT:  # %bb.11:
2952; X86-X87-NEXT:    movl %edi, %edx
2953; X86-X87-NEXT:    movl %esi, %eax
2954; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
2955; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
2956; X86-X87-NEXT:  .LBB28_12:
2957; X86-X87-NEXT:    movl %ebx, 8(%ecx)
2958; X86-X87-NEXT:    movl %ebp, 4(%ecx)
2959; X86-X87-NEXT:    movl %eax, (%ecx)
2960; X86-X87-NEXT:    andl $15, %edx
2961; X86-X87-NEXT:    movb %dl, 12(%ecx)
2962; X86-X87-NEXT:    movl %ecx, %eax
2963; X86-X87-NEXT:    addl $60, %esp
2964; X86-X87-NEXT:    popl %esi
2965; X86-X87-NEXT:    popl %edi
2966; X86-X87-NEXT:    popl %ebx
2967; X86-X87-NEXT:    popl %ebp
2968; X86-X87-NEXT:    retl $4
2969;
2970; X86-SSE-LABEL: test_signed_i100_f16:
2971; X86-SSE:       # %bb.0:
2972; X86-SSE-NEXT:    pushl %ebp
2973; X86-SSE-NEXT:    pushl %ebx
2974; X86-SSE-NEXT:    pushl %edi
2975; X86-SSE-NEXT:    pushl %esi
2976; X86-SSE-NEXT:    subl $44, %esp
2977; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
2978; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
2979; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
2980; X86-SSE-NEXT:    movw %ax, (%esp)
2981; X86-SSE-NEXT:    calll __extendhfsf2
2982; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
2983; X86-SSE-NEXT:    movl %eax, (%esp)
2984; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
2985; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
2986; X86-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
2987; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
2988; X86-SSE-NEXT:    calll __fixsfti
2989; X86-SSE-NEXT:    subl $4, %esp
2990; X86-SSE-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
2991; X86-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero
2992; X86-SSE-NEXT:    xorl %ebp, %ebp
2993; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
2994; X86-SSE-NEXT:    movl $-8, %ebx
2995; X86-SSE-NEXT:    movl $0, %ecx
2996; X86-SSE-NEXT:    movl $0, %edx
2997; X86-SSE-NEXT:    movl $0, %edi
2998; X86-SSE-NEXT:    jb .LBB28_2
2999; X86-SSE-NEXT:  # %bb.1:
3000; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ebx
3001; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3002; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
3003; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
3004; X86-SSE-NEXT:  .LBB28_2:
3005; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
3006; X86-SSE-NEXT:    movl $-1, %eax
3007; X86-SSE-NEXT:    cmoval %eax, %edi
3008; X86-SSE-NEXT:    cmoval %eax, %edx
3009; X86-SSE-NEXT:    cmoval %eax, %ecx
3010; X86-SSE-NEXT:    movl $7, %eax
3011; X86-SSE-NEXT:    cmovbel %ebx, %eax
3012; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
3013; X86-SSE-NEXT:    cmovpl %ebp, %eax
3014; X86-SSE-NEXT:    cmovpl %ebp, %ecx
3015; X86-SSE-NEXT:    cmovpl %ebp, %edx
3016; X86-SSE-NEXT:    cmovpl %ebp, %edi
3017; X86-SSE-NEXT:    movl %edi, 8(%esi)
3018; X86-SSE-NEXT:    movl %edx, 4(%esi)
3019; X86-SSE-NEXT:    movl %ecx, (%esi)
3020; X86-SSE-NEXT:    andl $15, %eax
3021; X86-SSE-NEXT:    movb %al, 12(%esi)
3022; X86-SSE-NEXT:    movl %esi, %eax
3023; X86-SSE-NEXT:    addl $44, %esp
3024; X86-SSE-NEXT:    popl %esi
3025; X86-SSE-NEXT:    popl %edi
3026; X86-SSE-NEXT:    popl %ebx
3027; X86-SSE-NEXT:    popl %ebp
3028; X86-SSE-NEXT:    retl $4
3029;
3030; X64-LABEL: test_signed_i100_f16:
3031; X64:       # %bb.0:
3032; X64-NEXT:    pushq %rax
3033; X64-NEXT:    callq __extendhfsf2@PLT
3034; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
3035; X64-NEXT:    callq __fixsfti@PLT
3036; X64-NEXT:    xorl %ecx, %ecx
3037; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
3038; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero
3039; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3040; X64-NEXT:    cmovbq %rcx, %rax
3041; X64-NEXT:    movabsq $-34359738368, %rsi # imm = 0xFFFFFFF800000000
3042; X64-NEXT:    cmovbq %rsi, %rdx
3043; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3044; X64-NEXT:    movabsq $34359738367, %rsi # imm = 0x7FFFFFFFF
3045; X64-NEXT:    cmovaq %rsi, %rdx
3046; X64-NEXT:    movq $-1, %rsi
3047; X64-NEXT:    cmovaq %rsi, %rax
3048; X64-NEXT:    ucomiss %xmm0, %xmm0
3049; X64-NEXT:    cmovpq %rcx, %rax
3050; X64-NEXT:    cmovpq %rcx, %rdx
3051; X64-NEXT:    popq %rcx
3052; X64-NEXT:    retq
3053    %x = call i100 @llvm.fptosi.sat.i100.f16(half %f)
3054    ret i100 %x
3055}
3056
3057define i128 @test_signed_i128_f16(half %f) nounwind {
3058; X86-X87-LABEL: test_signed_i128_f16:
3059; X86-X87:       # %bb.0:
3060; X86-X87-NEXT:    pushl %ebp
3061; X86-X87-NEXT:    pushl %ebx
3062; X86-X87-NEXT:    pushl %edi
3063; X86-X87-NEXT:    pushl %esi
3064; X86-X87-NEXT:    subl $60, %esp
3065; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3066; X86-X87-NEXT:    movl %eax, (%esp)
3067; X86-X87-NEXT:    calll __gnu_h2f_ieee
3068; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
3069; X86-X87-NEXT:    movl %eax, (%esp)
3070; X86-X87-NEXT:    fsts {{[0-9]+}}(%esp)
3071; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3072; X86-X87-NEXT:    fxch %st(1)
3073; X86-X87-NEXT:    fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
3074; X86-X87-NEXT:    fucompp
3075; X86-X87-NEXT:    fnstsw %ax
3076; X86-X87-NEXT:    movl %eax, %ebx
3077; X86-X87-NEXT:    calll __fixsfti
3078; X86-X87-NEXT:    subl $4, %esp
3079; X86-X87-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
3080; X86-X87-NEXT:    movb %bh, %ah
3081; X86-X87-NEXT:    sahf
3082; X86-X87-NEXT:    movl $0, %eax
3083; X86-X87-NEXT:    movl $0, %ebx
3084; X86-X87-NEXT:    jae .LBB29_1
3085; X86-X87-NEXT:  # %bb.2:
3086; X86-X87-NEXT:    movl $0, %edx
3087; X86-X87-NEXT:    jae .LBB29_3
3088; X86-X87-NEXT:  .LBB29_4:
3089; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
3090; X86-X87-NEXT:    jb .LBB29_6
3091; X86-X87-NEXT:  .LBB29_5:
3092; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3093; X86-X87-NEXT:  .LBB29_6:
3094; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
3095; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3096; X86-X87-NEXT:    flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
3097; X86-X87-NEXT:    fucom %st(1)
3098; X86-X87-NEXT:    fstp %st(1)
3099; X86-X87-NEXT:    fnstsw %ax
3100; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3101; X86-X87-NEXT:    sahf
3102; X86-X87-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
3103; X86-X87-NEXT:    ja .LBB29_8
3104; X86-X87-NEXT:  # %bb.7:
3105; X86-X87-NEXT:    movl %ecx, %eax
3106; X86-X87-NEXT:  .LBB29_8:
3107; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
3108; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3109; X86-X87-NEXT:    movl $-1, %ebp
3110; X86-X87-NEXT:    movl $-1, %edi
3111; X86-X87-NEXT:    movl $-1, %esi
3112; X86-X87-NEXT:    ja .LBB29_10
3113; X86-X87-NEXT:  # %bb.9:
3114; X86-X87-NEXT:    movl %edx, %ebp
3115; X86-X87-NEXT:    movl %ebx, %edi
3116; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
3117; X86-X87-NEXT:  .LBB29_10:
3118; X86-X87-NEXT:    fucomp %st(0)
3119; X86-X87-NEXT:    fnstsw %ax
3120; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3121; X86-X87-NEXT:    sahf
3122; X86-X87-NEXT:    movl $0, %eax
3123; X86-X87-NEXT:    movl $0, %edx
3124; X86-X87-NEXT:    movl $0, %ebx
3125; X86-X87-NEXT:    jp .LBB29_12
3126; X86-X87-NEXT:  # %bb.11:
3127; X86-X87-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
3128; X86-X87-NEXT:    movl %edi, %eax
3129; X86-X87-NEXT:    movl %ebp, %edx
3130; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
3131; X86-X87-NEXT:  .LBB29_12:
3132; X86-X87-NEXT:    movl %ebx, 12(%ecx)
3133; X86-X87-NEXT:    movl %edx, 8(%ecx)
3134; X86-X87-NEXT:    movl %eax, 4(%ecx)
3135; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
3136; X86-X87-NEXT:    movl %eax, (%ecx)
3137; X86-X87-NEXT:    movl %ecx, %eax
3138; X86-X87-NEXT:    addl $60, %esp
3139; X86-X87-NEXT:    popl %esi
3140; X86-X87-NEXT:    popl %edi
3141; X86-X87-NEXT:    popl %ebx
3142; X86-X87-NEXT:    popl %ebp
3143; X86-X87-NEXT:    retl $4
3144; X86-X87-NEXT:  .LBB29_1:
3145; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
3146; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
3147; X86-X87-NEXT:    movl $0, %edx
3148; X86-X87-NEXT:    jb .LBB29_4
3149; X86-X87-NEXT:  .LBB29_3:
3150; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
3151; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
3152; X86-X87-NEXT:    jae .LBB29_5
3153; X86-X87-NEXT:    jmp .LBB29_6
3154;
3155; X86-SSE-LABEL: test_signed_i128_f16:
3156; X86-SSE:       # %bb.0:
3157; X86-SSE-NEXT:    pushl %ebp
3158; X86-SSE-NEXT:    pushl %ebx
3159; X86-SSE-NEXT:    pushl %edi
3160; X86-SSE-NEXT:    pushl %esi
3161; X86-SSE-NEXT:    subl $44, %esp
3162; X86-SSE-NEXT:    pinsrw $0, {{[0-9]+}}(%esp), %xmm0
3163; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
3164; X86-SSE-NEXT:    pextrw $0, %xmm0, %eax
3165; X86-SSE-NEXT:    movw %ax, (%esp)
3166; X86-SSE-NEXT:    calll __extendhfsf2
3167; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
3168; X86-SSE-NEXT:    movl %eax, (%esp)
3169; X86-SSE-NEXT:    fstps {{[0-9]+}}(%esp)
3170; X86-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
3171; X86-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
3172; X86-SSE-NEXT:    movss %xmm0, {{[0-9]+}}(%esp)
3173; X86-SSE-NEXT:    calll __fixsfti
3174; X86-SSE-NEXT:    subl $4, %esp
3175; X86-SSE-NEXT:    xorl %ecx, %ecx
3176; X86-SSE-NEXT:    movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload
3177; X86-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero
3178; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
3179; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
3180; X86-SSE-NEXT:    cmovbl %ecx, %eax
3181; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
3182; X86-SSE-NEXT:    cmovbl %ecx, %edx
3183; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
3184; X86-SSE-NEXT:    cmovbl %ecx, %edi
3185; X86-SSE-NEXT:    movl $-2147483648, %ebp # imm = 0x80000000
3186; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %ebp
3187; X86-SSE-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0
3188; X86-SSE-NEXT:    movl $2147483647, %ebx # imm = 0x7FFFFFFF
3189; X86-SSE-NEXT:    cmovbel %ebp, %ebx
3190; X86-SSE-NEXT:    movl $-1, %ebp
3191; X86-SSE-NEXT:    cmoval %ebp, %edi
3192; X86-SSE-NEXT:    cmoval %ebp, %edx
3193; X86-SSE-NEXT:    cmoval %ebp, %eax
3194; X86-SSE-NEXT:    ucomiss %xmm0, %xmm0
3195; X86-SSE-NEXT:    cmovpl %ecx, %eax
3196; X86-SSE-NEXT:    cmovpl %ecx, %edx
3197; X86-SSE-NEXT:    cmovpl %ecx, %edi
3198; X86-SSE-NEXT:    cmovpl %ecx, %ebx
3199; X86-SSE-NEXT:    movl %ebx, 12(%esi)
3200; X86-SSE-NEXT:    movl %edi, 8(%esi)
3201; X86-SSE-NEXT:    movl %edx, 4(%esi)
3202; X86-SSE-NEXT:    movl %eax, (%esi)
3203; X86-SSE-NEXT:    movl %esi, %eax
3204; X86-SSE-NEXT:    addl $44, %esp
3205; X86-SSE-NEXT:    popl %esi
3206; X86-SSE-NEXT:    popl %edi
3207; X86-SSE-NEXT:    popl %ebx
3208; X86-SSE-NEXT:    popl %ebp
3209; X86-SSE-NEXT:    retl $4
3210;
3211; X64-LABEL: test_signed_i128_f16:
3212; X64:       # %bb.0:
3213; X64-NEXT:    pushq %rax
3214; X64-NEXT:    callq __extendhfsf2@PLT
3215; X64-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill
3216; X64-NEXT:    callq __fixsfti@PLT
3217; X64-NEXT:    xorl %ecx, %ecx
3218; X64-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload
3219; X64-NEXT:    # xmm0 = mem[0],zero,zero,zero
3220; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3221; X64-NEXT:    cmovbq %rcx, %rax
3222; X64-NEXT:    movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000
3223; X64-NEXT:    cmovbq %rsi, %rdx
3224; X64-NEXT:    ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
3225; X64-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
3226; X64-NEXT:    cmovaq %rsi, %rdx
3227; X64-NEXT:    movq $-1, %rsi
3228; X64-NEXT:    cmovaq %rsi, %rax
3229; X64-NEXT:    ucomiss %xmm0, %xmm0
3230; X64-NEXT:    cmovpq %rcx, %rax
3231; X64-NEXT:    cmovpq %rcx, %rdx
3232; X64-NEXT:    popq %rcx
3233; X64-NEXT:    retq
3234    %x = call i128 @llvm.fptosi.sat.i128.f16(half %f)
3235    ret i128 %x
3236}
3237
3238;
3239; 80-bit float to signed integer
3240;
3241
3242declare   i1 @llvm.fptosi.sat.i1.f80  (x86_fp80)
3243declare   i8 @llvm.fptosi.sat.i8.f80  (x86_fp80)
3244declare  i13 @llvm.fptosi.sat.i13.f80 (x86_fp80)
3245declare  i16 @llvm.fptosi.sat.i16.f80 (x86_fp80)
3246declare  i19 @llvm.fptosi.sat.i19.f80 (x86_fp80)
3247declare  i32 @llvm.fptosi.sat.i32.f80 (x86_fp80)
3248declare  i50 @llvm.fptosi.sat.i50.f80 (x86_fp80)
3249declare  i64 @llvm.fptosi.sat.i64.f80 (x86_fp80)
3250declare i100 @llvm.fptosi.sat.i100.f80(x86_fp80)
3251declare i128 @llvm.fptosi.sat.i128.f80(x86_fp80)
3252
3253define i1 @test_signed_i1_f80(x86_fp80 %f) nounwind {
3254; X86-X87-LABEL: test_signed_i1_f80:
3255; X86-X87:       # %bb.0:
3256; X86-X87-NEXT:    pushl %ebx
3257; X86-X87-NEXT:    subl $8, %esp
3258; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
3259; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
3260; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3261; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
3262; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3263; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3264; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
3265; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3266; X86-X87-NEXT:    fld1
3267; X86-X87-NEXT:    fchs
3268; X86-X87-NEXT:    fxch %st(1)
3269; X86-X87-NEXT:    fucom %st(1)
3270; X86-X87-NEXT:    fstp %st(1)
3271; X86-X87-NEXT:    fnstsw %ax
3272; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3273; X86-X87-NEXT:    sahf
3274; X86-X87-NEXT:    movb $-1, %dl
3275; X86-X87-NEXT:    jb .LBB30_2
3276; X86-X87-NEXT:  # %bb.1:
3277; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
3278; X86-X87-NEXT:  .LBB30_2:
3279; X86-X87-NEXT:    fldz
3280; X86-X87-NEXT:    fxch %st(1)
3281; X86-X87-NEXT:    fucom %st(1)
3282; X86-X87-NEXT:    fstp %st(1)
3283; X86-X87-NEXT:    fnstsw %ax
3284; X86-X87-NEXT:    xorl %ecx, %ecx
3285; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3286; X86-X87-NEXT:    sahf
3287; X86-X87-NEXT:    movl $0, %ebx
3288; X86-X87-NEXT:    ja .LBB30_4
3289; X86-X87-NEXT:  # %bb.3:
3290; X86-X87-NEXT:    movl %edx, %ebx
3291; X86-X87-NEXT:  .LBB30_4:
3292; X86-X87-NEXT:    fucomp %st(0)
3293; X86-X87-NEXT:    fnstsw %ax
3294; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3295; X86-X87-NEXT:    sahf
3296; X86-X87-NEXT:    jp .LBB30_6
3297; X86-X87-NEXT:  # %bb.5:
3298; X86-X87-NEXT:    movl %ebx, %ecx
3299; X86-X87-NEXT:  .LBB30_6:
3300; X86-X87-NEXT:    movl %ecx, %eax
3301; X86-X87-NEXT:    addl $8, %esp
3302; X86-X87-NEXT:    popl %ebx
3303; X86-X87-NEXT:    retl
3304;
3305; X86-SSE-LABEL: test_signed_i1_f80:
3306; X86-SSE:       # %bb.0:
3307; X86-SSE-NEXT:    subl $8, %esp
3308; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
3309; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
3310; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3311; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
3312; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3313; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3314; X86-SSE-NEXT:    fists {{[0-9]+}}(%esp)
3315; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3316; X86-SSE-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx
3317; X86-SSE-NEXT:    fld1
3318; X86-SSE-NEXT:    fchs
3319; X86-SSE-NEXT:    fxch %st(1)
3320; X86-SSE-NEXT:    fucomi %st(1), %st
3321; X86-SSE-NEXT:    fstp %st(1)
3322; X86-SSE-NEXT:    movl $255, %eax
3323; X86-SSE-NEXT:    cmovael %ecx, %eax
3324; X86-SSE-NEXT:    xorl %ecx, %ecx
3325; X86-SSE-NEXT:    fldz
3326; X86-SSE-NEXT:    fxch %st(1)
3327; X86-SSE-NEXT:    fucomi %st(1), %st
3328; X86-SSE-NEXT:    fstp %st(1)
3329; X86-SSE-NEXT:    cmoval %ecx, %eax
3330; X86-SSE-NEXT:    fucompi %st(0), %st
3331; X86-SSE-NEXT:    cmovpl %ecx, %eax
3332; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
3333; X86-SSE-NEXT:    addl $8, %esp
3334; X86-SSE-NEXT:    retl
3335;
3336; X64-LABEL: test_signed_i1_f80:
3337; X64:       # %bb.0:
3338; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
3339; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
3340; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3341; X64-NEXT:    orl $3072, %eax # imm = 0xC00
3342; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
3343; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3344; X64-NEXT:    fists -{{[0-9]+}}(%rsp)
3345; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3346; X64-NEXT:    movzbl -{{[0-9]+}}(%rsp), %ecx
3347; X64-NEXT:    fld1
3348; X64-NEXT:    fchs
3349; X64-NEXT:    fxch %st(1)
3350; X64-NEXT:    fucomi %st(1), %st
3351; X64-NEXT:    fstp %st(1)
3352; X64-NEXT:    movl $255, %eax
3353; X64-NEXT:    cmovael %ecx, %eax
3354; X64-NEXT:    xorl %ecx, %ecx
3355; X64-NEXT:    fldz
3356; X64-NEXT:    fxch %st(1)
3357; X64-NEXT:    fucomi %st(1), %st
3358; X64-NEXT:    fstp %st(1)
3359; X64-NEXT:    cmoval %ecx, %eax
3360; X64-NEXT:    fucompi %st(0), %st
3361; X64-NEXT:    cmovpl %ecx, %eax
3362; X64-NEXT:    # kill: def $al killed $al killed $eax
3363; X64-NEXT:    retq
3364    %x = call i1 @llvm.fptosi.sat.i1.f80(x86_fp80 %f)
3365    ret i1 %x
3366}
3367
3368define i8 @test_signed_i8_f80(x86_fp80 %f) nounwind {
3369; X86-X87-LABEL: test_signed_i8_f80:
3370; X86-X87:       # %bb.0:
3371; X86-X87-NEXT:    subl $8, %esp
3372; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
3373; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
3374; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3375; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
3376; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3377; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3378; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
3379; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3380; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3381; X86-X87-NEXT:    fxch %st(1)
3382; X86-X87-NEXT:    fucom %st(1)
3383; X86-X87-NEXT:    fstp %st(1)
3384; X86-X87-NEXT:    fnstsw %ax
3385; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3386; X86-X87-NEXT:    sahf
3387; X86-X87-NEXT:    movb $-128, %dl
3388; X86-X87-NEXT:    jb .LBB31_2
3389; X86-X87-NEXT:  # %bb.1:
3390; X86-X87-NEXT:    movzbl {{[0-9]+}}(%esp), %edx
3391; X86-X87-NEXT:  .LBB31_2:
3392; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3393; X86-X87-NEXT:    fxch %st(1)
3394; X86-X87-NEXT:    fucom %st(1)
3395; X86-X87-NEXT:    fstp %st(1)
3396; X86-X87-NEXT:    fnstsw %ax
3397; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3398; X86-X87-NEXT:    sahf
3399; X86-X87-NEXT:    movb $127, %cl
3400; X86-X87-NEXT:    ja .LBB31_4
3401; X86-X87-NEXT:  # %bb.3:
3402; X86-X87-NEXT:    movl %edx, %ecx
3403; X86-X87-NEXT:  .LBB31_4:
3404; X86-X87-NEXT:    fucomp %st(0)
3405; X86-X87-NEXT:    fnstsw %ax
3406; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3407; X86-X87-NEXT:    sahf
3408; X86-X87-NEXT:    jnp .LBB31_6
3409; X86-X87-NEXT:  # %bb.5:
3410; X86-X87-NEXT:    xorl %ecx, %ecx
3411; X86-X87-NEXT:  .LBB31_6:
3412; X86-X87-NEXT:    movl %ecx, %eax
3413; X86-X87-NEXT:    addl $8, %esp
3414; X86-X87-NEXT:    retl
3415;
3416; X86-SSE-LABEL: test_signed_i8_f80:
3417; X86-SSE:       # %bb.0:
3418; X86-SSE-NEXT:    subl $8, %esp
3419; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
3420; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
3421; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3422; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
3423; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3424; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3425; X86-SSE-NEXT:    fists {{[0-9]+}}(%esp)
3426; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3427; X86-SSE-NEXT:    movzbl {{[0-9]+}}(%esp), %eax
3428; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3429; X86-SSE-NEXT:    fxch %st(1)
3430; X86-SSE-NEXT:    fucomi %st(1), %st
3431; X86-SSE-NEXT:    fstp %st(1)
3432; X86-SSE-NEXT:    movl $128, %ecx
3433; X86-SSE-NEXT:    cmovael %eax, %ecx
3434; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3435; X86-SSE-NEXT:    fxch %st(1)
3436; X86-SSE-NEXT:    fucomi %st(1), %st
3437; X86-SSE-NEXT:    fstp %st(1)
3438; X86-SSE-NEXT:    movl $127, %edx
3439; X86-SSE-NEXT:    cmovbel %ecx, %edx
3440; X86-SSE-NEXT:    xorl %eax, %eax
3441; X86-SSE-NEXT:    fucompi %st(0), %st
3442; X86-SSE-NEXT:    cmovnpl %edx, %eax
3443; X86-SSE-NEXT:    # kill: def $al killed $al killed $eax
3444; X86-SSE-NEXT:    addl $8, %esp
3445; X86-SSE-NEXT:    retl
3446;
3447; X64-LABEL: test_signed_i8_f80:
3448; X64:       # %bb.0:
3449; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
3450; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
3451; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3452; X64-NEXT:    orl $3072, %eax # imm = 0xC00
3453; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
3454; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3455; X64-NEXT:    fists -{{[0-9]+}}(%rsp)
3456; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3457; X64-NEXT:    movzbl -{{[0-9]+}}(%rsp), %eax
3458; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3459; X64-NEXT:    fxch %st(1)
3460; X64-NEXT:    fucomi %st(1), %st
3461; X64-NEXT:    fstp %st(1)
3462; X64-NEXT:    movl $128, %ecx
3463; X64-NEXT:    cmovael %eax, %ecx
3464; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3465; X64-NEXT:    fxch %st(1)
3466; X64-NEXT:    fucomi %st(1), %st
3467; X64-NEXT:    fstp %st(1)
3468; X64-NEXT:    movl $127, %edx
3469; X64-NEXT:    cmovbel %ecx, %edx
3470; X64-NEXT:    xorl %eax, %eax
3471; X64-NEXT:    fucompi %st(0), %st
3472; X64-NEXT:    cmovnpl %edx, %eax
3473; X64-NEXT:    # kill: def $al killed $al killed $eax
3474; X64-NEXT:    retq
3475    %x = call i8 @llvm.fptosi.sat.i8.f80(x86_fp80 %f)
3476    ret i8 %x
3477}
3478
3479define i13 @test_signed_i13_f80(x86_fp80 %f) nounwind {
3480; X86-X87-LABEL: test_signed_i13_f80:
3481; X86-X87:       # %bb.0:
3482; X86-X87-NEXT:    subl $8, %esp
3483; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
3484; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
3485; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3486; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
3487; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3488; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3489; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
3490; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3491; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3492; X86-X87-NEXT:    fxch %st(1)
3493; X86-X87-NEXT:    fucom %st(1)
3494; X86-X87-NEXT:    fstp %st(1)
3495; X86-X87-NEXT:    fnstsw %ax
3496; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3497; X86-X87-NEXT:    sahf
3498; X86-X87-NEXT:    movl $61440, %ecx # imm = 0xF000
3499; X86-X87-NEXT:    jb .LBB32_2
3500; X86-X87-NEXT:  # %bb.1:
3501; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
3502; X86-X87-NEXT:  .LBB32_2:
3503; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3504; X86-X87-NEXT:    fxch %st(1)
3505; X86-X87-NEXT:    fucom %st(1)
3506; X86-X87-NEXT:    fstp %st(1)
3507; X86-X87-NEXT:    fnstsw %ax
3508; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3509; X86-X87-NEXT:    sahf
3510; X86-X87-NEXT:    movl $4095, %edx # imm = 0xFFF
3511; X86-X87-NEXT:    ja .LBB32_4
3512; X86-X87-NEXT:  # %bb.3:
3513; X86-X87-NEXT:    movl %ecx, %edx
3514; X86-X87-NEXT:  .LBB32_4:
3515; X86-X87-NEXT:    fucomp %st(0)
3516; X86-X87-NEXT:    fnstsw %ax
3517; X86-X87-NEXT:    xorl %ecx, %ecx
3518; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3519; X86-X87-NEXT:    sahf
3520; X86-X87-NEXT:    jp .LBB32_6
3521; X86-X87-NEXT:  # %bb.5:
3522; X86-X87-NEXT:    movl %edx, %ecx
3523; X86-X87-NEXT:  .LBB32_6:
3524; X86-X87-NEXT:    movl %ecx, %eax
3525; X86-X87-NEXT:    addl $8, %esp
3526; X86-X87-NEXT:    retl
3527;
3528; X86-SSE-LABEL: test_signed_i13_f80:
3529; X86-SSE:       # %bb.0:
3530; X86-SSE-NEXT:    subl $8, %esp
3531; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
3532; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
3533; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3534; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
3535; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3536; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3537; X86-SSE-NEXT:    fists {{[0-9]+}}(%esp)
3538; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3539; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3540; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3541; X86-SSE-NEXT:    fxch %st(1)
3542; X86-SSE-NEXT:    fucomi %st(1), %st
3543; X86-SSE-NEXT:    fstp %st(1)
3544; X86-SSE-NEXT:    movl $61440, %ecx # imm = 0xF000
3545; X86-SSE-NEXT:    cmovael %eax, %ecx
3546; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3547; X86-SSE-NEXT:    fxch %st(1)
3548; X86-SSE-NEXT:    fucomi %st(1), %st
3549; X86-SSE-NEXT:    fstp %st(1)
3550; X86-SSE-NEXT:    movl $4095, %edx # imm = 0xFFF
3551; X86-SSE-NEXT:    cmovbel %ecx, %edx
3552; X86-SSE-NEXT:    xorl %eax, %eax
3553; X86-SSE-NEXT:    fucompi %st(0), %st
3554; X86-SSE-NEXT:    cmovnpl %edx, %eax
3555; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
3556; X86-SSE-NEXT:    addl $8, %esp
3557; X86-SSE-NEXT:    retl
3558;
3559; X64-LABEL: test_signed_i13_f80:
3560; X64:       # %bb.0:
3561; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
3562; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
3563; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3564; X64-NEXT:    orl $3072, %eax # imm = 0xC00
3565; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
3566; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3567; X64-NEXT:    fists -{{[0-9]+}}(%rsp)
3568; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3569; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3570; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3571; X64-NEXT:    fxch %st(1)
3572; X64-NEXT:    fucomi %st(1), %st
3573; X64-NEXT:    fstp %st(1)
3574; X64-NEXT:    movl $61440, %ecx # imm = 0xF000
3575; X64-NEXT:    cmovael %eax, %ecx
3576; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3577; X64-NEXT:    fxch %st(1)
3578; X64-NEXT:    fucomi %st(1), %st
3579; X64-NEXT:    fstp %st(1)
3580; X64-NEXT:    movl $4095, %edx # imm = 0xFFF
3581; X64-NEXT:    cmovbel %ecx, %edx
3582; X64-NEXT:    xorl %eax, %eax
3583; X64-NEXT:    fucompi %st(0), %st
3584; X64-NEXT:    cmovnpl %edx, %eax
3585; X64-NEXT:    # kill: def $ax killed $ax killed $eax
3586; X64-NEXT:    retq
3587    %x = call i13 @llvm.fptosi.sat.i13.f80(x86_fp80 %f)
3588    ret i13 %x
3589}
3590
3591define i16 @test_signed_i16_f80(x86_fp80 %f) nounwind {
3592; X86-X87-LABEL: test_signed_i16_f80:
3593; X86-X87:       # %bb.0:
3594; X86-X87-NEXT:    subl $8, %esp
3595; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
3596; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
3597; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3598; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
3599; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3600; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3601; X86-X87-NEXT:    fists {{[0-9]+}}(%esp)
3602; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3603; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3604; X86-X87-NEXT:    fxch %st(1)
3605; X86-X87-NEXT:    fucom %st(1)
3606; X86-X87-NEXT:    fstp %st(1)
3607; X86-X87-NEXT:    fnstsw %ax
3608; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3609; X86-X87-NEXT:    sahf
3610; X86-X87-NEXT:    movl $32768, %ecx # imm = 0x8000
3611; X86-X87-NEXT:    jb .LBB33_2
3612; X86-X87-NEXT:  # %bb.1:
3613; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %ecx
3614; X86-X87-NEXT:  .LBB33_2:
3615; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3616; X86-X87-NEXT:    fxch %st(1)
3617; X86-X87-NEXT:    fucom %st(1)
3618; X86-X87-NEXT:    fstp %st(1)
3619; X86-X87-NEXT:    fnstsw %ax
3620; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3621; X86-X87-NEXT:    sahf
3622; X86-X87-NEXT:    movl $32767, %edx # imm = 0x7FFF
3623; X86-X87-NEXT:    ja .LBB33_4
3624; X86-X87-NEXT:  # %bb.3:
3625; X86-X87-NEXT:    movl %ecx, %edx
3626; X86-X87-NEXT:  .LBB33_4:
3627; X86-X87-NEXT:    fucomp %st(0)
3628; X86-X87-NEXT:    fnstsw %ax
3629; X86-X87-NEXT:    xorl %ecx, %ecx
3630; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3631; X86-X87-NEXT:    sahf
3632; X86-X87-NEXT:    jp .LBB33_6
3633; X86-X87-NEXT:  # %bb.5:
3634; X86-X87-NEXT:    movl %edx, %ecx
3635; X86-X87-NEXT:  .LBB33_6:
3636; X86-X87-NEXT:    movl %ecx, %eax
3637; X86-X87-NEXT:    addl $8, %esp
3638; X86-X87-NEXT:    retl
3639;
3640; X86-SSE-LABEL: test_signed_i16_f80:
3641; X86-SSE:       # %bb.0:
3642; X86-SSE-NEXT:    subl $8, %esp
3643; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
3644; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
3645; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3646; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
3647; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3648; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3649; X86-SSE-NEXT:    fists {{[0-9]+}}(%esp)
3650; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3651; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3652; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3653; X86-SSE-NEXT:    fxch %st(1)
3654; X86-SSE-NEXT:    fucomi %st(1), %st
3655; X86-SSE-NEXT:    fstp %st(1)
3656; X86-SSE-NEXT:    movl $32768, %ecx # imm = 0x8000
3657; X86-SSE-NEXT:    cmovael %eax, %ecx
3658; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3659; X86-SSE-NEXT:    fxch %st(1)
3660; X86-SSE-NEXT:    fucomi %st(1), %st
3661; X86-SSE-NEXT:    fstp %st(1)
3662; X86-SSE-NEXT:    movl $32767, %edx # imm = 0x7FFF
3663; X86-SSE-NEXT:    cmovbel %ecx, %edx
3664; X86-SSE-NEXT:    xorl %eax, %eax
3665; X86-SSE-NEXT:    fucompi %st(0), %st
3666; X86-SSE-NEXT:    cmovnpl %edx, %eax
3667; X86-SSE-NEXT:    # kill: def $ax killed $ax killed $eax
3668; X86-SSE-NEXT:    addl $8, %esp
3669; X86-SSE-NEXT:    retl
3670;
3671; X64-LABEL: test_signed_i16_f80:
3672; X64:       # %bb.0:
3673; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
3674; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
3675; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3676; X64-NEXT:    orl $3072, %eax # imm = 0xC00
3677; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
3678; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3679; X64-NEXT:    fists -{{[0-9]+}}(%rsp)
3680; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3681; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3682; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3683; X64-NEXT:    fxch %st(1)
3684; X64-NEXT:    fucomi %st(1), %st
3685; X64-NEXT:    fstp %st(1)
3686; X64-NEXT:    movl $32768, %ecx # imm = 0x8000
3687; X64-NEXT:    cmovael %eax, %ecx
3688; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3689; X64-NEXT:    fxch %st(1)
3690; X64-NEXT:    fucomi %st(1), %st
3691; X64-NEXT:    fstp %st(1)
3692; X64-NEXT:    movl $32767, %edx # imm = 0x7FFF
3693; X64-NEXT:    cmovbel %ecx, %edx
3694; X64-NEXT:    xorl %eax, %eax
3695; X64-NEXT:    fucompi %st(0), %st
3696; X64-NEXT:    cmovnpl %edx, %eax
3697; X64-NEXT:    # kill: def $ax killed $ax killed $eax
3698; X64-NEXT:    retq
3699    %x = call i16 @llvm.fptosi.sat.i16.f80(x86_fp80 %f)
3700    ret i16 %x
3701}
3702
3703define i19 @test_signed_i19_f80(x86_fp80 %f) nounwind {
3704; X86-X87-LABEL: test_signed_i19_f80:
3705; X86-X87:       # %bb.0:
3706; X86-X87-NEXT:    subl $8, %esp
3707; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
3708; X86-X87-NEXT:    fnstcw (%esp)
3709; X86-X87-NEXT:    movzwl (%esp), %eax
3710; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
3711; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3712; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3713; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
3714; X86-X87-NEXT:    fldcw (%esp)
3715; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3716; X86-X87-NEXT:    fxch %st(1)
3717; X86-X87-NEXT:    fucom %st(1)
3718; X86-X87-NEXT:    fstp %st(1)
3719; X86-X87-NEXT:    fnstsw %ax
3720; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3721; X86-X87-NEXT:    sahf
3722; X86-X87-NEXT:    movl $-262144, %ecx # imm = 0xFFFC0000
3723; X86-X87-NEXT:    jb .LBB34_2
3724; X86-X87-NEXT:  # %bb.1:
3725; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3726; X86-X87-NEXT:  .LBB34_2:
3727; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3728; X86-X87-NEXT:    fxch %st(1)
3729; X86-X87-NEXT:    fucom %st(1)
3730; X86-X87-NEXT:    fstp %st(1)
3731; X86-X87-NEXT:    fnstsw %ax
3732; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3733; X86-X87-NEXT:    sahf
3734; X86-X87-NEXT:    movl $262143, %edx # imm = 0x3FFFF
3735; X86-X87-NEXT:    ja .LBB34_4
3736; X86-X87-NEXT:  # %bb.3:
3737; X86-X87-NEXT:    movl %ecx, %edx
3738; X86-X87-NEXT:  .LBB34_4:
3739; X86-X87-NEXT:    fucomp %st(0)
3740; X86-X87-NEXT:    fnstsw %ax
3741; X86-X87-NEXT:    xorl %ecx, %ecx
3742; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3743; X86-X87-NEXT:    sahf
3744; X86-X87-NEXT:    jp .LBB34_6
3745; X86-X87-NEXT:  # %bb.5:
3746; X86-X87-NEXT:    movl %edx, %ecx
3747; X86-X87-NEXT:  .LBB34_6:
3748; X86-X87-NEXT:    movl %ecx, %eax
3749; X86-X87-NEXT:    addl $8, %esp
3750; X86-X87-NEXT:    retl
3751;
3752; X86-SSE-LABEL: test_signed_i19_f80:
3753; X86-SSE:       # %bb.0:
3754; X86-SSE-NEXT:    subl $8, %esp
3755; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
3756; X86-SSE-NEXT:    fnstcw (%esp)
3757; X86-SSE-NEXT:    movzwl (%esp), %eax
3758; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
3759; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3760; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3761; X86-SSE-NEXT:    fistl {{[0-9]+}}(%esp)
3762; X86-SSE-NEXT:    fldcw (%esp)
3763; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3764; X86-SSE-NEXT:    fxch %st(1)
3765; X86-SSE-NEXT:    fucomi %st(1), %st
3766; X86-SSE-NEXT:    fstp %st(1)
3767; X86-SSE-NEXT:    movl $-262144, %eax # imm = 0xFFFC0000
3768; X86-SSE-NEXT:    jb .LBB34_2
3769; X86-SSE-NEXT:  # %bb.1:
3770; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
3771; X86-SSE-NEXT:  .LBB34_2:
3772; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3773; X86-SSE-NEXT:    fxch %st(1)
3774; X86-SSE-NEXT:    fucomi %st(1), %st
3775; X86-SSE-NEXT:    fstp %st(1)
3776; X86-SSE-NEXT:    movl $262143, %ecx # imm = 0x3FFFF
3777; X86-SSE-NEXT:    cmovbel %eax, %ecx
3778; X86-SSE-NEXT:    xorl %eax, %eax
3779; X86-SSE-NEXT:    fucompi %st(0), %st
3780; X86-SSE-NEXT:    cmovnpl %ecx, %eax
3781; X86-SSE-NEXT:    addl $8, %esp
3782; X86-SSE-NEXT:    retl
3783;
3784; X64-LABEL: test_signed_i19_f80:
3785; X64:       # %bb.0:
3786; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
3787; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
3788; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3789; X64-NEXT:    orl $3072, %eax # imm = 0xC00
3790; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
3791; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3792; X64-NEXT:    fistl -{{[0-9]+}}(%rsp)
3793; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3794; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3795; X64-NEXT:    fxch %st(1)
3796; X64-NEXT:    fucomi %st(1), %st
3797; X64-NEXT:    fstp %st(1)
3798; X64-NEXT:    movl $-262144, %eax # imm = 0xFFFC0000
3799; X64-NEXT:    jb .LBB34_2
3800; X64-NEXT:  # %bb.1:
3801; X64-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
3802; X64-NEXT:  .LBB34_2:
3803; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3804; X64-NEXT:    fxch %st(1)
3805; X64-NEXT:    fucomi %st(1), %st
3806; X64-NEXT:    fstp %st(1)
3807; X64-NEXT:    movl $262143, %ecx # imm = 0x3FFFF
3808; X64-NEXT:    cmovbel %eax, %ecx
3809; X64-NEXT:    xorl %eax, %eax
3810; X64-NEXT:    fucompi %st(0), %st
3811; X64-NEXT:    cmovnpl %ecx, %eax
3812; X64-NEXT:    retq
3813    %x = call i19 @llvm.fptosi.sat.i19.f80(x86_fp80 %f)
3814    ret i19 %x
3815}
3816
3817define i32 @test_signed_i32_f80(x86_fp80 %f) nounwind {
3818; X86-X87-LABEL: test_signed_i32_f80:
3819; X86-X87:       # %bb.0:
3820; X86-X87-NEXT:    subl $8, %esp
3821; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
3822; X86-X87-NEXT:    fnstcw (%esp)
3823; X86-X87-NEXT:    movzwl (%esp), %eax
3824; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
3825; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3826; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3827; X86-X87-NEXT:    fistl {{[0-9]+}}(%esp)
3828; X86-X87-NEXT:    fldcw (%esp)
3829; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3830; X86-X87-NEXT:    fxch %st(1)
3831; X86-X87-NEXT:    fucom %st(1)
3832; X86-X87-NEXT:    fstp %st(1)
3833; X86-X87-NEXT:    fnstsw %ax
3834; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3835; X86-X87-NEXT:    sahf
3836; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
3837; X86-X87-NEXT:    jb .LBB35_2
3838; X86-X87-NEXT:  # %bb.1:
3839; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
3840; X86-X87-NEXT:  .LBB35_2:
3841; X86-X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
3842; X86-X87-NEXT:    fxch %st(1)
3843; X86-X87-NEXT:    fucom %st(1)
3844; X86-X87-NEXT:    fstp %st(1)
3845; X86-X87-NEXT:    fnstsw %ax
3846; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3847; X86-X87-NEXT:    sahf
3848; X86-X87-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
3849; X86-X87-NEXT:    ja .LBB35_4
3850; X86-X87-NEXT:  # %bb.3:
3851; X86-X87-NEXT:    movl %ecx, %edx
3852; X86-X87-NEXT:  .LBB35_4:
3853; X86-X87-NEXT:    fucomp %st(0)
3854; X86-X87-NEXT:    fnstsw %ax
3855; X86-X87-NEXT:    xorl %ecx, %ecx
3856; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3857; X86-X87-NEXT:    sahf
3858; X86-X87-NEXT:    jp .LBB35_6
3859; X86-X87-NEXT:  # %bb.5:
3860; X86-X87-NEXT:    movl %edx, %ecx
3861; X86-X87-NEXT:  .LBB35_6:
3862; X86-X87-NEXT:    movl %ecx, %eax
3863; X86-X87-NEXT:    addl $8, %esp
3864; X86-X87-NEXT:    retl
3865;
3866; X86-SSE-LABEL: test_signed_i32_f80:
3867; X86-SSE:       # %bb.0:
3868; X86-SSE-NEXT:    subl $8, %esp
3869; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
3870; X86-SSE-NEXT:    fnstcw (%esp)
3871; X86-SSE-NEXT:    movzwl (%esp), %eax
3872; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
3873; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3874; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
3875; X86-SSE-NEXT:    fistl {{[0-9]+}}(%esp)
3876; X86-SSE-NEXT:    fldcw (%esp)
3877; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3878; X86-SSE-NEXT:    fxch %st(1)
3879; X86-SSE-NEXT:    fucomi %st(1), %st
3880; X86-SSE-NEXT:    fstp %st(1)
3881; X86-SSE-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
3882; X86-SSE-NEXT:    jb .LBB35_2
3883; X86-SSE-NEXT:  # %bb.1:
3884; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
3885; X86-SSE-NEXT:  .LBB35_2:
3886; X86-SSE-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
3887; X86-SSE-NEXT:    fxch %st(1)
3888; X86-SSE-NEXT:    fucomi %st(1), %st
3889; X86-SSE-NEXT:    fstp %st(1)
3890; X86-SSE-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
3891; X86-SSE-NEXT:    cmovbel %eax, %ecx
3892; X86-SSE-NEXT:    xorl %eax, %eax
3893; X86-SSE-NEXT:    fucompi %st(0), %st
3894; X86-SSE-NEXT:    cmovnpl %ecx, %eax
3895; X86-SSE-NEXT:    addl $8, %esp
3896; X86-SSE-NEXT:    retl
3897;
3898; X64-LABEL: test_signed_i32_f80:
3899; X64:       # %bb.0:
3900; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
3901; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
3902; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
3903; X64-NEXT:    orl $3072, %eax # imm = 0xC00
3904; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
3905; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3906; X64-NEXT:    fistl -{{[0-9]+}}(%rsp)
3907; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
3908; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3909; X64-NEXT:    fxch %st(1)
3910; X64-NEXT:    fucomi %st(1), %st
3911; X64-NEXT:    fstp %st(1)
3912; X64-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
3913; X64-NEXT:    jb .LBB35_2
3914; X64-NEXT:  # %bb.1:
3915; X64-NEXT:    movl -{{[0-9]+}}(%rsp), %eax
3916; X64-NEXT:  .LBB35_2:
3917; X64-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
3918; X64-NEXT:    fxch %st(1)
3919; X64-NEXT:    fucomi %st(1), %st
3920; X64-NEXT:    fstp %st(1)
3921; X64-NEXT:    movl $2147483647, %ecx # imm = 0x7FFFFFFF
3922; X64-NEXT:    cmovbel %eax, %ecx
3923; X64-NEXT:    xorl %eax, %eax
3924; X64-NEXT:    fucompi %st(0), %st
3925; X64-NEXT:    cmovnpl %ecx, %eax
3926; X64-NEXT:    retq
3927    %x = call i32 @llvm.fptosi.sat.i32.f80(x86_fp80 %f)
3928    ret i32 %x
3929}
3930
3931define i50 @test_signed_i50_f80(x86_fp80 %f) nounwind {
3932; X86-X87-LABEL: test_signed_i50_f80:
3933; X86-X87:       # %bb.0:
3934; X86-X87-NEXT:    pushl %edi
3935; X86-X87-NEXT:    pushl %esi
3936; X86-X87-NEXT:    subl $20, %esp
3937; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
3938; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
3939; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
3940; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
3941; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
3942; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3943; X86-X87-NEXT:    fld %st(0)
3944; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
3945; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
3946; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
3947; X86-X87-NEXT:    fxch %st(1)
3948; X86-X87-NEXT:    fucom %st(1)
3949; X86-X87-NEXT:    fstp %st(1)
3950; X86-X87-NEXT:    fnstsw %ax
3951; X86-X87-NEXT:    xorl %ecx, %ecx
3952; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3953; X86-X87-NEXT:    sahf
3954; X86-X87-NEXT:    movl $0, %edx
3955; X86-X87-NEXT:    jb .LBB36_2
3956; X86-X87-NEXT:  # %bb.1:
3957; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
3958; X86-X87-NEXT:  .LBB36_2:
3959; X86-X87-NEXT:    movl $-131072, %edi # imm = 0xFFFE0000
3960; X86-X87-NEXT:    jb .LBB36_4
3961; X86-X87-NEXT:  # %bb.3:
3962; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
3963; X86-X87-NEXT:  .LBB36_4:
3964; X86-X87-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
3965; X86-X87-NEXT:    fxch %st(1)
3966; X86-X87-NEXT:    fucom %st(1)
3967; X86-X87-NEXT:    fstp %st(1)
3968; X86-X87-NEXT:    fnstsw %ax
3969; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3970; X86-X87-NEXT:    sahf
3971; X86-X87-NEXT:    movl $131071, %esi # imm = 0x1FFFF
3972; X86-X87-NEXT:    ja .LBB36_6
3973; X86-X87-NEXT:  # %bb.5:
3974; X86-X87-NEXT:    movl %edi, %esi
3975; X86-X87-NEXT:  .LBB36_6:
3976; X86-X87-NEXT:    movl $-1, %edi
3977; X86-X87-NEXT:    ja .LBB36_8
3978; X86-X87-NEXT:  # %bb.7:
3979; X86-X87-NEXT:    movl %edx, %edi
3980; X86-X87-NEXT:  .LBB36_8:
3981; X86-X87-NEXT:    fucomp %st(0)
3982; X86-X87-NEXT:    fnstsw %ax
3983; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
3984; X86-X87-NEXT:    sahf
3985; X86-X87-NEXT:    movl $0, %edx
3986; X86-X87-NEXT:    jp .LBB36_10
3987; X86-X87-NEXT:  # %bb.9:
3988; X86-X87-NEXT:    movl %edi, %ecx
3989; X86-X87-NEXT:    movl %esi, %edx
3990; X86-X87-NEXT:  .LBB36_10:
3991; X86-X87-NEXT:    movl %ecx, %eax
3992; X86-X87-NEXT:    addl $20, %esp
3993; X86-X87-NEXT:    popl %esi
3994; X86-X87-NEXT:    popl %edi
3995; X86-X87-NEXT:    retl
3996;
3997; X86-SSE-LABEL: test_signed_i50_f80:
3998; X86-SSE:       # %bb.0:
3999; X86-SSE-NEXT:    pushl %esi
4000; X86-SSE-NEXT:    subl $16, %esp
4001; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
4002; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
4003; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
4004; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
4005; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
4006; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
4007; X86-SSE-NEXT:    fld %st(0)
4008; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
4009; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
4010; X86-SSE-NEXT:    xorl %ecx, %ecx
4011; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
4012; X86-SSE-NEXT:    fxch %st(1)
4013; X86-SSE-NEXT:    fucomi %st(1), %st
4014; X86-SSE-NEXT:    fstp %st(1)
4015; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
4016; X86-SSE-NEXT:    cmovbl %ecx, %esi
4017; X86-SSE-NEXT:    movl $-131072, %eax # imm = 0xFFFE0000
4018; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
4019; X86-SSE-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}
4020; X86-SSE-NEXT:    fxch %st(1)
4021; X86-SSE-NEXT:    fucomi %st(1), %st
4022; X86-SSE-NEXT:    fstp %st(1)
4023; X86-SSE-NEXT:    movl $131071, %edx # imm = 0x1FFFF
4024; X86-SSE-NEXT:    cmovbel %eax, %edx
4025; X86-SSE-NEXT:    movl $-1, %eax
4026; X86-SSE-NEXT:    cmovbel %esi, %eax
4027; X86-SSE-NEXT:    fucompi %st(0), %st
4028; X86-SSE-NEXT:    cmovpl %ecx, %eax
4029; X86-SSE-NEXT:    cmovpl %ecx, %edx
4030; X86-SSE-NEXT:    addl $16, %esp
4031; X86-SSE-NEXT:    popl %esi
4032; X86-SSE-NEXT:    retl
4033;
4034; X64-LABEL: test_signed_i50_f80:
4035; X64:       # %bb.0:
4036; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
4037; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
4038; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
4039; X64-NEXT:    orl $3072, %eax # imm = 0xC00
4040; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
4041; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
4042; X64-NEXT:    fld %st(0)
4043; X64-NEXT:    fistpll -{{[0-9]+}}(%rsp)
4044; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
4045; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4046; X64-NEXT:    fxch %st(1)
4047; X64-NEXT:    fucomi %st(1), %st
4048; X64-NEXT:    fstp %st(1)
4049; X64-NEXT:    jb .LBB36_1
4050; X64-NEXT:  # %bb.2:
4051; X64-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
4052; X64-NEXT:    jmp .LBB36_3
4053; X64-NEXT:  .LBB36_1:
4054; X64-NEXT:    movabsq $-562949953421312, %rax # imm = 0xFFFE000000000000
4055; X64-NEXT:  .LBB36_3:
4056; X64-NEXT:    fldl {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4057; X64-NEXT:    fxch %st(1)
4058; X64-NEXT:    fucomi %st(1), %st
4059; X64-NEXT:    fstp %st(1)
4060; X64-NEXT:    movabsq $562949953421311, %rcx # imm = 0x1FFFFFFFFFFFF
4061; X64-NEXT:    cmovbeq %rax, %rcx
4062; X64-NEXT:    xorl %eax, %eax
4063; X64-NEXT:    fucompi %st(0), %st
4064; X64-NEXT:    cmovnpq %rcx, %rax
4065; X64-NEXT:    retq
4066    %x = call i50 @llvm.fptosi.sat.i50.f80(x86_fp80 %f)
4067    ret i50 %x
4068}
4069
4070define i64 @test_signed_i64_f80(x86_fp80 %f) nounwind {
4071; X86-X87-LABEL: test_signed_i64_f80:
4072; X86-X87:       # %bb.0:
4073; X86-X87-NEXT:    pushl %edi
4074; X86-X87-NEXT:    pushl %esi
4075; X86-X87-NEXT:    subl $20, %esp
4076; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
4077; X86-X87-NEXT:    fnstcw {{[0-9]+}}(%esp)
4078; X86-X87-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
4079; X86-X87-NEXT:    orl $3072, %eax # imm = 0xC00
4080; X86-X87-NEXT:    movw %ax, {{[0-9]+}}(%esp)
4081; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
4082; X86-X87-NEXT:    fld %st(0)
4083; X86-X87-NEXT:    fistpll {{[0-9]+}}(%esp)
4084; X86-X87-NEXT:    fldcw {{[0-9]+}}(%esp)
4085; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
4086; X86-X87-NEXT:    fxch %st(1)
4087; X86-X87-NEXT:    fucom %st(1)
4088; X86-X87-NEXT:    fstp %st(1)
4089; X86-X87-NEXT:    fnstsw %ax
4090; X86-X87-NEXT:    xorl %ecx, %ecx
4091; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
4092; X86-X87-NEXT:    sahf
4093; X86-X87-NEXT:    movl $0, %edx
4094; X86-X87-NEXT:    jb .LBB37_2
4095; X86-X87-NEXT:  # %bb.1:
4096; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
4097; X86-X87-NEXT:  .LBB37_2:
4098; X86-X87-NEXT:    movl $-2147483648, %edi # imm = 0x80000000
4099; X86-X87-NEXT:    jb .LBB37_4
4100; X86-X87-NEXT:  # %bb.3:
4101; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
4102; X86-X87-NEXT:  .LBB37_4:
4103; X86-X87-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}
4104; X86-X87-NEXT:    fxch %st(1)
4105; X86-X87-NEXT:    fucom %st(1)
4106; X86-X87-NEXT:    fstp %st(1)
4107; X86-X87-NEXT:    fnstsw %ax
4108; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
4109; X86-X87-NEXT:    sahf
4110; X86-X87-NEXT:    movl $2147483647, %esi # imm = 0x7FFFFFFF
4111; X86-X87-NEXT:    ja .LBB37_6
4112; X86-X87-NEXT:  # %bb.5:
4113; X86-X87-NEXT:    movl %edi, %esi
4114; X86-X87-NEXT:  .LBB37_6:
4115; X86-X87-NEXT:    movl $-1, %edi
4116; X86-X87-NEXT:    ja .LBB37_8
4117; X86-X87-NEXT:  # %bb.7:
4118; X86-X87-NEXT:    movl %edx, %edi
4119; X86-X87-NEXT:  .LBB37_8:
4120; X86-X87-NEXT:    fucomp %st(0)
4121; X86-X87-NEXT:    fnstsw %ax
4122; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
4123; X86-X87-NEXT:    sahf
4124; X86-X87-NEXT:    movl $0, %edx
4125; X86-X87-NEXT:    jp .LBB37_10
4126; X86-X87-NEXT:  # %bb.9:
4127; X86-X87-NEXT:    movl %edi, %ecx
4128; X86-X87-NEXT:    movl %esi, %edx
4129; X86-X87-NEXT:  .LBB37_10:
4130; X86-X87-NEXT:    movl %ecx, %eax
4131; X86-X87-NEXT:    addl $20, %esp
4132; X86-X87-NEXT:    popl %esi
4133; X86-X87-NEXT:    popl %edi
4134; X86-X87-NEXT:    retl
4135;
4136; X86-SSE-LABEL: test_signed_i64_f80:
4137; X86-SSE:       # %bb.0:
4138; X86-SSE-NEXT:    pushl %esi
4139; X86-SSE-NEXT:    subl $16, %esp
4140; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
4141; X86-SSE-NEXT:    fnstcw {{[0-9]+}}(%esp)
4142; X86-SSE-NEXT:    movzwl {{[0-9]+}}(%esp), %eax
4143; X86-SSE-NEXT:    orl $3072, %eax # imm = 0xC00
4144; X86-SSE-NEXT:    movw %ax, {{[0-9]+}}(%esp)
4145; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
4146; X86-SSE-NEXT:    fld %st(0)
4147; X86-SSE-NEXT:    fistpll {{[0-9]+}}(%esp)
4148; X86-SSE-NEXT:    fldcw {{[0-9]+}}(%esp)
4149; X86-SSE-NEXT:    xorl %ecx, %ecx
4150; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
4151; X86-SSE-NEXT:    fxch %st(1)
4152; X86-SSE-NEXT:    fucomi %st(1), %st
4153; X86-SSE-NEXT:    fstp %st(1)
4154; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
4155; X86-SSE-NEXT:    cmovbl %ecx, %esi
4156; X86-SSE-NEXT:    movl $-2147483648, %eax # imm = 0x80000000
4157; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %eax
4158; X86-SSE-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}
4159; X86-SSE-NEXT:    fxch %st(1)
4160; X86-SSE-NEXT:    fucomi %st(1), %st
4161; X86-SSE-NEXT:    fstp %st(1)
4162; X86-SSE-NEXT:    movl $2147483647, %edx # imm = 0x7FFFFFFF
4163; X86-SSE-NEXT:    cmovbel %eax, %edx
4164; X86-SSE-NEXT:    movl $-1, %eax
4165; X86-SSE-NEXT:    cmovbel %esi, %eax
4166; X86-SSE-NEXT:    fucompi %st(0), %st
4167; X86-SSE-NEXT:    cmovpl %ecx, %eax
4168; X86-SSE-NEXT:    cmovpl %ecx, %edx
4169; X86-SSE-NEXT:    addl $16, %esp
4170; X86-SSE-NEXT:    popl %esi
4171; X86-SSE-NEXT:    retl
4172;
4173; X64-LABEL: test_signed_i64_f80:
4174; X64:       # %bb.0:
4175; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
4176; X64-NEXT:    fnstcw -{{[0-9]+}}(%rsp)
4177; X64-NEXT:    movzwl -{{[0-9]+}}(%rsp), %eax
4178; X64-NEXT:    orl $3072, %eax # imm = 0xC00
4179; X64-NEXT:    movw %ax, -{{[0-9]+}}(%rsp)
4180; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
4181; X64-NEXT:    fld %st(0)
4182; X64-NEXT:    fistpll -{{[0-9]+}}(%rsp)
4183; X64-NEXT:    fldcw -{{[0-9]+}}(%rsp)
4184; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4185; X64-NEXT:    fxch %st(1)
4186; X64-NEXT:    fucomi %st(1), %st
4187; X64-NEXT:    fstp %st(1)
4188; X64-NEXT:    jb .LBB37_1
4189; X64-NEXT:  # %bb.2:
4190; X64-NEXT:    movq -{{[0-9]+}}(%rsp), %rax
4191; X64-NEXT:    jmp .LBB37_3
4192; X64-NEXT:  .LBB37_1:
4193; X64-NEXT:    movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
4194; X64-NEXT:  .LBB37_3:
4195; X64-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4196; X64-NEXT:    fxch %st(1)
4197; X64-NEXT:    fucomi %st(1), %st
4198; X64-NEXT:    fstp %st(1)
4199; X64-NEXT:    movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF
4200; X64-NEXT:    cmovbeq %rax, %rcx
4201; X64-NEXT:    xorl %eax, %eax
4202; X64-NEXT:    fucompi %st(0), %st
4203; X64-NEXT:    cmovnpq %rcx, %rax
4204; X64-NEXT:    retq
4205    %x = call i64 @llvm.fptosi.sat.i64.f80(x86_fp80 %f)
4206    ret i64 %x
4207}
4208
4209define i100 @test_signed_i100_f80(x86_fp80 %f) nounwind {
4210; X86-X87-LABEL: test_signed_i100_f80:
4211; X86-X87:       # %bb.0:
4212; X86-X87-NEXT:    pushl %ebp
4213; X86-X87-NEXT:    pushl %ebx
4214; X86-X87-NEXT:    pushl %edi
4215; X86-X87-NEXT:    pushl %esi
4216; X86-X87-NEXT:    subl $60, %esp
4217; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
4218; X86-X87-NEXT:    fld %st(0)
4219; X86-X87-NEXT:    fstpt {{[0-9]+}}(%esp)
4220; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
4221; X86-X87-NEXT:    movl %eax, (%esp)
4222; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
4223; X86-X87-NEXT:    fld %st(1)
4224; X86-X87-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
4225; X86-X87-NEXT:    fxch %st(1)
4226; X86-X87-NEXT:    fucompp
4227; X86-X87-NEXT:    fnstsw %ax
4228; X86-X87-NEXT:    movl %eax, %ebx
4229; X86-X87-NEXT:    calll __fixxfti
4230; X86-X87-NEXT:    subl $4, %esp
4231; X86-X87-NEXT:    xorl %edx, %edx
4232; X86-X87-NEXT:    movb %bh, %ah
4233; X86-X87-NEXT:    sahf
4234; X86-X87-NEXT:    movl $-8, %ebx
4235; X86-X87-NEXT:    jb .LBB38_2
4236; X86-X87-NEXT:  # %bb.1:
4237; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
4238; X86-X87-NEXT:  .LBB38_2:
4239; X86-X87-NEXT:    movl $0, %ecx
4240; X86-X87-NEXT:    movl $0, %ebp
4241; X86-X87-NEXT:    jb .LBB38_4
4242; X86-X87-NEXT:  # %bb.3:
4243; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
4244; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebp
4245; X86-X87-NEXT:  .LBB38_4:
4246; X86-X87-NEXT:    movl $0, %edi
4247; X86-X87-NEXT:    jb .LBB38_6
4248; X86-X87-NEXT:  # %bb.5:
4249; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edi
4250; X86-X87-NEXT:  .LBB38_6:
4251; X86-X87-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}
4252; X86-X87-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
4253; X86-X87-NEXT:    fucom %st(1)
4254; X86-X87-NEXT:    fstp %st(1)
4255; X86-X87-NEXT:    fnstsw %ax
4256; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
4257; X86-X87-NEXT:    sahf
4258; X86-X87-NEXT:    movl $-1, %eax
4259; X86-X87-NEXT:    movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
4260; X86-X87-NEXT:    movl $-1, %esi
4261; X86-X87-NEXT:    ja .LBB38_8
4262; X86-X87-NEXT:  # %bb.7:
4263; X86-X87-NEXT:    movl %edi, %eax
4264; X86-X87-NEXT:    movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
4265; X86-X87-NEXT:    movl %ecx, %esi
4266; X86-X87-NEXT:  .LBB38_8:
4267; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
4268; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
4269; X86-X87-NEXT:    movl $7, %edi
4270; X86-X87-NEXT:    ja .LBB38_10
4271; X86-X87-NEXT:  # %bb.9:
4272; X86-X87-NEXT:    movl %ebx, %edi
4273; X86-X87-NEXT:  .LBB38_10:
4274; X86-X87-NEXT:    fucomp %st(0)
4275; X86-X87-NEXT:    fnstsw %ax
4276; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
4277; X86-X87-NEXT:    sahf
4278; X86-X87-NEXT:    movl $0, %eax
4279; X86-X87-NEXT:    movl $0, %ebp
4280; X86-X87-NEXT:    movl $0, %ebx
4281; X86-X87-NEXT:    jp .LBB38_12
4282; X86-X87-NEXT:  # %bb.11:
4283; X86-X87-NEXT:    movl %edi, %edx
4284; X86-X87-NEXT:    movl %esi, %eax
4285; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
4286; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
4287; X86-X87-NEXT:  .LBB38_12:
4288; X86-X87-NEXT:    movl %ebx, 8(%ecx)
4289; X86-X87-NEXT:    movl %ebp, 4(%ecx)
4290; X86-X87-NEXT:    movl %eax, (%ecx)
4291; X86-X87-NEXT:    andl $15, %edx
4292; X86-X87-NEXT:    movb %dl, 12(%ecx)
4293; X86-X87-NEXT:    movl %ecx, %eax
4294; X86-X87-NEXT:    addl $60, %esp
4295; X86-X87-NEXT:    popl %esi
4296; X86-X87-NEXT:    popl %edi
4297; X86-X87-NEXT:    popl %ebx
4298; X86-X87-NEXT:    popl %ebp
4299; X86-X87-NEXT:    retl $4
4300;
4301; X86-SSE-LABEL: test_signed_i100_f80:
4302; X86-SSE:       # %bb.0:
4303; X86-SSE-NEXT:    pushl %ebp
4304; X86-SSE-NEXT:    pushl %ebx
4305; X86-SSE-NEXT:    pushl %edi
4306; X86-SSE-NEXT:    pushl %esi
4307; X86-SSE-NEXT:    subl $44, %esp
4308; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
4309; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
4310; X86-SSE-NEXT:    fld %st(0)
4311; X86-SSE-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
4312; X86-SSE-NEXT:    fstpt {{[0-9]+}}(%esp)
4313; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
4314; X86-SSE-NEXT:    movl %eax, (%esp)
4315; X86-SSE-NEXT:    calll __fixxfti
4316; X86-SSE-NEXT:    subl $4, %esp
4317; X86-SSE-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
4318; X86-SSE-NEXT:    xorl %ebp, %ebp
4319; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
4320; X86-SSE-NEXT:    fxch %st(1)
4321; X86-SSE-NEXT:    fucomi %st(1), %st
4322; X86-SSE-NEXT:    fstp %st(1)
4323; X86-SSE-NEXT:    movl $-8, %ebx
4324; X86-SSE-NEXT:    movl $0, %ecx
4325; X86-SSE-NEXT:    movl $0, %edx
4326; X86-SSE-NEXT:    movl $0, %edi
4327; X86-SSE-NEXT:    jb .LBB38_2
4328; X86-SSE-NEXT:  # %bb.1:
4329; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ebx
4330; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %ecx
4331; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
4332; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
4333; X86-SSE-NEXT:  .LBB38_2:
4334; X86-SSE-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}
4335; X86-SSE-NEXT:    fxch %st(1)
4336; X86-SSE-NEXT:    fucomi %st(1), %st
4337; X86-SSE-NEXT:    fstp %st(1)
4338; X86-SSE-NEXT:    movl $-1, %eax
4339; X86-SSE-NEXT:    cmoval %eax, %edi
4340; X86-SSE-NEXT:    cmoval %eax, %edx
4341; X86-SSE-NEXT:    cmoval %eax, %ecx
4342; X86-SSE-NEXT:    movl $7, %eax
4343; X86-SSE-NEXT:    cmovbel %ebx, %eax
4344; X86-SSE-NEXT:    fucompi %st(0), %st
4345; X86-SSE-NEXT:    cmovpl %ebp, %eax
4346; X86-SSE-NEXT:    cmovpl %ebp, %ecx
4347; X86-SSE-NEXT:    cmovpl %ebp, %edx
4348; X86-SSE-NEXT:    cmovpl %ebp, %edi
4349; X86-SSE-NEXT:    movl %edi, 8(%esi)
4350; X86-SSE-NEXT:    movl %edx, 4(%esi)
4351; X86-SSE-NEXT:    movl %ecx, (%esi)
4352; X86-SSE-NEXT:    andl $15, %eax
4353; X86-SSE-NEXT:    movb %al, 12(%esi)
4354; X86-SSE-NEXT:    movl %esi, %eax
4355; X86-SSE-NEXT:    addl $44, %esp
4356; X86-SSE-NEXT:    popl %esi
4357; X86-SSE-NEXT:    popl %edi
4358; X86-SSE-NEXT:    popl %ebx
4359; X86-SSE-NEXT:    popl %ebp
4360; X86-SSE-NEXT:    retl $4
4361;
4362; X64-LABEL: test_signed_i100_f80:
4363; X64:       # %bb.0:
4364; X64-NEXT:    subq $40, %rsp
4365; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
4366; X64-NEXT:    fld %st(0)
4367; X64-NEXT:    fstpt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Spill
4368; X64-NEXT:    fstpt (%rsp)
4369; X64-NEXT:    callq __fixxfti@PLT
4370; X64-NEXT:    xorl %ecx, %ecx
4371; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4372; X64-NEXT:    fldt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Reload
4373; X64-NEXT:    fucomi %st(1), %st
4374; X64-NEXT:    fstp %st(1)
4375; X64-NEXT:    cmovbq %rcx, %rax
4376; X64-NEXT:    movabsq $-34359738368, %rsi # imm = 0xFFFFFFF800000000
4377; X64-NEXT:    cmovbq %rsi, %rdx
4378; X64-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4379; X64-NEXT:    fxch %st(1)
4380; X64-NEXT:    fucomi %st(1), %st
4381; X64-NEXT:    fstp %st(1)
4382; X64-NEXT:    movabsq $34359738367, %rsi # imm = 0x7FFFFFFFF
4383; X64-NEXT:    cmovaq %rsi, %rdx
4384; X64-NEXT:    movq $-1, %rsi
4385; X64-NEXT:    cmovaq %rsi, %rax
4386; X64-NEXT:    fucompi %st(0), %st
4387; X64-NEXT:    cmovpq %rcx, %rax
4388; X64-NEXT:    cmovpq %rcx, %rdx
4389; X64-NEXT:    addq $40, %rsp
4390; X64-NEXT:    retq
4391    %x = call i100 @llvm.fptosi.sat.i100.f80(x86_fp80 %f)
4392    ret i100 %x
4393}
4394
4395define i128 @test_signed_i128_f80(x86_fp80 %f) nounwind {
4396; X86-X87-LABEL: test_signed_i128_f80:
4397; X86-X87:       # %bb.0:
4398; X86-X87-NEXT:    pushl %ebp
4399; X86-X87-NEXT:    pushl %ebx
4400; X86-X87-NEXT:    pushl %edi
4401; X86-X87-NEXT:    pushl %esi
4402; X86-X87-NEXT:    subl $60, %esp
4403; X86-X87-NEXT:    fldt {{[0-9]+}}(%esp)
4404; X86-X87-NEXT:    fld %st(0)
4405; X86-X87-NEXT:    fstpt {{[0-9]+}}(%esp)
4406; X86-X87-NEXT:    leal {{[0-9]+}}(%esp), %eax
4407; X86-X87-NEXT:    movl %eax, (%esp)
4408; X86-X87-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
4409; X86-X87-NEXT:    fld %st(1)
4410; X86-X87-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
4411; X86-X87-NEXT:    fxch %st(1)
4412; X86-X87-NEXT:    fucompp
4413; X86-X87-NEXT:    fnstsw %ax
4414; X86-X87-NEXT:    movl %eax, %ebx
4415; X86-X87-NEXT:    calll __fixxfti
4416; X86-X87-NEXT:    subl $4, %esp
4417; X86-X87-NEXT:    movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
4418; X86-X87-NEXT:    movb %bh, %ah
4419; X86-X87-NEXT:    sahf
4420; X86-X87-NEXT:    movl $0, %eax
4421; X86-X87-NEXT:    movl $0, %ebx
4422; X86-X87-NEXT:    jae .LBB39_1
4423; X86-X87-NEXT:  # %bb.2:
4424; X86-X87-NEXT:    movl $0, %edx
4425; X86-X87-NEXT:    jae .LBB39_3
4426; X86-X87-NEXT:  .LBB39_4:
4427; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
4428; X86-X87-NEXT:    jb .LBB39_6
4429; X86-X87-NEXT:  .LBB39_5:
4430; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
4431; X86-X87-NEXT:  .LBB39_6:
4432; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
4433; X86-X87-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}
4434; X86-X87-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
4435; X86-X87-NEXT:    fucom %st(1)
4436; X86-X87-NEXT:    fstp %st(1)
4437; X86-X87-NEXT:    fnstsw %ax
4438; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
4439; X86-X87-NEXT:    sahf
4440; X86-X87-NEXT:    movl $2147483647, %eax # imm = 0x7FFFFFFF
4441; X86-X87-NEXT:    ja .LBB39_8
4442; X86-X87-NEXT:  # %bb.7:
4443; X86-X87-NEXT:    movl %ecx, %eax
4444; X86-X87-NEXT:  .LBB39_8:
4445; X86-X87-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
4446; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ecx
4447; X86-X87-NEXT:    movl $-1, %ebp
4448; X86-X87-NEXT:    movl $-1, %edi
4449; X86-X87-NEXT:    movl $-1, %esi
4450; X86-X87-NEXT:    ja .LBB39_10
4451; X86-X87-NEXT:  # %bb.9:
4452; X86-X87-NEXT:    movl %edx, %ebp
4453; X86-X87-NEXT:    movl %ebx, %edi
4454; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
4455; X86-X87-NEXT:  .LBB39_10:
4456; X86-X87-NEXT:    fucomp %st(0)
4457; X86-X87-NEXT:    fnstsw %ax
4458; X86-X87-NEXT:    # kill: def $ah killed $ah killed $ax
4459; X86-X87-NEXT:    sahf
4460; X86-X87-NEXT:    movl $0, %eax
4461; X86-X87-NEXT:    movl $0, %edx
4462; X86-X87-NEXT:    movl $0, %ebx
4463; X86-X87-NEXT:    jp .LBB39_12
4464; X86-X87-NEXT:  # %bb.11:
4465; X86-X87-NEXT:    movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
4466; X86-X87-NEXT:    movl %edi, %eax
4467; X86-X87-NEXT:    movl %ebp, %edx
4468; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
4469; X86-X87-NEXT:  .LBB39_12:
4470; X86-X87-NEXT:    movl %ebx, 12(%ecx)
4471; X86-X87-NEXT:    movl %edx, 8(%ecx)
4472; X86-X87-NEXT:    movl %eax, 4(%ecx)
4473; X86-X87-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
4474; X86-X87-NEXT:    movl %eax, (%ecx)
4475; X86-X87-NEXT:    movl %ecx, %eax
4476; X86-X87-NEXT:    addl $60, %esp
4477; X86-X87-NEXT:    popl %esi
4478; X86-X87-NEXT:    popl %edi
4479; X86-X87-NEXT:    popl %ebx
4480; X86-X87-NEXT:    popl %ebp
4481; X86-X87-NEXT:    retl $4
4482; X86-X87-NEXT:  .LBB39_1:
4483; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %eax
4484; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %ebx
4485; X86-X87-NEXT:    movl $0, %edx
4486; X86-X87-NEXT:    jb .LBB39_4
4487; X86-X87-NEXT:  .LBB39_3:
4488; X86-X87-NEXT:    movl {{[0-9]+}}(%esp), %edx
4489; X86-X87-NEXT:    movl $-2147483648, %ecx # imm = 0x80000000
4490; X86-X87-NEXT:    jae .LBB39_5
4491; X86-X87-NEXT:    jmp .LBB39_6
4492;
4493; X86-SSE-LABEL: test_signed_i128_f80:
4494; X86-SSE:       # %bb.0:
4495; X86-SSE-NEXT:    pushl %ebp
4496; X86-SSE-NEXT:    pushl %ebx
4497; X86-SSE-NEXT:    pushl %edi
4498; X86-SSE-NEXT:    pushl %esi
4499; X86-SSE-NEXT:    subl $44, %esp
4500; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %esi
4501; X86-SSE-NEXT:    fldt {{[0-9]+}}(%esp)
4502; X86-SSE-NEXT:    fld %st(0)
4503; X86-SSE-NEXT:    fstpt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Spill
4504; X86-SSE-NEXT:    fstpt {{[0-9]+}}(%esp)
4505; X86-SSE-NEXT:    leal {{[0-9]+}}(%esp), %eax
4506; X86-SSE-NEXT:    movl %eax, (%esp)
4507; X86-SSE-NEXT:    calll __fixxfti
4508; X86-SSE-NEXT:    subl $4, %esp
4509; X86-SSE-NEXT:    xorl %ecx, %ecx
4510; X86-SSE-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}
4511; X86-SSE-NEXT:    fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload
4512; X86-SSE-NEXT:    fucomi %st(1), %st
4513; X86-SSE-NEXT:    fstp %st(1)
4514; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %eax
4515; X86-SSE-NEXT:    cmovbl %ecx, %eax
4516; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edx
4517; X86-SSE-NEXT:    cmovbl %ecx, %edx
4518; X86-SSE-NEXT:    movl {{[0-9]+}}(%esp), %edi
4519; X86-SSE-NEXT:    cmovbl %ecx, %edi
4520; X86-SSE-NEXT:    movl $-2147483648, %ebp # imm = 0x80000000
4521; X86-SSE-NEXT:    cmovael {{[0-9]+}}(%esp), %ebp
4522; X86-SSE-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}
4523; X86-SSE-NEXT:    fxch %st(1)
4524; X86-SSE-NEXT:    fucomi %st(1), %st
4525; X86-SSE-NEXT:    fstp %st(1)
4526; X86-SSE-NEXT:    movl $2147483647, %ebx # imm = 0x7FFFFFFF
4527; X86-SSE-NEXT:    cmovbel %ebp, %ebx
4528; X86-SSE-NEXT:    movl $-1, %ebp
4529; X86-SSE-NEXT:    cmoval %ebp, %edi
4530; X86-SSE-NEXT:    cmoval %ebp, %edx
4531; X86-SSE-NEXT:    cmoval %ebp, %eax
4532; X86-SSE-NEXT:    fucompi %st(0), %st
4533; X86-SSE-NEXT:    cmovpl %ecx, %eax
4534; X86-SSE-NEXT:    cmovpl %ecx, %edx
4535; X86-SSE-NEXT:    cmovpl %ecx, %edi
4536; X86-SSE-NEXT:    cmovpl %ecx, %ebx
4537; X86-SSE-NEXT:    movl %ebx, 12(%esi)
4538; X86-SSE-NEXT:    movl %edi, 8(%esi)
4539; X86-SSE-NEXT:    movl %edx, 4(%esi)
4540; X86-SSE-NEXT:    movl %eax, (%esi)
4541; X86-SSE-NEXT:    movl %esi, %eax
4542; X86-SSE-NEXT:    addl $44, %esp
4543; X86-SSE-NEXT:    popl %esi
4544; X86-SSE-NEXT:    popl %edi
4545; X86-SSE-NEXT:    popl %ebx
4546; X86-SSE-NEXT:    popl %ebp
4547; X86-SSE-NEXT:    retl $4
4548;
4549; X64-LABEL: test_signed_i128_f80:
4550; X64:       # %bb.0:
4551; X64-NEXT:    subq $40, %rsp
4552; X64-NEXT:    fldt {{[0-9]+}}(%rsp)
4553; X64-NEXT:    fld %st(0)
4554; X64-NEXT:    fstpt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Spill
4555; X64-NEXT:    fstpt (%rsp)
4556; X64-NEXT:    callq __fixxfti@PLT
4557; X64-NEXT:    xorl %ecx, %ecx
4558; X64-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4559; X64-NEXT:    fldt {{[-0-9]+}}(%r{{[sb]}}p) # 10-byte Folded Reload
4560; X64-NEXT:    fucomi %st(1), %st
4561; X64-NEXT:    fstp %st(1)
4562; X64-NEXT:    cmovbq %rcx, %rax
4563; X64-NEXT:    movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000
4564; X64-NEXT:    cmovbq %rsi, %rdx
4565; X64-NEXT:    fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip)
4566; X64-NEXT:    fxch %st(1)
4567; X64-NEXT:    fucomi %st(1), %st
4568; X64-NEXT:    fstp %st(1)
4569; X64-NEXT:    movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF
4570; X64-NEXT:    cmovaq %rsi, %rdx
4571; X64-NEXT:    movq $-1, %rsi
4572; X64-NEXT:    cmovaq %rsi, %rax
4573; X64-NEXT:    fucompi %st(0), %st
4574; X64-NEXT:    cmovpq %rcx, %rax
4575; X64-NEXT:    cmovpq %rcx, %rdx
4576; X64-NEXT:    addq $40, %rsp
4577; X64-NEXT:    retq
4578    %x = call i128 @llvm.fptosi.sat.i128.f80(x86_fp80 %f)
4579    ret i128 %x
4580}
4581