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