xref: /llvm-project/llvm/test/CodeGen/ARM/fptoui-sat-scalar.ll (revision e0ed0333f0fed2e73f805afd58b61176a87aa3ad)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=thumbv6-none-eabi -float-abi=soft %s -o - | FileCheck %s --check-prefixes=SOFT
3; RUN: llc -mtriple=thumbv7-none-eabi -mattr=+vfp2 %s -o - | FileCheck %s --check-prefixes=VFP,VFP2
4; RUN: llc -mtriple=thumbv8.1m.main-eabi -mattr=+fullfp16,+fp64 %s -o - | FileCheck %s --check-prefixes=VFP,FP16
5
6;
7; 32-bit float to signed 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_signed_i1_f32(float %f) nounwind {
22; SOFT-LABEL: test_signed_i1_f32:
23; SOFT:       @ %bb.0:
24; SOFT-NEXT:    .save {r4, r5, r6, lr}
25; SOFT-NEXT:    push {r4, r5, r6, lr}
26; SOFT-NEXT:    mov r5, r0
27; SOFT-NEXT:    movs r1, #0
28; SOFT-NEXT:    bl __aeabi_fcmpge
29; SOFT-NEXT:    mov r6, r0
30; SOFT-NEXT:    mov r0, r5
31; SOFT-NEXT:    bl __aeabi_f2uiz
32; SOFT-NEXT:    mov r4, r0
33; SOFT-NEXT:    cmp r6, #0
34; SOFT-NEXT:    bne .LBB0_2
35; SOFT-NEXT:  @ %bb.1:
36; SOFT-NEXT:    mov r4, r6
37; SOFT-NEXT:  .LBB0_2:
38; SOFT-NEXT:    movs r0, #127
39; SOFT-NEXT:    lsls r1, r0, #23
40; SOFT-NEXT:    mov r0, r5
41; SOFT-NEXT:    bl __aeabi_fcmpgt
42; SOFT-NEXT:    cmp r0, #0
43; SOFT-NEXT:    beq .LBB0_4
44; SOFT-NEXT:  @ %bb.3:
45; SOFT-NEXT:    movs r4, #1
46; SOFT-NEXT:  .LBB0_4:
47; SOFT-NEXT:    mov r0, r4
48; SOFT-NEXT:    pop {r4, r5, r6, pc}
49;
50; VFP2-LABEL: test_signed_i1_f32:
51; VFP2:       @ %bb.0:
52; VFP2-NEXT:    vmov s0, r0
53; VFP2-NEXT:    vmov.f32 s4, #1.000000e+00
54; VFP2-NEXT:    vcvt.u32.f32 s2, s0
55; VFP2-NEXT:    vcmp.f32 s0, #0
56; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
57; VFP2-NEXT:    vcmp.f32 s0, s4
58; VFP2-NEXT:    vmov r0, s2
59; VFP2-NEXT:    it lt
60; VFP2-NEXT:    movlt r0, #0
61; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
62; VFP2-NEXT:    it gt
63; VFP2-NEXT:    movgt r0, #1
64; VFP2-NEXT:    bx lr
65;
66; FP16-LABEL: test_signed_i1_f32:
67; FP16:       @ %bb.0:
68; FP16-NEXT:    vldr s0, .LCPI0_0
69; FP16-NEXT:    vmov s2, r0
70; FP16-NEXT:    vmov.f32 s4, #1.000000e+00
71; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
72; FP16-NEXT:    vminnm.f32 s0, s0, s4
73; FP16-NEXT:    vcvt.u32.f32 s0, s0
74; FP16-NEXT:    vmov r0, s0
75; FP16-NEXT:    bx lr
76; FP16-NEXT:    .p2align 2
77; FP16-NEXT:  @ %bb.1:
78; FP16-NEXT:  .LCPI0_0:
79; FP16-NEXT:    .long 0x00000000 @ float 0
80    %x = call i1 @llvm.fptoui.sat.i1.f32(float %f)
81    ret i1 %x
82}
83
84define i8 @test_signed_i8_f32(float %f) nounwind {
85; SOFT-LABEL: test_signed_i8_f32:
86; SOFT:       @ %bb.0:
87; SOFT-NEXT:    .save {r4, r5, r6, lr}
88; SOFT-NEXT:    push {r4, r5, r6, lr}
89; SOFT-NEXT:    mov r5, r0
90; SOFT-NEXT:    movs r1, #0
91; SOFT-NEXT:    bl __aeabi_fcmpge
92; SOFT-NEXT:    mov r6, r0
93; SOFT-NEXT:    mov r0, r5
94; SOFT-NEXT:    bl __aeabi_f2uiz
95; SOFT-NEXT:    mov r4, r0
96; SOFT-NEXT:    cmp r6, #0
97; SOFT-NEXT:    bne .LBB1_2
98; SOFT-NEXT:  @ %bb.1:
99; SOFT-NEXT:    mov r4, r6
100; SOFT-NEXT:  .LBB1_2:
101; SOFT-NEXT:    ldr r1, .LCPI1_0
102; SOFT-NEXT:    mov r0, r5
103; SOFT-NEXT:    bl __aeabi_fcmpgt
104; SOFT-NEXT:    cmp r0, #0
105; SOFT-NEXT:    beq .LBB1_4
106; SOFT-NEXT:  @ %bb.3:
107; SOFT-NEXT:    movs r4, #255
108; SOFT-NEXT:  .LBB1_4:
109; SOFT-NEXT:    mov r0, r4
110; SOFT-NEXT:    pop {r4, r5, r6, pc}
111; SOFT-NEXT:    .p2align 2
112; SOFT-NEXT:  @ %bb.5:
113; SOFT-NEXT:  .LCPI1_0:
114; SOFT-NEXT:    .long 1132396544 @ 0x437f0000
115;
116; VFP2-LABEL: test_signed_i8_f32:
117; VFP2:       @ %bb.0:
118; VFP2-NEXT:    vmov s0, r0
119; VFP2-NEXT:    vldr s4, .LCPI1_0
120; VFP2-NEXT:    vcvt.u32.f32 s2, s0
121; VFP2-NEXT:    vcmp.f32 s0, #0
122; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
123; VFP2-NEXT:    vcmp.f32 s0, s4
124; VFP2-NEXT:    vmov r0, s2
125; VFP2-NEXT:    it lt
126; VFP2-NEXT:    movlt r0, #0
127; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
128; VFP2-NEXT:    it gt
129; VFP2-NEXT:    movgt r0, #255
130; VFP2-NEXT:    bx lr
131; VFP2-NEXT:    .p2align 2
132; VFP2-NEXT:  @ %bb.1:
133; VFP2-NEXT:  .LCPI1_0:
134; VFP2-NEXT:    .long 0x437f0000 @ float 255
135;
136; FP16-LABEL: test_signed_i8_f32:
137; FP16:       @ %bb.0:
138; FP16-NEXT:    vldr s0, .LCPI1_0
139; FP16-NEXT:    vmov s2, r0
140; FP16-NEXT:    vldr s4, .LCPI1_1
141; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
142; FP16-NEXT:    vminnm.f32 s0, s0, s4
143; FP16-NEXT:    vcvt.u32.f32 s0, s0
144; FP16-NEXT:    vmov r0, s0
145; FP16-NEXT:    bx lr
146; FP16-NEXT:    .p2align 2
147; FP16-NEXT:  @ %bb.1:
148; FP16-NEXT:  .LCPI1_0:
149; FP16-NEXT:    .long 0x00000000 @ float 0
150; FP16-NEXT:  .LCPI1_1:
151; FP16-NEXT:    .long 0x437f0000 @ float 255
152    %x = call i8 @llvm.fptoui.sat.i8.f32(float %f)
153    ret i8 %x
154}
155
156define i13 @test_signed_i13_f32(float %f) nounwind {
157; SOFT-LABEL: test_signed_i13_f32:
158; SOFT:       @ %bb.0:
159; SOFT-NEXT:    .save {r4, r5, r6, lr}
160; SOFT-NEXT:    push {r4, r5, r6, lr}
161; SOFT-NEXT:    mov r5, r0
162; SOFT-NEXT:    movs r1, #0
163; SOFT-NEXT:    bl __aeabi_fcmpge
164; SOFT-NEXT:    mov r6, r0
165; SOFT-NEXT:    mov r0, r5
166; SOFT-NEXT:    bl __aeabi_f2uiz
167; SOFT-NEXT:    mov r4, r0
168; SOFT-NEXT:    cmp r6, #0
169; SOFT-NEXT:    bne .LBB2_2
170; SOFT-NEXT:  @ %bb.1:
171; SOFT-NEXT:    mov r4, r6
172; SOFT-NEXT:  .LBB2_2:
173; SOFT-NEXT:    ldr r1, .LCPI2_0
174; SOFT-NEXT:    mov r0, r5
175; SOFT-NEXT:    bl __aeabi_fcmpgt
176; SOFT-NEXT:    cmp r0, #0
177; SOFT-NEXT:    beq .LBB2_4
178; SOFT-NEXT:  @ %bb.3:
179; SOFT-NEXT:    ldr r4, .LCPI2_1
180; SOFT-NEXT:  .LBB2_4:
181; SOFT-NEXT:    mov r0, r4
182; SOFT-NEXT:    pop {r4, r5, r6, pc}
183; SOFT-NEXT:    .p2align 2
184; SOFT-NEXT:  @ %bb.5:
185; SOFT-NEXT:  .LCPI2_0:
186; SOFT-NEXT:    .long 1174403072 @ 0x45fff800
187; SOFT-NEXT:  .LCPI2_1:
188; SOFT-NEXT:    .long 8191 @ 0x1fff
189;
190; VFP2-LABEL: test_signed_i13_f32:
191; VFP2:       @ %bb.0:
192; VFP2-NEXT:    vmov s0, r0
193; VFP2-NEXT:    vldr s4, .LCPI2_0
194; VFP2-NEXT:    vcvt.u32.f32 s2, s0
195; VFP2-NEXT:    vcmp.f32 s0, #0
196; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
197; VFP2-NEXT:    vcmp.f32 s0, s4
198; VFP2-NEXT:    vmov r0, s2
199; VFP2-NEXT:    it lt
200; VFP2-NEXT:    movlt r0, #0
201; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
202; VFP2-NEXT:    it gt
203; VFP2-NEXT:    movwgt r0, #8191
204; VFP2-NEXT:    bx lr
205; VFP2-NEXT:    .p2align 2
206; VFP2-NEXT:  @ %bb.1:
207; VFP2-NEXT:  .LCPI2_0:
208; VFP2-NEXT:    .long 0x45fff800 @ float 8191
209;
210; FP16-LABEL: test_signed_i13_f32:
211; FP16:       @ %bb.0:
212; FP16-NEXT:    vldr s0, .LCPI2_0
213; FP16-NEXT:    vmov s2, r0
214; FP16-NEXT:    vldr s4, .LCPI2_1
215; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
216; FP16-NEXT:    vminnm.f32 s0, s0, s4
217; FP16-NEXT:    vcvt.u32.f32 s0, s0
218; FP16-NEXT:    vmov r0, s0
219; FP16-NEXT:    bx lr
220; FP16-NEXT:    .p2align 2
221; FP16-NEXT:  @ %bb.1:
222; FP16-NEXT:  .LCPI2_0:
223; FP16-NEXT:    .long 0x00000000 @ float 0
224; FP16-NEXT:  .LCPI2_1:
225; FP16-NEXT:    .long 0x45fff800 @ float 8191
226    %x = call i13 @llvm.fptoui.sat.i13.f32(float %f)
227    ret i13 %x
228}
229
230define i16 @test_signed_i16_f32(float %f) nounwind {
231; SOFT-LABEL: test_signed_i16_f32:
232; SOFT:       @ %bb.0:
233; SOFT-NEXT:    .save {r4, r5, r6, lr}
234; SOFT-NEXT:    push {r4, r5, r6, lr}
235; SOFT-NEXT:    mov r5, r0
236; SOFT-NEXT:    movs r1, #0
237; SOFT-NEXT:    bl __aeabi_fcmpge
238; SOFT-NEXT:    mov r6, r0
239; SOFT-NEXT:    mov r0, r5
240; SOFT-NEXT:    bl __aeabi_f2uiz
241; SOFT-NEXT:    mov r4, r0
242; SOFT-NEXT:    cmp r6, #0
243; SOFT-NEXT:    bne .LBB3_2
244; SOFT-NEXT:  @ %bb.1:
245; SOFT-NEXT:    mov r4, r6
246; SOFT-NEXT:  .LBB3_2:
247; SOFT-NEXT:    ldr r1, .LCPI3_0
248; SOFT-NEXT:    mov r0, r5
249; SOFT-NEXT:    bl __aeabi_fcmpgt
250; SOFT-NEXT:    cmp r0, #0
251; SOFT-NEXT:    beq .LBB3_4
252; SOFT-NEXT:  @ %bb.3:
253; SOFT-NEXT:    ldr r4, .LCPI3_1
254; SOFT-NEXT:  .LBB3_4:
255; SOFT-NEXT:    mov r0, r4
256; SOFT-NEXT:    pop {r4, r5, r6, pc}
257; SOFT-NEXT:    .p2align 2
258; SOFT-NEXT:  @ %bb.5:
259; SOFT-NEXT:  .LCPI3_0:
260; SOFT-NEXT:    .long 1199570688 @ 0x477fff00
261; SOFT-NEXT:  .LCPI3_1:
262; SOFT-NEXT:    .long 65535 @ 0xffff
263;
264; VFP2-LABEL: test_signed_i16_f32:
265; VFP2:       @ %bb.0:
266; VFP2-NEXT:    vmov s0, r0
267; VFP2-NEXT:    vldr s4, .LCPI3_0
268; VFP2-NEXT:    vcvt.u32.f32 s2, s0
269; VFP2-NEXT:    vcmp.f32 s0, #0
270; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
271; VFP2-NEXT:    vcmp.f32 s0, s4
272; VFP2-NEXT:    vmov r0, s2
273; VFP2-NEXT:    it lt
274; VFP2-NEXT:    movlt r0, #0
275; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
276; VFP2-NEXT:    it gt
277; VFP2-NEXT:    movwgt r0, #65535
278; VFP2-NEXT:    bx lr
279; VFP2-NEXT:    .p2align 2
280; VFP2-NEXT:  @ %bb.1:
281; VFP2-NEXT:  .LCPI3_0:
282; VFP2-NEXT:    .long 0x477fff00 @ float 65535
283;
284; FP16-LABEL: test_signed_i16_f32:
285; FP16:       @ %bb.0:
286; FP16-NEXT:    vldr s0, .LCPI3_0
287; FP16-NEXT:    vmov s2, r0
288; FP16-NEXT:    vldr s4, .LCPI3_1
289; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
290; FP16-NEXT:    vminnm.f32 s0, s0, s4
291; FP16-NEXT:    vcvt.u32.f32 s0, s0
292; FP16-NEXT:    vmov r0, s0
293; FP16-NEXT:    bx lr
294; FP16-NEXT:    .p2align 2
295; FP16-NEXT:  @ %bb.1:
296; FP16-NEXT:  .LCPI3_0:
297; FP16-NEXT:    .long 0x00000000 @ float 0
298; FP16-NEXT:  .LCPI3_1:
299; FP16-NEXT:    .long 0x477fff00 @ float 65535
300    %x = call i16 @llvm.fptoui.sat.i16.f32(float %f)
301    ret i16 %x
302}
303
304define i19 @test_signed_i19_f32(float %f) nounwind {
305; SOFT-LABEL: test_signed_i19_f32:
306; SOFT:       @ %bb.0:
307; SOFT-NEXT:    .save {r4, r5, r6, lr}
308; SOFT-NEXT:    push {r4, r5, r6, lr}
309; SOFT-NEXT:    mov r5, r0
310; SOFT-NEXT:    movs r1, #0
311; SOFT-NEXT:    bl __aeabi_fcmpge
312; SOFT-NEXT:    mov r6, r0
313; SOFT-NEXT:    mov r0, r5
314; SOFT-NEXT:    bl __aeabi_f2uiz
315; SOFT-NEXT:    mov r4, r0
316; SOFT-NEXT:    cmp r6, #0
317; SOFT-NEXT:    bne .LBB4_2
318; SOFT-NEXT:  @ %bb.1:
319; SOFT-NEXT:    mov r4, r6
320; SOFT-NEXT:  .LBB4_2:
321; SOFT-NEXT:    ldr r1, .LCPI4_0
322; SOFT-NEXT:    mov r0, r5
323; SOFT-NEXT:    bl __aeabi_fcmpgt
324; SOFT-NEXT:    cmp r0, #0
325; SOFT-NEXT:    beq .LBB4_4
326; SOFT-NEXT:  @ %bb.3:
327; SOFT-NEXT:    ldr r4, .LCPI4_1
328; SOFT-NEXT:  .LBB4_4:
329; SOFT-NEXT:    mov r0, r4
330; SOFT-NEXT:    pop {r4, r5, r6, pc}
331; SOFT-NEXT:    .p2align 2
332; SOFT-NEXT:  @ %bb.5:
333; SOFT-NEXT:  .LCPI4_0:
334; SOFT-NEXT:    .long 1224736736 @ 0x48ffffe0
335; SOFT-NEXT:  .LCPI4_1:
336; SOFT-NEXT:    .long 524287 @ 0x7ffff
337;
338; VFP2-LABEL: test_signed_i19_f32:
339; VFP2:       @ %bb.0:
340; VFP2-NEXT:    vmov s0, r0
341; VFP2-NEXT:    vldr s4, .LCPI4_0
342; VFP2-NEXT:    vcvt.u32.f32 s2, s0
343; VFP2-NEXT:    vcmp.f32 s0, #0
344; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
345; VFP2-NEXT:    vcmp.f32 s0, s4
346; VFP2-NEXT:    vmov r0, s2
347; VFP2-NEXT:    it lt
348; VFP2-NEXT:    movlt r0, #0
349; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
350; VFP2-NEXT:    itt gt
351; VFP2-NEXT:    movwgt r0, #65535
352; VFP2-NEXT:    movtgt r0, #7
353; VFP2-NEXT:    bx lr
354; VFP2-NEXT:    .p2align 2
355; VFP2-NEXT:  @ %bb.1:
356; VFP2-NEXT:  .LCPI4_0:
357; VFP2-NEXT:    .long 0x48ffffe0 @ float 524287
358;
359; FP16-LABEL: test_signed_i19_f32:
360; FP16:       @ %bb.0:
361; FP16-NEXT:    vldr s0, .LCPI4_0
362; FP16-NEXT:    vmov s2, r0
363; FP16-NEXT:    vldr s4, .LCPI4_1
364; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
365; FP16-NEXT:    vminnm.f32 s0, s0, s4
366; FP16-NEXT:    vcvt.u32.f32 s0, s0
367; FP16-NEXT:    vmov r0, s0
368; FP16-NEXT:    bx lr
369; FP16-NEXT:    .p2align 2
370; FP16-NEXT:  @ %bb.1:
371; FP16-NEXT:  .LCPI4_0:
372; FP16-NEXT:    .long 0x00000000 @ float 0
373; FP16-NEXT:  .LCPI4_1:
374; FP16-NEXT:    .long 0x48ffffe0 @ float 524287
375    %x = call i19 @llvm.fptoui.sat.i19.f32(float %f)
376    ret i19 %x
377}
378
379define i32 @test_signed_i32_f32(float %f) nounwind {
380; SOFT-LABEL: test_signed_i32_f32:
381; SOFT:       @ %bb.0:
382; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
383; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
384; SOFT-NEXT:    .pad #4
385; SOFT-NEXT:    sub sp, #4
386; SOFT-NEXT:    mov r6, r0
387; SOFT-NEXT:    movs r4, #0
388; SOFT-NEXT:    mov r1, r4
389; SOFT-NEXT:    bl __aeabi_fcmpge
390; SOFT-NEXT:    mov r7, r0
391; SOFT-NEXT:    mov r0, r6
392; SOFT-NEXT:    bl __aeabi_f2uiz
393; SOFT-NEXT:    mov r5, r0
394; SOFT-NEXT:    cmp r7, #0
395; SOFT-NEXT:    bne .LBB5_2
396; SOFT-NEXT:  @ %bb.1:
397; SOFT-NEXT:    mov r5, r7
398; SOFT-NEXT:  .LBB5_2:
399; SOFT-NEXT:    ldr r1, .LCPI5_0
400; SOFT-NEXT:    mov r0, r6
401; SOFT-NEXT:    bl __aeabi_fcmpgt
402; SOFT-NEXT:    cmp r0, #0
403; SOFT-NEXT:    beq .LBB5_4
404; SOFT-NEXT:  @ %bb.3:
405; SOFT-NEXT:    mvns r5, r4
406; SOFT-NEXT:  .LBB5_4:
407; SOFT-NEXT:    mov r0, r5
408; SOFT-NEXT:    add sp, #4
409; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
410; SOFT-NEXT:    .p2align 2
411; SOFT-NEXT:  @ %bb.5:
412; SOFT-NEXT:  .LCPI5_0:
413; SOFT-NEXT:    .long 1333788671 @ 0x4f7fffff
414;
415; VFP-LABEL: test_signed_i32_f32:
416; VFP:       @ %bb.0:
417; VFP-NEXT:    vmov s0, r0
418; VFP-NEXT:    vcvt.u32.f32 s0, s0
419; VFP-NEXT:    vmov r0, s0
420; VFP-NEXT:    bx lr
421    %x = call i32 @llvm.fptoui.sat.i32.f32(float %f)
422    ret i32 %x
423}
424
425define i50 @test_signed_i50_f32(float %f) nounwind {
426; SOFT-LABEL: test_signed_i50_f32:
427; SOFT:       @ %bb.0:
428; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
429; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
430; SOFT-NEXT:    .pad #4
431; SOFT-NEXT:    sub sp, #4
432; SOFT-NEXT:    mov r6, r0
433; SOFT-NEXT:    movs r5, #0
434; SOFT-NEXT:    mov r1, r5
435; SOFT-NEXT:    bl __aeabi_fcmpge
436; SOFT-NEXT:    mov r4, r0
437; SOFT-NEXT:    mov r0, r6
438; SOFT-NEXT:    bl __aeabi_f2ulz
439; SOFT-NEXT:    mov r7, r1
440; SOFT-NEXT:    cmp r4, #0
441; SOFT-NEXT:    bne .LBB6_2
442; SOFT-NEXT:  @ %bb.1:
443; SOFT-NEXT:    mov r7, r4
444; SOFT-NEXT:  .LBB6_2:
445; SOFT-NEXT:    bne .LBB6_4
446; SOFT-NEXT:  @ %bb.3:
447; SOFT-NEXT:    mov r0, r4
448; SOFT-NEXT:  .LBB6_4:
449; SOFT-NEXT:    mov r4, r0
450; SOFT-NEXT:    ldr r1, .LCPI6_0
451; SOFT-NEXT:    mov r0, r6
452; SOFT-NEXT:    bl __aeabi_fcmpgt
453; SOFT-NEXT:    mov r1, r0
454; SOFT-NEXT:    mvns r0, r5
455; SOFT-NEXT:    cmp r1, #0
456; SOFT-NEXT:    bne .LBB6_6
457; SOFT-NEXT:  @ %bb.5:
458; SOFT-NEXT:    mov r0, r4
459; SOFT-NEXT:  .LBB6_6:
460; SOFT-NEXT:    beq .LBB6_8
461; SOFT-NEXT:  @ %bb.7:
462; SOFT-NEXT:    ldr r7, .LCPI6_1
463; SOFT-NEXT:  .LBB6_8:
464; SOFT-NEXT:    mov r1, r7
465; SOFT-NEXT:    add sp, #4
466; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
467; SOFT-NEXT:    .p2align 2
468; SOFT-NEXT:  @ %bb.9:
469; SOFT-NEXT:  .LCPI6_0:
470; SOFT-NEXT:    .long 1484783615 @ 0x587fffff
471; SOFT-NEXT:  .LCPI6_1:
472; SOFT-NEXT:    .long 262143 @ 0x3ffff
473;
474; VFP-LABEL: test_signed_i50_f32:
475; VFP:       @ %bb.0:
476; VFP-NEXT:    .save {r7, lr}
477; VFP-NEXT:    push {r7, lr}
478; VFP-NEXT:    .vsave {d8}
479; VFP-NEXT:    vpush {d8}
480; VFP-NEXT:    vmov s16, r0
481; VFP-NEXT:    bl __aeabi_f2ulz
482; VFP-NEXT:    vldr s0, .LCPI6_0
483; VFP-NEXT:    vcmp.f32 s16, #0
484; VFP-NEXT:    vmrs APSR_nzcv, fpscr
485; VFP-NEXT:    itt lt
486; VFP-NEXT:    movlt r1, #0
487; VFP-NEXT:    movlt r0, #0
488; VFP-NEXT:    vcmp.f32 s16, s0
489; VFP-NEXT:    vmrs APSR_nzcv, fpscr
490; VFP-NEXT:    ittt gt
491; VFP-NEXT:    movwgt r1, #65535
492; VFP-NEXT:    movtgt r1, #3
493; VFP-NEXT:    movgt.w r0, #-1
494; VFP-NEXT:    vpop {d8}
495; VFP-NEXT:    pop {r7, pc}
496; VFP-NEXT:    .p2align 2
497; VFP-NEXT:  @ %bb.1:
498; VFP-NEXT:  .LCPI6_0:
499; VFP-NEXT:    .long 0x587fffff @ float 1.12589984E+15
500    %x = call i50 @llvm.fptoui.sat.i50.f32(float %f)
501    ret i50 %x
502}
503
504define i64 @test_signed_i64_f32(float %f) nounwind {
505; SOFT-LABEL: test_signed_i64_f32:
506; SOFT:       @ %bb.0:
507; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
508; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
509; SOFT-NEXT:    .pad #4
510; SOFT-NEXT:    sub sp, #4
511; SOFT-NEXT:    mov r6, r0
512; SOFT-NEXT:    movs r4, #0
513; SOFT-NEXT:    mov r1, r4
514; SOFT-NEXT:    bl __aeabi_fcmpge
515; SOFT-NEXT:    mov r5, r0
516; SOFT-NEXT:    mov r0, r6
517; SOFT-NEXT:    bl __aeabi_f2ulz
518; SOFT-NEXT:    mov r7, r0
519; SOFT-NEXT:    cmp r5, #0
520; SOFT-NEXT:    bne .LBB7_2
521; SOFT-NEXT:  @ %bb.1:
522; SOFT-NEXT:    mov r1, r5
523; SOFT-NEXT:  .LBB7_2:
524; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
525; SOFT-NEXT:    bne .LBB7_4
526; SOFT-NEXT:  @ %bb.3:
527; SOFT-NEXT:    mov r7, r5
528; SOFT-NEXT:  .LBB7_4:
529; SOFT-NEXT:    ldr r1, .LCPI7_0
530; SOFT-NEXT:    mov r0, r6
531; SOFT-NEXT:    bl __aeabi_fcmpgt
532; SOFT-NEXT:    mvns r1, r4
533; SOFT-NEXT:    cmp r0, #0
534; SOFT-NEXT:    mov r0, r1
535; SOFT-NEXT:    beq .LBB7_7
536; SOFT-NEXT:  @ %bb.5:
537; SOFT-NEXT:    beq .LBB7_8
538; SOFT-NEXT:  .LBB7_6:
539; SOFT-NEXT:    add sp, #4
540; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
541; SOFT-NEXT:  .LBB7_7:
542; SOFT-NEXT:    mov r0, r7
543; SOFT-NEXT:    bne .LBB7_6
544; SOFT-NEXT:  .LBB7_8:
545; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
546; SOFT-NEXT:    add sp, #4
547; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
548; SOFT-NEXT:    .p2align 2
549; SOFT-NEXT:  @ %bb.9:
550; SOFT-NEXT:  .LCPI7_0:
551; SOFT-NEXT:    .long 1602224127 @ 0x5f7fffff
552;
553; VFP-LABEL: test_signed_i64_f32:
554; VFP:       @ %bb.0:
555; VFP-NEXT:    .save {r7, lr}
556; VFP-NEXT:    push {r7, lr}
557; VFP-NEXT:    .vsave {d8}
558; VFP-NEXT:    vpush {d8}
559; VFP-NEXT:    vmov s16, r0
560; VFP-NEXT:    bl __aeabi_f2ulz
561; VFP-NEXT:    vldr s0, .LCPI7_0
562; VFP-NEXT:    vcmp.f32 s16, #0
563; VFP-NEXT:    vmrs APSR_nzcv, fpscr
564; VFP-NEXT:    itt lt
565; VFP-NEXT:    movlt r1, #0
566; VFP-NEXT:    movlt r0, #0
567; VFP-NEXT:    vcmp.f32 s16, s0
568; VFP-NEXT:    vmrs APSR_nzcv, fpscr
569; VFP-NEXT:    itt gt
570; VFP-NEXT:    movgt.w r0, #-1
571; VFP-NEXT:    movgt.w r1, #-1
572; VFP-NEXT:    vpop {d8}
573; VFP-NEXT:    pop {r7, pc}
574; VFP-NEXT:    .p2align 2
575; VFP-NEXT:  @ %bb.1:
576; VFP-NEXT:  .LCPI7_0:
577; VFP-NEXT:    .long 0x5f7fffff @ float 1.8446743E+19
578    %x = call i64 @llvm.fptoui.sat.i64.f32(float %f)
579    ret i64 %x
580}
581
582define i100 @test_signed_i100_f32(float %f) nounwind {
583; SOFT-LABEL: test_signed_i100_f32:
584; SOFT:       @ %bb.0:
585; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
586; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
587; SOFT-NEXT:    .pad #12
588; SOFT-NEXT:    sub sp, #12
589; SOFT-NEXT:    mov r4, r0
590; SOFT-NEXT:    movs r6, #0
591; SOFT-NEXT:    mov r1, r6
592; SOFT-NEXT:    bl __aeabi_fcmpge
593; SOFT-NEXT:    mov r7, r0
594; SOFT-NEXT:    mov r0, r4
595; SOFT-NEXT:    bl __fixunssfti
596; SOFT-NEXT:    mov r5, r0
597; SOFT-NEXT:    cmp r7, #0
598; SOFT-NEXT:    beq .LBB8_11
599; SOFT-NEXT:  @ %bb.1:
600; SOFT-NEXT:    beq .LBB8_12
601; SOFT-NEXT:  .LBB8_2:
602; SOFT-NEXT:    bne .LBB8_4
603; SOFT-NEXT:  .LBB8_3:
604; SOFT-NEXT:    mov r1, r7
605; SOFT-NEXT:  .LBB8_4:
606; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
607; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
608; SOFT-NEXT:    str r3, [sp, #8] @ 4-byte Spill
609; SOFT-NEXT:    bne .LBB8_6
610; SOFT-NEXT:  @ %bb.5:
611; SOFT-NEXT:    mov r5, r7
612; SOFT-NEXT:  .LBB8_6:
613; SOFT-NEXT:    ldr r1, .LCPI8_0
614; SOFT-NEXT:    mov r0, r4
615; SOFT-NEXT:    bl __aeabi_fcmpgt
616; SOFT-NEXT:    mvns r2, r6
617; SOFT-NEXT:    movs r3, #15
618; SOFT-NEXT:    cmp r0, #0
619; SOFT-NEXT:    mov r0, r2
620; SOFT-NEXT:    beq .LBB8_13
621; SOFT-NEXT:  @ %bb.7:
622; SOFT-NEXT:    mov r1, r2
623; SOFT-NEXT:    beq .LBB8_14
624; SOFT-NEXT:  .LBB8_8:
625; SOFT-NEXT:    beq .LBB8_15
626; SOFT-NEXT:  .LBB8_9:
627; SOFT-NEXT:    beq .LBB8_16
628; SOFT-NEXT:  .LBB8_10:
629; SOFT-NEXT:    add sp, #12
630; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
631; SOFT-NEXT:  .LBB8_11:
632; SOFT-NEXT:    mov r3, r7
633; SOFT-NEXT:    bne .LBB8_2
634; SOFT-NEXT:  .LBB8_12:
635; SOFT-NEXT:    mov r2, r7
636; SOFT-NEXT:    beq .LBB8_3
637; SOFT-NEXT:    b .LBB8_4
638; SOFT-NEXT:  .LBB8_13:
639; SOFT-NEXT:    mov r0, r5
640; SOFT-NEXT:    mov r1, r2
641; SOFT-NEXT:    bne .LBB8_8
642; SOFT-NEXT:  .LBB8_14:
643; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
644; SOFT-NEXT:    bne .LBB8_9
645; SOFT-NEXT:  .LBB8_15:
646; SOFT-NEXT:    ldr r2, [sp, #4] @ 4-byte Reload
647; SOFT-NEXT:    bne .LBB8_10
648; SOFT-NEXT:  .LBB8_16:
649; SOFT-NEXT:    ldr r3, [sp, #8] @ 4-byte Reload
650; SOFT-NEXT:    add sp, #12
651; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
652; SOFT-NEXT:    .p2align 2
653; SOFT-NEXT:  @ %bb.17:
654; SOFT-NEXT:  .LCPI8_0:
655; SOFT-NEXT:    .long 1904214015 @ 0x717fffff
656;
657; VFP-LABEL: test_signed_i100_f32:
658; VFP:       @ %bb.0:
659; VFP-NEXT:    .save {r7, lr}
660; VFP-NEXT:    push {r7, lr}
661; VFP-NEXT:    .vsave {d8}
662; VFP-NEXT:    vpush {d8}
663; VFP-NEXT:    vmov s16, r0
664; VFP-NEXT:    bl __fixunssfti
665; VFP-NEXT:    vldr s0, .LCPI8_0
666; VFP-NEXT:    vcmp.f32 s16, #0
667; VFP-NEXT:    vmrs APSR_nzcv, fpscr
668; VFP-NEXT:    itttt lt
669; VFP-NEXT:    movlt r3, #0
670; VFP-NEXT:    movlt r2, #0
671; VFP-NEXT:    movlt r1, #0
672; VFP-NEXT:    movlt r0, #0
673; VFP-NEXT:    vcmp.f32 s16, s0
674; VFP-NEXT:    vmrs APSR_nzcv, fpscr
675; VFP-NEXT:    itttt gt
676; VFP-NEXT:    movgt.w r0, #-1
677; VFP-NEXT:    movgt.w r1, #-1
678; VFP-NEXT:    movgt.w r2, #-1
679; VFP-NEXT:    movgt r3, #15
680; VFP-NEXT:    vpop {d8}
681; VFP-NEXT:    pop {r7, pc}
682; VFP-NEXT:    .p2align 2
683; VFP-NEXT:  @ %bb.1:
684; VFP-NEXT:  .LCPI8_0:
685; VFP-NEXT:    .long 0x717fffff @ float 1.26765052E+30
686    %x = call i100 @llvm.fptoui.sat.i100.f32(float %f)
687    ret i100 %x
688}
689
690define i128 @test_signed_i128_f32(float %f) nounwind {
691; SOFT-LABEL: test_signed_i128_f32:
692; SOFT:       @ %bb.0:
693; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
694; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
695; SOFT-NEXT:    .pad #12
696; SOFT-NEXT:    sub sp, #12
697; SOFT-NEXT:    mov r4, r0
698; SOFT-NEXT:    movs r6, #0
699; SOFT-NEXT:    mov r1, r6
700; SOFT-NEXT:    bl __aeabi_fcmpge
701; SOFT-NEXT:    mov r7, r0
702; SOFT-NEXT:    mov r0, r4
703; SOFT-NEXT:    bl __fixunssfti
704; SOFT-NEXT:    mov r5, r0
705; SOFT-NEXT:    cmp r7, #0
706; SOFT-NEXT:    beq .LBB9_11
707; SOFT-NEXT:  @ %bb.1:
708; SOFT-NEXT:    beq .LBB9_12
709; SOFT-NEXT:  .LBB9_2:
710; SOFT-NEXT:    bne .LBB9_4
711; SOFT-NEXT:  .LBB9_3:
712; SOFT-NEXT:    mov r1, r7
713; SOFT-NEXT:  .LBB9_4:
714; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
715; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
716; SOFT-NEXT:    str r3, [sp, #8] @ 4-byte Spill
717; SOFT-NEXT:    bne .LBB9_6
718; SOFT-NEXT:  @ %bb.5:
719; SOFT-NEXT:    mov r5, r7
720; SOFT-NEXT:  .LBB9_6:
721; SOFT-NEXT:    ldr r1, .LCPI9_0
722; SOFT-NEXT:    mov r0, r4
723; SOFT-NEXT:    bl __aeabi_fcmpgt
724; SOFT-NEXT:    mvns r3, r6
725; SOFT-NEXT:    cmp r0, #0
726; SOFT-NEXT:    mov r0, r3
727; SOFT-NEXT:    beq .LBB9_13
728; SOFT-NEXT:  @ %bb.7:
729; SOFT-NEXT:    mov r1, r3
730; SOFT-NEXT:    beq .LBB9_14
731; SOFT-NEXT:  .LBB9_8:
732; SOFT-NEXT:    mov r2, r3
733; SOFT-NEXT:    beq .LBB9_15
734; SOFT-NEXT:  .LBB9_9:
735; SOFT-NEXT:    beq .LBB9_16
736; SOFT-NEXT:  .LBB9_10:
737; SOFT-NEXT:    add sp, #12
738; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
739; SOFT-NEXT:  .LBB9_11:
740; SOFT-NEXT:    mov r3, r7
741; SOFT-NEXT:    bne .LBB9_2
742; SOFT-NEXT:  .LBB9_12:
743; SOFT-NEXT:    mov r2, r7
744; SOFT-NEXT:    beq .LBB9_3
745; SOFT-NEXT:    b .LBB9_4
746; SOFT-NEXT:  .LBB9_13:
747; SOFT-NEXT:    mov r0, r5
748; SOFT-NEXT:    mov r1, r3
749; SOFT-NEXT:    bne .LBB9_8
750; SOFT-NEXT:  .LBB9_14:
751; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
752; SOFT-NEXT:    mov r2, r3
753; SOFT-NEXT:    bne .LBB9_9
754; SOFT-NEXT:  .LBB9_15:
755; SOFT-NEXT:    ldr r2, [sp, #4] @ 4-byte Reload
756; SOFT-NEXT:    bne .LBB9_10
757; SOFT-NEXT:  .LBB9_16:
758; SOFT-NEXT:    ldr r3, [sp, #8] @ 4-byte Reload
759; SOFT-NEXT:    add sp, #12
760; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
761; SOFT-NEXT:    .p2align 2
762; SOFT-NEXT:  @ %bb.17:
763; SOFT-NEXT:  .LCPI9_0:
764; SOFT-NEXT:    .long 2139095039 @ 0x7f7fffff
765;
766; VFP-LABEL: test_signed_i128_f32:
767; VFP:       @ %bb.0:
768; VFP-NEXT:    .save {r7, lr}
769; VFP-NEXT:    push {r7, lr}
770; VFP-NEXT:    .vsave {d8}
771; VFP-NEXT:    vpush {d8}
772; VFP-NEXT:    vmov s16, r0
773; VFP-NEXT:    bl __fixunssfti
774; VFP-NEXT:    vldr s0, .LCPI9_0
775; VFP-NEXT:    vcmp.f32 s16, #0
776; VFP-NEXT:    vmrs APSR_nzcv, fpscr
777; VFP-NEXT:    itttt lt
778; VFP-NEXT:    movlt r3, #0
779; VFP-NEXT:    movlt r2, #0
780; VFP-NEXT:    movlt r1, #0
781; VFP-NEXT:    movlt r0, #0
782; VFP-NEXT:    vcmp.f32 s16, s0
783; VFP-NEXT:    vmrs APSR_nzcv, fpscr
784; VFP-NEXT:    itttt gt
785; VFP-NEXT:    movgt.w r0, #-1
786; VFP-NEXT:    movgt.w r1, #-1
787; VFP-NEXT:    movgt.w r2, #-1
788; VFP-NEXT:    movgt.w r3, #-1
789; VFP-NEXT:    vpop {d8}
790; VFP-NEXT:    pop {r7, pc}
791; VFP-NEXT:    .p2align 2
792; VFP-NEXT:  @ %bb.1:
793; VFP-NEXT:  .LCPI9_0:
794; VFP-NEXT:    .long 0x7f7fffff @ float 3.40282347E+38
795    %x = call i128 @llvm.fptoui.sat.i128.f32(float %f)
796    ret i128 %x
797}
798
799;
800; 64-bit float to signed integer
801;
802
803declare   i1 @llvm.fptoui.sat.i1.f64  (double)
804declare   i8 @llvm.fptoui.sat.i8.f64  (double)
805declare  i13 @llvm.fptoui.sat.i13.f64 (double)
806declare  i16 @llvm.fptoui.sat.i16.f64 (double)
807declare  i19 @llvm.fptoui.sat.i19.f64 (double)
808declare  i32 @llvm.fptoui.sat.i32.f64 (double)
809declare  i50 @llvm.fptoui.sat.i50.f64 (double)
810declare  i64 @llvm.fptoui.sat.i64.f64 (double)
811declare i100 @llvm.fptoui.sat.i100.f64(double)
812declare i128 @llvm.fptoui.sat.i128.f64(double)
813
814define i1 @test_signed_i1_f64(double %f) nounwind {
815; SOFT-LABEL: test_signed_i1_f64:
816; SOFT:       @ %bb.0:
817; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
818; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
819; SOFT-NEXT:    .pad #4
820; SOFT-NEXT:    sub sp, #4
821; SOFT-NEXT:    mov r4, r1
822; SOFT-NEXT:    mov r5, r0
823; SOFT-NEXT:    movs r6, #0
824; SOFT-NEXT:    mov r2, r6
825; SOFT-NEXT:    mov r3, r6
826; SOFT-NEXT:    bl __aeabi_dcmpge
827; SOFT-NEXT:    mov r7, r0
828; SOFT-NEXT:    mov r0, r5
829; SOFT-NEXT:    mov r1, r4
830; SOFT-NEXT:    bl __aeabi_d2uiz
831; SOFT-NEXT:    cmp r7, #0
832; SOFT-NEXT:    bne .LBB10_2
833; SOFT-NEXT:  @ %bb.1:
834; SOFT-NEXT:    mov r0, r7
835; SOFT-NEXT:  .LBB10_2:
836; SOFT-NEXT:    mov r7, r0
837; SOFT-NEXT:    ldr r3, .LCPI10_0
838; SOFT-NEXT:    mov r0, r5
839; SOFT-NEXT:    mov r1, r4
840; SOFT-NEXT:    mov r2, r6
841; SOFT-NEXT:    bl __aeabi_dcmpgt
842; SOFT-NEXT:    cmp r0, #0
843; SOFT-NEXT:    bne .LBB10_4
844; SOFT-NEXT:  @ %bb.3:
845; SOFT-NEXT:    mov r0, r7
846; SOFT-NEXT:    add sp, #4
847; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
848; SOFT-NEXT:  .LBB10_4:
849; SOFT-NEXT:    movs r0, #1
850; SOFT-NEXT:    add sp, #4
851; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
852; SOFT-NEXT:    .p2align 2
853; SOFT-NEXT:  @ %bb.5:
854; SOFT-NEXT:  .LCPI10_0:
855; SOFT-NEXT:    .long 1072693248 @ 0x3ff00000
856;
857; VFP2-LABEL: test_signed_i1_f64:
858; VFP2:       @ %bb.0:
859; VFP2-NEXT:    vmov d16, r0, r1
860; VFP2-NEXT:    vcmp.f64 d16, #0
861; VFP2-NEXT:    vcvt.u32.f64 s0, d16
862; VFP2-NEXT:    vmov.f64 d17, #1.000000e+00
863; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
864; VFP2-NEXT:    vmov r0, s0
865; VFP2-NEXT:    vcmp.f64 d16, d17
866; VFP2-NEXT:    it lt
867; VFP2-NEXT:    movlt r0, #0
868; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
869; VFP2-NEXT:    it gt
870; VFP2-NEXT:    movgt r0, #1
871; VFP2-NEXT:    bx lr
872;
873; FP16-LABEL: test_signed_i1_f64:
874; FP16:       @ %bb.0:
875; FP16-NEXT:    vmov.f64 d0, #1.000000e+00
876; FP16-NEXT:    vldr d1, .LCPI10_0
877; FP16-NEXT:    vmov d2, r0, r1
878; FP16-NEXT:    vmaxnm.f64 d1, d2, d1
879; FP16-NEXT:    vminnm.f64 d0, d1, d0
880; FP16-NEXT:    vcvt.u32.f64 s0, d0
881; FP16-NEXT:    vmov r0, s0
882; FP16-NEXT:    bx lr
883; FP16-NEXT:    .p2align 3
884; FP16-NEXT:  @ %bb.1:
885; FP16-NEXT:  .LCPI10_0:
886; FP16-NEXT:    .long 0 @ double 0
887; FP16-NEXT:    .long 0
888    %x = call i1 @llvm.fptoui.sat.i1.f64(double %f)
889    ret i1 %x
890}
891
892define i8 @test_signed_i8_f64(double %f) nounwind {
893; SOFT-LABEL: test_signed_i8_f64:
894; SOFT:       @ %bb.0:
895; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
896; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
897; SOFT-NEXT:    .pad #4
898; SOFT-NEXT:    sub sp, #4
899; SOFT-NEXT:    mov r4, r1
900; SOFT-NEXT:    mov r5, r0
901; SOFT-NEXT:    movs r6, #0
902; SOFT-NEXT:    mov r2, r6
903; SOFT-NEXT:    mov r3, r6
904; SOFT-NEXT:    bl __aeabi_dcmpge
905; SOFT-NEXT:    mov r7, r0
906; SOFT-NEXT:    mov r0, r5
907; SOFT-NEXT:    mov r1, r4
908; SOFT-NEXT:    bl __aeabi_d2uiz
909; SOFT-NEXT:    cmp r7, #0
910; SOFT-NEXT:    bne .LBB11_2
911; SOFT-NEXT:  @ %bb.1:
912; SOFT-NEXT:    mov r0, r7
913; SOFT-NEXT:  .LBB11_2:
914; SOFT-NEXT:    mov r7, r0
915; SOFT-NEXT:    ldr r3, .LCPI11_0
916; SOFT-NEXT:    mov r0, r5
917; SOFT-NEXT:    mov r1, r4
918; SOFT-NEXT:    mov r2, r6
919; SOFT-NEXT:    bl __aeabi_dcmpgt
920; SOFT-NEXT:    cmp r0, #0
921; SOFT-NEXT:    bne .LBB11_4
922; SOFT-NEXT:  @ %bb.3:
923; SOFT-NEXT:    mov r0, r7
924; SOFT-NEXT:    add sp, #4
925; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
926; SOFT-NEXT:  .LBB11_4:
927; SOFT-NEXT:    movs r0, #255
928; SOFT-NEXT:    add sp, #4
929; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
930; SOFT-NEXT:    .p2align 2
931; SOFT-NEXT:  @ %bb.5:
932; SOFT-NEXT:  .LCPI11_0:
933; SOFT-NEXT:    .long 1081073664 @ 0x406fe000
934;
935; VFP2-LABEL: test_signed_i8_f64:
936; VFP2:       @ %bb.0:
937; VFP2-NEXT:    vmov d16, r0, r1
938; VFP2-NEXT:    vldr d17, .LCPI11_0
939; VFP2-NEXT:    vcmp.f64 d16, #0
940; VFP2-NEXT:    vcvt.u32.f64 s0, d16
941; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
942; VFP2-NEXT:    vmov r0, s0
943; VFP2-NEXT:    vcmp.f64 d16, d17
944; VFP2-NEXT:    it lt
945; VFP2-NEXT:    movlt r0, #0
946; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
947; VFP2-NEXT:    it gt
948; VFP2-NEXT:    movgt r0, #255
949; VFP2-NEXT:    bx lr
950; VFP2-NEXT:    .p2align 3
951; VFP2-NEXT:  @ %bb.1:
952; VFP2-NEXT:  .LCPI11_0:
953; VFP2-NEXT:    .long 0 @ double 255
954; VFP2-NEXT:    .long 1081073664
955;
956; FP16-LABEL: test_signed_i8_f64:
957; FP16:       @ %bb.0:
958; FP16-NEXT:    vldr d0, .LCPI11_0
959; FP16-NEXT:    vmov d1, r0, r1
960; FP16-NEXT:    vldr d2, .LCPI11_1
961; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
962; FP16-NEXT:    vminnm.f64 d0, d0, d2
963; FP16-NEXT:    vcvt.u32.f64 s0, d0
964; FP16-NEXT:    vmov r0, s0
965; FP16-NEXT:    bx lr
966; FP16-NEXT:    .p2align 3
967; FP16-NEXT:  @ %bb.1:
968; FP16-NEXT:  .LCPI11_0:
969; FP16-NEXT:    .long 0 @ double 0
970; FP16-NEXT:    .long 0
971; FP16-NEXT:  .LCPI11_1:
972; FP16-NEXT:    .long 0 @ double 255
973; FP16-NEXT:    .long 1081073664
974    %x = call i8 @llvm.fptoui.sat.i8.f64(double %f)
975    ret i8 %x
976}
977
978define i13 @test_signed_i13_f64(double %f) nounwind {
979; SOFT-LABEL: test_signed_i13_f64:
980; SOFT:       @ %bb.0:
981; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
982; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
983; SOFT-NEXT:    .pad #4
984; SOFT-NEXT:    sub sp, #4
985; SOFT-NEXT:    mov r4, r1
986; SOFT-NEXT:    mov r5, r0
987; SOFT-NEXT:    movs r6, #0
988; SOFT-NEXT:    mov r2, r6
989; SOFT-NEXT:    mov r3, r6
990; SOFT-NEXT:    bl __aeabi_dcmpge
991; SOFT-NEXT:    mov r7, r0
992; SOFT-NEXT:    mov r0, r5
993; SOFT-NEXT:    mov r1, r4
994; SOFT-NEXT:    bl __aeabi_d2uiz
995; SOFT-NEXT:    cmp r7, #0
996; SOFT-NEXT:    bne .LBB12_2
997; SOFT-NEXT:  @ %bb.1:
998; SOFT-NEXT:    mov r0, r7
999; SOFT-NEXT:  .LBB12_2:
1000; SOFT-NEXT:    mov r7, r0
1001; SOFT-NEXT:    ldr r3, .LCPI12_0
1002; SOFT-NEXT:    mov r0, r5
1003; SOFT-NEXT:    mov r1, r4
1004; SOFT-NEXT:    mov r2, r6
1005; SOFT-NEXT:    bl __aeabi_dcmpgt
1006; SOFT-NEXT:    cmp r0, #0
1007; SOFT-NEXT:    bne .LBB12_4
1008; SOFT-NEXT:  @ %bb.3:
1009; SOFT-NEXT:    mov r0, r7
1010; SOFT-NEXT:    add sp, #4
1011; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1012; SOFT-NEXT:  .LBB12_4:
1013; SOFT-NEXT:    ldr r0, .LCPI12_1
1014; SOFT-NEXT:    add sp, #4
1015; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1016; SOFT-NEXT:    .p2align 2
1017; SOFT-NEXT:  @ %bb.5:
1018; SOFT-NEXT:  .LCPI12_0:
1019; SOFT-NEXT:    .long 1086324480 @ 0x40bfff00
1020; SOFT-NEXT:  .LCPI12_1:
1021; SOFT-NEXT:    .long 8191 @ 0x1fff
1022;
1023; VFP2-LABEL: test_signed_i13_f64:
1024; VFP2:       @ %bb.0:
1025; VFP2-NEXT:    vmov d16, r0, r1
1026; VFP2-NEXT:    vldr d17, .LCPI12_0
1027; VFP2-NEXT:    vcmp.f64 d16, #0
1028; VFP2-NEXT:    vcvt.u32.f64 s0, d16
1029; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1030; VFP2-NEXT:    vmov r0, s0
1031; VFP2-NEXT:    vcmp.f64 d16, d17
1032; VFP2-NEXT:    it lt
1033; VFP2-NEXT:    movlt r0, #0
1034; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1035; VFP2-NEXT:    it gt
1036; VFP2-NEXT:    movwgt r0, #8191
1037; VFP2-NEXT:    bx lr
1038; VFP2-NEXT:    .p2align 3
1039; VFP2-NEXT:  @ %bb.1:
1040; VFP2-NEXT:  .LCPI12_0:
1041; VFP2-NEXT:    .long 0 @ double 8191
1042; VFP2-NEXT:    .long 1086324480
1043;
1044; FP16-LABEL: test_signed_i13_f64:
1045; FP16:       @ %bb.0:
1046; FP16-NEXT:    vldr d0, .LCPI12_0
1047; FP16-NEXT:    vmov d1, r0, r1
1048; FP16-NEXT:    vldr d2, .LCPI12_1
1049; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1050; FP16-NEXT:    vminnm.f64 d0, d0, d2
1051; FP16-NEXT:    vcvt.u32.f64 s0, d0
1052; FP16-NEXT:    vmov r0, s0
1053; FP16-NEXT:    bx lr
1054; FP16-NEXT:    .p2align 3
1055; FP16-NEXT:  @ %bb.1:
1056; FP16-NEXT:  .LCPI12_0:
1057; FP16-NEXT:    .long 0 @ double 0
1058; FP16-NEXT:    .long 0
1059; FP16-NEXT:  .LCPI12_1:
1060; FP16-NEXT:    .long 0 @ double 8191
1061; FP16-NEXT:    .long 1086324480
1062    %x = call i13 @llvm.fptoui.sat.i13.f64(double %f)
1063    ret i13 %x
1064}
1065
1066define i16 @test_signed_i16_f64(double %f) nounwind {
1067; SOFT-LABEL: test_signed_i16_f64:
1068; SOFT:       @ %bb.0:
1069; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1070; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1071; SOFT-NEXT:    .pad #4
1072; SOFT-NEXT:    sub sp, #4
1073; SOFT-NEXT:    mov r4, r1
1074; SOFT-NEXT:    mov r5, r0
1075; SOFT-NEXT:    movs r6, #0
1076; SOFT-NEXT:    mov r2, r6
1077; SOFT-NEXT:    mov r3, r6
1078; SOFT-NEXT:    bl __aeabi_dcmpge
1079; SOFT-NEXT:    mov r7, r0
1080; SOFT-NEXT:    mov r0, r5
1081; SOFT-NEXT:    mov r1, r4
1082; SOFT-NEXT:    bl __aeabi_d2uiz
1083; SOFT-NEXT:    cmp r7, #0
1084; SOFT-NEXT:    bne .LBB13_2
1085; SOFT-NEXT:  @ %bb.1:
1086; SOFT-NEXT:    mov r0, r7
1087; SOFT-NEXT:  .LBB13_2:
1088; SOFT-NEXT:    mov r7, r0
1089; SOFT-NEXT:    ldr r3, .LCPI13_0
1090; SOFT-NEXT:    mov r0, r5
1091; SOFT-NEXT:    mov r1, r4
1092; SOFT-NEXT:    mov r2, r6
1093; SOFT-NEXT:    bl __aeabi_dcmpgt
1094; SOFT-NEXT:    cmp r0, #0
1095; SOFT-NEXT:    bne .LBB13_4
1096; SOFT-NEXT:  @ %bb.3:
1097; SOFT-NEXT:    mov r0, r7
1098; SOFT-NEXT:    add sp, #4
1099; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1100; SOFT-NEXT:  .LBB13_4:
1101; SOFT-NEXT:    ldr r0, .LCPI13_1
1102; SOFT-NEXT:    add sp, #4
1103; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1104; SOFT-NEXT:    .p2align 2
1105; SOFT-NEXT:  @ %bb.5:
1106; SOFT-NEXT:  .LCPI13_0:
1107; SOFT-NEXT:    .long 1089470432 @ 0x40efffe0
1108; SOFT-NEXT:  .LCPI13_1:
1109; SOFT-NEXT:    .long 65535 @ 0xffff
1110;
1111; VFP2-LABEL: test_signed_i16_f64:
1112; VFP2:       @ %bb.0:
1113; VFP2-NEXT:    vmov d16, r0, r1
1114; VFP2-NEXT:    vldr d17, .LCPI13_0
1115; VFP2-NEXT:    vcmp.f64 d16, #0
1116; VFP2-NEXT:    vcvt.u32.f64 s0, d16
1117; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1118; VFP2-NEXT:    vmov r0, s0
1119; VFP2-NEXT:    vcmp.f64 d16, d17
1120; VFP2-NEXT:    it lt
1121; VFP2-NEXT:    movlt r0, #0
1122; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1123; VFP2-NEXT:    it gt
1124; VFP2-NEXT:    movwgt r0, #65535
1125; VFP2-NEXT:    bx lr
1126; VFP2-NEXT:    .p2align 3
1127; VFP2-NEXT:  @ %bb.1:
1128; VFP2-NEXT:  .LCPI13_0:
1129; VFP2-NEXT:    .long 0 @ double 65535
1130; VFP2-NEXT:    .long 1089470432
1131;
1132; FP16-LABEL: test_signed_i16_f64:
1133; FP16:       @ %bb.0:
1134; FP16-NEXT:    vldr d0, .LCPI13_0
1135; FP16-NEXT:    vmov d1, r0, r1
1136; FP16-NEXT:    vldr d2, .LCPI13_1
1137; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1138; FP16-NEXT:    vminnm.f64 d0, d0, d2
1139; FP16-NEXT:    vcvt.u32.f64 s0, d0
1140; FP16-NEXT:    vmov r0, s0
1141; FP16-NEXT:    bx lr
1142; FP16-NEXT:    .p2align 3
1143; FP16-NEXT:  @ %bb.1:
1144; FP16-NEXT:  .LCPI13_0:
1145; FP16-NEXT:    .long 0 @ double 0
1146; FP16-NEXT:    .long 0
1147; FP16-NEXT:  .LCPI13_1:
1148; FP16-NEXT:    .long 0 @ double 65535
1149; FP16-NEXT:    .long 1089470432
1150    %x = call i16 @llvm.fptoui.sat.i16.f64(double %f)
1151    ret i16 %x
1152}
1153
1154define i19 @test_signed_i19_f64(double %f) nounwind {
1155; SOFT-LABEL: test_signed_i19_f64:
1156; SOFT:       @ %bb.0:
1157; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1158; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1159; SOFT-NEXT:    .pad #4
1160; SOFT-NEXT:    sub sp, #4
1161; SOFT-NEXT:    mov r4, r1
1162; SOFT-NEXT:    mov r5, r0
1163; SOFT-NEXT:    movs r6, #0
1164; SOFT-NEXT:    mov r2, r6
1165; SOFT-NEXT:    mov r3, r6
1166; SOFT-NEXT:    bl __aeabi_dcmpge
1167; SOFT-NEXT:    mov r7, r0
1168; SOFT-NEXT:    mov r0, r5
1169; SOFT-NEXT:    mov r1, r4
1170; SOFT-NEXT:    bl __aeabi_d2uiz
1171; SOFT-NEXT:    cmp r7, #0
1172; SOFT-NEXT:    bne .LBB14_2
1173; SOFT-NEXT:  @ %bb.1:
1174; SOFT-NEXT:    mov r0, r7
1175; SOFT-NEXT:  .LBB14_2:
1176; SOFT-NEXT:    mov r7, r0
1177; SOFT-NEXT:    ldr r3, .LCPI14_0
1178; SOFT-NEXT:    mov r0, r5
1179; SOFT-NEXT:    mov r1, r4
1180; SOFT-NEXT:    mov r2, r6
1181; SOFT-NEXT:    bl __aeabi_dcmpgt
1182; SOFT-NEXT:    cmp r0, #0
1183; SOFT-NEXT:    bne .LBB14_4
1184; SOFT-NEXT:  @ %bb.3:
1185; SOFT-NEXT:    mov r0, r7
1186; SOFT-NEXT:    add sp, #4
1187; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1188; SOFT-NEXT:  .LBB14_4:
1189; SOFT-NEXT:    ldr r0, .LCPI14_1
1190; SOFT-NEXT:    add sp, #4
1191; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1192; SOFT-NEXT:    .p2align 2
1193; SOFT-NEXT:  @ %bb.5:
1194; SOFT-NEXT:  .LCPI14_0:
1195; SOFT-NEXT:    .long 1092616188 @ 0x411ffffc
1196; SOFT-NEXT:  .LCPI14_1:
1197; SOFT-NEXT:    .long 524287 @ 0x7ffff
1198;
1199; VFP2-LABEL: test_signed_i19_f64:
1200; VFP2:       @ %bb.0:
1201; VFP2-NEXT:    vmov d16, r0, r1
1202; VFP2-NEXT:    vldr d17, .LCPI14_0
1203; VFP2-NEXT:    vcmp.f64 d16, #0
1204; VFP2-NEXT:    vcvt.u32.f64 s0, d16
1205; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1206; VFP2-NEXT:    vmov r0, s0
1207; VFP2-NEXT:    vcmp.f64 d16, d17
1208; VFP2-NEXT:    it lt
1209; VFP2-NEXT:    movlt r0, #0
1210; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1211; VFP2-NEXT:    itt gt
1212; VFP2-NEXT:    movwgt r0, #65535
1213; VFP2-NEXT:    movtgt r0, #7
1214; VFP2-NEXT:    bx lr
1215; VFP2-NEXT:    .p2align 3
1216; VFP2-NEXT:  @ %bb.1:
1217; VFP2-NEXT:  .LCPI14_0:
1218; VFP2-NEXT:    .long 0 @ double 524287
1219; VFP2-NEXT:    .long 1092616188
1220;
1221; FP16-LABEL: test_signed_i19_f64:
1222; FP16:       @ %bb.0:
1223; FP16-NEXT:    vldr d0, .LCPI14_0
1224; FP16-NEXT:    vmov d1, r0, r1
1225; FP16-NEXT:    vldr d2, .LCPI14_1
1226; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1227; FP16-NEXT:    vminnm.f64 d0, d0, d2
1228; FP16-NEXT:    vcvt.u32.f64 s0, d0
1229; FP16-NEXT:    vmov r0, s0
1230; FP16-NEXT:    bx lr
1231; FP16-NEXT:    .p2align 3
1232; FP16-NEXT:  @ %bb.1:
1233; FP16-NEXT:  .LCPI14_0:
1234; FP16-NEXT:    .long 0 @ double 0
1235; FP16-NEXT:    .long 0
1236; FP16-NEXT:  .LCPI14_1:
1237; FP16-NEXT:    .long 0 @ double 524287
1238; FP16-NEXT:    .long 1092616188
1239    %x = call i19 @llvm.fptoui.sat.i19.f64(double %f)
1240    ret i19 %x
1241}
1242
1243define i32 @test_signed_i32_f64(double %f) nounwind {
1244; SOFT-LABEL: test_signed_i32_f64:
1245; SOFT:       @ %bb.0:
1246; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1247; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1248; SOFT-NEXT:    .pad #4
1249; SOFT-NEXT:    sub sp, #4
1250; SOFT-NEXT:    mov r5, r1
1251; SOFT-NEXT:    mov r6, r0
1252; SOFT-NEXT:    movs r4, #0
1253; SOFT-NEXT:    mov r2, r4
1254; SOFT-NEXT:    mov r3, r4
1255; SOFT-NEXT:    bl __aeabi_dcmpge
1256; SOFT-NEXT:    mov r7, r0
1257; SOFT-NEXT:    mov r0, r6
1258; SOFT-NEXT:    mov r1, r5
1259; SOFT-NEXT:    bl __aeabi_d2uiz
1260; SOFT-NEXT:    cmp r7, #0
1261; SOFT-NEXT:    bne .LBB15_2
1262; SOFT-NEXT:  @ %bb.1:
1263; SOFT-NEXT:    mov r0, r7
1264; SOFT-NEXT:  .LBB15_2:
1265; SOFT-NEXT:    mov r7, r0
1266; SOFT-NEXT:    ldr r2, .LCPI15_0
1267; SOFT-NEXT:    ldr r3, .LCPI15_1
1268; SOFT-NEXT:    mov r0, r6
1269; SOFT-NEXT:    mov r1, r5
1270; SOFT-NEXT:    bl __aeabi_dcmpgt
1271; SOFT-NEXT:    cmp r0, #0
1272; SOFT-NEXT:    bne .LBB15_4
1273; SOFT-NEXT:  @ %bb.3:
1274; SOFT-NEXT:    mov r0, r7
1275; SOFT-NEXT:    add sp, #4
1276; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1277; SOFT-NEXT:  .LBB15_4:
1278; SOFT-NEXT:    mvns r0, r4
1279; SOFT-NEXT:    add sp, #4
1280; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1281; SOFT-NEXT:    .p2align 2
1282; SOFT-NEXT:  @ %bb.5:
1283; SOFT-NEXT:  .LCPI15_0:
1284; SOFT-NEXT:    .long 4292870144 @ 0xffe00000
1285; SOFT-NEXT:  .LCPI15_1:
1286; SOFT-NEXT:    .long 1106247679 @ 0x41efffff
1287;
1288; VFP2-LABEL: test_signed_i32_f64:
1289; VFP2:       @ %bb.0:
1290; VFP2-NEXT:    vmov d16, r0, r1
1291; VFP2-NEXT:    vcvt.u32.f64 s0, d16
1292; VFP2-NEXT:    vmov r0, s0
1293; VFP2-NEXT:    bx lr
1294;
1295; FP16-LABEL: test_signed_i32_f64:
1296; FP16:       @ %bb.0:
1297; FP16-NEXT:    vmov d0, r0, r1
1298; FP16-NEXT:    vcvt.u32.f64 s0, d0
1299; FP16-NEXT:    vmov r0, s0
1300; FP16-NEXT:    bx lr
1301    %x = call i32 @llvm.fptoui.sat.i32.f64(double %f)
1302    ret i32 %x
1303}
1304
1305define i50 @test_signed_i50_f64(double %f) nounwind {
1306; SOFT-LABEL: test_signed_i50_f64:
1307; SOFT:       @ %bb.0:
1308; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1309; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1310; SOFT-NEXT:    .pad #4
1311; SOFT-NEXT:    sub sp, #4
1312; SOFT-NEXT:    mov r6, r1
1313; SOFT-NEXT:    mov r7, r0
1314; SOFT-NEXT:    movs r5, #0
1315; SOFT-NEXT:    mov r2, r5
1316; SOFT-NEXT:    mov r3, r5
1317; SOFT-NEXT:    bl __aeabi_dcmpge
1318; SOFT-NEXT:    mov r4, r0
1319; SOFT-NEXT:    mov r0, r7
1320; SOFT-NEXT:    mov r1, r6
1321; SOFT-NEXT:    bl __aeabi_d2ulz
1322; SOFT-NEXT:    cmp r4, #0
1323; SOFT-NEXT:    bne .LBB16_2
1324; SOFT-NEXT:  @ %bb.1:
1325; SOFT-NEXT:    mov r1, r4
1326; SOFT-NEXT:  .LBB16_2:
1327; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
1328; SOFT-NEXT:    bne .LBB16_4
1329; SOFT-NEXT:  @ %bb.3:
1330; SOFT-NEXT:    mov r0, r4
1331; SOFT-NEXT:  .LBB16_4:
1332; SOFT-NEXT:    mov r4, r0
1333; SOFT-NEXT:    movs r0, #7
1334; SOFT-NEXT:    mvns r2, r0
1335; SOFT-NEXT:    ldr r3, .LCPI16_0
1336; SOFT-NEXT:    mov r0, r7
1337; SOFT-NEXT:    mov r1, r6
1338; SOFT-NEXT:    bl __aeabi_dcmpgt
1339; SOFT-NEXT:    mov r1, r0
1340; SOFT-NEXT:    mvns r0, r5
1341; SOFT-NEXT:    cmp r1, #0
1342; SOFT-NEXT:    beq .LBB16_7
1343; SOFT-NEXT:  @ %bb.5:
1344; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
1345; SOFT-NEXT:    bne .LBB16_8
1346; SOFT-NEXT:  .LBB16_6:
1347; SOFT-NEXT:    add sp, #4
1348; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1349; SOFT-NEXT:  .LBB16_7:
1350; SOFT-NEXT:    mov r0, r4
1351; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
1352; SOFT-NEXT:    beq .LBB16_6
1353; SOFT-NEXT:  .LBB16_8:
1354; SOFT-NEXT:    ldr r1, .LCPI16_1
1355; SOFT-NEXT:    add sp, #4
1356; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1357; SOFT-NEXT:    .p2align 2
1358; SOFT-NEXT:  @ %bb.9:
1359; SOFT-NEXT:  .LCPI16_0:
1360; SOFT-NEXT:    .long 1125122047 @ 0x430fffff
1361; SOFT-NEXT:  .LCPI16_1:
1362; SOFT-NEXT:    .long 262143 @ 0x3ffff
1363;
1364; VFP2-LABEL: test_signed_i50_f64:
1365; VFP2:       @ %bb.0:
1366; VFP2-NEXT:    .save {r7, lr}
1367; VFP2-NEXT:    push {r7, lr}
1368; VFP2-NEXT:    .vsave {d8}
1369; VFP2-NEXT:    vpush {d8}
1370; VFP2-NEXT:    vmov d8, r0, r1
1371; VFP2-NEXT:    bl __aeabi_d2ulz
1372; VFP2-NEXT:    vcmp.f64 d8, #0
1373; VFP2-NEXT:    vldr d16, .LCPI16_0
1374; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1375; VFP2-NEXT:    itt lt
1376; VFP2-NEXT:    movlt r1, #0
1377; VFP2-NEXT:    movlt r0, #0
1378; VFP2-NEXT:    vcmp.f64 d8, d16
1379; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1380; VFP2-NEXT:    ittt gt
1381; VFP2-NEXT:    movwgt r1, #65535
1382; VFP2-NEXT:    movtgt r1, #3
1383; VFP2-NEXT:    movgt.w r0, #-1
1384; VFP2-NEXT:    vpop {d8}
1385; VFP2-NEXT:    pop {r7, pc}
1386; VFP2-NEXT:    .p2align 3
1387; VFP2-NEXT:  @ %bb.1:
1388; VFP2-NEXT:  .LCPI16_0:
1389; VFP2-NEXT:    .long 4294967288 @ double 1125899906842623
1390; VFP2-NEXT:    .long 1125122047
1391;
1392; FP16-LABEL: test_signed_i50_f64:
1393; FP16:       @ %bb.0:
1394; FP16-NEXT:    .save {r7, lr}
1395; FP16-NEXT:    push {r7, lr}
1396; FP16-NEXT:    vldr d0, .LCPI16_0
1397; FP16-NEXT:    vmov d1, r0, r1
1398; FP16-NEXT:    vldr d2, .LCPI16_1
1399; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1400; FP16-NEXT:    vminnm.f64 d0, d0, d2
1401; FP16-NEXT:    vmov r0, r1, d0
1402; FP16-NEXT:    bl __aeabi_d2ulz
1403; FP16-NEXT:    pop {r7, pc}
1404; FP16-NEXT:    .p2align 3
1405; FP16-NEXT:  @ %bb.1:
1406; FP16-NEXT:  .LCPI16_0:
1407; FP16-NEXT:    .long 0 @ double 0
1408; FP16-NEXT:    .long 0
1409; FP16-NEXT:  .LCPI16_1:
1410; FP16-NEXT:    .long 4294967288 @ double 1125899906842623
1411; FP16-NEXT:    .long 1125122047
1412    %x = call i50 @llvm.fptoui.sat.i50.f64(double %f)
1413    ret i50 %x
1414}
1415
1416define i64 @test_signed_i64_f64(double %f) nounwind {
1417; SOFT-LABEL: test_signed_i64_f64:
1418; SOFT:       @ %bb.0:
1419; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1420; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1421; SOFT-NEXT:    .pad #4
1422; SOFT-NEXT:    sub sp, #4
1423; SOFT-NEXT:    mov r4, r1
1424; SOFT-NEXT:    mov r5, r0
1425; SOFT-NEXT:    movs r7, #0
1426; SOFT-NEXT:    mov r2, r7
1427; SOFT-NEXT:    mov r3, r7
1428; SOFT-NEXT:    bl __aeabi_dcmpge
1429; SOFT-NEXT:    mov r6, r0
1430; SOFT-NEXT:    mov r0, r5
1431; SOFT-NEXT:    mov r1, r4
1432; SOFT-NEXT:    bl __aeabi_d2ulz
1433; SOFT-NEXT:    cmp r6, #0
1434; SOFT-NEXT:    bne .LBB17_2
1435; SOFT-NEXT:  @ %bb.1:
1436; SOFT-NEXT:    mov r1, r6
1437; SOFT-NEXT:  .LBB17_2:
1438; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
1439; SOFT-NEXT:    bne .LBB17_4
1440; SOFT-NEXT:  @ %bb.3:
1441; SOFT-NEXT:    mov r0, r6
1442; SOFT-NEXT:  .LBB17_4:
1443; SOFT-NEXT:    mov r6, r0
1444; SOFT-NEXT:    mvns r7, r7
1445; SOFT-NEXT:    ldr r3, .LCPI17_0
1446; SOFT-NEXT:    mov r0, r5
1447; SOFT-NEXT:    mov r1, r4
1448; SOFT-NEXT:    mov r2, r7
1449; SOFT-NEXT:    bl __aeabi_dcmpgt
1450; SOFT-NEXT:    cmp r0, #0
1451; SOFT-NEXT:    mov r0, r7
1452; SOFT-NEXT:    bne .LBB17_6
1453; SOFT-NEXT:  @ %bb.5:
1454; SOFT-NEXT:    mov r0, r6
1455; SOFT-NEXT:  .LBB17_6:
1456; SOFT-NEXT:    bne .LBB17_8
1457; SOFT-NEXT:  @ %bb.7:
1458; SOFT-NEXT:    ldr r7, [sp] @ 4-byte Reload
1459; SOFT-NEXT:  .LBB17_8:
1460; SOFT-NEXT:    mov r1, r7
1461; SOFT-NEXT:    add sp, #4
1462; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1463; SOFT-NEXT:    .p2align 2
1464; SOFT-NEXT:  @ %bb.9:
1465; SOFT-NEXT:  .LCPI17_0:
1466; SOFT-NEXT:    .long 1139802111 @ 0x43efffff
1467;
1468; VFP2-LABEL: test_signed_i64_f64:
1469; VFP2:       @ %bb.0:
1470; VFP2-NEXT:    .save {r7, lr}
1471; VFP2-NEXT:    push {r7, lr}
1472; VFP2-NEXT:    .vsave {d8}
1473; VFP2-NEXT:    vpush {d8}
1474; VFP2-NEXT:    vmov d8, r0, r1
1475; VFP2-NEXT:    bl __aeabi_d2ulz
1476; VFP2-NEXT:    vcmp.f64 d8, #0
1477; VFP2-NEXT:    vldr d16, .LCPI17_0
1478; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1479; VFP2-NEXT:    itt lt
1480; VFP2-NEXT:    movlt r1, #0
1481; VFP2-NEXT:    movlt r0, #0
1482; VFP2-NEXT:    vcmp.f64 d8, d16
1483; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1484; VFP2-NEXT:    itt gt
1485; VFP2-NEXT:    movgt.w r0, #-1
1486; VFP2-NEXT:    movgt.w r1, #-1
1487; VFP2-NEXT:    vpop {d8}
1488; VFP2-NEXT:    pop {r7, pc}
1489; VFP2-NEXT:    .p2align 3
1490; VFP2-NEXT:  @ %bb.1:
1491; VFP2-NEXT:  .LCPI17_0:
1492; VFP2-NEXT:    .long 4294967295 @ double 1.844674407370955E+19
1493; VFP2-NEXT:    .long 1139802111
1494;
1495; FP16-LABEL: test_signed_i64_f64:
1496; FP16:       @ %bb.0:
1497; FP16-NEXT:    .save {r7, lr}
1498; FP16-NEXT:    push {r7, lr}
1499; FP16-NEXT:    .vsave {d8}
1500; FP16-NEXT:    vpush {d8}
1501; FP16-NEXT:    vmov d8, r0, r1
1502; FP16-NEXT:    bl __aeabi_d2ulz
1503; FP16-NEXT:    vcmp.f64 d8, #0
1504; FP16-NEXT:    vldr d0, .LCPI17_0
1505; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1506; FP16-NEXT:    itt lt
1507; FP16-NEXT:    movlt r1, #0
1508; FP16-NEXT:    movlt r0, #0
1509; FP16-NEXT:    vcmp.f64 d8, d0
1510; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1511; FP16-NEXT:    itt gt
1512; FP16-NEXT:    movgt.w r0, #-1
1513; FP16-NEXT:    movgt.w r1, #-1
1514; FP16-NEXT:    vpop {d8}
1515; FP16-NEXT:    pop {r7, pc}
1516; FP16-NEXT:    .p2align 3
1517; FP16-NEXT:  @ %bb.1:
1518; FP16-NEXT:  .LCPI17_0:
1519; FP16-NEXT:    .long 4294967295 @ double 1.844674407370955E+19
1520; FP16-NEXT:    .long 1139802111
1521    %x = call i64 @llvm.fptoui.sat.i64.f64(double %f)
1522    ret i64 %x
1523}
1524
1525define i100 @test_signed_i100_f64(double %f) nounwind {
1526; SOFT-LABEL: test_signed_i100_f64:
1527; SOFT:       @ %bb.0:
1528; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1529; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1530; SOFT-NEXT:    .pad #12
1531; SOFT-NEXT:    sub sp, #12
1532; SOFT-NEXT:    mov r6, r1
1533; SOFT-NEXT:    mov r4, r0
1534; SOFT-NEXT:    movs r5, #0
1535; SOFT-NEXT:    mov r2, r5
1536; SOFT-NEXT:    mov r3, r5
1537; SOFT-NEXT:    bl __aeabi_dcmpge
1538; SOFT-NEXT:    mov r7, r0
1539; SOFT-NEXT:    mov r0, r4
1540; SOFT-NEXT:    mov r1, r6
1541; SOFT-NEXT:    bl __fixunsdfti
1542; SOFT-NEXT:    cmp r7, #0
1543; SOFT-NEXT:    beq .LBB18_12
1544; SOFT-NEXT:  @ %bb.1:
1545; SOFT-NEXT:    beq .LBB18_13
1546; SOFT-NEXT:  .LBB18_2:
1547; SOFT-NEXT:    bne .LBB18_4
1548; SOFT-NEXT:  .LBB18_3:
1549; SOFT-NEXT:    mov r1, r7
1550; SOFT-NEXT:  .LBB18_4:
1551; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
1552; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
1553; SOFT-NEXT:    str r3, [sp, #8] @ 4-byte Spill
1554; SOFT-NEXT:    bne .LBB18_6
1555; SOFT-NEXT:  @ %bb.5:
1556; SOFT-NEXT:    mov r0, r7
1557; SOFT-NEXT:  .LBB18_6:
1558; SOFT-NEXT:    mov r7, r0
1559; SOFT-NEXT:    mvns r5, r5
1560; SOFT-NEXT:    ldr r3, .LCPI18_0
1561; SOFT-NEXT:    mov r0, r4
1562; SOFT-NEXT:    mov r1, r6
1563; SOFT-NEXT:    mov r2, r5
1564; SOFT-NEXT:    bl __aeabi_dcmpgt
1565; SOFT-NEXT:    movs r3, #15
1566; SOFT-NEXT:    cmp r0, #0
1567; SOFT-NEXT:    mov r0, r5
1568; SOFT-NEXT:    beq .LBB18_14
1569; SOFT-NEXT:  @ %bb.7:
1570; SOFT-NEXT:    mov r1, r5
1571; SOFT-NEXT:    beq .LBB18_15
1572; SOFT-NEXT:  .LBB18_8:
1573; SOFT-NEXT:    beq .LBB18_16
1574; SOFT-NEXT:  .LBB18_9:
1575; SOFT-NEXT:    bne .LBB18_11
1576; SOFT-NEXT:  .LBB18_10:
1577; SOFT-NEXT:    ldr r3, [sp, #8] @ 4-byte Reload
1578; SOFT-NEXT:  .LBB18_11:
1579; SOFT-NEXT:    mov r2, r5
1580; SOFT-NEXT:    add sp, #12
1581; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1582; SOFT-NEXT:  .LBB18_12:
1583; SOFT-NEXT:    mov r3, r7
1584; SOFT-NEXT:    bne .LBB18_2
1585; SOFT-NEXT:  .LBB18_13:
1586; SOFT-NEXT:    mov r2, r7
1587; SOFT-NEXT:    beq .LBB18_3
1588; SOFT-NEXT:    b .LBB18_4
1589; SOFT-NEXT:  .LBB18_14:
1590; SOFT-NEXT:    mov r0, r7
1591; SOFT-NEXT:    mov r1, r5
1592; SOFT-NEXT:    bne .LBB18_8
1593; SOFT-NEXT:  .LBB18_15:
1594; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
1595; SOFT-NEXT:    bne .LBB18_9
1596; SOFT-NEXT:  .LBB18_16:
1597; SOFT-NEXT:    ldr r5, [sp, #4] @ 4-byte Reload
1598; SOFT-NEXT:    beq .LBB18_10
1599; SOFT-NEXT:    b .LBB18_11
1600; SOFT-NEXT:    .p2align 2
1601; SOFT-NEXT:  @ %bb.17:
1602; SOFT-NEXT:  .LCPI18_0:
1603; SOFT-NEXT:    .long 1177550847 @ 0x462fffff
1604;
1605; VFP2-LABEL: test_signed_i100_f64:
1606; VFP2:       @ %bb.0:
1607; VFP2-NEXT:    .save {r7, lr}
1608; VFP2-NEXT:    push {r7, lr}
1609; VFP2-NEXT:    .vsave {d8}
1610; VFP2-NEXT:    vpush {d8}
1611; VFP2-NEXT:    vmov d8, r0, r1
1612; VFP2-NEXT:    bl __fixunsdfti
1613; VFP2-NEXT:    vcmp.f64 d8, #0
1614; VFP2-NEXT:    vldr d16, .LCPI18_0
1615; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1616; VFP2-NEXT:    itttt lt
1617; VFP2-NEXT:    movlt r3, #0
1618; VFP2-NEXT:    movlt r2, #0
1619; VFP2-NEXT:    movlt r1, #0
1620; VFP2-NEXT:    movlt r0, #0
1621; VFP2-NEXT:    vcmp.f64 d8, d16
1622; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1623; VFP2-NEXT:    itttt gt
1624; VFP2-NEXT:    movgt.w r0, #-1
1625; VFP2-NEXT:    movgt.w r1, #-1
1626; VFP2-NEXT:    movgt.w r2, #-1
1627; VFP2-NEXT:    movgt r3, #15
1628; VFP2-NEXT:    vpop {d8}
1629; VFP2-NEXT:    pop {r7, pc}
1630; VFP2-NEXT:    .p2align 3
1631; VFP2-NEXT:  @ %bb.1:
1632; VFP2-NEXT:  .LCPI18_0:
1633; VFP2-NEXT:    .long 4294967295 @ double 1.2676506002282293E+30
1634; VFP2-NEXT:    .long 1177550847
1635;
1636; FP16-LABEL: test_signed_i100_f64:
1637; FP16:       @ %bb.0:
1638; FP16-NEXT:    .save {r7, lr}
1639; FP16-NEXT:    push {r7, lr}
1640; FP16-NEXT:    .vsave {d8}
1641; FP16-NEXT:    vpush {d8}
1642; FP16-NEXT:    vmov d8, r0, r1
1643; FP16-NEXT:    bl __fixunsdfti
1644; FP16-NEXT:    vcmp.f64 d8, #0
1645; FP16-NEXT:    vldr d0, .LCPI18_0
1646; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1647; FP16-NEXT:    itttt lt
1648; FP16-NEXT:    movlt r3, #0
1649; FP16-NEXT:    movlt r2, #0
1650; FP16-NEXT:    movlt r1, #0
1651; FP16-NEXT:    movlt r0, #0
1652; FP16-NEXT:    vcmp.f64 d8, d0
1653; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1654; FP16-NEXT:    itttt gt
1655; FP16-NEXT:    movgt.w r0, #-1
1656; FP16-NEXT:    movgt.w r1, #-1
1657; FP16-NEXT:    movgt.w r2, #-1
1658; FP16-NEXT:    movgt r3, #15
1659; FP16-NEXT:    vpop {d8}
1660; FP16-NEXT:    pop {r7, pc}
1661; FP16-NEXT:    .p2align 3
1662; FP16-NEXT:  @ %bb.1:
1663; FP16-NEXT:  .LCPI18_0:
1664; FP16-NEXT:    .long 4294967295 @ double 1.2676506002282293E+30
1665; FP16-NEXT:    .long 1177550847
1666    %x = call i100 @llvm.fptoui.sat.i100.f64(double %f)
1667    ret i100 %x
1668}
1669
1670define i128 @test_signed_i128_f64(double %f) nounwind {
1671; SOFT-LABEL: test_signed_i128_f64:
1672; SOFT:       @ %bb.0:
1673; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1674; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1675; SOFT-NEXT:    .pad #12
1676; SOFT-NEXT:    sub sp, #12
1677; SOFT-NEXT:    mov r6, r1
1678; SOFT-NEXT:    mov r7, r0
1679; SOFT-NEXT:    movs r5, #0
1680; SOFT-NEXT:    mov r2, r5
1681; SOFT-NEXT:    mov r3, r5
1682; SOFT-NEXT:    bl __aeabi_dcmpge
1683; SOFT-NEXT:    mov r4, r0
1684; SOFT-NEXT:    mov r0, r7
1685; SOFT-NEXT:    mov r1, r6
1686; SOFT-NEXT:    bl __fixunsdfti
1687; SOFT-NEXT:    cmp r4, #0
1688; SOFT-NEXT:    beq .LBB19_12
1689; SOFT-NEXT:  @ %bb.1:
1690; SOFT-NEXT:    beq .LBB19_13
1691; SOFT-NEXT:  .LBB19_2:
1692; SOFT-NEXT:    bne .LBB19_4
1693; SOFT-NEXT:  .LBB19_3:
1694; SOFT-NEXT:    mov r1, r4
1695; SOFT-NEXT:  .LBB19_4:
1696; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
1697; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
1698; SOFT-NEXT:    str r3, [sp, #8] @ 4-byte Spill
1699; SOFT-NEXT:    bne .LBB19_6
1700; SOFT-NEXT:  @ %bb.5:
1701; SOFT-NEXT:    mov r0, r4
1702; SOFT-NEXT:  .LBB19_6:
1703; SOFT-NEXT:    mov r4, r0
1704; SOFT-NEXT:    mvns r5, r5
1705; SOFT-NEXT:    ldr r3, .LCPI19_0
1706; SOFT-NEXT:    mov r0, r7
1707; SOFT-NEXT:    mov r1, r6
1708; SOFT-NEXT:    mov r2, r5
1709; SOFT-NEXT:    bl __aeabi_dcmpgt
1710; SOFT-NEXT:    cmp r0, #0
1711; SOFT-NEXT:    mov r0, r5
1712; SOFT-NEXT:    beq .LBB19_14
1713; SOFT-NEXT:  @ %bb.7:
1714; SOFT-NEXT:    mov r1, r5
1715; SOFT-NEXT:    beq .LBB19_15
1716; SOFT-NEXT:  .LBB19_8:
1717; SOFT-NEXT:    mov r2, r5
1718; SOFT-NEXT:    beq .LBB19_16
1719; SOFT-NEXT:  .LBB19_9:
1720; SOFT-NEXT:    bne .LBB19_11
1721; SOFT-NEXT:  .LBB19_10:
1722; SOFT-NEXT:    ldr r5, [sp, #8] @ 4-byte Reload
1723; SOFT-NEXT:  .LBB19_11:
1724; SOFT-NEXT:    mov r3, r5
1725; SOFT-NEXT:    add sp, #12
1726; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1727; SOFT-NEXT:  .LBB19_12:
1728; SOFT-NEXT:    mov r3, r4
1729; SOFT-NEXT:    bne .LBB19_2
1730; SOFT-NEXT:  .LBB19_13:
1731; SOFT-NEXT:    mov r2, r4
1732; SOFT-NEXT:    beq .LBB19_3
1733; SOFT-NEXT:    b .LBB19_4
1734; SOFT-NEXT:  .LBB19_14:
1735; SOFT-NEXT:    mov r0, r4
1736; SOFT-NEXT:    mov r1, r5
1737; SOFT-NEXT:    bne .LBB19_8
1738; SOFT-NEXT:  .LBB19_15:
1739; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
1740; SOFT-NEXT:    mov r2, r5
1741; SOFT-NEXT:    bne .LBB19_9
1742; SOFT-NEXT:  .LBB19_16:
1743; SOFT-NEXT:    ldr r2, [sp, #4] @ 4-byte Reload
1744; SOFT-NEXT:    beq .LBB19_10
1745; SOFT-NEXT:    b .LBB19_11
1746; SOFT-NEXT:    .p2align 2
1747; SOFT-NEXT:  @ %bb.17:
1748; SOFT-NEXT:  .LCPI19_0:
1749; SOFT-NEXT:    .long 1206910975 @ 0x47efffff
1750;
1751; VFP2-LABEL: test_signed_i128_f64:
1752; VFP2:       @ %bb.0:
1753; VFP2-NEXT:    .save {r7, lr}
1754; VFP2-NEXT:    push {r7, lr}
1755; VFP2-NEXT:    .vsave {d8}
1756; VFP2-NEXT:    vpush {d8}
1757; VFP2-NEXT:    vmov d8, r0, r1
1758; VFP2-NEXT:    bl __fixunsdfti
1759; VFP2-NEXT:    vcmp.f64 d8, #0
1760; VFP2-NEXT:    vldr d16, .LCPI19_0
1761; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1762; VFP2-NEXT:    itttt lt
1763; VFP2-NEXT:    movlt r3, #0
1764; VFP2-NEXT:    movlt r2, #0
1765; VFP2-NEXT:    movlt r1, #0
1766; VFP2-NEXT:    movlt r0, #0
1767; VFP2-NEXT:    vcmp.f64 d8, d16
1768; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1769; VFP2-NEXT:    itttt gt
1770; VFP2-NEXT:    movgt.w r0, #-1
1771; VFP2-NEXT:    movgt.w r1, #-1
1772; VFP2-NEXT:    movgt.w r2, #-1
1773; VFP2-NEXT:    movgt.w r3, #-1
1774; VFP2-NEXT:    vpop {d8}
1775; VFP2-NEXT:    pop {r7, pc}
1776; VFP2-NEXT:    .p2align 3
1777; VFP2-NEXT:  @ %bb.1:
1778; VFP2-NEXT:  .LCPI19_0:
1779; VFP2-NEXT:    .long 4294967295 @ double 3.4028236692093843E+38
1780; VFP2-NEXT:    .long 1206910975
1781;
1782; FP16-LABEL: test_signed_i128_f64:
1783; FP16:       @ %bb.0:
1784; FP16-NEXT:    .save {r7, lr}
1785; FP16-NEXT:    push {r7, lr}
1786; FP16-NEXT:    .vsave {d8}
1787; FP16-NEXT:    vpush {d8}
1788; FP16-NEXT:    vmov d8, r0, r1
1789; FP16-NEXT:    bl __fixunsdfti
1790; FP16-NEXT:    vcmp.f64 d8, #0
1791; FP16-NEXT:    vldr d0, .LCPI19_0
1792; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1793; FP16-NEXT:    itttt lt
1794; FP16-NEXT:    movlt r3, #0
1795; FP16-NEXT:    movlt r2, #0
1796; FP16-NEXT:    movlt r1, #0
1797; FP16-NEXT:    movlt r0, #0
1798; FP16-NEXT:    vcmp.f64 d8, d0
1799; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1800; FP16-NEXT:    itttt gt
1801; FP16-NEXT:    movgt.w r0, #-1
1802; FP16-NEXT:    movgt.w r1, #-1
1803; FP16-NEXT:    movgt.w r2, #-1
1804; FP16-NEXT:    movgt.w r3, #-1
1805; FP16-NEXT:    vpop {d8}
1806; FP16-NEXT:    pop {r7, pc}
1807; FP16-NEXT:    .p2align 3
1808; FP16-NEXT:  @ %bb.1:
1809; FP16-NEXT:  .LCPI19_0:
1810; FP16-NEXT:    .long 4294967295 @ double 3.4028236692093843E+38
1811; FP16-NEXT:    .long 1206910975
1812    %x = call i128 @llvm.fptoui.sat.i128.f64(double %f)
1813    ret i128 %x
1814}
1815
1816;
1817; 16-bit float to signed integer
1818;
1819
1820declare   i1 @llvm.fptoui.sat.i1.f16  (half)
1821declare   i8 @llvm.fptoui.sat.i8.f16  (half)
1822declare  i13 @llvm.fptoui.sat.i13.f16 (half)
1823declare  i16 @llvm.fptoui.sat.i16.f16 (half)
1824declare  i19 @llvm.fptoui.sat.i19.f16 (half)
1825declare  i32 @llvm.fptoui.sat.i32.f16 (half)
1826declare  i50 @llvm.fptoui.sat.i50.f16 (half)
1827declare  i64 @llvm.fptoui.sat.i64.f16 (half)
1828declare i100 @llvm.fptoui.sat.i100.f16(half)
1829declare i128 @llvm.fptoui.sat.i128.f16(half)
1830
1831define i1 @test_signed_i1_f16(half %f) nounwind {
1832; SOFT-LABEL: test_signed_i1_f16:
1833; SOFT:       @ %bb.0:
1834; SOFT-NEXT:    .save {r4, r5, r6, lr}
1835; SOFT-NEXT:    push {r4, r5, r6, lr}
1836; SOFT-NEXT:    uxth r0, r0
1837; SOFT-NEXT:    bl __aeabi_h2f
1838; SOFT-NEXT:    mov r5, r0
1839; SOFT-NEXT:    movs r1, #0
1840; SOFT-NEXT:    bl __aeabi_fcmpge
1841; SOFT-NEXT:    mov r6, r0
1842; SOFT-NEXT:    mov r0, r5
1843; SOFT-NEXT:    bl __aeabi_f2uiz
1844; SOFT-NEXT:    mov r4, r0
1845; SOFT-NEXT:    cmp r6, #0
1846; SOFT-NEXT:    bne .LBB20_2
1847; SOFT-NEXT:  @ %bb.1:
1848; SOFT-NEXT:    mov r4, r6
1849; SOFT-NEXT:  .LBB20_2:
1850; SOFT-NEXT:    movs r0, #127
1851; SOFT-NEXT:    lsls r1, r0, #23
1852; SOFT-NEXT:    mov r0, r5
1853; SOFT-NEXT:    bl __aeabi_fcmpgt
1854; SOFT-NEXT:    cmp r0, #0
1855; SOFT-NEXT:    beq .LBB20_4
1856; SOFT-NEXT:  @ %bb.3:
1857; SOFT-NEXT:    movs r4, #1
1858; SOFT-NEXT:  .LBB20_4:
1859; SOFT-NEXT:    mov r0, r4
1860; SOFT-NEXT:    pop {r4, r5, r6, pc}
1861;
1862; VFP2-LABEL: test_signed_i1_f16:
1863; VFP2:       @ %bb.0:
1864; VFP2-NEXT:    .save {r7, lr}
1865; VFP2-NEXT:    push {r7, lr}
1866; VFP2-NEXT:    bl __aeabi_h2f
1867; VFP2-NEXT:    vmov s0, r0
1868; VFP2-NEXT:    vmov.f32 s4, #1.000000e+00
1869; VFP2-NEXT:    vcvt.u32.f32 s2, s0
1870; VFP2-NEXT:    vcmp.f32 s0, #0
1871; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1872; VFP2-NEXT:    vcmp.f32 s0, s4
1873; VFP2-NEXT:    vmov r0, s2
1874; VFP2-NEXT:    it lt
1875; VFP2-NEXT:    movlt r0, #0
1876; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1877; VFP2-NEXT:    it gt
1878; VFP2-NEXT:    movgt r0, #1
1879; VFP2-NEXT:    pop {r7, pc}
1880;
1881; FP16-LABEL: test_signed_i1_f16:
1882; FP16:       @ %bb.0:
1883; FP16-NEXT:    vmov.f16 s0, r0
1884; FP16-NEXT:    vldr s4, .LCPI20_0
1885; FP16-NEXT:    vcvtb.f32.f16 s0, s0
1886; FP16-NEXT:    vmov.f32 s2, #1.000000e+00
1887; FP16-NEXT:    vmaxnm.f32 s0, s0, s4
1888; FP16-NEXT:    vminnm.f32 s0, s0, s2
1889; FP16-NEXT:    vcvt.u32.f32 s0, s0
1890; FP16-NEXT:    vmov r0, s0
1891; FP16-NEXT:    bx lr
1892; FP16-NEXT:    .p2align 2
1893; FP16-NEXT:  @ %bb.1:
1894; FP16-NEXT:  .LCPI20_0:
1895; FP16-NEXT:    .long 0x00000000 @ float 0
1896    %x = call i1 @llvm.fptoui.sat.i1.f16(half %f)
1897    ret i1 %x
1898}
1899
1900define i8 @test_signed_i8_f16(half %f) nounwind {
1901; SOFT-LABEL: test_signed_i8_f16:
1902; SOFT:       @ %bb.0:
1903; SOFT-NEXT:    .save {r4, r5, r6, lr}
1904; SOFT-NEXT:    push {r4, r5, r6, lr}
1905; SOFT-NEXT:    uxth r0, r0
1906; SOFT-NEXT:    bl __aeabi_h2f
1907; SOFT-NEXT:    mov r5, r0
1908; SOFT-NEXT:    movs r1, #0
1909; SOFT-NEXT:    bl __aeabi_fcmpge
1910; SOFT-NEXT:    mov r6, r0
1911; SOFT-NEXT:    mov r0, r5
1912; SOFT-NEXT:    bl __aeabi_f2uiz
1913; SOFT-NEXT:    mov r4, r0
1914; SOFT-NEXT:    cmp r6, #0
1915; SOFT-NEXT:    bne .LBB21_2
1916; SOFT-NEXT:  @ %bb.1:
1917; SOFT-NEXT:    mov r4, r6
1918; SOFT-NEXT:  .LBB21_2:
1919; SOFT-NEXT:    ldr r1, .LCPI21_0
1920; SOFT-NEXT:    mov r0, r5
1921; SOFT-NEXT:    bl __aeabi_fcmpgt
1922; SOFT-NEXT:    cmp r0, #0
1923; SOFT-NEXT:    beq .LBB21_4
1924; SOFT-NEXT:  @ %bb.3:
1925; SOFT-NEXT:    movs r4, #255
1926; SOFT-NEXT:  .LBB21_4:
1927; SOFT-NEXT:    mov r0, r4
1928; SOFT-NEXT:    pop {r4, r5, r6, pc}
1929; SOFT-NEXT:    .p2align 2
1930; SOFT-NEXT:  @ %bb.5:
1931; SOFT-NEXT:  .LCPI21_0:
1932; SOFT-NEXT:    .long 1132396544 @ 0x437f0000
1933;
1934; VFP2-LABEL: test_signed_i8_f16:
1935; VFP2:       @ %bb.0:
1936; VFP2-NEXT:    .save {r7, lr}
1937; VFP2-NEXT:    push {r7, lr}
1938; VFP2-NEXT:    bl __aeabi_h2f
1939; VFP2-NEXT:    vmov s0, r0
1940; VFP2-NEXT:    vldr s4, .LCPI21_0
1941; VFP2-NEXT:    vcvt.u32.f32 s2, s0
1942; VFP2-NEXT:    vcmp.f32 s0, #0
1943; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1944; VFP2-NEXT:    vcmp.f32 s0, s4
1945; VFP2-NEXT:    vmov r0, s2
1946; VFP2-NEXT:    it lt
1947; VFP2-NEXT:    movlt r0, #0
1948; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1949; VFP2-NEXT:    it gt
1950; VFP2-NEXT:    movgt r0, #255
1951; VFP2-NEXT:    pop {r7, pc}
1952; VFP2-NEXT:    .p2align 2
1953; VFP2-NEXT:  @ %bb.1:
1954; VFP2-NEXT:  .LCPI21_0:
1955; VFP2-NEXT:    .long 0x437f0000 @ float 255
1956;
1957; FP16-LABEL: test_signed_i8_f16:
1958; FP16:       @ %bb.0:
1959; FP16-NEXT:    vmov.f16 s0, r0
1960; FP16-NEXT:    vldr s4, .LCPI21_1
1961; FP16-NEXT:    vcvtb.f32.f16 s0, s0
1962; FP16-NEXT:    vldr s2, .LCPI21_0
1963; FP16-NEXT:    vmaxnm.f32 s0, s0, s4
1964; FP16-NEXT:    vminnm.f32 s0, s0, s2
1965; FP16-NEXT:    vcvt.u32.f32 s0, s0
1966; FP16-NEXT:    vmov r0, s0
1967; FP16-NEXT:    bx lr
1968; FP16-NEXT:    .p2align 2
1969; FP16-NEXT:  @ %bb.1:
1970; FP16-NEXT:  .LCPI21_0:
1971; FP16-NEXT:    .long 0x437f0000 @ float 255
1972; FP16-NEXT:  .LCPI21_1:
1973; FP16-NEXT:    .long 0x00000000 @ float 0
1974    %x = call i8 @llvm.fptoui.sat.i8.f16(half %f)
1975    ret i8 %x
1976}
1977
1978define i13 @test_signed_i13_f16(half %f) nounwind {
1979; SOFT-LABEL: test_signed_i13_f16:
1980; SOFT:       @ %bb.0:
1981; SOFT-NEXT:    .save {r4, r5, r6, lr}
1982; SOFT-NEXT:    push {r4, r5, r6, lr}
1983; SOFT-NEXT:    uxth r0, r0
1984; SOFT-NEXT:    bl __aeabi_h2f
1985; SOFT-NEXT:    mov r5, r0
1986; SOFT-NEXT:    movs r1, #0
1987; SOFT-NEXT:    bl __aeabi_fcmpge
1988; SOFT-NEXT:    mov r6, r0
1989; SOFT-NEXT:    mov r0, r5
1990; SOFT-NEXT:    bl __aeabi_f2uiz
1991; SOFT-NEXT:    mov r4, r0
1992; SOFT-NEXT:    cmp r6, #0
1993; SOFT-NEXT:    bne .LBB22_2
1994; SOFT-NEXT:  @ %bb.1:
1995; SOFT-NEXT:    mov r4, r6
1996; SOFT-NEXT:  .LBB22_2:
1997; SOFT-NEXT:    ldr r1, .LCPI22_0
1998; SOFT-NEXT:    mov r0, r5
1999; SOFT-NEXT:    bl __aeabi_fcmpgt
2000; SOFT-NEXT:    cmp r0, #0
2001; SOFT-NEXT:    beq .LBB22_4
2002; SOFT-NEXT:  @ %bb.3:
2003; SOFT-NEXT:    ldr r4, .LCPI22_1
2004; SOFT-NEXT:  .LBB22_4:
2005; SOFT-NEXT:    mov r0, r4
2006; SOFT-NEXT:    pop {r4, r5, r6, pc}
2007; SOFT-NEXT:    .p2align 2
2008; SOFT-NEXT:  @ %bb.5:
2009; SOFT-NEXT:  .LCPI22_0:
2010; SOFT-NEXT:    .long 1174403072 @ 0x45fff800
2011; SOFT-NEXT:  .LCPI22_1:
2012; SOFT-NEXT:    .long 8191 @ 0x1fff
2013;
2014; VFP2-LABEL: test_signed_i13_f16:
2015; VFP2:       @ %bb.0:
2016; VFP2-NEXT:    .save {r7, lr}
2017; VFP2-NEXT:    push {r7, lr}
2018; VFP2-NEXT:    bl __aeabi_h2f
2019; VFP2-NEXT:    vmov s0, r0
2020; VFP2-NEXT:    vldr s4, .LCPI22_0
2021; VFP2-NEXT:    vcvt.u32.f32 s2, s0
2022; VFP2-NEXT:    vcmp.f32 s0, #0
2023; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2024; VFP2-NEXT:    vcmp.f32 s0, s4
2025; VFP2-NEXT:    vmov r0, s2
2026; VFP2-NEXT:    it lt
2027; VFP2-NEXT:    movlt r0, #0
2028; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2029; VFP2-NEXT:    it gt
2030; VFP2-NEXT:    movwgt r0, #8191
2031; VFP2-NEXT:    pop {r7, pc}
2032; VFP2-NEXT:    .p2align 2
2033; VFP2-NEXT:  @ %bb.1:
2034; VFP2-NEXT:  .LCPI22_0:
2035; VFP2-NEXT:    .long 0x45fff800 @ float 8191
2036;
2037; FP16-LABEL: test_signed_i13_f16:
2038; FP16:       @ %bb.0:
2039; FP16-NEXT:    vmov.f16 s0, r0
2040; FP16-NEXT:    vldr s4, .LCPI22_1
2041; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2042; FP16-NEXT:    vldr s2, .LCPI22_0
2043; FP16-NEXT:    vmaxnm.f32 s0, s0, s4
2044; FP16-NEXT:    vminnm.f32 s0, s0, s2
2045; FP16-NEXT:    vcvt.u32.f32 s0, s0
2046; FP16-NEXT:    vmov r0, s0
2047; FP16-NEXT:    bx lr
2048; FP16-NEXT:    .p2align 2
2049; FP16-NEXT:  @ %bb.1:
2050; FP16-NEXT:  .LCPI22_0:
2051; FP16-NEXT:    .long 0x45fff800 @ float 8191
2052; FP16-NEXT:  .LCPI22_1:
2053; FP16-NEXT:    .long 0x00000000 @ float 0
2054    %x = call i13 @llvm.fptoui.sat.i13.f16(half %f)
2055    ret i13 %x
2056}
2057
2058define i16 @test_signed_i16_f16(half %f) nounwind {
2059; SOFT-LABEL: test_signed_i16_f16:
2060; SOFT:       @ %bb.0:
2061; SOFT-NEXT:    .save {r4, r5, r6, lr}
2062; SOFT-NEXT:    push {r4, r5, r6, lr}
2063; SOFT-NEXT:    uxth r0, r0
2064; SOFT-NEXT:    bl __aeabi_h2f
2065; SOFT-NEXT:    mov r5, r0
2066; SOFT-NEXT:    movs r1, #0
2067; SOFT-NEXT:    bl __aeabi_fcmpge
2068; SOFT-NEXT:    mov r6, r0
2069; SOFT-NEXT:    mov r0, r5
2070; SOFT-NEXT:    bl __aeabi_f2uiz
2071; SOFT-NEXT:    mov r4, r0
2072; SOFT-NEXT:    cmp r6, #0
2073; SOFT-NEXT:    bne .LBB23_2
2074; SOFT-NEXT:  @ %bb.1:
2075; SOFT-NEXT:    mov r4, r6
2076; SOFT-NEXT:  .LBB23_2:
2077; SOFT-NEXT:    ldr r1, .LCPI23_0
2078; SOFT-NEXT:    mov r0, r5
2079; SOFT-NEXT:    bl __aeabi_fcmpgt
2080; SOFT-NEXT:    cmp r0, #0
2081; SOFT-NEXT:    beq .LBB23_4
2082; SOFT-NEXT:  @ %bb.3:
2083; SOFT-NEXT:    ldr r4, .LCPI23_1
2084; SOFT-NEXT:  .LBB23_4:
2085; SOFT-NEXT:    mov r0, r4
2086; SOFT-NEXT:    pop {r4, r5, r6, pc}
2087; SOFT-NEXT:    .p2align 2
2088; SOFT-NEXT:  @ %bb.5:
2089; SOFT-NEXT:  .LCPI23_0:
2090; SOFT-NEXT:    .long 1199570688 @ 0x477fff00
2091; SOFT-NEXT:  .LCPI23_1:
2092; SOFT-NEXT:    .long 65535 @ 0xffff
2093;
2094; VFP2-LABEL: test_signed_i16_f16:
2095; VFP2:       @ %bb.0:
2096; VFP2-NEXT:    .save {r7, lr}
2097; VFP2-NEXT:    push {r7, lr}
2098; VFP2-NEXT:    bl __aeabi_h2f
2099; VFP2-NEXT:    vmov s0, r0
2100; VFP2-NEXT:    vldr s4, .LCPI23_0
2101; VFP2-NEXT:    vcvt.u32.f32 s2, s0
2102; VFP2-NEXT:    vcmp.f32 s0, #0
2103; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2104; VFP2-NEXT:    vcmp.f32 s0, s4
2105; VFP2-NEXT:    vmov r0, s2
2106; VFP2-NEXT:    it lt
2107; VFP2-NEXT:    movlt r0, #0
2108; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2109; VFP2-NEXT:    it gt
2110; VFP2-NEXT:    movwgt r0, #65535
2111; VFP2-NEXT:    pop {r7, pc}
2112; VFP2-NEXT:    .p2align 2
2113; VFP2-NEXT:  @ %bb.1:
2114; VFP2-NEXT:  .LCPI23_0:
2115; VFP2-NEXT:    .long 0x477fff00 @ float 65535
2116;
2117; FP16-LABEL: test_signed_i16_f16:
2118; FP16:       @ %bb.0:
2119; FP16-NEXT:    vmov.f16 s0, r0
2120; FP16-NEXT:    vldr s4, .LCPI23_1
2121; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2122; FP16-NEXT:    vldr s2, .LCPI23_0
2123; FP16-NEXT:    vmaxnm.f32 s0, s0, s4
2124; FP16-NEXT:    vminnm.f32 s0, s0, s2
2125; FP16-NEXT:    vcvt.u32.f32 s0, s0
2126; FP16-NEXT:    vmov r0, s0
2127; FP16-NEXT:    bx lr
2128; FP16-NEXT:    .p2align 2
2129; FP16-NEXT:  @ %bb.1:
2130; FP16-NEXT:  .LCPI23_0:
2131; FP16-NEXT:    .long 0x477fff00 @ float 65535
2132; FP16-NEXT:  .LCPI23_1:
2133; FP16-NEXT:    .long 0x00000000 @ float 0
2134    %x = call i16 @llvm.fptoui.sat.i16.f16(half %f)
2135    ret i16 %x
2136}
2137
2138define i19 @test_signed_i19_f16(half %f) nounwind {
2139; SOFT-LABEL: test_signed_i19_f16:
2140; SOFT:       @ %bb.0:
2141; SOFT-NEXT:    .save {r4, r5, r6, lr}
2142; SOFT-NEXT:    push {r4, r5, r6, lr}
2143; SOFT-NEXT:    uxth r0, r0
2144; SOFT-NEXT:    bl __aeabi_h2f
2145; SOFT-NEXT:    mov r5, r0
2146; SOFT-NEXT:    movs r1, #0
2147; SOFT-NEXT:    bl __aeabi_fcmpge
2148; SOFT-NEXT:    mov r6, r0
2149; SOFT-NEXT:    mov r0, r5
2150; SOFT-NEXT:    bl __aeabi_f2uiz
2151; SOFT-NEXT:    mov r4, r0
2152; SOFT-NEXT:    cmp r6, #0
2153; SOFT-NEXT:    bne .LBB24_2
2154; SOFT-NEXT:  @ %bb.1:
2155; SOFT-NEXT:    mov r4, r6
2156; SOFT-NEXT:  .LBB24_2:
2157; SOFT-NEXT:    ldr r1, .LCPI24_0
2158; SOFT-NEXT:    mov r0, r5
2159; SOFT-NEXT:    bl __aeabi_fcmpgt
2160; SOFT-NEXT:    cmp r0, #0
2161; SOFT-NEXT:    beq .LBB24_4
2162; SOFT-NEXT:  @ %bb.3:
2163; SOFT-NEXT:    ldr r4, .LCPI24_1
2164; SOFT-NEXT:  .LBB24_4:
2165; SOFT-NEXT:    mov r0, r4
2166; SOFT-NEXT:    pop {r4, r5, r6, pc}
2167; SOFT-NEXT:    .p2align 2
2168; SOFT-NEXT:  @ %bb.5:
2169; SOFT-NEXT:  .LCPI24_0:
2170; SOFT-NEXT:    .long 1224736736 @ 0x48ffffe0
2171; SOFT-NEXT:  .LCPI24_1:
2172; SOFT-NEXT:    .long 524287 @ 0x7ffff
2173;
2174; VFP2-LABEL: test_signed_i19_f16:
2175; VFP2:       @ %bb.0:
2176; VFP2-NEXT:    .save {r7, lr}
2177; VFP2-NEXT:    push {r7, lr}
2178; VFP2-NEXT:    bl __aeabi_h2f
2179; VFP2-NEXT:    vmov s0, r0
2180; VFP2-NEXT:    vldr s4, .LCPI24_0
2181; VFP2-NEXT:    vcvt.u32.f32 s2, s0
2182; VFP2-NEXT:    vcmp.f32 s0, #0
2183; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2184; VFP2-NEXT:    vcmp.f32 s0, s4
2185; VFP2-NEXT:    vmov r0, s2
2186; VFP2-NEXT:    it lt
2187; VFP2-NEXT:    movlt r0, #0
2188; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2189; VFP2-NEXT:    itt gt
2190; VFP2-NEXT:    movwgt r0, #65535
2191; VFP2-NEXT:    movtgt r0, #7
2192; VFP2-NEXT:    pop {r7, pc}
2193; VFP2-NEXT:    .p2align 2
2194; VFP2-NEXT:  @ %bb.1:
2195; VFP2-NEXT:  .LCPI24_0:
2196; VFP2-NEXT:    .long 0x48ffffe0 @ float 524287
2197;
2198; FP16-LABEL: test_signed_i19_f16:
2199; FP16:       @ %bb.0:
2200; FP16-NEXT:    vmov.f16 s0, r0
2201; FP16-NEXT:    vldr s4, .LCPI24_1
2202; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2203; FP16-NEXT:    vldr s2, .LCPI24_0
2204; FP16-NEXT:    vmaxnm.f32 s0, s0, s4
2205; FP16-NEXT:    vminnm.f32 s0, s0, s2
2206; FP16-NEXT:    vcvt.u32.f32 s0, s0
2207; FP16-NEXT:    vmov r0, s0
2208; FP16-NEXT:    bx lr
2209; FP16-NEXT:    .p2align 2
2210; FP16-NEXT:  @ %bb.1:
2211; FP16-NEXT:  .LCPI24_0:
2212; FP16-NEXT:    .long 0x48ffffe0 @ float 524287
2213; FP16-NEXT:  .LCPI24_1:
2214; FP16-NEXT:    .long 0x00000000 @ float 0
2215    %x = call i19 @llvm.fptoui.sat.i19.f16(half %f)
2216    ret i19 %x
2217}
2218
2219define i32 @test_signed_i32_f16(half %f) nounwind {
2220; SOFT-LABEL: test_signed_i32_f16:
2221; SOFT:       @ %bb.0:
2222; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2223; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2224; SOFT-NEXT:    .pad #4
2225; SOFT-NEXT:    sub sp, #4
2226; SOFT-NEXT:    uxth r0, r0
2227; SOFT-NEXT:    bl __aeabi_h2f
2228; SOFT-NEXT:    mov r6, r0
2229; SOFT-NEXT:    movs r4, #0
2230; SOFT-NEXT:    mov r1, r4
2231; SOFT-NEXT:    bl __aeabi_fcmpge
2232; SOFT-NEXT:    mov r7, r0
2233; SOFT-NEXT:    mov r0, r6
2234; SOFT-NEXT:    bl __aeabi_f2uiz
2235; SOFT-NEXT:    mov r5, r0
2236; SOFT-NEXT:    cmp r7, #0
2237; SOFT-NEXT:    bne .LBB25_2
2238; SOFT-NEXT:  @ %bb.1:
2239; SOFT-NEXT:    mov r5, r7
2240; SOFT-NEXT:  .LBB25_2:
2241; SOFT-NEXT:    ldr r1, .LCPI25_0
2242; SOFT-NEXT:    mov r0, r6
2243; SOFT-NEXT:    bl __aeabi_fcmpgt
2244; SOFT-NEXT:    cmp r0, #0
2245; SOFT-NEXT:    beq .LBB25_4
2246; SOFT-NEXT:  @ %bb.3:
2247; SOFT-NEXT:    mvns r5, r4
2248; SOFT-NEXT:  .LBB25_4:
2249; SOFT-NEXT:    mov r0, r5
2250; SOFT-NEXT:    add sp, #4
2251; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2252; SOFT-NEXT:    .p2align 2
2253; SOFT-NEXT:  @ %bb.5:
2254; SOFT-NEXT:  .LCPI25_0:
2255; SOFT-NEXT:    .long 1333788671 @ 0x4f7fffff
2256;
2257; VFP2-LABEL: test_signed_i32_f16:
2258; VFP2:       @ %bb.0:
2259; VFP2-NEXT:    .save {r7, lr}
2260; VFP2-NEXT:    push {r7, lr}
2261; VFP2-NEXT:    bl __aeabi_h2f
2262; VFP2-NEXT:    vmov s0, r0
2263; VFP2-NEXT:    vcvt.u32.f32 s0, s0
2264; VFP2-NEXT:    vmov r0, s0
2265; VFP2-NEXT:    pop {r7, pc}
2266;
2267; FP16-LABEL: test_signed_i32_f16:
2268; FP16:       @ %bb.0:
2269; FP16-NEXT:    vmov.f16 s0, r0
2270; FP16-NEXT:    vcvt.u32.f16 s0, s0
2271; FP16-NEXT:    vmov r0, s0
2272; FP16-NEXT:    bx lr
2273    %x = call i32 @llvm.fptoui.sat.i32.f16(half %f)
2274    ret i32 %x
2275}
2276
2277define i50 @test_signed_i50_f16(half %f) nounwind {
2278; SOFT-LABEL: test_signed_i50_f16:
2279; SOFT:       @ %bb.0:
2280; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2281; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2282; SOFT-NEXT:    .pad #4
2283; SOFT-NEXT:    sub sp, #4
2284; SOFT-NEXT:    uxth r0, r0
2285; SOFT-NEXT:    bl __aeabi_h2f
2286; SOFT-NEXT:    mov r6, r0
2287; SOFT-NEXT:    movs r5, #0
2288; SOFT-NEXT:    mov r1, r5
2289; SOFT-NEXT:    bl __aeabi_fcmpge
2290; SOFT-NEXT:    mov r4, r0
2291; SOFT-NEXT:    mov r0, r6
2292; SOFT-NEXT:    bl __aeabi_f2ulz
2293; SOFT-NEXT:    mov r7, r1
2294; SOFT-NEXT:    cmp r4, #0
2295; SOFT-NEXT:    bne .LBB26_2
2296; SOFT-NEXT:  @ %bb.1:
2297; SOFT-NEXT:    mov r7, r4
2298; SOFT-NEXT:  .LBB26_2:
2299; SOFT-NEXT:    bne .LBB26_4
2300; SOFT-NEXT:  @ %bb.3:
2301; SOFT-NEXT:    mov r0, r4
2302; SOFT-NEXT:  .LBB26_4:
2303; SOFT-NEXT:    mov r4, r0
2304; SOFT-NEXT:    ldr r1, .LCPI26_0
2305; SOFT-NEXT:    mov r0, r6
2306; SOFT-NEXT:    bl __aeabi_fcmpgt
2307; SOFT-NEXT:    mov r1, r0
2308; SOFT-NEXT:    mvns r0, r5
2309; SOFT-NEXT:    cmp r1, #0
2310; SOFT-NEXT:    bne .LBB26_6
2311; SOFT-NEXT:  @ %bb.5:
2312; SOFT-NEXT:    mov r0, r4
2313; SOFT-NEXT:  .LBB26_6:
2314; SOFT-NEXT:    beq .LBB26_8
2315; SOFT-NEXT:  @ %bb.7:
2316; SOFT-NEXT:    ldr r7, .LCPI26_1
2317; SOFT-NEXT:  .LBB26_8:
2318; SOFT-NEXT:    mov r1, r7
2319; SOFT-NEXT:    add sp, #4
2320; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2321; SOFT-NEXT:    .p2align 2
2322; SOFT-NEXT:  @ %bb.9:
2323; SOFT-NEXT:  .LCPI26_0:
2324; SOFT-NEXT:    .long 1484783615 @ 0x587fffff
2325; SOFT-NEXT:  .LCPI26_1:
2326; SOFT-NEXT:    .long 262143 @ 0x3ffff
2327;
2328; VFP2-LABEL: test_signed_i50_f16:
2329; VFP2:       @ %bb.0:
2330; VFP2-NEXT:    .save {r4, lr}
2331; VFP2-NEXT:    push {r4, lr}
2332; VFP2-NEXT:    bl __aeabi_h2f
2333; VFP2-NEXT:    mov r4, r0
2334; VFP2-NEXT:    bl __aeabi_f2ulz
2335; VFP2-NEXT:    vmov s0, r4
2336; VFP2-NEXT:    vldr s2, .LCPI26_0
2337; VFP2-NEXT:    vcmp.f32 s0, #0
2338; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2339; VFP2-NEXT:    itt lt
2340; VFP2-NEXT:    movlt r1, #0
2341; VFP2-NEXT:    movlt r0, #0
2342; VFP2-NEXT:    vcmp.f32 s0, s2
2343; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2344; VFP2-NEXT:    ittt gt
2345; VFP2-NEXT:    movwgt r1, #65535
2346; VFP2-NEXT:    movtgt r1, #3
2347; VFP2-NEXT:    movgt.w r0, #-1
2348; VFP2-NEXT:    pop {r4, pc}
2349; VFP2-NEXT:    .p2align 2
2350; VFP2-NEXT:  @ %bb.1:
2351; VFP2-NEXT:  .LCPI26_0:
2352; VFP2-NEXT:    .long 0x587fffff @ float 1.12589984E+15
2353;
2354; FP16-LABEL: test_signed_i50_f16:
2355; FP16:       @ %bb.0:
2356; FP16-NEXT:    .save {r7, lr}
2357; FP16-NEXT:    push {r7, lr}
2358; FP16-NEXT:    .vsave {d8}
2359; FP16-NEXT:    vpush {d8}
2360; FP16-NEXT:    vmov.f16 s0, r0
2361; FP16-NEXT:    vcvtb.f32.f16 s16, s0
2362; FP16-NEXT:    vmov r0, s16
2363; FP16-NEXT:    bl __aeabi_f2ulz
2364; FP16-NEXT:    vldr s0, .LCPI26_0
2365; FP16-NEXT:    vcmp.f32 s16, #0
2366; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2367; FP16-NEXT:    itt lt
2368; FP16-NEXT:    movlt r1, #0
2369; FP16-NEXT:    movlt r0, #0
2370; FP16-NEXT:    vcmp.f32 s16, s0
2371; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2372; FP16-NEXT:    ittt gt
2373; FP16-NEXT:    movwgt r1, #65535
2374; FP16-NEXT:    movtgt r1, #3
2375; FP16-NEXT:    movgt.w r0, #-1
2376; FP16-NEXT:    vpop {d8}
2377; FP16-NEXT:    pop {r7, pc}
2378; FP16-NEXT:    .p2align 2
2379; FP16-NEXT:  @ %bb.1:
2380; FP16-NEXT:  .LCPI26_0:
2381; FP16-NEXT:    .long 0x587fffff @ float 1.12589984E+15
2382    %x = call i50 @llvm.fptoui.sat.i50.f16(half %f)
2383    ret i50 %x
2384}
2385
2386define i64 @test_signed_i64_f16(half %f) nounwind {
2387; SOFT-LABEL: test_signed_i64_f16:
2388; SOFT:       @ %bb.0:
2389; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2390; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2391; SOFT-NEXT:    .pad #4
2392; SOFT-NEXT:    sub sp, #4
2393; SOFT-NEXT:    uxth r0, r0
2394; SOFT-NEXT:    bl __aeabi_h2f
2395; SOFT-NEXT:    mov r6, r0
2396; SOFT-NEXT:    movs r4, #0
2397; SOFT-NEXT:    mov r1, r4
2398; SOFT-NEXT:    bl __aeabi_fcmpge
2399; SOFT-NEXT:    mov r5, r0
2400; SOFT-NEXT:    mov r0, r6
2401; SOFT-NEXT:    bl __aeabi_f2ulz
2402; SOFT-NEXT:    mov r7, r0
2403; SOFT-NEXT:    cmp r5, #0
2404; SOFT-NEXT:    bne .LBB27_2
2405; SOFT-NEXT:  @ %bb.1:
2406; SOFT-NEXT:    mov r1, r5
2407; SOFT-NEXT:  .LBB27_2:
2408; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
2409; SOFT-NEXT:    bne .LBB27_4
2410; SOFT-NEXT:  @ %bb.3:
2411; SOFT-NEXT:    mov r7, r5
2412; SOFT-NEXT:  .LBB27_4:
2413; SOFT-NEXT:    ldr r1, .LCPI27_0
2414; SOFT-NEXT:    mov r0, r6
2415; SOFT-NEXT:    bl __aeabi_fcmpgt
2416; SOFT-NEXT:    mvns r1, r4
2417; SOFT-NEXT:    cmp r0, #0
2418; SOFT-NEXT:    mov r0, r1
2419; SOFT-NEXT:    beq .LBB27_7
2420; SOFT-NEXT:  @ %bb.5:
2421; SOFT-NEXT:    beq .LBB27_8
2422; SOFT-NEXT:  .LBB27_6:
2423; SOFT-NEXT:    add sp, #4
2424; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2425; SOFT-NEXT:  .LBB27_7:
2426; SOFT-NEXT:    mov r0, r7
2427; SOFT-NEXT:    bne .LBB27_6
2428; SOFT-NEXT:  .LBB27_8:
2429; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
2430; SOFT-NEXT:    add sp, #4
2431; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2432; SOFT-NEXT:    .p2align 2
2433; SOFT-NEXT:  @ %bb.9:
2434; SOFT-NEXT:  .LCPI27_0:
2435; SOFT-NEXT:    .long 1602224127 @ 0x5f7fffff
2436;
2437; VFP2-LABEL: test_signed_i64_f16:
2438; VFP2:       @ %bb.0:
2439; VFP2-NEXT:    .save {r4, lr}
2440; VFP2-NEXT:    push {r4, lr}
2441; VFP2-NEXT:    bl __aeabi_h2f
2442; VFP2-NEXT:    mov r4, r0
2443; VFP2-NEXT:    bl __aeabi_f2ulz
2444; VFP2-NEXT:    vmov s0, r4
2445; VFP2-NEXT:    vldr s2, .LCPI27_0
2446; VFP2-NEXT:    vcmp.f32 s0, #0
2447; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2448; VFP2-NEXT:    itt lt
2449; VFP2-NEXT:    movlt r1, #0
2450; VFP2-NEXT:    movlt r0, #0
2451; VFP2-NEXT:    vcmp.f32 s0, s2
2452; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2453; VFP2-NEXT:    itt gt
2454; VFP2-NEXT:    movgt.w r0, #-1
2455; VFP2-NEXT:    movgt.w r1, #-1
2456; VFP2-NEXT:    pop {r4, pc}
2457; VFP2-NEXT:    .p2align 2
2458; VFP2-NEXT:  @ %bb.1:
2459; VFP2-NEXT:  .LCPI27_0:
2460; VFP2-NEXT:    .long 0x5f7fffff @ float 1.8446743E+19
2461;
2462; FP16-LABEL: test_signed_i64_f16:
2463; FP16:       @ %bb.0:
2464; FP16-NEXT:    .save {r7, lr}
2465; FP16-NEXT:    push {r7, lr}
2466; FP16-NEXT:    .vsave {d8}
2467; FP16-NEXT:    vpush {d8}
2468; FP16-NEXT:    vmov.f16 s0, r0
2469; FP16-NEXT:    vcvtb.f32.f16 s16, s0
2470; FP16-NEXT:    vmov r0, s16
2471; FP16-NEXT:    bl __aeabi_f2ulz
2472; FP16-NEXT:    vldr s0, .LCPI27_0
2473; FP16-NEXT:    vcmp.f32 s16, #0
2474; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2475; FP16-NEXT:    itt lt
2476; FP16-NEXT:    movlt r1, #0
2477; FP16-NEXT:    movlt r0, #0
2478; FP16-NEXT:    vcmp.f32 s16, s0
2479; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2480; FP16-NEXT:    itt gt
2481; FP16-NEXT:    movgt.w r0, #-1
2482; FP16-NEXT:    movgt.w r1, #-1
2483; FP16-NEXT:    vpop {d8}
2484; FP16-NEXT:    pop {r7, pc}
2485; FP16-NEXT:    .p2align 2
2486; FP16-NEXT:  @ %bb.1:
2487; FP16-NEXT:  .LCPI27_0:
2488; FP16-NEXT:    .long 0x5f7fffff @ float 1.8446743E+19
2489    %x = call i64 @llvm.fptoui.sat.i64.f16(half %f)
2490    ret i64 %x
2491}
2492
2493define i100 @test_signed_i100_f16(half %f) nounwind {
2494; SOFT-LABEL: test_signed_i100_f16:
2495; SOFT:       @ %bb.0:
2496; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2497; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2498; SOFT-NEXT:    .pad #12
2499; SOFT-NEXT:    sub sp, #12
2500; SOFT-NEXT:    uxth r0, r0
2501; SOFT-NEXT:    bl __aeabi_h2f
2502; SOFT-NEXT:    mov r4, r0
2503; SOFT-NEXT:    movs r6, #0
2504; SOFT-NEXT:    mov r1, r6
2505; SOFT-NEXT:    bl __aeabi_fcmpge
2506; SOFT-NEXT:    mov r7, r0
2507; SOFT-NEXT:    mov r0, r4
2508; SOFT-NEXT:    bl __fixunssfti
2509; SOFT-NEXT:    mov r5, r0
2510; SOFT-NEXT:    cmp r7, #0
2511; SOFT-NEXT:    beq .LBB28_11
2512; SOFT-NEXT:  @ %bb.1:
2513; SOFT-NEXT:    beq .LBB28_12
2514; SOFT-NEXT:  .LBB28_2:
2515; SOFT-NEXT:    bne .LBB28_4
2516; SOFT-NEXT:  .LBB28_3:
2517; SOFT-NEXT:    mov r1, r7
2518; SOFT-NEXT:  .LBB28_4:
2519; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
2520; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
2521; SOFT-NEXT:    str r3, [sp, #8] @ 4-byte Spill
2522; SOFT-NEXT:    bne .LBB28_6
2523; SOFT-NEXT:  @ %bb.5:
2524; SOFT-NEXT:    mov r5, r7
2525; SOFT-NEXT:  .LBB28_6:
2526; SOFT-NEXT:    ldr r1, .LCPI28_0
2527; SOFT-NEXT:    mov r0, r4
2528; SOFT-NEXT:    bl __aeabi_fcmpgt
2529; SOFT-NEXT:    mvns r2, r6
2530; SOFT-NEXT:    movs r3, #15
2531; SOFT-NEXT:    cmp r0, #0
2532; SOFT-NEXT:    mov r0, r2
2533; SOFT-NEXT:    beq .LBB28_13
2534; SOFT-NEXT:  @ %bb.7:
2535; SOFT-NEXT:    mov r1, r2
2536; SOFT-NEXT:    beq .LBB28_14
2537; SOFT-NEXT:  .LBB28_8:
2538; SOFT-NEXT:    beq .LBB28_15
2539; SOFT-NEXT:  .LBB28_9:
2540; SOFT-NEXT:    beq .LBB28_16
2541; SOFT-NEXT:  .LBB28_10:
2542; SOFT-NEXT:    add sp, #12
2543; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2544; SOFT-NEXT:  .LBB28_11:
2545; SOFT-NEXT:    mov r3, r7
2546; SOFT-NEXT:    bne .LBB28_2
2547; SOFT-NEXT:  .LBB28_12:
2548; SOFT-NEXT:    mov r2, r7
2549; SOFT-NEXT:    beq .LBB28_3
2550; SOFT-NEXT:    b .LBB28_4
2551; SOFT-NEXT:  .LBB28_13:
2552; SOFT-NEXT:    mov r0, r5
2553; SOFT-NEXT:    mov r1, r2
2554; SOFT-NEXT:    bne .LBB28_8
2555; SOFT-NEXT:  .LBB28_14:
2556; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
2557; SOFT-NEXT:    bne .LBB28_9
2558; SOFT-NEXT:  .LBB28_15:
2559; SOFT-NEXT:    ldr r2, [sp, #4] @ 4-byte Reload
2560; SOFT-NEXT:    bne .LBB28_10
2561; SOFT-NEXT:  .LBB28_16:
2562; SOFT-NEXT:    ldr r3, [sp, #8] @ 4-byte Reload
2563; SOFT-NEXT:    add sp, #12
2564; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2565; SOFT-NEXT:    .p2align 2
2566; SOFT-NEXT:  @ %bb.17:
2567; SOFT-NEXT:  .LCPI28_0:
2568; SOFT-NEXT:    .long 1904214015 @ 0x717fffff
2569;
2570; VFP2-LABEL: test_signed_i100_f16:
2571; VFP2:       @ %bb.0:
2572; VFP2-NEXT:    .save {r4, lr}
2573; VFP2-NEXT:    push {r4, lr}
2574; VFP2-NEXT:    bl __aeabi_h2f
2575; VFP2-NEXT:    mov r4, r0
2576; VFP2-NEXT:    bl __fixunssfti
2577; VFP2-NEXT:    vmov s0, r4
2578; VFP2-NEXT:    vldr s2, .LCPI28_0
2579; VFP2-NEXT:    vcmp.f32 s0, #0
2580; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2581; VFP2-NEXT:    itttt lt
2582; VFP2-NEXT:    movlt r3, #0
2583; VFP2-NEXT:    movlt r2, #0
2584; VFP2-NEXT:    movlt r1, #0
2585; VFP2-NEXT:    movlt r0, #0
2586; VFP2-NEXT:    vcmp.f32 s0, s2
2587; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2588; VFP2-NEXT:    itttt gt
2589; VFP2-NEXT:    movgt.w r0, #-1
2590; VFP2-NEXT:    movgt.w r1, #-1
2591; VFP2-NEXT:    movgt.w r2, #-1
2592; VFP2-NEXT:    movgt r3, #15
2593; VFP2-NEXT:    pop {r4, pc}
2594; VFP2-NEXT:    .p2align 2
2595; VFP2-NEXT:  @ %bb.1:
2596; VFP2-NEXT:  .LCPI28_0:
2597; VFP2-NEXT:    .long 0x717fffff @ float 1.26765052E+30
2598;
2599; FP16-LABEL: test_signed_i100_f16:
2600; FP16:       @ %bb.0:
2601; FP16-NEXT:    .save {r7, lr}
2602; FP16-NEXT:    push {r7, lr}
2603; FP16-NEXT:    .vsave {d8}
2604; FP16-NEXT:    vpush {d8}
2605; FP16-NEXT:    vmov.f16 s0, r0
2606; FP16-NEXT:    vcvtb.f32.f16 s16, s0
2607; FP16-NEXT:    vmov r0, s16
2608; FP16-NEXT:    bl __fixunssfti
2609; FP16-NEXT:    vldr s0, .LCPI28_0
2610; FP16-NEXT:    vcmp.f32 s16, #0
2611; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2612; FP16-NEXT:    itttt lt
2613; FP16-NEXT:    movlt r3, #0
2614; FP16-NEXT:    movlt r2, #0
2615; FP16-NEXT:    movlt r1, #0
2616; FP16-NEXT:    movlt r0, #0
2617; FP16-NEXT:    vcmp.f32 s16, s0
2618; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2619; FP16-NEXT:    itttt gt
2620; FP16-NEXT:    movgt.w r0, #-1
2621; FP16-NEXT:    movgt.w r1, #-1
2622; FP16-NEXT:    movgt.w r2, #-1
2623; FP16-NEXT:    movgt r3, #15
2624; FP16-NEXT:    vpop {d8}
2625; FP16-NEXT:    pop {r7, pc}
2626; FP16-NEXT:    .p2align 2
2627; FP16-NEXT:  @ %bb.1:
2628; FP16-NEXT:  .LCPI28_0:
2629; FP16-NEXT:    .long 0x717fffff @ float 1.26765052E+30
2630    %x = call i100 @llvm.fptoui.sat.i100.f16(half %f)
2631    ret i100 %x
2632}
2633
2634define i128 @test_signed_i128_f16(half %f) nounwind {
2635; SOFT-LABEL: test_signed_i128_f16:
2636; SOFT:       @ %bb.0:
2637; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2638; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2639; SOFT-NEXT:    .pad #12
2640; SOFT-NEXT:    sub sp, #12
2641; SOFT-NEXT:    uxth r0, r0
2642; SOFT-NEXT:    bl __aeabi_h2f
2643; SOFT-NEXT:    mov r4, r0
2644; SOFT-NEXT:    movs r6, #0
2645; SOFT-NEXT:    mov r1, r6
2646; SOFT-NEXT:    bl __aeabi_fcmpge
2647; SOFT-NEXT:    mov r7, r0
2648; SOFT-NEXT:    mov r0, r4
2649; SOFT-NEXT:    bl __fixunssfti
2650; SOFT-NEXT:    mov r5, r0
2651; SOFT-NEXT:    cmp r7, #0
2652; SOFT-NEXT:    beq .LBB29_11
2653; SOFT-NEXT:  @ %bb.1:
2654; SOFT-NEXT:    beq .LBB29_12
2655; SOFT-NEXT:  .LBB29_2:
2656; SOFT-NEXT:    bne .LBB29_4
2657; SOFT-NEXT:  .LBB29_3:
2658; SOFT-NEXT:    mov r1, r7
2659; SOFT-NEXT:  .LBB29_4:
2660; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
2661; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
2662; SOFT-NEXT:    str r3, [sp, #8] @ 4-byte Spill
2663; SOFT-NEXT:    bne .LBB29_6
2664; SOFT-NEXT:  @ %bb.5:
2665; SOFT-NEXT:    mov r5, r7
2666; SOFT-NEXT:  .LBB29_6:
2667; SOFT-NEXT:    ldr r1, .LCPI29_0
2668; SOFT-NEXT:    mov r0, r4
2669; SOFT-NEXT:    bl __aeabi_fcmpgt
2670; SOFT-NEXT:    mvns r3, r6
2671; SOFT-NEXT:    cmp r0, #0
2672; SOFT-NEXT:    mov r0, r3
2673; SOFT-NEXT:    beq .LBB29_13
2674; SOFT-NEXT:  @ %bb.7:
2675; SOFT-NEXT:    mov r1, r3
2676; SOFT-NEXT:    beq .LBB29_14
2677; SOFT-NEXT:  .LBB29_8:
2678; SOFT-NEXT:    mov r2, r3
2679; SOFT-NEXT:    beq .LBB29_15
2680; SOFT-NEXT:  .LBB29_9:
2681; SOFT-NEXT:    beq .LBB29_16
2682; SOFT-NEXT:  .LBB29_10:
2683; SOFT-NEXT:    add sp, #12
2684; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2685; SOFT-NEXT:  .LBB29_11:
2686; SOFT-NEXT:    mov r3, r7
2687; SOFT-NEXT:    bne .LBB29_2
2688; SOFT-NEXT:  .LBB29_12:
2689; SOFT-NEXT:    mov r2, r7
2690; SOFT-NEXT:    beq .LBB29_3
2691; SOFT-NEXT:    b .LBB29_4
2692; SOFT-NEXT:  .LBB29_13:
2693; SOFT-NEXT:    mov r0, r5
2694; SOFT-NEXT:    mov r1, r3
2695; SOFT-NEXT:    bne .LBB29_8
2696; SOFT-NEXT:  .LBB29_14:
2697; SOFT-NEXT:    ldr r1, [sp] @ 4-byte Reload
2698; SOFT-NEXT:    mov r2, r3
2699; SOFT-NEXT:    bne .LBB29_9
2700; SOFT-NEXT:  .LBB29_15:
2701; SOFT-NEXT:    ldr r2, [sp, #4] @ 4-byte Reload
2702; SOFT-NEXT:    bne .LBB29_10
2703; SOFT-NEXT:  .LBB29_16:
2704; SOFT-NEXT:    ldr r3, [sp, #8] @ 4-byte Reload
2705; SOFT-NEXT:    add sp, #12
2706; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2707; SOFT-NEXT:    .p2align 2
2708; SOFT-NEXT:  @ %bb.17:
2709; SOFT-NEXT:  .LCPI29_0:
2710; SOFT-NEXT:    .long 2139095039 @ 0x7f7fffff
2711;
2712; VFP2-LABEL: test_signed_i128_f16:
2713; VFP2:       @ %bb.0:
2714; VFP2-NEXT:    .save {r4, lr}
2715; VFP2-NEXT:    push {r4, lr}
2716; VFP2-NEXT:    bl __aeabi_h2f
2717; VFP2-NEXT:    mov r4, r0
2718; VFP2-NEXT:    bl __fixunssfti
2719; VFP2-NEXT:    vmov s0, r4
2720; VFP2-NEXT:    vldr s2, .LCPI29_0
2721; VFP2-NEXT:    vcmp.f32 s0, #0
2722; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2723; VFP2-NEXT:    itttt lt
2724; VFP2-NEXT:    movlt r3, #0
2725; VFP2-NEXT:    movlt r2, #0
2726; VFP2-NEXT:    movlt r1, #0
2727; VFP2-NEXT:    movlt r0, #0
2728; VFP2-NEXT:    vcmp.f32 s0, s2
2729; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2730; VFP2-NEXT:    itttt gt
2731; VFP2-NEXT:    movgt.w r0, #-1
2732; VFP2-NEXT:    movgt.w r1, #-1
2733; VFP2-NEXT:    movgt.w r2, #-1
2734; VFP2-NEXT:    movgt.w r3, #-1
2735; VFP2-NEXT:    pop {r4, pc}
2736; VFP2-NEXT:    .p2align 2
2737; VFP2-NEXT:  @ %bb.1:
2738; VFP2-NEXT:  .LCPI29_0:
2739; VFP2-NEXT:    .long 0x7f7fffff @ float 3.40282347E+38
2740;
2741; FP16-LABEL: test_signed_i128_f16:
2742; FP16:       @ %bb.0:
2743; FP16-NEXT:    .save {r7, lr}
2744; FP16-NEXT:    push {r7, lr}
2745; FP16-NEXT:    .vsave {d8}
2746; FP16-NEXT:    vpush {d8}
2747; FP16-NEXT:    vmov.f16 s0, r0
2748; FP16-NEXT:    vcvtb.f32.f16 s16, s0
2749; FP16-NEXT:    vmov r0, s16
2750; FP16-NEXT:    bl __fixunssfti
2751; FP16-NEXT:    vldr s0, .LCPI29_0
2752; FP16-NEXT:    vcmp.f32 s16, #0
2753; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2754; FP16-NEXT:    itttt lt
2755; FP16-NEXT:    movlt r3, #0
2756; FP16-NEXT:    movlt r2, #0
2757; FP16-NEXT:    movlt r1, #0
2758; FP16-NEXT:    movlt r0, #0
2759; FP16-NEXT:    vcmp.f32 s16, s0
2760; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2761; FP16-NEXT:    itttt gt
2762; FP16-NEXT:    movgt.w r0, #-1
2763; FP16-NEXT:    movgt.w r1, #-1
2764; FP16-NEXT:    movgt.w r2, #-1
2765; FP16-NEXT:    movgt.w r3, #-1
2766; FP16-NEXT:    vpop {d8}
2767; FP16-NEXT:    pop {r7, pc}
2768; FP16-NEXT:    .p2align 2
2769; FP16-NEXT:  @ %bb.1:
2770; FP16-NEXT:  .LCPI29_0:
2771; FP16-NEXT:    .long 0x7f7fffff @ float 3.40282347E+38
2772    %x = call i128 @llvm.fptoui.sat.i128.f16(half %f)
2773    ret i128 %x
2774}
2775