xref: /llvm-project/llvm/test/CodeGen/ARM/fptosi-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.fptosi.sat.i1.f32  (float)
11declare   i8 @llvm.fptosi.sat.i8.f32  (float)
12declare  i13 @llvm.fptosi.sat.i13.f32 (float)
13declare  i16 @llvm.fptosi.sat.i16.f32 (float)
14declare  i19 @llvm.fptosi.sat.i19.f32 (float)
15declare  i32 @llvm.fptosi.sat.i32.f32 (float)
16declare  i50 @llvm.fptosi.sat.i50.f32 (float)
17declare  i64 @llvm.fptosi.sat.i64.f32 (float)
18declare i100 @llvm.fptosi.sat.i100.f32(float)
19declare i128 @llvm.fptosi.sat.i128.f32(float)
20
21define i1 @test_signed_i1_f32(float %f) nounwind {
22; SOFT-LABEL: test_signed_i1_f32:
23; SOFT:       @ %bb.0:
24; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
25; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
26; SOFT-NEXT:    .pad #4
27; SOFT-NEXT:    sub sp, #4
28; SOFT-NEXT:    mov r4, r0
29; SOFT-NEXT:    ldr r1, .LCPI0_0
30; SOFT-NEXT:    bl __aeabi_fcmpge
31; SOFT-NEXT:    mov r7, r0
32; SOFT-NEXT:    mov r0, r4
33; SOFT-NEXT:    bl __aeabi_f2iz
34; SOFT-NEXT:    movs r5, #0
35; SOFT-NEXT:    cmp r7, #0
36; SOFT-NEXT:    beq .LBB0_2
37; SOFT-NEXT:  @ %bb.1:
38; SOFT-NEXT:    mov r6, r0
39; SOFT-NEXT:    b .LBB0_3
40; SOFT-NEXT:  .LBB0_2:
41; SOFT-NEXT:    mvns r6, r5
42; SOFT-NEXT:  .LBB0_3:
43; SOFT-NEXT:    mov r0, r4
44; SOFT-NEXT:    mov r1, r5
45; SOFT-NEXT:    bl __aeabi_fcmpgt
46; SOFT-NEXT:    cmp r0, #0
47; SOFT-NEXT:    mov r7, r5
48; SOFT-NEXT:    bne .LBB0_5
49; SOFT-NEXT:  @ %bb.4:
50; SOFT-NEXT:    mov r7, r6
51; SOFT-NEXT:  .LBB0_5:
52; SOFT-NEXT:    mov r0, r4
53; SOFT-NEXT:    mov r1, r4
54; SOFT-NEXT:    bl __aeabi_fcmpun
55; SOFT-NEXT:    cmp r0, #0
56; SOFT-NEXT:    bne .LBB0_7
57; SOFT-NEXT:  @ %bb.6:
58; SOFT-NEXT:    mov r5, r7
59; SOFT-NEXT:  .LBB0_7:
60; SOFT-NEXT:    mov r0, r5
61; SOFT-NEXT:    add sp, #4
62; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
63; SOFT-NEXT:    .p2align 2
64; SOFT-NEXT:  @ %bb.8:
65; SOFT-NEXT:  .LCPI0_0:
66; SOFT-NEXT:    .long 3212836864 @ 0xbf800000
67;
68; VFP2-LABEL: test_signed_i1_f32:
69; VFP2:       @ %bb.0:
70; VFP2-NEXT:    vmov s2, r0
71; VFP2-NEXT:    vmov.f32 s0, #-1.000000e+00
72; VFP2-NEXT:    vcvt.s32.f32 s4, s2
73; VFP2-NEXT:    vcmp.f32 s2, s0
74; VFP2-NEXT:    vmov r0, s4
75; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
76; VFP2-NEXT:    it lt
77; VFP2-NEXT:    movlt.w r0, #-1
78; VFP2-NEXT:    vcmp.f32 s2, #0
79; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
80; VFP2-NEXT:    it gt
81; VFP2-NEXT:    movgt r0, #0
82; VFP2-NEXT:    vcmp.f32 s2, s2
83; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
84; VFP2-NEXT:    it vs
85; VFP2-NEXT:    movvs r0, #0
86; VFP2-NEXT:    bx lr
87;
88; FP16-LABEL: test_signed_i1_f32:
89; FP16:       @ %bb.0:
90; FP16-NEXT:    vmov s2, r0
91; FP16-NEXT:    vldr s4, .LCPI0_0
92; FP16-NEXT:    vmov.f32 s0, #-1.000000e+00
93; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
94; FP16-NEXT:    vcmp.f32 s2, s2
95; FP16-NEXT:    vminnm.f32 s0, s0, s4
96; FP16-NEXT:    vmrs APSR_nzcv, fpscr
97; FP16-NEXT:    vcvt.s32.f32 s0, s0
98; FP16-NEXT:    vmov r0, s0
99; FP16-NEXT:    it vs
100; FP16-NEXT:    movvs r0, #0
101; FP16-NEXT:    bx lr
102; FP16-NEXT:    .p2align 2
103; FP16-NEXT:  @ %bb.1:
104; FP16-NEXT:  .LCPI0_0:
105; FP16-NEXT:    .long 0x00000000 @ float 0
106    %x = call i1 @llvm.fptosi.sat.i1.f32(float %f)
107    ret i1 %x
108}
109
110define i8 @test_signed_i8_f32(float %f) nounwind {
111; SOFT-LABEL: test_signed_i8_f32:
112; SOFT:       @ %bb.0:
113; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
114; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
115; SOFT-NEXT:    .pad #4
116; SOFT-NEXT:    sub sp, #4
117; SOFT-NEXT:    mov r4, r0
118; SOFT-NEXT:    movs r0, #195
119; SOFT-NEXT:    lsls r1, r0, #24
120; SOFT-NEXT:    mov r0, r4
121; SOFT-NEXT:    bl __aeabi_fcmpge
122; SOFT-NEXT:    mov r7, r0
123; SOFT-NEXT:    mov r0, r4
124; SOFT-NEXT:    bl __aeabi_f2iz
125; SOFT-NEXT:    movs r5, #127
126; SOFT-NEXT:    cmp r7, #0
127; SOFT-NEXT:    beq .LBB1_2
128; SOFT-NEXT:  @ %bb.1:
129; SOFT-NEXT:    mov r6, r0
130; SOFT-NEXT:    b .LBB1_3
131; SOFT-NEXT:  .LBB1_2:
132; SOFT-NEXT:    mvns r6, r5
133; SOFT-NEXT:  .LBB1_3:
134; SOFT-NEXT:    ldr r1, .LCPI1_0
135; SOFT-NEXT:    mov r0, r4
136; SOFT-NEXT:    bl __aeabi_fcmpgt
137; SOFT-NEXT:    cmp r0, #0
138; SOFT-NEXT:    bne .LBB1_5
139; SOFT-NEXT:  @ %bb.4:
140; SOFT-NEXT:    mov r5, r6
141; SOFT-NEXT:  .LBB1_5:
142; SOFT-NEXT:    mov r0, r4
143; SOFT-NEXT:    mov r1, r4
144; SOFT-NEXT:    bl __aeabi_fcmpun
145; SOFT-NEXT:    cmp r0, #0
146; SOFT-NEXT:    beq .LBB1_7
147; SOFT-NEXT:  @ %bb.6:
148; SOFT-NEXT:    movs r5, #0
149; SOFT-NEXT:  .LBB1_7:
150; SOFT-NEXT:    mov r0, r5
151; SOFT-NEXT:    add sp, #4
152; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
153; SOFT-NEXT:    .p2align 2
154; SOFT-NEXT:  @ %bb.8:
155; SOFT-NEXT:  .LCPI1_0:
156; SOFT-NEXT:    .long 1123942400 @ 0x42fe0000
157;
158; VFP2-LABEL: test_signed_i8_f32:
159; VFP2:       @ %bb.0:
160; VFP2-NEXT:    vmov s0, r0
161; VFP2-NEXT:    vldr s2, .LCPI1_0
162; VFP2-NEXT:    vldr s6, .LCPI1_1
163; VFP2-NEXT:    vcvt.s32.f32 s4, s0
164; VFP2-NEXT:    vcmp.f32 s0, s2
165; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
166; VFP2-NEXT:    vcmp.f32 s0, s6
167; VFP2-NEXT:    vmov r0, s4
168; VFP2-NEXT:    it lt
169; VFP2-NEXT:    mvnlt r0, #127
170; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
171; VFP2-NEXT:    it gt
172; VFP2-NEXT:    movgt r0, #127
173; VFP2-NEXT:    vcmp.f32 s0, s0
174; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
175; VFP2-NEXT:    it vs
176; VFP2-NEXT:    movvs r0, #0
177; VFP2-NEXT:    bx lr
178; VFP2-NEXT:    .p2align 2
179; VFP2-NEXT:  @ %bb.1:
180; VFP2-NEXT:  .LCPI1_0:
181; VFP2-NEXT:    .long 0xc3000000 @ float -128
182; VFP2-NEXT:  .LCPI1_1:
183; VFP2-NEXT:    .long 0x42fe0000 @ float 127
184;
185; FP16-LABEL: test_signed_i8_f32:
186; FP16:       @ %bb.0:
187; FP16-NEXT:    vldr s0, .LCPI1_0
188; FP16-NEXT:    vmov s2, r0
189; FP16-NEXT:    vldr s4, .LCPI1_1
190; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
191; FP16-NEXT:    vcmp.f32 s2, s2
192; FP16-NEXT:    vminnm.f32 s0, s0, s4
193; FP16-NEXT:    vmrs APSR_nzcv, fpscr
194; FP16-NEXT:    vcvt.s32.f32 s0, s0
195; FP16-NEXT:    vmov r0, s0
196; FP16-NEXT:    it vs
197; FP16-NEXT:    movvs r0, #0
198; FP16-NEXT:    bx lr
199; FP16-NEXT:    .p2align 2
200; FP16-NEXT:  @ %bb.1:
201; FP16-NEXT:  .LCPI1_0:
202; FP16-NEXT:    .long 0xc3000000 @ float -128
203; FP16-NEXT:  .LCPI1_1:
204; FP16-NEXT:    .long 0x42fe0000 @ float 127
205    %x = call i8 @llvm.fptosi.sat.i8.f32(float %f)
206    ret i8 %x
207}
208
209define i13 @test_signed_i13_f32(float %f) nounwind {
210; SOFT-LABEL: test_signed_i13_f32:
211; SOFT:       @ %bb.0:
212; SOFT-NEXT:    .save {r4, r5, r6, lr}
213; SOFT-NEXT:    push {r4, r5, r6, lr}
214; SOFT-NEXT:    mov r4, r0
215; SOFT-NEXT:    ldr r1, .LCPI2_0
216; SOFT-NEXT:    bl __aeabi_fcmpge
217; SOFT-NEXT:    mov r6, r0
218; SOFT-NEXT:    mov r0, r4
219; SOFT-NEXT:    bl __aeabi_f2iz
220; SOFT-NEXT:    cmp r6, #0
221; SOFT-NEXT:    beq .LBB2_2
222; SOFT-NEXT:  @ %bb.1:
223; SOFT-NEXT:    mov r5, r0
224; SOFT-NEXT:    b .LBB2_3
225; SOFT-NEXT:  .LBB2_2:
226; SOFT-NEXT:    ldr r5, .LCPI2_1
227; SOFT-NEXT:  .LBB2_3:
228; SOFT-NEXT:    ldr r1, .LCPI2_2
229; SOFT-NEXT:    mov r0, r4
230; SOFT-NEXT:    bl __aeabi_fcmpgt
231; SOFT-NEXT:    cmp r0, #0
232; SOFT-NEXT:    beq .LBB2_5
233; SOFT-NEXT:  @ %bb.4:
234; SOFT-NEXT:    ldr r5, .LCPI2_3
235; SOFT-NEXT:  .LBB2_5:
236; SOFT-NEXT:    mov r0, r4
237; SOFT-NEXT:    mov r1, r4
238; SOFT-NEXT:    bl __aeabi_fcmpun
239; SOFT-NEXT:    cmp r0, #0
240; SOFT-NEXT:    beq .LBB2_7
241; SOFT-NEXT:  @ %bb.6:
242; SOFT-NEXT:    movs r5, #0
243; SOFT-NEXT:  .LBB2_7:
244; SOFT-NEXT:    mov r0, r5
245; SOFT-NEXT:    pop {r4, r5, r6, pc}
246; SOFT-NEXT:    .p2align 2
247; SOFT-NEXT:  @ %bb.8:
248; SOFT-NEXT:  .LCPI2_0:
249; SOFT-NEXT:    .long 3313500160 @ 0xc5800000
250; SOFT-NEXT:  .LCPI2_1:
251; SOFT-NEXT:    .long 4294963200 @ 0xfffff000
252; SOFT-NEXT:  .LCPI2_2:
253; SOFT-NEXT:    .long 1166012416 @ 0x457ff000
254; SOFT-NEXT:  .LCPI2_3:
255; SOFT-NEXT:    .long 4095 @ 0xfff
256;
257; VFP2-LABEL: test_signed_i13_f32:
258; VFP2:       @ %bb.0:
259; VFP2-NEXT:    vmov s0, r0
260; VFP2-NEXT:    vldr s2, .LCPI2_0
261; VFP2-NEXT:    vldr s6, .LCPI2_1
262; VFP2-NEXT:    vcvt.s32.f32 s4, s0
263; VFP2-NEXT:    vcmp.f32 s0, s2
264; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
265; VFP2-NEXT:    vcmp.f32 s0, s6
266; VFP2-NEXT:    vmov r0, s4
267; VFP2-NEXT:    itt lt
268; VFP2-NEXT:    movwlt r0, #61440
269; VFP2-NEXT:    movtlt r0, #65535
270; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
271; VFP2-NEXT:    it gt
272; VFP2-NEXT:    movwgt r0, #4095
273; VFP2-NEXT:    vcmp.f32 s0, s0
274; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
275; VFP2-NEXT:    it vs
276; VFP2-NEXT:    movvs r0, #0
277; VFP2-NEXT:    bx lr
278; VFP2-NEXT:    .p2align 2
279; VFP2-NEXT:  @ %bb.1:
280; VFP2-NEXT:  .LCPI2_0:
281; VFP2-NEXT:    .long 0xc5800000 @ float -4096
282; VFP2-NEXT:  .LCPI2_1:
283; VFP2-NEXT:    .long 0x457ff000 @ float 4095
284;
285; FP16-LABEL: test_signed_i13_f32:
286; FP16:       @ %bb.0:
287; FP16-NEXT:    vldr s0, .LCPI2_0
288; FP16-NEXT:    vmov s2, r0
289; FP16-NEXT:    vldr s4, .LCPI2_1
290; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
291; FP16-NEXT:    vcmp.f32 s2, s2
292; FP16-NEXT:    vminnm.f32 s0, s0, s4
293; FP16-NEXT:    vmrs APSR_nzcv, fpscr
294; FP16-NEXT:    vcvt.s32.f32 s0, s0
295; FP16-NEXT:    vmov r0, s0
296; FP16-NEXT:    it vs
297; FP16-NEXT:    movvs r0, #0
298; FP16-NEXT:    bx lr
299; FP16-NEXT:    .p2align 2
300; FP16-NEXT:  @ %bb.1:
301; FP16-NEXT:  .LCPI2_0:
302; FP16-NEXT:    .long 0xc5800000 @ float -4096
303; FP16-NEXT:  .LCPI2_1:
304; FP16-NEXT:    .long 0x457ff000 @ float 4095
305    %x = call i13 @llvm.fptosi.sat.i13.f32(float %f)
306    ret i13 %x
307}
308
309define i16 @test_signed_i16_f32(float %f) nounwind {
310; SOFT-LABEL: test_signed_i16_f32:
311; SOFT:       @ %bb.0:
312; SOFT-NEXT:    .save {r4, r5, r6, lr}
313; SOFT-NEXT:    push {r4, r5, r6, lr}
314; SOFT-NEXT:    mov r4, r0
315; SOFT-NEXT:    movs r0, #199
316; SOFT-NEXT:    lsls r1, r0, #24
317; SOFT-NEXT:    mov r0, r4
318; SOFT-NEXT:    bl __aeabi_fcmpge
319; SOFT-NEXT:    mov r6, r0
320; SOFT-NEXT:    mov r0, r4
321; SOFT-NEXT:    bl __aeabi_f2iz
322; SOFT-NEXT:    cmp r6, #0
323; SOFT-NEXT:    beq .LBB3_2
324; SOFT-NEXT:  @ %bb.1:
325; SOFT-NEXT:    mov r5, r0
326; SOFT-NEXT:    b .LBB3_3
327; SOFT-NEXT:  .LBB3_2:
328; SOFT-NEXT:    ldr r5, .LCPI3_0
329; SOFT-NEXT:  .LBB3_3:
330; SOFT-NEXT:    ldr r1, .LCPI3_1
331; SOFT-NEXT:    mov r0, r4
332; SOFT-NEXT:    bl __aeabi_fcmpgt
333; SOFT-NEXT:    cmp r0, #0
334; SOFT-NEXT:    beq .LBB3_5
335; SOFT-NEXT:  @ %bb.4:
336; SOFT-NEXT:    ldr r5, .LCPI3_2
337; SOFT-NEXT:  .LBB3_5:
338; SOFT-NEXT:    mov r0, r4
339; SOFT-NEXT:    mov r1, r4
340; SOFT-NEXT:    bl __aeabi_fcmpun
341; SOFT-NEXT:    cmp r0, #0
342; SOFT-NEXT:    beq .LBB3_7
343; SOFT-NEXT:  @ %bb.6:
344; SOFT-NEXT:    movs r5, #0
345; SOFT-NEXT:  .LBB3_7:
346; SOFT-NEXT:    mov r0, r5
347; SOFT-NEXT:    pop {r4, r5, r6, pc}
348; SOFT-NEXT:    .p2align 2
349; SOFT-NEXT:  @ %bb.8:
350; SOFT-NEXT:  .LCPI3_0:
351; SOFT-NEXT:    .long 4294934528 @ 0xffff8000
352; SOFT-NEXT:  .LCPI3_1:
353; SOFT-NEXT:    .long 1191181824 @ 0x46fffe00
354; SOFT-NEXT:  .LCPI3_2:
355; SOFT-NEXT:    .long 32767 @ 0x7fff
356;
357; VFP2-LABEL: test_signed_i16_f32:
358; VFP2:       @ %bb.0:
359; VFP2-NEXT:    vmov s0, r0
360; VFP2-NEXT:    vldr s2, .LCPI3_0
361; VFP2-NEXT:    vldr s6, .LCPI3_1
362; VFP2-NEXT:    vcvt.s32.f32 s4, s0
363; VFP2-NEXT:    vcmp.f32 s0, s2
364; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
365; VFP2-NEXT:    vcmp.f32 s0, s6
366; VFP2-NEXT:    vmov r0, s4
367; VFP2-NEXT:    itt lt
368; VFP2-NEXT:    movwlt r0, #32768
369; VFP2-NEXT:    movtlt r0, #65535
370; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
371; VFP2-NEXT:    it gt
372; VFP2-NEXT:    movwgt r0, #32767
373; VFP2-NEXT:    vcmp.f32 s0, s0
374; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
375; VFP2-NEXT:    it vs
376; VFP2-NEXT:    movvs r0, #0
377; VFP2-NEXT:    bx lr
378; VFP2-NEXT:    .p2align 2
379; VFP2-NEXT:  @ %bb.1:
380; VFP2-NEXT:  .LCPI3_0:
381; VFP2-NEXT:    .long 0xc7000000 @ float -32768
382; VFP2-NEXT:  .LCPI3_1:
383; VFP2-NEXT:    .long 0x46fffe00 @ float 32767
384;
385; FP16-LABEL: test_signed_i16_f32:
386; FP16:       @ %bb.0:
387; FP16-NEXT:    vldr s0, .LCPI3_0
388; FP16-NEXT:    vmov s2, r0
389; FP16-NEXT:    vldr s4, .LCPI3_1
390; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
391; FP16-NEXT:    vcmp.f32 s2, s2
392; FP16-NEXT:    vminnm.f32 s0, s0, s4
393; FP16-NEXT:    vmrs APSR_nzcv, fpscr
394; FP16-NEXT:    vcvt.s32.f32 s0, s0
395; FP16-NEXT:    vmov r0, s0
396; FP16-NEXT:    it vs
397; FP16-NEXT:    movvs r0, #0
398; FP16-NEXT:    bx lr
399; FP16-NEXT:    .p2align 2
400; FP16-NEXT:  @ %bb.1:
401; FP16-NEXT:  .LCPI3_0:
402; FP16-NEXT:    .long 0xc7000000 @ float -32768
403; FP16-NEXT:  .LCPI3_1:
404; FP16-NEXT:    .long 0x46fffe00 @ float 32767
405    %x = call i16 @llvm.fptosi.sat.i16.f32(float %f)
406    ret i16 %x
407}
408
409define i19 @test_signed_i19_f32(float %f) nounwind {
410; SOFT-LABEL: test_signed_i19_f32:
411; SOFT:       @ %bb.0:
412; SOFT-NEXT:    .save {r4, r5, r6, lr}
413; SOFT-NEXT:    push {r4, r5, r6, lr}
414; SOFT-NEXT:    mov r4, r0
415; SOFT-NEXT:    ldr r1, .LCPI4_0
416; SOFT-NEXT:    bl __aeabi_fcmpge
417; SOFT-NEXT:    mov r6, r0
418; SOFT-NEXT:    mov r0, r4
419; SOFT-NEXT:    bl __aeabi_f2iz
420; SOFT-NEXT:    cmp r6, #0
421; SOFT-NEXT:    beq .LBB4_2
422; SOFT-NEXT:  @ %bb.1:
423; SOFT-NEXT:    mov r5, r0
424; SOFT-NEXT:    b .LBB4_3
425; SOFT-NEXT:  .LBB4_2:
426; SOFT-NEXT:    ldr r5, .LCPI4_1
427; SOFT-NEXT:  .LBB4_3:
428; SOFT-NEXT:    ldr r1, .LCPI4_2
429; SOFT-NEXT:    mov r0, r4
430; SOFT-NEXT:    bl __aeabi_fcmpgt
431; SOFT-NEXT:    cmp r0, #0
432; SOFT-NEXT:    beq .LBB4_5
433; SOFT-NEXT:  @ %bb.4:
434; SOFT-NEXT:    ldr r5, .LCPI4_3
435; SOFT-NEXT:  .LBB4_5:
436; SOFT-NEXT:    mov r0, r4
437; SOFT-NEXT:    mov r1, r4
438; SOFT-NEXT:    bl __aeabi_fcmpun
439; SOFT-NEXT:    cmp r0, #0
440; SOFT-NEXT:    beq .LBB4_7
441; SOFT-NEXT:  @ %bb.6:
442; SOFT-NEXT:    movs r5, #0
443; SOFT-NEXT:  .LBB4_7:
444; SOFT-NEXT:    mov r0, r5
445; SOFT-NEXT:    pop {r4, r5, r6, pc}
446; SOFT-NEXT:    .p2align 2
447; SOFT-NEXT:  @ %bb.8:
448; SOFT-NEXT:  .LCPI4_0:
449; SOFT-NEXT:    .long 3363831808 @ 0xc8800000
450; SOFT-NEXT:  .LCPI4_1:
451; SOFT-NEXT:    .long 4294705152 @ 0xfffc0000
452; SOFT-NEXT:  .LCPI4_2:
453; SOFT-NEXT:    .long 1216348096 @ 0x487fffc0
454; SOFT-NEXT:  .LCPI4_3:
455; SOFT-NEXT:    .long 262143 @ 0x3ffff
456;
457; VFP2-LABEL: test_signed_i19_f32:
458; VFP2:       @ %bb.0:
459; VFP2-NEXT:    vmov s0, r0
460; VFP2-NEXT:    vldr s2, .LCPI4_0
461; VFP2-NEXT:    vldr s6, .LCPI4_1
462; VFP2-NEXT:    vcvt.s32.f32 s4, s0
463; VFP2-NEXT:    vcmp.f32 s0, s2
464; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
465; VFP2-NEXT:    vcmp.f32 s0, s6
466; VFP2-NEXT:    vmov r0, s4
467; VFP2-NEXT:    itt lt
468; VFP2-NEXT:    movlt r0, #0
469; VFP2-NEXT:    movtlt r0, #65532
470; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
471; VFP2-NEXT:    vcmp.f32 s0, s0
472; VFP2-NEXT:    itt gt
473; VFP2-NEXT:    movwgt r0, #65535
474; VFP2-NEXT:    movtgt r0, #3
475; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
476; VFP2-NEXT:    it vs
477; VFP2-NEXT:    movvs r0, #0
478; VFP2-NEXT:    bx lr
479; VFP2-NEXT:    .p2align 2
480; VFP2-NEXT:  @ %bb.1:
481; VFP2-NEXT:  .LCPI4_0:
482; VFP2-NEXT:    .long 0xc8800000 @ float -262144
483; VFP2-NEXT:  .LCPI4_1:
484; VFP2-NEXT:    .long 0x487fffc0 @ float 262143
485;
486; FP16-LABEL: test_signed_i19_f32:
487; FP16:       @ %bb.0:
488; FP16-NEXT:    vldr s0, .LCPI4_0
489; FP16-NEXT:    vmov s2, r0
490; FP16-NEXT:    vldr s4, .LCPI4_1
491; FP16-NEXT:    vmaxnm.f32 s0, s2, s0
492; FP16-NEXT:    vcmp.f32 s2, s2
493; FP16-NEXT:    vminnm.f32 s0, s0, s4
494; FP16-NEXT:    vmrs APSR_nzcv, fpscr
495; FP16-NEXT:    vcvt.s32.f32 s0, s0
496; FP16-NEXT:    vmov r0, s0
497; FP16-NEXT:    it vs
498; FP16-NEXT:    movvs r0, #0
499; FP16-NEXT:    bx lr
500; FP16-NEXT:    .p2align 2
501; FP16-NEXT:  @ %bb.1:
502; FP16-NEXT:  .LCPI4_0:
503; FP16-NEXT:    .long 0xc8800000 @ float -262144
504; FP16-NEXT:  .LCPI4_1:
505; FP16-NEXT:    .long 0x487fffc0 @ float 262143
506    %x = call i19 @llvm.fptosi.sat.i19.f32(float %f)
507    ret i19 %x
508}
509
510define i32 @test_signed_i32_f32(float %f) nounwind {
511; SOFT-LABEL: test_signed_i32_f32:
512; SOFT:       @ %bb.0:
513; SOFT-NEXT:    .save {r4, r5, r6, lr}
514; SOFT-NEXT:    push {r4, r5, r6, lr}
515; SOFT-NEXT:    mov r4, r0
516; SOFT-NEXT:    movs r0, #207
517; SOFT-NEXT:    lsls r1, r0, #24
518; SOFT-NEXT:    mov r0, r4
519; SOFT-NEXT:    bl __aeabi_fcmpge
520; SOFT-NEXT:    mov r6, r0
521; SOFT-NEXT:    mov r0, r4
522; SOFT-NEXT:    bl __aeabi_f2iz
523; SOFT-NEXT:    cmp r6, #0
524; SOFT-NEXT:    beq .LBB5_2
525; SOFT-NEXT:  @ %bb.1:
526; SOFT-NEXT:    mov r5, r0
527; SOFT-NEXT:    b .LBB5_3
528; SOFT-NEXT:  .LBB5_2:
529; SOFT-NEXT:    movs r0, #1
530; SOFT-NEXT:    lsls r5, r0, #31
531; SOFT-NEXT:  .LBB5_3:
532; SOFT-NEXT:    ldr r1, .LCPI5_0
533; SOFT-NEXT:    mov r0, r4
534; SOFT-NEXT:    bl __aeabi_fcmpgt
535; SOFT-NEXT:    cmp r0, #0
536; SOFT-NEXT:    beq .LBB5_5
537; SOFT-NEXT:  @ %bb.4:
538; SOFT-NEXT:    ldr r5, .LCPI5_1
539; SOFT-NEXT:  .LBB5_5:
540; SOFT-NEXT:    mov r0, r4
541; SOFT-NEXT:    mov r1, r4
542; SOFT-NEXT:    bl __aeabi_fcmpun
543; SOFT-NEXT:    cmp r0, #0
544; SOFT-NEXT:    beq .LBB5_7
545; SOFT-NEXT:  @ %bb.6:
546; SOFT-NEXT:    movs r5, #0
547; SOFT-NEXT:  .LBB5_7:
548; SOFT-NEXT:    mov r0, r5
549; SOFT-NEXT:    pop {r4, r5, r6, pc}
550; SOFT-NEXT:    .p2align 2
551; SOFT-NEXT:  @ %bb.8:
552; SOFT-NEXT:  .LCPI5_0:
553; SOFT-NEXT:    .long 1325400063 @ 0x4effffff
554; SOFT-NEXT:  .LCPI5_1:
555; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
556;
557; VFP-LABEL: test_signed_i32_f32:
558; VFP:       @ %bb.0:
559; VFP-NEXT:    vmov s0, r0
560; VFP-NEXT:    vcvt.s32.f32 s0, s0
561; VFP-NEXT:    vmov r0, s0
562; VFP-NEXT:    bx lr
563    %x = call i32 @llvm.fptosi.sat.i32.f32(float %f)
564    ret i32 %x
565}
566
567define i50 @test_signed_i50_f32(float %f) nounwind {
568; SOFT-LABEL: test_signed_i50_f32:
569; SOFT:       @ %bb.0:
570; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
571; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
572; SOFT-NEXT:    .pad #4
573; SOFT-NEXT:    sub sp, #4
574; SOFT-NEXT:    mov r4, r0
575; SOFT-NEXT:    movs r0, #27
576; SOFT-NEXT:    lsls r1, r0, #27
577; SOFT-NEXT:    mov r0, r4
578; SOFT-NEXT:    bl __aeabi_fcmpge
579; SOFT-NEXT:    mov r7, r0
580; SOFT-NEXT:    mov r0, r4
581; SOFT-NEXT:    bl __aeabi_f2lz
582; SOFT-NEXT:    mov r5, r0
583; SOFT-NEXT:    cmp r7, #0
584; SOFT-NEXT:    bne .LBB6_2
585; SOFT-NEXT:  @ %bb.1:
586; SOFT-NEXT:    mov r5, r7
587; SOFT-NEXT:  .LBB6_2:
588; SOFT-NEXT:    beq .LBB6_4
589; SOFT-NEXT:  @ %bb.3:
590; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
591; SOFT-NEXT:    b .LBB6_5
592; SOFT-NEXT:  .LBB6_4:
593; SOFT-NEXT:    ldr r0, .LCPI6_0
594; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
595; SOFT-NEXT:  .LBB6_5:
596; SOFT-NEXT:    ldr r1, .LCPI6_1
597; SOFT-NEXT:    mov r0, r4
598; SOFT-NEXT:    bl __aeabi_fcmpgt
599; SOFT-NEXT:    movs r7, #0
600; SOFT-NEXT:    mvns r6, r7
601; SOFT-NEXT:    cmp r0, #0
602; SOFT-NEXT:    beq .LBB6_7
603; SOFT-NEXT:  @ %bb.6:
604; SOFT-NEXT:    ldr r0, .LCPI6_2
605; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
606; SOFT-NEXT:  .LBB6_7:
607; SOFT-NEXT:    bne .LBB6_9
608; SOFT-NEXT:  @ %bb.8:
609; SOFT-NEXT:    mov r6, r5
610; SOFT-NEXT:  .LBB6_9:
611; SOFT-NEXT:    mov r0, r4
612; SOFT-NEXT:    mov r1, r4
613; SOFT-NEXT:    bl __aeabi_fcmpun
614; SOFT-NEXT:    cmp r0, #0
615; SOFT-NEXT:    mov r0, r7
616; SOFT-NEXT:    bne .LBB6_11
617; SOFT-NEXT:  @ %bb.10:
618; SOFT-NEXT:    mov r0, r6
619; SOFT-NEXT:  .LBB6_11:
620; SOFT-NEXT:    bne .LBB6_13
621; SOFT-NEXT:  @ %bb.12:
622; SOFT-NEXT:    ldr r7, [sp] @ 4-byte Reload
623; SOFT-NEXT:  .LBB6_13:
624; SOFT-NEXT:    mov r1, r7
625; SOFT-NEXT:    add sp, #4
626; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
627; SOFT-NEXT:    .p2align 2
628; SOFT-NEXT:  @ %bb.14:
629; SOFT-NEXT:  .LCPI6_0:
630; SOFT-NEXT:    .long 4294836224 @ 0xfffe0000
631; SOFT-NEXT:  .LCPI6_1:
632; SOFT-NEXT:    .long 1476395007 @ 0x57ffffff
633; SOFT-NEXT:  .LCPI6_2:
634; SOFT-NEXT:    .long 131071 @ 0x1ffff
635;
636; VFP-LABEL: test_signed_i50_f32:
637; VFP:       @ %bb.0:
638; VFP-NEXT:    .save {r4, lr}
639; VFP-NEXT:    push {r4, lr}
640; VFP-NEXT:    mov r4, r0
641; VFP-NEXT:    bl __aeabi_f2lz
642; VFP-NEXT:    vldr s0, .LCPI6_0
643; VFP-NEXT:    vmov s2, r4
644; VFP-NEXT:    vldr s4, .LCPI6_1
645; VFP-NEXT:    vcmp.f32 s2, s0
646; VFP-NEXT:    vmrs APSR_nzcv, fpscr
647; VFP-NEXT:    ittt lt
648; VFP-NEXT:    movlt r1, #0
649; VFP-NEXT:    movtlt r1, #65534
650; VFP-NEXT:    movlt r0, #0
651; VFP-NEXT:    vcmp.f32 s2, s4
652; VFP-NEXT:    vmrs APSR_nzcv, fpscr
653; VFP-NEXT:    it gt
654; VFP-NEXT:    movgt.w r0, #-1
655; VFP-NEXT:    vcmp.f32 s2, s2
656; VFP-NEXT:    itt gt
657; VFP-NEXT:    movwgt r1, #65535
658; VFP-NEXT:    movtgt r1, #1
659; VFP-NEXT:    vmrs APSR_nzcv, fpscr
660; VFP-NEXT:    itt vs
661; VFP-NEXT:    movvs r0, #0
662; VFP-NEXT:    movvs r1, #0
663; VFP-NEXT:    pop {r4, pc}
664; VFP-NEXT:    .p2align 2
665; VFP-NEXT:  @ %bb.1:
666; VFP-NEXT:  .LCPI6_0:
667; VFP-NEXT:    .long 0xd8000000 @ float -5.62949953E+14
668; VFP-NEXT:  .LCPI6_1:
669; VFP-NEXT:    .long 0x57ffffff @ float 5.6294992E+14
670    %x = call i50 @llvm.fptosi.sat.i50.f32(float %f)
671    ret i50 %x
672}
673
674define i64 @test_signed_i64_f32(float %f) nounwind {
675; SOFT-LABEL: test_signed_i64_f32:
676; SOFT:       @ %bb.0:
677; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
678; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
679; SOFT-NEXT:    .pad #4
680; SOFT-NEXT:    sub sp, #4
681; SOFT-NEXT:    mov r4, r0
682; SOFT-NEXT:    movs r0, #223
683; SOFT-NEXT:    lsls r1, r0, #24
684; SOFT-NEXT:    mov r0, r4
685; SOFT-NEXT:    bl __aeabi_fcmpge
686; SOFT-NEXT:    mov r6, r0
687; SOFT-NEXT:    mov r0, r4
688; SOFT-NEXT:    bl __aeabi_f2lz
689; SOFT-NEXT:    movs r2, #1
690; SOFT-NEXT:    lsls r7, r2, #31
691; SOFT-NEXT:    cmp r6, #0
692; SOFT-NEXT:    bne .LBB7_2
693; SOFT-NEXT:  @ %bb.1:
694; SOFT-NEXT:    mov r0, r6
695; SOFT-NEXT:  .LBB7_2:
696; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
697; SOFT-NEXT:    beq .LBB7_4
698; SOFT-NEXT:  @ %bb.3:
699; SOFT-NEXT:    mov r7, r1
700; SOFT-NEXT:  .LBB7_4:
701; SOFT-NEXT:    ldr r1, .LCPI7_0
702; SOFT-NEXT:    mov r0, r4
703; SOFT-NEXT:    bl __aeabi_fcmpgt
704; SOFT-NEXT:    movs r6, #0
705; SOFT-NEXT:    mvns r5, r6
706; SOFT-NEXT:    cmp r0, #0
707; SOFT-NEXT:    beq .LBB7_6
708; SOFT-NEXT:  @ %bb.5:
709; SOFT-NEXT:    ldr r7, .LCPI7_1
710; SOFT-NEXT:  .LBB7_6:
711; SOFT-NEXT:    bne .LBB7_8
712; SOFT-NEXT:  @ %bb.7:
713; SOFT-NEXT:    ldr r5, [sp] @ 4-byte Reload
714; SOFT-NEXT:  .LBB7_8:
715; SOFT-NEXT:    mov r0, r4
716; SOFT-NEXT:    mov r1, r4
717; SOFT-NEXT:    bl __aeabi_fcmpun
718; SOFT-NEXT:    cmp r0, #0
719; SOFT-NEXT:    mov r0, r6
720; SOFT-NEXT:    bne .LBB7_10
721; SOFT-NEXT:  @ %bb.9:
722; SOFT-NEXT:    mov r0, r5
723; SOFT-NEXT:  .LBB7_10:
724; SOFT-NEXT:    bne .LBB7_12
725; SOFT-NEXT:  @ %bb.11:
726; SOFT-NEXT:    mov r6, r7
727; SOFT-NEXT:  .LBB7_12:
728; SOFT-NEXT:    mov r1, r6
729; SOFT-NEXT:    add sp, #4
730; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
731; SOFT-NEXT:    .p2align 2
732; SOFT-NEXT:  @ %bb.13:
733; SOFT-NEXT:  .LCPI7_0:
734; SOFT-NEXT:    .long 1593835519 @ 0x5effffff
735; SOFT-NEXT:  .LCPI7_1:
736; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
737;
738; VFP-LABEL: test_signed_i64_f32:
739; VFP:       @ %bb.0:
740; VFP-NEXT:    .save {r4, lr}
741; VFP-NEXT:    push {r4, lr}
742; VFP-NEXT:    mov r4, r0
743; VFP-NEXT:    bl __aeabi_f2lz
744; VFP-NEXT:    vldr s0, .LCPI7_0
745; VFP-NEXT:    vmov s2, r4
746; VFP-NEXT:    vldr s4, .LCPI7_1
747; VFP-NEXT:    vcmp.f32 s2, s0
748; VFP-NEXT:    vmrs APSR_nzcv, fpscr
749; VFP-NEXT:    itt lt
750; VFP-NEXT:    movlt r0, #0
751; VFP-NEXT:    movlt.w r1, #-2147483648
752; VFP-NEXT:    vcmp.f32 s2, s4
753; VFP-NEXT:    vmrs APSR_nzcv, fpscr
754; VFP-NEXT:    itt gt
755; VFP-NEXT:    mvngt r1, #-2147483648
756; VFP-NEXT:    movgt.w r0, #-1
757; VFP-NEXT:    vcmp.f32 s2, s2
758; VFP-NEXT:    vmrs APSR_nzcv, fpscr
759; VFP-NEXT:    itt vs
760; VFP-NEXT:    movvs r0, #0
761; VFP-NEXT:    movvs r1, #0
762; VFP-NEXT:    pop {r4, pc}
763; VFP-NEXT:    .p2align 2
764; VFP-NEXT:  @ %bb.1:
765; VFP-NEXT:  .LCPI7_0:
766; VFP-NEXT:    .long 0xdf000000 @ float -9.22337203E+18
767; VFP-NEXT:  .LCPI7_1:
768; VFP-NEXT:    .long 0x5effffff @ float 9.22337149E+18
769    %x = call i64 @llvm.fptosi.sat.i64.f32(float %f)
770    ret i64 %x
771}
772
773define i100 @test_signed_i100_f32(float %f) nounwind {
774; SOFT-LABEL: test_signed_i100_f32:
775; SOFT:       @ %bb.0:
776; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
777; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
778; SOFT-NEXT:    .pad #20
779; SOFT-NEXT:    sub sp, #20
780; SOFT-NEXT:    mov r4, r0
781; SOFT-NEXT:    movs r0, #241
782; SOFT-NEXT:    lsls r1, r0, #24
783; SOFT-NEXT:    mov r0, r4
784; SOFT-NEXT:    bl __aeabi_fcmpge
785; SOFT-NEXT:    mov r6, r0
786; SOFT-NEXT:    mov r0, r4
787; SOFT-NEXT:    bl __fixsfti
788; SOFT-NEXT:    movs r5, #7
789; SOFT-NEXT:    str r5, [sp, #16] @ 4-byte Spill
790; SOFT-NEXT:    mvns r7, r5
791; SOFT-NEXT:    cmp r6, #0
792; SOFT-NEXT:    beq .LBB8_17
793; SOFT-NEXT:  @ %bb.1:
794; SOFT-NEXT:    beq .LBB8_18
795; SOFT-NEXT:  .LBB8_2:
796; SOFT-NEXT:    bne .LBB8_4
797; SOFT-NEXT:  .LBB8_3:
798; SOFT-NEXT:    mov r2, r6
799; SOFT-NEXT:  .LBB8_4:
800; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
801; SOFT-NEXT:    str r1, [sp, #8] @ 4-byte Spill
802; SOFT-NEXT:    str r0, [sp, #12] @ 4-byte Spill
803; SOFT-NEXT:    beq .LBB8_6
804; SOFT-NEXT:  @ %bb.5:
805; SOFT-NEXT:    mov r7, r3
806; SOFT-NEXT:  .LBB8_6:
807; SOFT-NEXT:    ldr r1, .LCPI8_0
808; SOFT-NEXT:    mov r0, r4
809; SOFT-NEXT:    bl __aeabi_fcmpgt
810; SOFT-NEXT:    movs r6, #0
811; SOFT-NEXT:    mvns r5, r6
812; SOFT-NEXT:    cmp r0, #0
813; SOFT-NEXT:    beq .LBB8_19
814; SOFT-NEXT:  @ %bb.7:
815; SOFT-NEXT:    mov r0, r5
816; SOFT-NEXT:    beq .LBB8_20
817; SOFT-NEXT:  .LBB8_8:
818; SOFT-NEXT:    mov r7, r5
819; SOFT-NEXT:    beq .LBB8_21
820; SOFT-NEXT:  .LBB8_9:
821; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
822; SOFT-NEXT:    bne .LBB8_11
823; SOFT-NEXT:  .LBB8_10:
824; SOFT-NEXT:    ldr r5, [sp, #12] @ 4-byte Reload
825; SOFT-NEXT:  .LBB8_11:
826; SOFT-NEXT:    mov r0, r4
827; SOFT-NEXT:    mov r1, r4
828; SOFT-NEXT:    bl __aeabi_fcmpun
829; SOFT-NEXT:    cmp r0, #0
830; SOFT-NEXT:    mov r0, r6
831; SOFT-NEXT:    beq .LBB8_22
832; SOFT-NEXT:  @ %bb.12:
833; SOFT-NEXT:    mov r1, r6
834; SOFT-NEXT:    beq .LBB8_23
835; SOFT-NEXT:  .LBB8_13:
836; SOFT-NEXT:    mov r2, r6
837; SOFT-NEXT:    beq .LBB8_24
838; SOFT-NEXT:  .LBB8_14:
839; SOFT-NEXT:    bne .LBB8_16
840; SOFT-NEXT:  .LBB8_15:
841; SOFT-NEXT:    ldr r6, [sp, #16] @ 4-byte Reload
842; SOFT-NEXT:  .LBB8_16:
843; SOFT-NEXT:    mov r3, r6
844; SOFT-NEXT:    add sp, #20
845; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
846; SOFT-NEXT:  .LBB8_17:
847; SOFT-NEXT:    mov r0, r6
848; SOFT-NEXT:    bne .LBB8_2
849; SOFT-NEXT:  .LBB8_18:
850; SOFT-NEXT:    mov r1, r6
851; SOFT-NEXT:    beq .LBB8_3
852; SOFT-NEXT:    b .LBB8_4
853; SOFT-NEXT:  .LBB8_19:
854; SOFT-NEXT:    str r7, [sp, #16] @ 4-byte Spill
855; SOFT-NEXT:    mov r0, r5
856; SOFT-NEXT:    bne .LBB8_8
857; SOFT-NEXT:  .LBB8_20:
858; SOFT-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
859; SOFT-NEXT:    mov r7, r5
860; SOFT-NEXT:    bne .LBB8_9
861; SOFT-NEXT:  .LBB8_21:
862; SOFT-NEXT:    ldr r7, [sp, #8] @ 4-byte Reload
863; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
864; SOFT-NEXT:    beq .LBB8_10
865; SOFT-NEXT:    b .LBB8_11
866; SOFT-NEXT:  .LBB8_22:
867; SOFT-NEXT:    mov r0, r5
868; SOFT-NEXT:    mov r1, r6
869; SOFT-NEXT:    bne .LBB8_13
870; SOFT-NEXT:  .LBB8_23:
871; SOFT-NEXT:    mov r1, r7
872; SOFT-NEXT:    mov r2, r6
873; SOFT-NEXT:    bne .LBB8_14
874; SOFT-NEXT:  .LBB8_24:
875; SOFT-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
876; SOFT-NEXT:    beq .LBB8_15
877; SOFT-NEXT:    b .LBB8_16
878; SOFT-NEXT:    .p2align 2
879; SOFT-NEXT:  @ %bb.25:
880; SOFT-NEXT:  .LCPI8_0:
881; SOFT-NEXT:    .long 1895825407 @ 0x70ffffff
882;
883; VFP-LABEL: test_signed_i100_f32:
884; VFP:       @ %bb.0:
885; VFP-NEXT:    .save {r4, lr}
886; VFP-NEXT:    push {r4, lr}
887; VFP-NEXT:    mov r4, r0
888; VFP-NEXT:    bl __fixsfti
889; VFP-NEXT:    vldr s0, .LCPI8_0
890; VFP-NEXT:    vmov s2, r4
891; VFP-NEXT:    vldr s4, .LCPI8_1
892; VFP-NEXT:    vcmp.f32 s2, s0
893; VFP-NEXT:    vmrs APSR_nzcv, fpscr
894; VFP-NEXT:    itttt lt
895; VFP-NEXT:    movlt r0, #0
896; VFP-NEXT:    movlt r1, #0
897; VFP-NEXT:    movlt r2, #0
898; VFP-NEXT:    mvnlt r3, #7
899; VFP-NEXT:    vcmp.f32 s2, s4
900; VFP-NEXT:    vmrs APSR_nzcv, fpscr
901; VFP-NEXT:    itttt gt
902; VFP-NEXT:    movgt r3, #7
903; VFP-NEXT:    movgt.w r2, #-1
904; VFP-NEXT:    movgt.w r1, #-1
905; VFP-NEXT:    movgt.w r0, #-1
906; VFP-NEXT:    vcmp.f32 s2, s2
907; VFP-NEXT:    vmrs APSR_nzcv, fpscr
908; VFP-NEXT:    itttt vs
909; VFP-NEXT:    movvs r0, #0
910; VFP-NEXT:    movvs r1, #0
911; VFP-NEXT:    movvs r2, #0
912; VFP-NEXT:    movvs r3, #0
913; VFP-NEXT:    pop {r4, pc}
914; VFP-NEXT:    .p2align 2
915; VFP-NEXT:  @ %bb.1:
916; VFP-NEXT:  .LCPI8_0:
917; VFP-NEXT:    .long 0xf1000000 @ float -6.338253E+29
918; VFP-NEXT:  .LCPI8_1:
919; VFP-NEXT:    .long 0x70ffffff @ float 6.33825262E+29
920    %x = call i100 @llvm.fptosi.sat.i100.f32(float %f)
921    ret i100 %x
922}
923
924define i128 @test_signed_i128_f32(float %f) nounwind {
925; SOFT-LABEL: test_signed_i128_f32:
926; SOFT:       @ %bb.0:
927; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
928; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
929; SOFT-NEXT:    .pad #20
930; SOFT-NEXT:    sub sp, #20
931; SOFT-NEXT:    mov r4, r0
932; SOFT-NEXT:    movs r0, #255
933; SOFT-NEXT:    lsls r1, r0, #24
934; SOFT-NEXT:    mov r0, r4
935; SOFT-NEXT:    bl __aeabi_fcmpge
936; SOFT-NEXT:    mov r6, r0
937; SOFT-NEXT:    mov r0, r4
938; SOFT-NEXT:    bl __fixsfti
939; SOFT-NEXT:    movs r5, #1
940; SOFT-NEXT:    lsls r7, r5, #31
941; SOFT-NEXT:    cmp r6, #0
942; SOFT-NEXT:    beq .LBB9_18
943; SOFT-NEXT:  @ %bb.1:
944; SOFT-NEXT:    beq .LBB9_19
945; SOFT-NEXT:  .LBB9_2:
946; SOFT-NEXT:    bne .LBB9_4
947; SOFT-NEXT:  .LBB9_3:
948; SOFT-NEXT:    mov r2, r6
949; SOFT-NEXT:  .LBB9_4:
950; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
951; SOFT-NEXT:    str r1, [sp, #8] @ 4-byte Spill
952; SOFT-NEXT:    str r0, [sp, #12] @ 4-byte Spill
953; SOFT-NEXT:    beq .LBB9_6
954; SOFT-NEXT:  @ %bb.5:
955; SOFT-NEXT:    mov r7, r3
956; SOFT-NEXT:  .LBB9_6:
957; SOFT-NEXT:    ldr r1, .LCPI9_0
958; SOFT-NEXT:    mov r0, r4
959; SOFT-NEXT:    bl __aeabi_fcmpgt
960; SOFT-NEXT:    movs r6, #0
961; SOFT-NEXT:    mvns r5, r6
962; SOFT-NEXT:    cmp r0, #0
963; SOFT-NEXT:    beq .LBB9_8
964; SOFT-NEXT:  @ %bb.7:
965; SOFT-NEXT:    ldr r7, .LCPI9_1
966; SOFT-NEXT:  .LBB9_8:
967; SOFT-NEXT:    str r7, [sp, #16] @ 4-byte Spill
968; SOFT-NEXT:    mov r0, r5
969; SOFT-NEXT:    beq .LBB9_20
970; SOFT-NEXT:  @ %bb.9:
971; SOFT-NEXT:    mov r7, r5
972; SOFT-NEXT:    beq .LBB9_21
973; SOFT-NEXT:  .LBB9_10:
974; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
975; SOFT-NEXT:    bne .LBB9_12
976; SOFT-NEXT:  .LBB9_11:
977; SOFT-NEXT:    ldr r5, [sp, #12] @ 4-byte Reload
978; SOFT-NEXT:  .LBB9_12:
979; SOFT-NEXT:    mov r0, r4
980; SOFT-NEXT:    mov r1, r4
981; SOFT-NEXT:    bl __aeabi_fcmpun
982; SOFT-NEXT:    cmp r0, #0
983; SOFT-NEXT:    mov r0, r6
984; SOFT-NEXT:    beq .LBB9_22
985; SOFT-NEXT:  @ %bb.13:
986; SOFT-NEXT:    mov r1, r6
987; SOFT-NEXT:    beq .LBB9_23
988; SOFT-NEXT:  .LBB9_14:
989; SOFT-NEXT:    mov r2, r6
990; SOFT-NEXT:    beq .LBB9_24
991; SOFT-NEXT:  .LBB9_15:
992; SOFT-NEXT:    ldr r3, [sp, #16] @ 4-byte Reload
993; SOFT-NEXT:    bne .LBB9_17
994; SOFT-NEXT:  .LBB9_16:
995; SOFT-NEXT:    mov r6, r3
996; SOFT-NEXT:  .LBB9_17:
997; SOFT-NEXT:    mov r3, r6
998; SOFT-NEXT:    add sp, #20
999; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1000; SOFT-NEXT:  .LBB9_18:
1001; SOFT-NEXT:    mov r0, r6
1002; SOFT-NEXT:    bne .LBB9_2
1003; SOFT-NEXT:  .LBB9_19:
1004; SOFT-NEXT:    mov r1, r6
1005; SOFT-NEXT:    beq .LBB9_3
1006; SOFT-NEXT:    b .LBB9_4
1007; SOFT-NEXT:  .LBB9_20:
1008; SOFT-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
1009; SOFT-NEXT:    mov r7, r5
1010; SOFT-NEXT:    bne .LBB9_10
1011; SOFT-NEXT:  .LBB9_21:
1012; SOFT-NEXT:    ldr r7, [sp, #8] @ 4-byte Reload
1013; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
1014; SOFT-NEXT:    beq .LBB9_11
1015; SOFT-NEXT:    b .LBB9_12
1016; SOFT-NEXT:  .LBB9_22:
1017; SOFT-NEXT:    mov r0, r5
1018; SOFT-NEXT:    mov r1, r6
1019; SOFT-NEXT:    bne .LBB9_14
1020; SOFT-NEXT:  .LBB9_23:
1021; SOFT-NEXT:    mov r1, r7
1022; SOFT-NEXT:    mov r2, r6
1023; SOFT-NEXT:    bne .LBB9_15
1024; SOFT-NEXT:  .LBB9_24:
1025; SOFT-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
1026; SOFT-NEXT:    ldr r3, [sp, #16] @ 4-byte Reload
1027; SOFT-NEXT:    beq .LBB9_16
1028; SOFT-NEXT:    b .LBB9_17
1029; SOFT-NEXT:    .p2align 2
1030; SOFT-NEXT:  @ %bb.25:
1031; SOFT-NEXT:  .LCPI9_0:
1032; SOFT-NEXT:    .long 2130706431 @ 0x7effffff
1033; SOFT-NEXT:  .LCPI9_1:
1034; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
1035;
1036; VFP-LABEL: test_signed_i128_f32:
1037; VFP:       @ %bb.0:
1038; VFP-NEXT:    .save {r4, lr}
1039; VFP-NEXT:    push {r4, lr}
1040; VFP-NEXT:    mov r4, r0
1041; VFP-NEXT:    bl __fixsfti
1042; VFP-NEXT:    vldr s0, .LCPI9_0
1043; VFP-NEXT:    vmov s2, r4
1044; VFP-NEXT:    vldr s4, .LCPI9_1
1045; VFP-NEXT:    vcmp.f32 s2, s0
1046; VFP-NEXT:    vmrs APSR_nzcv, fpscr
1047; VFP-NEXT:    itttt lt
1048; VFP-NEXT:    movlt r0, #0
1049; VFP-NEXT:    movlt r1, #0
1050; VFP-NEXT:    movlt r2, #0
1051; VFP-NEXT:    movlt.w r3, #-2147483648
1052; VFP-NEXT:    vcmp.f32 s2, s4
1053; VFP-NEXT:    vmrs APSR_nzcv, fpscr
1054; VFP-NEXT:    itttt gt
1055; VFP-NEXT:    mvngt r3, #-2147483648
1056; VFP-NEXT:    movgt.w r2, #-1
1057; VFP-NEXT:    movgt.w r1, #-1
1058; VFP-NEXT:    movgt.w r0, #-1
1059; VFP-NEXT:    vcmp.f32 s2, s2
1060; VFP-NEXT:    vmrs APSR_nzcv, fpscr
1061; VFP-NEXT:    itttt vs
1062; VFP-NEXT:    movvs r0, #0
1063; VFP-NEXT:    movvs r1, #0
1064; VFP-NEXT:    movvs r2, #0
1065; VFP-NEXT:    movvs r3, #0
1066; VFP-NEXT:    pop {r4, pc}
1067; VFP-NEXT:    .p2align 2
1068; VFP-NEXT:  @ %bb.1:
1069; VFP-NEXT:  .LCPI9_0:
1070; VFP-NEXT:    .long 0xff000000 @ float -1.70141183E+38
1071; VFP-NEXT:  .LCPI9_1:
1072; VFP-NEXT:    .long 0x7effffff @ float 1.70141173E+38
1073    %x = call i128 @llvm.fptosi.sat.i128.f32(float %f)
1074    ret i128 %x
1075}
1076
1077;
1078; 64-bit float to signed integer
1079;
1080
1081declare   i1 @llvm.fptosi.sat.i1.f64  (double)
1082declare   i8 @llvm.fptosi.sat.i8.f64  (double)
1083declare  i13 @llvm.fptosi.sat.i13.f64 (double)
1084declare  i16 @llvm.fptosi.sat.i16.f64 (double)
1085declare  i19 @llvm.fptosi.sat.i19.f64 (double)
1086declare  i32 @llvm.fptosi.sat.i32.f64 (double)
1087declare  i50 @llvm.fptosi.sat.i50.f64 (double)
1088declare  i64 @llvm.fptosi.sat.i64.f64 (double)
1089declare i100 @llvm.fptosi.sat.i100.f64(double)
1090declare i128 @llvm.fptosi.sat.i128.f64(double)
1091
1092define i1 @test_signed_i1_f64(double %f) nounwind {
1093; SOFT-LABEL: test_signed_i1_f64:
1094; SOFT:       @ %bb.0:
1095; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1096; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1097; SOFT-NEXT:    .pad #4
1098; SOFT-NEXT:    sub sp, #4
1099; SOFT-NEXT:    mov r5, r1
1100; SOFT-NEXT:    mov r6, r0
1101; SOFT-NEXT:    movs r4, #0
1102; SOFT-NEXT:    ldr r3, .LCPI10_0
1103; SOFT-NEXT:    mov r2, r4
1104; SOFT-NEXT:    bl __aeabi_dcmpge
1105; SOFT-NEXT:    mov r7, r0
1106; SOFT-NEXT:    mov r0, r6
1107; SOFT-NEXT:    mov r1, r5
1108; SOFT-NEXT:    bl __aeabi_d2iz
1109; SOFT-NEXT:    cmp r7, #0
1110; SOFT-NEXT:    bne .LBB10_2
1111; SOFT-NEXT:  @ %bb.1:
1112; SOFT-NEXT:    mvns r0, r4
1113; SOFT-NEXT:  .LBB10_2:
1114; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
1115; SOFT-NEXT:    mov r0, r6
1116; SOFT-NEXT:    mov r1, r5
1117; SOFT-NEXT:    mov r2, r4
1118; SOFT-NEXT:    mov r3, r4
1119; SOFT-NEXT:    bl __aeabi_dcmpgt
1120; SOFT-NEXT:    cmp r0, #0
1121; SOFT-NEXT:    mov r7, r4
1122; SOFT-NEXT:    bne .LBB10_4
1123; SOFT-NEXT:  @ %bb.3:
1124; SOFT-NEXT:    ldr r7, [sp] @ 4-byte Reload
1125; SOFT-NEXT:  .LBB10_4:
1126; SOFT-NEXT:    mov r0, r6
1127; SOFT-NEXT:    mov r1, r5
1128; SOFT-NEXT:    mov r2, r6
1129; SOFT-NEXT:    mov r3, r5
1130; SOFT-NEXT:    bl __aeabi_dcmpun
1131; SOFT-NEXT:    cmp r0, #0
1132; SOFT-NEXT:    bne .LBB10_6
1133; SOFT-NEXT:  @ %bb.5:
1134; SOFT-NEXT:    mov r4, r7
1135; SOFT-NEXT:  .LBB10_6:
1136; SOFT-NEXT:    mov r0, r4
1137; SOFT-NEXT:    add sp, #4
1138; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1139; SOFT-NEXT:    .p2align 2
1140; SOFT-NEXT:  @ %bb.7:
1141; SOFT-NEXT:  .LCPI10_0:
1142; SOFT-NEXT:    .long 3220176896 @ 0xbff00000
1143;
1144; VFP2-LABEL: test_signed_i1_f64:
1145; VFP2:       @ %bb.0:
1146; VFP2-NEXT:    vmov.f64 d17, #-1.000000e+00
1147; VFP2-NEXT:    vmov d16, r0, r1
1148; VFP2-NEXT:    vcmp.f64 d16, d17
1149; VFP2-NEXT:    vcvt.s32.f64 s0, d16
1150; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1151; VFP2-NEXT:    vmov r0, s0
1152; VFP2-NEXT:    vcmp.f64 d16, #0
1153; VFP2-NEXT:    it lt
1154; VFP2-NEXT:    movlt.w r0, #-1
1155; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1156; VFP2-NEXT:    it gt
1157; VFP2-NEXT:    movgt r0, #0
1158; VFP2-NEXT:    vcmp.f64 d16, d16
1159; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1160; VFP2-NEXT:    it vs
1161; VFP2-NEXT:    movvs r0, #0
1162; VFP2-NEXT:    bx lr
1163;
1164; FP16-LABEL: test_signed_i1_f64:
1165; FP16:       @ %bb.0:
1166; FP16-NEXT:    vmov.f64 d0, #-1.000000e+00
1167; FP16-NEXT:    vmov d1, r0, r1
1168; FP16-NEXT:    vldr d2, .LCPI10_0
1169; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1170; FP16-NEXT:    vminnm.f64 d0, d0, d2
1171; FP16-NEXT:    vcmp.f64 d1, d1
1172; FP16-NEXT:    vcvt.s32.f64 s0, d0
1173; FP16-NEXT:    vmov r0, s0
1174; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1175; FP16-NEXT:    it vs
1176; FP16-NEXT:    movvs r0, #0
1177; FP16-NEXT:    bx lr
1178; FP16-NEXT:    .p2align 3
1179; FP16-NEXT:  @ %bb.1:
1180; FP16-NEXT:  .LCPI10_0:
1181; FP16-NEXT:    .long 0 @ double 0
1182; FP16-NEXT:    .long 0
1183    %x = call i1 @llvm.fptosi.sat.i1.f64(double %f)
1184    ret i1 %x
1185}
1186
1187define i8 @test_signed_i8_f64(double %f) nounwind {
1188; SOFT-LABEL: test_signed_i8_f64:
1189; SOFT:       @ %bb.0:
1190; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1191; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1192; SOFT-NEXT:    .pad #4
1193; SOFT-NEXT:    sub sp, #4
1194; SOFT-NEXT:    mov r5, r1
1195; SOFT-NEXT:    mov r6, r0
1196; SOFT-NEXT:    movs r4, #0
1197; SOFT-NEXT:    ldr r3, .LCPI11_0
1198; SOFT-NEXT:    mov r2, r4
1199; SOFT-NEXT:    bl __aeabi_dcmpge
1200; SOFT-NEXT:    mov r7, r0
1201; SOFT-NEXT:    mov r0, r6
1202; SOFT-NEXT:    mov r1, r5
1203; SOFT-NEXT:    bl __aeabi_d2iz
1204; SOFT-NEXT:    movs r1, #127
1205; SOFT-NEXT:    cmp r7, #0
1206; SOFT-NEXT:    beq .LBB11_2
1207; SOFT-NEXT:  @ %bb.1:
1208; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
1209; SOFT-NEXT:    mov r7, r1
1210; SOFT-NEXT:    b .LBB11_3
1211; SOFT-NEXT:  .LBB11_2:
1212; SOFT-NEXT:    mov r7, r1
1213; SOFT-NEXT:    mvns r0, r1
1214; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
1215; SOFT-NEXT:  .LBB11_3:
1216; SOFT-NEXT:    ldr r3, .LCPI11_1
1217; SOFT-NEXT:    mov r0, r6
1218; SOFT-NEXT:    mov r1, r5
1219; SOFT-NEXT:    mov r2, r4
1220; SOFT-NEXT:    bl __aeabi_dcmpgt
1221; SOFT-NEXT:    cmp r0, #0
1222; SOFT-NEXT:    bne .LBB11_5
1223; SOFT-NEXT:  @ %bb.4:
1224; SOFT-NEXT:    ldr r7, [sp] @ 4-byte Reload
1225; SOFT-NEXT:  .LBB11_5:
1226; SOFT-NEXT:    mov r0, r6
1227; SOFT-NEXT:    mov r1, r5
1228; SOFT-NEXT:    mov r2, r6
1229; SOFT-NEXT:    mov r3, r5
1230; SOFT-NEXT:    bl __aeabi_dcmpun
1231; SOFT-NEXT:    cmp r0, #0
1232; SOFT-NEXT:    bne .LBB11_7
1233; SOFT-NEXT:  @ %bb.6:
1234; SOFT-NEXT:    mov r4, r7
1235; SOFT-NEXT:  .LBB11_7:
1236; SOFT-NEXT:    mov r0, r4
1237; SOFT-NEXT:    add sp, #4
1238; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1239; SOFT-NEXT:    .p2align 2
1240; SOFT-NEXT:  @ %bb.8:
1241; SOFT-NEXT:  .LCPI11_0:
1242; SOFT-NEXT:    .long 3227516928 @ 0xc0600000
1243; SOFT-NEXT:  .LCPI11_1:
1244; SOFT-NEXT:    .long 1080016896 @ 0x405fc000
1245;
1246; VFP2-LABEL: test_signed_i8_f64:
1247; VFP2:       @ %bb.0:
1248; VFP2-NEXT:    vmov d16, r0, r1
1249; VFP2-NEXT:    vldr d17, .LCPI11_0
1250; VFP2-NEXT:    vldr d18, .LCPI11_1
1251; VFP2-NEXT:    vcvt.s32.f64 s0, d16
1252; VFP2-NEXT:    vcmp.f64 d16, d17
1253; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1254; VFP2-NEXT:    vmov r0, s0
1255; VFP2-NEXT:    vcmp.f64 d16, d18
1256; VFP2-NEXT:    it lt
1257; VFP2-NEXT:    mvnlt r0, #127
1258; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1259; VFP2-NEXT:    it gt
1260; VFP2-NEXT:    movgt r0, #127
1261; VFP2-NEXT:    vcmp.f64 d16, d16
1262; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1263; VFP2-NEXT:    it vs
1264; VFP2-NEXT:    movvs r0, #0
1265; VFP2-NEXT:    bx lr
1266; VFP2-NEXT:    .p2align 3
1267; VFP2-NEXT:  @ %bb.1:
1268; VFP2-NEXT:  .LCPI11_0:
1269; VFP2-NEXT:    .long 0 @ double -128
1270; VFP2-NEXT:    .long 3227516928
1271; VFP2-NEXT:  .LCPI11_1:
1272; VFP2-NEXT:    .long 0 @ double 127
1273; VFP2-NEXT:    .long 1080016896
1274;
1275; FP16-LABEL: test_signed_i8_f64:
1276; FP16:       @ %bb.0:
1277; FP16-NEXT:    vldr d0, .LCPI11_0
1278; FP16-NEXT:    vmov d1, r0, r1
1279; FP16-NEXT:    vldr d2, .LCPI11_1
1280; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1281; FP16-NEXT:    vcmp.f64 d1, d1
1282; FP16-NEXT:    vminnm.f64 d0, d0, d2
1283; FP16-NEXT:    vcvt.s32.f64 s0, d0
1284; FP16-NEXT:    vmov r0, s0
1285; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1286; FP16-NEXT:    it vs
1287; FP16-NEXT:    movvs r0, #0
1288; FP16-NEXT:    bx lr
1289; FP16-NEXT:    .p2align 3
1290; FP16-NEXT:  @ %bb.1:
1291; FP16-NEXT:  .LCPI11_0:
1292; FP16-NEXT:    .long 0 @ double -128
1293; FP16-NEXT:    .long 3227516928
1294; FP16-NEXT:  .LCPI11_1:
1295; FP16-NEXT:    .long 0 @ double 127
1296; FP16-NEXT:    .long 1080016896
1297    %x = call i8 @llvm.fptosi.sat.i8.f64(double %f)
1298    ret i8 %x
1299}
1300
1301define i13 @test_signed_i13_f64(double %f) nounwind {
1302; SOFT-LABEL: test_signed_i13_f64:
1303; SOFT:       @ %bb.0:
1304; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1305; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1306; SOFT-NEXT:    .pad #4
1307; SOFT-NEXT:    sub sp, #4
1308; SOFT-NEXT:    mov r5, r1
1309; SOFT-NEXT:    mov r6, r0
1310; SOFT-NEXT:    movs r4, #0
1311; SOFT-NEXT:    ldr r3, .LCPI12_0
1312; SOFT-NEXT:    mov r2, r4
1313; SOFT-NEXT:    bl __aeabi_dcmpge
1314; SOFT-NEXT:    mov r7, r0
1315; SOFT-NEXT:    mov r0, r6
1316; SOFT-NEXT:    mov r1, r5
1317; SOFT-NEXT:    bl __aeabi_d2iz
1318; SOFT-NEXT:    cmp r7, #0
1319; SOFT-NEXT:    beq .LBB12_2
1320; SOFT-NEXT:  @ %bb.1:
1321; SOFT-NEXT:    mov r7, r0
1322; SOFT-NEXT:    b .LBB12_3
1323; SOFT-NEXT:  .LBB12_2:
1324; SOFT-NEXT:    ldr r7, .LCPI12_1
1325; SOFT-NEXT:  .LBB12_3:
1326; SOFT-NEXT:    ldr r3, .LCPI12_2
1327; SOFT-NEXT:    mov r0, r6
1328; SOFT-NEXT:    mov r1, r5
1329; SOFT-NEXT:    mov r2, r4
1330; SOFT-NEXT:    bl __aeabi_dcmpgt
1331; SOFT-NEXT:    cmp r0, #0
1332; SOFT-NEXT:    beq .LBB12_5
1333; SOFT-NEXT:  @ %bb.4:
1334; SOFT-NEXT:    ldr r7, .LCPI12_3
1335; SOFT-NEXT:  .LBB12_5:
1336; SOFT-NEXT:    mov r0, r6
1337; SOFT-NEXT:    mov r1, r5
1338; SOFT-NEXT:    mov r2, r6
1339; SOFT-NEXT:    mov r3, r5
1340; SOFT-NEXT:    bl __aeabi_dcmpun
1341; SOFT-NEXT:    cmp r0, #0
1342; SOFT-NEXT:    bne .LBB12_7
1343; SOFT-NEXT:  @ %bb.6:
1344; SOFT-NEXT:    mov r4, r7
1345; SOFT-NEXT:  .LBB12_7:
1346; SOFT-NEXT:    mov r0, r4
1347; SOFT-NEXT:    add sp, #4
1348; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1349; SOFT-NEXT:    .p2align 2
1350; SOFT-NEXT:  @ %bb.8:
1351; SOFT-NEXT:  .LCPI12_0:
1352; SOFT-NEXT:    .long 3232759808 @ 0xc0b00000
1353; SOFT-NEXT:  .LCPI12_1:
1354; SOFT-NEXT:    .long 4294963200 @ 0xfffff000
1355; SOFT-NEXT:  .LCPI12_2:
1356; SOFT-NEXT:    .long 1085275648 @ 0x40affe00
1357; SOFT-NEXT:  .LCPI12_3:
1358; SOFT-NEXT:    .long 4095 @ 0xfff
1359;
1360; VFP2-LABEL: test_signed_i13_f64:
1361; VFP2:       @ %bb.0:
1362; VFP2-NEXT:    vmov d16, r0, r1
1363; VFP2-NEXT:    vldr d17, .LCPI12_0
1364; VFP2-NEXT:    vldr d18, .LCPI12_1
1365; VFP2-NEXT:    vcvt.s32.f64 s0, d16
1366; VFP2-NEXT:    vcmp.f64 d16, d17
1367; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1368; VFP2-NEXT:    vmov r0, s0
1369; VFP2-NEXT:    vcmp.f64 d16, d18
1370; VFP2-NEXT:    itt lt
1371; VFP2-NEXT:    movwlt r0, #61440
1372; VFP2-NEXT:    movtlt r0, #65535
1373; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1374; VFP2-NEXT:    it gt
1375; VFP2-NEXT:    movwgt r0, #4095
1376; VFP2-NEXT:    vcmp.f64 d16, d16
1377; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1378; VFP2-NEXT:    it vs
1379; VFP2-NEXT:    movvs r0, #0
1380; VFP2-NEXT:    bx lr
1381; VFP2-NEXT:    .p2align 3
1382; VFP2-NEXT:  @ %bb.1:
1383; VFP2-NEXT:  .LCPI12_0:
1384; VFP2-NEXT:    .long 0 @ double -4096
1385; VFP2-NEXT:    .long 3232759808
1386; VFP2-NEXT:  .LCPI12_1:
1387; VFP2-NEXT:    .long 0 @ double 4095
1388; VFP2-NEXT:    .long 1085275648
1389;
1390; FP16-LABEL: test_signed_i13_f64:
1391; FP16:       @ %bb.0:
1392; FP16-NEXT:    vldr d0, .LCPI12_0
1393; FP16-NEXT:    vmov d1, r0, r1
1394; FP16-NEXT:    vldr d2, .LCPI12_1
1395; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1396; FP16-NEXT:    vcmp.f64 d1, d1
1397; FP16-NEXT:    vminnm.f64 d0, d0, d2
1398; FP16-NEXT:    vcvt.s32.f64 s0, d0
1399; FP16-NEXT:    vmov r0, s0
1400; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1401; FP16-NEXT:    it vs
1402; FP16-NEXT:    movvs r0, #0
1403; FP16-NEXT:    bx lr
1404; FP16-NEXT:    .p2align 3
1405; FP16-NEXT:  @ %bb.1:
1406; FP16-NEXT:  .LCPI12_0:
1407; FP16-NEXT:    .long 0 @ double -4096
1408; FP16-NEXT:    .long 3232759808
1409; FP16-NEXT:  .LCPI12_1:
1410; FP16-NEXT:    .long 0 @ double 4095
1411; FP16-NEXT:    .long 1085275648
1412    %x = call i13 @llvm.fptosi.sat.i13.f64(double %f)
1413    ret i13 %x
1414}
1415
1416define i16 @test_signed_i16_f64(double %f) nounwind {
1417; SOFT-LABEL: test_signed_i16_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 r5, r1
1424; SOFT-NEXT:    mov r6, r0
1425; SOFT-NEXT:    movs r4, #0
1426; SOFT-NEXT:    ldr r3, .LCPI13_0
1427; SOFT-NEXT:    mov r2, r4
1428; SOFT-NEXT:    bl __aeabi_dcmpge
1429; SOFT-NEXT:    mov r7, r0
1430; SOFT-NEXT:    mov r0, r6
1431; SOFT-NEXT:    mov r1, r5
1432; SOFT-NEXT:    bl __aeabi_d2iz
1433; SOFT-NEXT:    cmp r7, #0
1434; SOFT-NEXT:    beq .LBB13_2
1435; SOFT-NEXT:  @ %bb.1:
1436; SOFT-NEXT:    mov r7, r0
1437; SOFT-NEXT:    b .LBB13_3
1438; SOFT-NEXT:  .LBB13_2:
1439; SOFT-NEXT:    ldr r7, .LCPI13_1
1440; SOFT-NEXT:  .LBB13_3:
1441; SOFT-NEXT:    ldr r3, .LCPI13_2
1442; SOFT-NEXT:    mov r0, r6
1443; SOFT-NEXT:    mov r1, r5
1444; SOFT-NEXT:    mov r2, r4
1445; SOFT-NEXT:    bl __aeabi_dcmpgt
1446; SOFT-NEXT:    cmp r0, #0
1447; SOFT-NEXT:    beq .LBB13_5
1448; SOFT-NEXT:  @ %bb.4:
1449; SOFT-NEXT:    ldr r7, .LCPI13_3
1450; SOFT-NEXT:  .LBB13_5:
1451; SOFT-NEXT:    mov r0, r6
1452; SOFT-NEXT:    mov r1, r5
1453; SOFT-NEXT:    mov r2, r6
1454; SOFT-NEXT:    mov r3, r5
1455; SOFT-NEXT:    bl __aeabi_dcmpun
1456; SOFT-NEXT:    cmp r0, #0
1457; SOFT-NEXT:    bne .LBB13_7
1458; SOFT-NEXT:  @ %bb.6:
1459; SOFT-NEXT:    mov r4, r7
1460; SOFT-NEXT:  .LBB13_7:
1461; SOFT-NEXT:    mov r0, r4
1462; SOFT-NEXT:    add sp, #4
1463; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1464; SOFT-NEXT:    .p2align 2
1465; SOFT-NEXT:  @ %bb.8:
1466; SOFT-NEXT:  .LCPI13_0:
1467; SOFT-NEXT:    .long 3235905536 @ 0xc0e00000
1468; SOFT-NEXT:  .LCPI13_1:
1469; SOFT-NEXT:    .long 4294934528 @ 0xffff8000
1470; SOFT-NEXT:  .LCPI13_2:
1471; SOFT-NEXT:    .long 1088421824 @ 0x40dfffc0
1472; SOFT-NEXT:  .LCPI13_3:
1473; SOFT-NEXT:    .long 32767 @ 0x7fff
1474;
1475; VFP2-LABEL: test_signed_i16_f64:
1476; VFP2:       @ %bb.0:
1477; VFP2-NEXT:    vmov d16, r0, r1
1478; VFP2-NEXT:    vldr d17, .LCPI13_0
1479; VFP2-NEXT:    vldr d18, .LCPI13_1
1480; VFP2-NEXT:    vcvt.s32.f64 s0, d16
1481; VFP2-NEXT:    vcmp.f64 d16, d17
1482; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1483; VFP2-NEXT:    vmov r0, s0
1484; VFP2-NEXT:    vcmp.f64 d16, d18
1485; VFP2-NEXT:    itt lt
1486; VFP2-NEXT:    movwlt r0, #32768
1487; VFP2-NEXT:    movtlt r0, #65535
1488; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1489; VFP2-NEXT:    it gt
1490; VFP2-NEXT:    movwgt r0, #32767
1491; VFP2-NEXT:    vcmp.f64 d16, d16
1492; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1493; VFP2-NEXT:    it vs
1494; VFP2-NEXT:    movvs r0, #0
1495; VFP2-NEXT:    bx lr
1496; VFP2-NEXT:    .p2align 3
1497; VFP2-NEXT:  @ %bb.1:
1498; VFP2-NEXT:  .LCPI13_0:
1499; VFP2-NEXT:    .long 0 @ double -32768
1500; VFP2-NEXT:    .long 3235905536
1501; VFP2-NEXT:  .LCPI13_1:
1502; VFP2-NEXT:    .long 0 @ double 32767
1503; VFP2-NEXT:    .long 1088421824
1504;
1505; FP16-LABEL: test_signed_i16_f64:
1506; FP16:       @ %bb.0:
1507; FP16-NEXT:    vldr d0, .LCPI13_0
1508; FP16-NEXT:    vmov d1, r0, r1
1509; FP16-NEXT:    vldr d2, .LCPI13_1
1510; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1511; FP16-NEXT:    vcmp.f64 d1, d1
1512; FP16-NEXT:    vminnm.f64 d0, d0, d2
1513; FP16-NEXT:    vcvt.s32.f64 s0, d0
1514; FP16-NEXT:    vmov r0, s0
1515; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1516; FP16-NEXT:    it vs
1517; FP16-NEXT:    movvs r0, #0
1518; FP16-NEXT:    bx lr
1519; FP16-NEXT:    .p2align 3
1520; FP16-NEXT:  @ %bb.1:
1521; FP16-NEXT:  .LCPI13_0:
1522; FP16-NEXT:    .long 0 @ double -32768
1523; FP16-NEXT:    .long 3235905536
1524; FP16-NEXT:  .LCPI13_1:
1525; FP16-NEXT:    .long 0 @ double 32767
1526; FP16-NEXT:    .long 1088421824
1527    %x = call i16 @llvm.fptosi.sat.i16.f64(double %f)
1528    ret i16 %x
1529}
1530
1531define i19 @test_signed_i19_f64(double %f) nounwind {
1532; SOFT-LABEL: test_signed_i19_f64:
1533; SOFT:       @ %bb.0:
1534; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1535; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1536; SOFT-NEXT:    .pad #4
1537; SOFT-NEXT:    sub sp, #4
1538; SOFT-NEXT:    mov r5, r1
1539; SOFT-NEXT:    mov r6, r0
1540; SOFT-NEXT:    movs r4, #0
1541; SOFT-NEXT:    ldr r3, .LCPI14_0
1542; SOFT-NEXT:    mov r2, r4
1543; SOFT-NEXT:    bl __aeabi_dcmpge
1544; SOFT-NEXT:    mov r7, r0
1545; SOFT-NEXT:    mov r0, r6
1546; SOFT-NEXT:    mov r1, r5
1547; SOFT-NEXT:    bl __aeabi_d2iz
1548; SOFT-NEXT:    cmp r7, #0
1549; SOFT-NEXT:    beq .LBB14_2
1550; SOFT-NEXT:  @ %bb.1:
1551; SOFT-NEXT:    mov r7, r0
1552; SOFT-NEXT:    b .LBB14_3
1553; SOFT-NEXT:  .LBB14_2:
1554; SOFT-NEXT:    ldr r7, .LCPI14_1
1555; SOFT-NEXT:  .LBB14_3:
1556; SOFT-NEXT:    ldr r3, .LCPI14_2
1557; SOFT-NEXT:    mov r0, r6
1558; SOFT-NEXT:    mov r1, r5
1559; SOFT-NEXT:    mov r2, r4
1560; SOFT-NEXT:    bl __aeabi_dcmpgt
1561; SOFT-NEXT:    cmp r0, #0
1562; SOFT-NEXT:    beq .LBB14_5
1563; SOFT-NEXT:  @ %bb.4:
1564; SOFT-NEXT:    ldr r7, .LCPI14_3
1565; SOFT-NEXT:  .LBB14_5:
1566; SOFT-NEXT:    mov r0, r6
1567; SOFT-NEXT:    mov r1, r5
1568; SOFT-NEXT:    mov r2, r6
1569; SOFT-NEXT:    mov r3, r5
1570; SOFT-NEXT:    bl __aeabi_dcmpun
1571; SOFT-NEXT:    cmp r0, #0
1572; SOFT-NEXT:    bne .LBB14_7
1573; SOFT-NEXT:  @ %bb.6:
1574; SOFT-NEXT:    mov r4, r7
1575; SOFT-NEXT:  .LBB14_7:
1576; SOFT-NEXT:    mov r0, r4
1577; SOFT-NEXT:    add sp, #4
1578; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1579; SOFT-NEXT:    .p2align 2
1580; SOFT-NEXT:  @ %bb.8:
1581; SOFT-NEXT:  .LCPI14_0:
1582; SOFT-NEXT:    .long 3239051264 @ 0xc1100000
1583; SOFT-NEXT:  .LCPI14_1:
1584; SOFT-NEXT:    .long 4294705152 @ 0xfffc0000
1585; SOFT-NEXT:  .LCPI14_2:
1586; SOFT-NEXT:    .long 1091567608 @ 0x410ffff8
1587; SOFT-NEXT:  .LCPI14_3:
1588; SOFT-NEXT:    .long 262143 @ 0x3ffff
1589;
1590; VFP2-LABEL: test_signed_i19_f64:
1591; VFP2:       @ %bb.0:
1592; VFP2-NEXT:    vmov d16, r0, r1
1593; VFP2-NEXT:    vldr d17, .LCPI14_0
1594; VFP2-NEXT:    vldr d18, .LCPI14_1
1595; VFP2-NEXT:    vcvt.s32.f64 s0, d16
1596; VFP2-NEXT:    vcmp.f64 d16, d17
1597; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1598; VFP2-NEXT:    vmov r0, s0
1599; VFP2-NEXT:    vcmp.f64 d16, d18
1600; VFP2-NEXT:    itt lt
1601; VFP2-NEXT:    movlt r0, #0
1602; VFP2-NEXT:    movtlt r0, #65532
1603; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1604; VFP2-NEXT:    itt gt
1605; VFP2-NEXT:    movwgt r0, #65535
1606; VFP2-NEXT:    movtgt r0, #3
1607; VFP2-NEXT:    vcmp.f64 d16, d16
1608; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1609; VFP2-NEXT:    it vs
1610; VFP2-NEXT:    movvs r0, #0
1611; VFP2-NEXT:    bx lr
1612; VFP2-NEXT:    .p2align 3
1613; VFP2-NEXT:  @ %bb.1:
1614; VFP2-NEXT:  .LCPI14_0:
1615; VFP2-NEXT:    .long 0 @ double -262144
1616; VFP2-NEXT:    .long 3239051264
1617; VFP2-NEXT:  .LCPI14_1:
1618; VFP2-NEXT:    .long 0 @ double 262143
1619; VFP2-NEXT:    .long 1091567608
1620;
1621; FP16-LABEL: test_signed_i19_f64:
1622; FP16:       @ %bb.0:
1623; FP16-NEXT:    vldr d0, .LCPI14_0
1624; FP16-NEXT:    vmov d1, r0, r1
1625; FP16-NEXT:    vldr d2, .LCPI14_1
1626; FP16-NEXT:    vmaxnm.f64 d0, d1, d0
1627; FP16-NEXT:    vcmp.f64 d1, d1
1628; FP16-NEXT:    vminnm.f64 d0, d0, d2
1629; FP16-NEXT:    vcvt.s32.f64 s0, d0
1630; FP16-NEXT:    vmov r0, s0
1631; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1632; FP16-NEXT:    it vs
1633; FP16-NEXT:    movvs r0, #0
1634; FP16-NEXT:    bx lr
1635; FP16-NEXT:    .p2align 3
1636; FP16-NEXT:  @ %bb.1:
1637; FP16-NEXT:  .LCPI14_0:
1638; FP16-NEXT:    .long 0 @ double -262144
1639; FP16-NEXT:    .long 3239051264
1640; FP16-NEXT:  .LCPI14_1:
1641; FP16-NEXT:    .long 0 @ double 262143
1642; FP16-NEXT:    .long 1091567608
1643    %x = call i19 @llvm.fptosi.sat.i19.f64(double %f)
1644    ret i19 %x
1645}
1646
1647define i32 @test_signed_i32_f64(double %f) nounwind {
1648; SOFT-LABEL: test_signed_i32_f64:
1649; SOFT:       @ %bb.0:
1650; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1651; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1652; SOFT-NEXT:    .pad #4
1653; SOFT-NEXT:    sub sp, #4
1654; SOFT-NEXT:    mov r5, r1
1655; SOFT-NEXT:    mov r6, r0
1656; SOFT-NEXT:    movs r4, #0
1657; SOFT-NEXT:    ldr r3, .LCPI15_0
1658; SOFT-NEXT:    mov r2, r4
1659; SOFT-NEXT:    bl __aeabi_dcmpge
1660; SOFT-NEXT:    mov r7, r0
1661; SOFT-NEXT:    mov r0, r6
1662; SOFT-NEXT:    mov r1, r5
1663; SOFT-NEXT:    bl __aeabi_d2iz
1664; SOFT-NEXT:    cmp r7, #0
1665; SOFT-NEXT:    beq .LBB15_2
1666; SOFT-NEXT:  @ %bb.1:
1667; SOFT-NEXT:    mov r7, r0
1668; SOFT-NEXT:    b .LBB15_3
1669; SOFT-NEXT:  .LBB15_2:
1670; SOFT-NEXT:    movs r0, #1
1671; SOFT-NEXT:    lsls r7, r0, #31
1672; SOFT-NEXT:  .LBB15_3:
1673; SOFT-NEXT:    ldr r2, .LCPI15_1
1674; SOFT-NEXT:    ldr r3, .LCPI15_2
1675; SOFT-NEXT:    mov r0, r6
1676; SOFT-NEXT:    mov r1, r5
1677; SOFT-NEXT:    bl __aeabi_dcmpgt
1678; SOFT-NEXT:    cmp r0, #0
1679; SOFT-NEXT:    beq .LBB15_5
1680; SOFT-NEXT:  @ %bb.4:
1681; SOFT-NEXT:    ldr r7, .LCPI15_3
1682; SOFT-NEXT:  .LBB15_5:
1683; SOFT-NEXT:    mov r0, r6
1684; SOFT-NEXT:    mov r1, r5
1685; SOFT-NEXT:    mov r2, r6
1686; SOFT-NEXT:    mov r3, r5
1687; SOFT-NEXT:    bl __aeabi_dcmpun
1688; SOFT-NEXT:    cmp r0, #0
1689; SOFT-NEXT:    bne .LBB15_7
1690; SOFT-NEXT:  @ %bb.6:
1691; SOFT-NEXT:    mov r4, r7
1692; SOFT-NEXT:  .LBB15_7:
1693; SOFT-NEXT:    mov r0, r4
1694; SOFT-NEXT:    add sp, #4
1695; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1696; SOFT-NEXT:    .p2align 2
1697; SOFT-NEXT:  @ %bb.8:
1698; SOFT-NEXT:  .LCPI15_0:
1699; SOFT-NEXT:    .long 3252682752 @ 0xc1e00000
1700; SOFT-NEXT:  .LCPI15_1:
1701; SOFT-NEXT:    .long 4290772992 @ 0xffc00000
1702; SOFT-NEXT:  .LCPI15_2:
1703; SOFT-NEXT:    .long 1105199103 @ 0x41dfffff
1704; SOFT-NEXT:  .LCPI15_3:
1705; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
1706;
1707; VFP2-LABEL: test_signed_i32_f64:
1708; VFP2:       @ %bb.0:
1709; VFP2-NEXT:    vmov d16, r0, r1
1710; VFP2-NEXT:    vcvt.s32.f64 s0, d16
1711; VFP2-NEXT:    vmov r0, s0
1712; VFP2-NEXT:    bx lr
1713;
1714; FP16-LABEL: test_signed_i32_f64:
1715; FP16:       @ %bb.0:
1716; FP16-NEXT:    vmov d0, r0, r1
1717; FP16-NEXT:    vcvt.s32.f64 s0, d0
1718; FP16-NEXT:    vmov r0, s0
1719; FP16-NEXT:    bx lr
1720    %x = call i32 @llvm.fptosi.sat.i32.f64(double %f)
1721    ret i32 %x
1722}
1723
1724define i50 @test_signed_i50_f64(double %f) nounwind {
1725; SOFT-LABEL: test_signed_i50_f64:
1726; SOFT:       @ %bb.0:
1727; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1728; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1729; SOFT-NEXT:    .pad #12
1730; SOFT-NEXT:    sub sp, #12
1731; SOFT-NEXT:    mov r5, r1
1732; SOFT-NEXT:    mov r6, r0
1733; SOFT-NEXT:    movs r0, #195
1734; SOFT-NEXT:    lsls r3, r0, #24
1735; SOFT-NEXT:    movs r4, #0
1736; SOFT-NEXT:    mov r0, r6
1737; SOFT-NEXT:    mov r2, r4
1738; SOFT-NEXT:    bl __aeabi_dcmpge
1739; SOFT-NEXT:    mov r7, r0
1740; SOFT-NEXT:    mov r0, r6
1741; SOFT-NEXT:    mov r1, r5
1742; SOFT-NEXT:    bl __aeabi_d2lz
1743; SOFT-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1744; SOFT-NEXT:    cmp r7, #0
1745; SOFT-NEXT:    bne .LBB16_2
1746; SOFT-NEXT:  @ %bb.1:
1747; SOFT-NEXT:    str r7, [sp, #4] @ 4-byte Spill
1748; SOFT-NEXT:  .LBB16_2:
1749; SOFT-NEXT:    beq .LBB16_4
1750; SOFT-NEXT:  @ %bb.3:
1751; SOFT-NEXT:    str r1, [sp, #8] @ 4-byte Spill
1752; SOFT-NEXT:    b .LBB16_5
1753; SOFT-NEXT:  .LBB16_4:
1754; SOFT-NEXT:    ldr r0, .LCPI16_0
1755; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
1756; SOFT-NEXT:  .LBB16_5:
1757; SOFT-NEXT:    movs r0, #15
1758; SOFT-NEXT:    mvns r2, r0
1759; SOFT-NEXT:    ldr r3, .LCPI16_1
1760; SOFT-NEXT:    mov r0, r6
1761; SOFT-NEXT:    mov r1, r5
1762; SOFT-NEXT:    bl __aeabi_dcmpgt
1763; SOFT-NEXT:    mvns r7, r4
1764; SOFT-NEXT:    cmp r0, #0
1765; SOFT-NEXT:    beq .LBB16_7
1766; SOFT-NEXT:  @ %bb.6:
1767; SOFT-NEXT:    ldr r0, .LCPI16_2
1768; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
1769; SOFT-NEXT:  .LBB16_7:
1770; SOFT-NEXT:    bne .LBB16_9
1771; SOFT-NEXT:  @ %bb.8:
1772; SOFT-NEXT:    ldr r7, [sp, #4] @ 4-byte Reload
1773; SOFT-NEXT:  .LBB16_9:
1774; SOFT-NEXT:    mov r0, r6
1775; SOFT-NEXT:    mov r1, r5
1776; SOFT-NEXT:    mov r2, r6
1777; SOFT-NEXT:    mov r3, r5
1778; SOFT-NEXT:    bl __aeabi_dcmpun
1779; SOFT-NEXT:    cmp r0, #0
1780; SOFT-NEXT:    mov r0, r4
1781; SOFT-NEXT:    bne .LBB16_11
1782; SOFT-NEXT:  @ %bb.10:
1783; SOFT-NEXT:    mov r0, r7
1784; SOFT-NEXT:  .LBB16_11:
1785; SOFT-NEXT:    bne .LBB16_13
1786; SOFT-NEXT:  @ %bb.12:
1787; SOFT-NEXT:    ldr r4, [sp, #8] @ 4-byte Reload
1788; SOFT-NEXT:  .LBB16_13:
1789; SOFT-NEXT:    mov r1, r4
1790; SOFT-NEXT:    add sp, #12
1791; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1792; SOFT-NEXT:    .p2align 2
1793; SOFT-NEXT:  @ %bb.14:
1794; SOFT-NEXT:  .LCPI16_0:
1795; SOFT-NEXT:    .long 4294836224 @ 0xfffe0000
1796; SOFT-NEXT:  .LCPI16_1:
1797; SOFT-NEXT:    .long 1124073471 @ 0x42ffffff
1798; SOFT-NEXT:  .LCPI16_2:
1799; SOFT-NEXT:    .long 131071 @ 0x1ffff
1800;
1801; VFP2-LABEL: test_signed_i50_f64:
1802; VFP2:       @ %bb.0:
1803; VFP2-NEXT:    .save {r4, r5, r7, lr}
1804; VFP2-NEXT:    push {r4, r5, r7, lr}
1805; VFP2-NEXT:    mov r4, r1
1806; VFP2-NEXT:    mov r5, r0
1807; VFP2-NEXT:    bl __aeabi_d2lz
1808; VFP2-NEXT:    vldr d16, .LCPI16_0
1809; VFP2-NEXT:    vmov d17, r5, r4
1810; VFP2-NEXT:    vldr d18, .LCPI16_1
1811; VFP2-NEXT:    vcmp.f64 d17, d16
1812; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1813; VFP2-NEXT:    ittt lt
1814; VFP2-NEXT:    movlt r1, #0
1815; VFP2-NEXT:    movtlt r1, #65534
1816; VFP2-NEXT:    movlt r0, #0
1817; VFP2-NEXT:    vcmp.f64 d17, d18
1818; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1819; VFP2-NEXT:    it gt
1820; VFP2-NEXT:    movgt.w r0, #-1
1821; VFP2-NEXT:    vcmp.f64 d17, d17
1822; VFP2-NEXT:    itt gt
1823; VFP2-NEXT:    movwgt r1, #65535
1824; VFP2-NEXT:    movtgt r1, #1
1825; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1826; VFP2-NEXT:    itt vs
1827; VFP2-NEXT:    movvs r0, #0
1828; VFP2-NEXT:    movvs r1, #0
1829; VFP2-NEXT:    pop {r4, r5, r7, pc}
1830; VFP2-NEXT:    .p2align 3
1831; VFP2-NEXT:  @ %bb.1:
1832; VFP2-NEXT:  .LCPI16_0:
1833; VFP2-NEXT:    .long 0 @ double -562949953421312
1834; VFP2-NEXT:    .long 3271557120
1835; VFP2-NEXT:  .LCPI16_1:
1836; VFP2-NEXT:    .long 4294967280 @ double 562949953421311
1837; VFP2-NEXT:    .long 1124073471
1838;
1839; FP16-LABEL: test_signed_i50_f64:
1840; FP16:       @ %bb.0:
1841; FP16-NEXT:    .save {r7, lr}
1842; FP16-NEXT:    push {r7, lr}
1843; FP16-NEXT:    .vsave {d8}
1844; FP16-NEXT:    vpush {d8}
1845; FP16-NEXT:    vldr d0, .LCPI16_0
1846; FP16-NEXT:    vmov d8, r0, r1
1847; FP16-NEXT:    vldr d1, .LCPI16_1
1848; FP16-NEXT:    vmaxnm.f64 d0, d8, d0
1849; FP16-NEXT:    vminnm.f64 d0, d0, d1
1850; FP16-NEXT:    vmov r0, r1, d0
1851; FP16-NEXT:    bl __aeabi_d2lz
1852; FP16-NEXT:    vcmp.f64 d8, d8
1853; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1854; FP16-NEXT:    itt vs
1855; FP16-NEXT:    movvs r0, #0
1856; FP16-NEXT:    movvs r1, #0
1857; FP16-NEXT:    vpop {d8}
1858; FP16-NEXT:    pop {r7, pc}
1859; FP16-NEXT:    .p2align 3
1860; FP16-NEXT:  @ %bb.1:
1861; FP16-NEXT:  .LCPI16_0:
1862; FP16-NEXT:    .long 0 @ double -562949953421312
1863; FP16-NEXT:    .long 3271557120
1864; FP16-NEXT:  .LCPI16_1:
1865; FP16-NEXT:    .long 4294967280 @ double 562949953421311
1866; FP16-NEXT:    .long 1124073471
1867    %x = call i50 @llvm.fptosi.sat.i50.f64(double %f)
1868    ret i50 %x
1869}
1870
1871define i64 @test_signed_i64_f64(double %f) nounwind {
1872; SOFT-LABEL: test_signed_i64_f64:
1873; SOFT:       @ %bb.0:
1874; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
1875; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
1876; SOFT-NEXT:    .pad #12
1877; SOFT-NEXT:    sub sp, #12
1878; SOFT-NEXT:    mov r5, r1
1879; SOFT-NEXT:    mov r6, r0
1880; SOFT-NEXT:    movs r4, #0
1881; SOFT-NEXT:    ldr r3, .LCPI17_0
1882; SOFT-NEXT:    mov r2, r4
1883; SOFT-NEXT:    bl __aeabi_dcmpge
1884; SOFT-NEXT:    mov r7, r0
1885; SOFT-NEXT:    mov r0, r6
1886; SOFT-NEXT:    mov r1, r5
1887; SOFT-NEXT:    bl __aeabi_d2lz
1888; SOFT-NEXT:    str r0, [sp, #4] @ 4-byte Spill
1889; SOFT-NEXT:    movs r0, #1
1890; SOFT-NEXT:    lsls r0, r0, #31
1891; SOFT-NEXT:    cmp r7, #0
1892; SOFT-NEXT:    bne .LBB17_2
1893; SOFT-NEXT:  @ %bb.1:
1894; SOFT-NEXT:    str r7, [sp, #4] @ 4-byte Spill
1895; SOFT-NEXT:  .LBB17_2:
1896; SOFT-NEXT:    beq .LBB17_4
1897; SOFT-NEXT:  @ %bb.3:
1898; SOFT-NEXT:    mov r0, r1
1899; SOFT-NEXT:  .LBB17_4:
1900; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
1901; SOFT-NEXT:    mvns r7, r4
1902; SOFT-NEXT:    ldr r3, .LCPI17_1
1903; SOFT-NEXT:    mov r0, r6
1904; SOFT-NEXT:    mov r1, r5
1905; SOFT-NEXT:    mov r2, r7
1906; SOFT-NEXT:    bl __aeabi_dcmpgt
1907; SOFT-NEXT:    cmp r0, #0
1908; SOFT-NEXT:    beq .LBB17_6
1909; SOFT-NEXT:  @ %bb.5:
1910; SOFT-NEXT:    ldr r0, .LCPI17_2
1911; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
1912; SOFT-NEXT:  .LBB17_6:
1913; SOFT-NEXT:    bne .LBB17_8
1914; SOFT-NEXT:  @ %bb.7:
1915; SOFT-NEXT:    ldr r7, [sp, #4] @ 4-byte Reload
1916; SOFT-NEXT:  .LBB17_8:
1917; SOFT-NEXT:    mov r0, r6
1918; SOFT-NEXT:    mov r1, r5
1919; SOFT-NEXT:    mov r2, r6
1920; SOFT-NEXT:    mov r3, r5
1921; SOFT-NEXT:    bl __aeabi_dcmpun
1922; SOFT-NEXT:    cmp r0, #0
1923; SOFT-NEXT:    mov r0, r4
1924; SOFT-NEXT:    bne .LBB17_10
1925; SOFT-NEXT:  @ %bb.9:
1926; SOFT-NEXT:    mov r0, r7
1927; SOFT-NEXT:  .LBB17_10:
1928; SOFT-NEXT:    bne .LBB17_12
1929; SOFT-NEXT:  @ %bb.11:
1930; SOFT-NEXT:    ldr r4, [sp, #8] @ 4-byte Reload
1931; SOFT-NEXT:  .LBB17_12:
1932; SOFT-NEXT:    mov r1, r4
1933; SOFT-NEXT:    add sp, #12
1934; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
1935; SOFT-NEXT:    .p2align 2
1936; SOFT-NEXT:  @ %bb.13:
1937; SOFT-NEXT:  .LCPI17_0:
1938; SOFT-NEXT:    .long 3286237184 @ 0xc3e00000
1939; SOFT-NEXT:  .LCPI17_1:
1940; SOFT-NEXT:    .long 1138753535 @ 0x43dfffff
1941; SOFT-NEXT:  .LCPI17_2:
1942; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
1943;
1944; VFP2-LABEL: test_signed_i64_f64:
1945; VFP2:       @ %bb.0:
1946; VFP2-NEXT:    .save {r4, r5, r7, lr}
1947; VFP2-NEXT:    push {r4, r5, r7, lr}
1948; VFP2-NEXT:    mov r4, r1
1949; VFP2-NEXT:    mov r5, r0
1950; VFP2-NEXT:    bl __aeabi_d2lz
1951; VFP2-NEXT:    vldr d16, .LCPI17_0
1952; VFP2-NEXT:    vmov d17, r5, r4
1953; VFP2-NEXT:    vldr d18, .LCPI17_1
1954; VFP2-NEXT:    vcmp.f64 d17, d16
1955; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1956; VFP2-NEXT:    itt lt
1957; VFP2-NEXT:    movlt r0, #0
1958; VFP2-NEXT:    movlt.w r1, #-2147483648
1959; VFP2-NEXT:    vcmp.f64 d17, d18
1960; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1961; VFP2-NEXT:    itt gt
1962; VFP2-NEXT:    mvngt r1, #-2147483648
1963; VFP2-NEXT:    movgt.w r0, #-1
1964; VFP2-NEXT:    vcmp.f64 d17, d17
1965; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
1966; VFP2-NEXT:    itt vs
1967; VFP2-NEXT:    movvs r0, #0
1968; VFP2-NEXT:    movvs r1, #0
1969; VFP2-NEXT:    pop {r4, r5, r7, pc}
1970; VFP2-NEXT:    .p2align 3
1971; VFP2-NEXT:  @ %bb.1:
1972; VFP2-NEXT:  .LCPI17_0:
1973; VFP2-NEXT:    .long 0 @ double -9.2233720368547758E+18
1974; VFP2-NEXT:    .long 3286237184
1975; VFP2-NEXT:  .LCPI17_1:
1976; VFP2-NEXT:    .long 4294967295 @ double 9.2233720368547748E+18
1977; VFP2-NEXT:    .long 1138753535
1978;
1979; FP16-LABEL: test_signed_i64_f64:
1980; FP16:       @ %bb.0:
1981; FP16-NEXT:    .save {r4, r5, r7, lr}
1982; FP16-NEXT:    push {r4, r5, r7, lr}
1983; FP16-NEXT:    mov r4, r1
1984; FP16-NEXT:    mov r5, r0
1985; FP16-NEXT:    bl __aeabi_d2lz
1986; FP16-NEXT:    vldr d0, .LCPI17_0
1987; FP16-NEXT:    vmov d1, r5, r4
1988; FP16-NEXT:    vldr d2, .LCPI17_1
1989; FP16-NEXT:    vcmp.f64 d1, d0
1990; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1991; FP16-NEXT:    itt lt
1992; FP16-NEXT:    movlt r0, #0
1993; FP16-NEXT:    movlt.w r1, #-2147483648
1994; FP16-NEXT:    vcmp.f64 d1, d2
1995; FP16-NEXT:    vmrs APSR_nzcv, fpscr
1996; FP16-NEXT:    itt gt
1997; FP16-NEXT:    mvngt r1, #-2147483648
1998; FP16-NEXT:    movgt.w r0, #-1
1999; FP16-NEXT:    vcmp.f64 d1, d1
2000; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2001; FP16-NEXT:    itt vs
2002; FP16-NEXT:    movvs r0, #0
2003; FP16-NEXT:    movvs r1, #0
2004; FP16-NEXT:    pop {r4, r5, r7, pc}
2005; FP16-NEXT:    .p2align 3
2006; FP16-NEXT:  @ %bb.1:
2007; FP16-NEXT:  .LCPI17_0:
2008; FP16-NEXT:    .long 0 @ double -9.2233720368547758E+18
2009; FP16-NEXT:    .long 3286237184
2010; FP16-NEXT:  .LCPI17_1:
2011; FP16-NEXT:    .long 4294967295 @ double 9.2233720368547748E+18
2012; FP16-NEXT:    .long 1138753535
2013    %x = call i64 @llvm.fptosi.sat.i64.f64(double %f)
2014    ret i64 %x
2015}
2016
2017define i100 @test_signed_i100_f64(double %f) nounwind {
2018; SOFT-LABEL: test_signed_i100_f64:
2019; SOFT:       @ %bb.0:
2020; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2021; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2022; SOFT-NEXT:    .pad #20
2023; SOFT-NEXT:    sub sp, #20
2024; SOFT-NEXT:    mov r5, r1
2025; SOFT-NEXT:    mov r6, r0
2026; SOFT-NEXT:    movs r4, #0
2027; SOFT-NEXT:    ldr r3, .LCPI18_0
2028; SOFT-NEXT:    mov r2, r4
2029; SOFT-NEXT:    bl __aeabi_dcmpge
2030; SOFT-NEXT:    mov r7, r0
2031; SOFT-NEXT:    mov r0, r6
2032; SOFT-NEXT:    mov r1, r5
2033; SOFT-NEXT:    bl __fixdfti
2034; SOFT-NEXT:    str r0, [sp, #12] @ 4-byte Spill
2035; SOFT-NEXT:    str r1, [sp, #8] @ 4-byte Spill
2036; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
2037; SOFT-NEXT:    movs r0, #7
2038; SOFT-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2039; SOFT-NEXT:    mvns r0, r0
2040; SOFT-NEXT:    cmp r7, #0
2041; SOFT-NEXT:    beq .LBB18_17
2042; SOFT-NEXT:  @ %bb.1:
2043; SOFT-NEXT:    beq .LBB18_18
2044; SOFT-NEXT:  .LBB18_2:
2045; SOFT-NEXT:    beq .LBB18_19
2046; SOFT-NEXT:  .LBB18_3:
2047; SOFT-NEXT:    beq .LBB18_5
2048; SOFT-NEXT:  .LBB18_4:
2049; SOFT-NEXT:    mov r0, r3
2050; SOFT-NEXT:  .LBB18_5:
2051; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
2052; SOFT-NEXT:    mvns r7, r4
2053; SOFT-NEXT:    ldr r3, .LCPI18_1
2054; SOFT-NEXT:    mov r0, r6
2055; SOFT-NEXT:    mov r1, r5
2056; SOFT-NEXT:    mov r2, r7
2057; SOFT-NEXT:    bl __aeabi_dcmpgt
2058; SOFT-NEXT:    cmp r0, #0
2059; SOFT-NEXT:    beq .LBB18_20
2060; SOFT-NEXT:  @ %bb.6:
2061; SOFT-NEXT:    mov r0, r7
2062; SOFT-NEXT:    beq .LBB18_21
2063; SOFT-NEXT:  .LBB18_7:
2064; SOFT-NEXT:    mov r1, r7
2065; SOFT-NEXT:    bne .LBB18_9
2066; SOFT-NEXT:  .LBB18_8:
2067; SOFT-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
2068; SOFT-NEXT:  .LBB18_9:
2069; SOFT-NEXT:    str r1, [sp, #4] @ 4-byte Spill
2070; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
2071; SOFT-NEXT:    bne .LBB18_11
2072; SOFT-NEXT:  @ %bb.10:
2073; SOFT-NEXT:    ldr r7, [sp, #12] @ 4-byte Reload
2074; SOFT-NEXT:  .LBB18_11:
2075; SOFT-NEXT:    mov r0, r6
2076; SOFT-NEXT:    mov r1, r5
2077; SOFT-NEXT:    mov r2, r6
2078; SOFT-NEXT:    mov r3, r5
2079; SOFT-NEXT:    bl __aeabi_dcmpun
2080; SOFT-NEXT:    cmp r0, #0
2081; SOFT-NEXT:    mov r0, r4
2082; SOFT-NEXT:    beq .LBB18_22
2083; SOFT-NEXT:  @ %bb.12:
2084; SOFT-NEXT:    mov r1, r4
2085; SOFT-NEXT:    beq .LBB18_23
2086; SOFT-NEXT:  .LBB18_13:
2087; SOFT-NEXT:    mov r2, r4
2088; SOFT-NEXT:    beq .LBB18_24
2089; SOFT-NEXT:  .LBB18_14:
2090; SOFT-NEXT:    bne .LBB18_16
2091; SOFT-NEXT:  .LBB18_15:
2092; SOFT-NEXT:    ldr r4, [sp, #16] @ 4-byte Reload
2093; SOFT-NEXT:  .LBB18_16:
2094; SOFT-NEXT:    mov r3, r4
2095; SOFT-NEXT:    add sp, #20
2096; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2097; SOFT-NEXT:  .LBB18_17:
2098; SOFT-NEXT:    str r7, [sp, #12] @ 4-byte Spill
2099; SOFT-NEXT:    bne .LBB18_2
2100; SOFT-NEXT:  .LBB18_18:
2101; SOFT-NEXT:    str r7, [sp, #8] @ 4-byte Spill
2102; SOFT-NEXT:    bne .LBB18_3
2103; SOFT-NEXT:  .LBB18_19:
2104; SOFT-NEXT:    str r7, [sp, #4] @ 4-byte Spill
2105; SOFT-NEXT:    bne .LBB18_4
2106; SOFT-NEXT:    b .LBB18_5
2107; SOFT-NEXT:  .LBB18_20:
2108; SOFT-NEXT:    ldr r0, [sp] @ 4-byte Reload
2109; SOFT-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2110; SOFT-NEXT:    mov r0, r7
2111; SOFT-NEXT:    bne .LBB18_7
2112; SOFT-NEXT:  .LBB18_21:
2113; SOFT-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
2114; SOFT-NEXT:    mov r1, r7
2115; SOFT-NEXT:    beq .LBB18_8
2116; SOFT-NEXT:    b .LBB18_9
2117; SOFT-NEXT:  .LBB18_22:
2118; SOFT-NEXT:    mov r0, r7
2119; SOFT-NEXT:    mov r1, r4
2120; SOFT-NEXT:    bne .LBB18_13
2121; SOFT-NEXT:  .LBB18_23:
2122; SOFT-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2123; SOFT-NEXT:    mov r2, r4
2124; SOFT-NEXT:    bne .LBB18_14
2125; SOFT-NEXT:  .LBB18_24:
2126; SOFT-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
2127; SOFT-NEXT:    beq .LBB18_15
2128; SOFT-NEXT:    b .LBB18_16
2129; SOFT-NEXT:    .p2align 2
2130; SOFT-NEXT:  @ %bb.25:
2131; SOFT-NEXT:  .LCPI18_0:
2132; SOFT-NEXT:    .long 3323985920 @ 0xc6200000
2133; SOFT-NEXT:  .LCPI18_1:
2134; SOFT-NEXT:    .long 1176502271 @ 0x461fffff
2135;
2136; VFP2-LABEL: test_signed_i100_f64:
2137; VFP2:       @ %bb.0:
2138; VFP2-NEXT:    .save {r4, r5, r7, lr}
2139; VFP2-NEXT:    push {r4, r5, r7, lr}
2140; VFP2-NEXT:    mov r4, r1
2141; VFP2-NEXT:    mov r5, r0
2142; VFP2-NEXT:    bl __fixdfti
2143; VFP2-NEXT:    vldr d16, .LCPI18_0
2144; VFP2-NEXT:    vmov d17, r5, r4
2145; VFP2-NEXT:    vldr d18, .LCPI18_1
2146; VFP2-NEXT:    vcmp.f64 d17, d16
2147; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2148; VFP2-NEXT:    itttt lt
2149; VFP2-NEXT:    movlt r0, #0
2150; VFP2-NEXT:    movlt r1, #0
2151; VFP2-NEXT:    movlt r2, #0
2152; VFP2-NEXT:    mvnlt r3, #7
2153; VFP2-NEXT:    vcmp.f64 d17, d18
2154; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2155; VFP2-NEXT:    itttt gt
2156; VFP2-NEXT:    movgt r3, #7
2157; VFP2-NEXT:    movgt.w r2, #-1
2158; VFP2-NEXT:    movgt.w r1, #-1
2159; VFP2-NEXT:    movgt.w r0, #-1
2160; VFP2-NEXT:    vcmp.f64 d17, d17
2161; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2162; VFP2-NEXT:    itttt vs
2163; VFP2-NEXT:    movvs r0, #0
2164; VFP2-NEXT:    movvs r1, #0
2165; VFP2-NEXT:    movvs r2, #0
2166; VFP2-NEXT:    movvs r3, #0
2167; VFP2-NEXT:    pop {r4, r5, r7, pc}
2168; VFP2-NEXT:    .p2align 3
2169; VFP2-NEXT:  @ %bb.1:
2170; VFP2-NEXT:  .LCPI18_0:
2171; VFP2-NEXT:    .long 0 @ double -6.338253001141147E+29
2172; VFP2-NEXT:    .long 3323985920
2173; VFP2-NEXT:  .LCPI18_1:
2174; VFP2-NEXT:    .long 4294967295 @ double 6.3382530011411463E+29
2175; VFP2-NEXT:    .long 1176502271
2176;
2177; FP16-LABEL: test_signed_i100_f64:
2178; FP16:       @ %bb.0:
2179; FP16-NEXT:    .save {r4, r5, r7, lr}
2180; FP16-NEXT:    push {r4, r5, r7, lr}
2181; FP16-NEXT:    mov r4, r1
2182; FP16-NEXT:    mov r5, r0
2183; FP16-NEXT:    bl __fixdfti
2184; FP16-NEXT:    vldr d0, .LCPI18_0
2185; FP16-NEXT:    vmov d1, r5, r4
2186; FP16-NEXT:    vldr d2, .LCPI18_1
2187; FP16-NEXT:    vcmp.f64 d1, d0
2188; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2189; FP16-NEXT:    itttt lt
2190; FP16-NEXT:    movlt r0, #0
2191; FP16-NEXT:    movlt r1, #0
2192; FP16-NEXT:    movlt r2, #0
2193; FP16-NEXT:    mvnlt r3, #7
2194; FP16-NEXT:    vcmp.f64 d1, d2
2195; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2196; FP16-NEXT:    itttt gt
2197; FP16-NEXT:    movgt r3, #7
2198; FP16-NEXT:    movgt.w r2, #-1
2199; FP16-NEXT:    movgt.w r1, #-1
2200; FP16-NEXT:    movgt.w r0, #-1
2201; FP16-NEXT:    vcmp.f64 d1, d1
2202; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2203; FP16-NEXT:    itttt vs
2204; FP16-NEXT:    movvs r0, #0
2205; FP16-NEXT:    movvs r1, #0
2206; FP16-NEXT:    movvs r2, #0
2207; FP16-NEXT:    movvs r3, #0
2208; FP16-NEXT:    pop {r4, r5, r7, pc}
2209; FP16-NEXT:    .p2align 3
2210; FP16-NEXT:  @ %bb.1:
2211; FP16-NEXT:  .LCPI18_0:
2212; FP16-NEXT:    .long 0 @ double -6.338253001141147E+29
2213; FP16-NEXT:    .long 3323985920
2214; FP16-NEXT:  .LCPI18_1:
2215; FP16-NEXT:    .long 4294967295 @ double 6.3382530011411463E+29
2216; FP16-NEXT:    .long 1176502271
2217    %x = call i100 @llvm.fptosi.sat.i100.f64(double %f)
2218    ret i100 %x
2219}
2220
2221define i128 @test_signed_i128_f64(double %f) nounwind {
2222; SOFT-LABEL: test_signed_i128_f64:
2223; SOFT:       @ %bb.0:
2224; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2225; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2226; SOFT-NEXT:    .pad #20
2227; SOFT-NEXT:    sub sp, #20
2228; SOFT-NEXT:    mov r5, r1
2229; SOFT-NEXT:    mov r6, r0
2230; SOFT-NEXT:    movs r4, #0
2231; SOFT-NEXT:    ldr r3, .LCPI19_0
2232; SOFT-NEXT:    mov r2, r4
2233; SOFT-NEXT:    bl __aeabi_dcmpge
2234; SOFT-NEXT:    mov r7, r0
2235; SOFT-NEXT:    mov r0, r6
2236; SOFT-NEXT:    mov r1, r5
2237; SOFT-NEXT:    bl __fixdfti
2238; SOFT-NEXT:    str r0, [sp, #12] @ 4-byte Spill
2239; SOFT-NEXT:    str r1, [sp, #8] @ 4-byte Spill
2240; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
2241; SOFT-NEXT:    movs r0, #1
2242; SOFT-NEXT:    lsls r0, r0, #31
2243; SOFT-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2244; SOFT-NEXT:    cmp r7, #0
2245; SOFT-NEXT:    beq .LBB19_17
2246; SOFT-NEXT:  @ %bb.1:
2247; SOFT-NEXT:    beq .LBB19_18
2248; SOFT-NEXT:  .LBB19_2:
2249; SOFT-NEXT:    beq .LBB19_19
2250; SOFT-NEXT:  .LBB19_3:
2251; SOFT-NEXT:    beq .LBB19_5
2252; SOFT-NEXT:  .LBB19_4:
2253; SOFT-NEXT:    str r3, [sp, #16] @ 4-byte Spill
2254; SOFT-NEXT:  .LBB19_5:
2255; SOFT-NEXT:    mvns r7, r4
2256; SOFT-NEXT:    ldr r3, .LCPI19_1
2257; SOFT-NEXT:    mov r0, r6
2258; SOFT-NEXT:    mov r1, r5
2259; SOFT-NEXT:    mov r2, r7
2260; SOFT-NEXT:    bl __aeabi_dcmpgt
2261; SOFT-NEXT:    cmp r0, #0
2262; SOFT-NEXT:    bne .LBB19_20
2263; SOFT-NEXT:  @ %bb.6:
2264; SOFT-NEXT:    mov r0, r7
2265; SOFT-NEXT:    beq .LBB19_21
2266; SOFT-NEXT:  .LBB19_7:
2267; SOFT-NEXT:    mov r1, r7
2268; SOFT-NEXT:    bne .LBB19_9
2269; SOFT-NEXT:  .LBB19_8:
2270; SOFT-NEXT:    ldr r1, [sp, #8] @ 4-byte Reload
2271; SOFT-NEXT:  .LBB19_9:
2272; SOFT-NEXT:    str r1, [sp, #4] @ 4-byte Spill
2273; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
2274; SOFT-NEXT:    bne .LBB19_11
2275; SOFT-NEXT:  @ %bb.10:
2276; SOFT-NEXT:    ldr r7, [sp, #12] @ 4-byte Reload
2277; SOFT-NEXT:  .LBB19_11:
2278; SOFT-NEXT:    mov r0, r6
2279; SOFT-NEXT:    mov r1, r5
2280; SOFT-NEXT:    mov r2, r6
2281; SOFT-NEXT:    mov r3, r5
2282; SOFT-NEXT:    bl __aeabi_dcmpun
2283; SOFT-NEXT:    cmp r0, #0
2284; SOFT-NEXT:    mov r0, r4
2285; SOFT-NEXT:    beq .LBB19_22
2286; SOFT-NEXT:  @ %bb.12:
2287; SOFT-NEXT:    mov r1, r4
2288; SOFT-NEXT:    beq .LBB19_23
2289; SOFT-NEXT:  .LBB19_13:
2290; SOFT-NEXT:    mov r2, r4
2291; SOFT-NEXT:    beq .LBB19_24
2292; SOFT-NEXT:  .LBB19_14:
2293; SOFT-NEXT:    bne .LBB19_16
2294; SOFT-NEXT:  .LBB19_15:
2295; SOFT-NEXT:    ldr r4, [sp, #16] @ 4-byte Reload
2296; SOFT-NEXT:  .LBB19_16:
2297; SOFT-NEXT:    mov r3, r4
2298; SOFT-NEXT:    add sp, #20
2299; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2300; SOFT-NEXT:  .LBB19_17:
2301; SOFT-NEXT:    str r7, [sp, #12] @ 4-byte Spill
2302; SOFT-NEXT:    bne .LBB19_2
2303; SOFT-NEXT:  .LBB19_18:
2304; SOFT-NEXT:    str r7, [sp, #8] @ 4-byte Spill
2305; SOFT-NEXT:    bne .LBB19_3
2306; SOFT-NEXT:  .LBB19_19:
2307; SOFT-NEXT:    str r7, [sp, #4] @ 4-byte Spill
2308; SOFT-NEXT:    bne .LBB19_4
2309; SOFT-NEXT:    b .LBB19_5
2310; SOFT-NEXT:  .LBB19_20:
2311; SOFT-NEXT:    ldr r0, .LCPI19_2
2312; SOFT-NEXT:    str r0, [sp, #16] @ 4-byte Spill
2313; SOFT-NEXT:    mov r0, r7
2314; SOFT-NEXT:    bne .LBB19_7
2315; SOFT-NEXT:  .LBB19_21:
2316; SOFT-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
2317; SOFT-NEXT:    mov r1, r7
2318; SOFT-NEXT:    beq .LBB19_8
2319; SOFT-NEXT:    b .LBB19_9
2320; SOFT-NEXT:  .LBB19_22:
2321; SOFT-NEXT:    mov r0, r7
2322; SOFT-NEXT:    mov r1, r4
2323; SOFT-NEXT:    bne .LBB19_13
2324; SOFT-NEXT:  .LBB19_23:
2325; SOFT-NEXT:    ldr r1, [sp, #4] @ 4-byte Reload
2326; SOFT-NEXT:    mov r2, r4
2327; SOFT-NEXT:    bne .LBB19_14
2328; SOFT-NEXT:  .LBB19_24:
2329; SOFT-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
2330; SOFT-NEXT:    beq .LBB19_15
2331; SOFT-NEXT:    b .LBB19_16
2332; SOFT-NEXT:    .p2align 2
2333; SOFT-NEXT:  @ %bb.25:
2334; SOFT-NEXT:  .LCPI19_0:
2335; SOFT-NEXT:    .long 3353346048 @ 0xc7e00000
2336; SOFT-NEXT:  .LCPI19_1:
2337; SOFT-NEXT:    .long 1205862399 @ 0x47dfffff
2338; SOFT-NEXT:  .LCPI19_2:
2339; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
2340;
2341; VFP2-LABEL: test_signed_i128_f64:
2342; VFP2:       @ %bb.0:
2343; VFP2-NEXT:    .save {r4, r5, r7, lr}
2344; VFP2-NEXT:    push {r4, r5, r7, lr}
2345; VFP2-NEXT:    mov r4, r1
2346; VFP2-NEXT:    mov r5, r0
2347; VFP2-NEXT:    bl __fixdfti
2348; VFP2-NEXT:    vldr d16, .LCPI19_0
2349; VFP2-NEXT:    vmov d17, r5, r4
2350; VFP2-NEXT:    vldr d18, .LCPI19_1
2351; VFP2-NEXT:    vcmp.f64 d17, d16
2352; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2353; VFP2-NEXT:    itttt lt
2354; VFP2-NEXT:    movlt r0, #0
2355; VFP2-NEXT:    movlt r1, #0
2356; VFP2-NEXT:    movlt r2, #0
2357; VFP2-NEXT:    movlt.w r3, #-2147483648
2358; VFP2-NEXT:    vcmp.f64 d17, d18
2359; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2360; VFP2-NEXT:    itttt gt
2361; VFP2-NEXT:    mvngt r3, #-2147483648
2362; VFP2-NEXT:    movgt.w r2, #-1
2363; VFP2-NEXT:    movgt.w r1, #-1
2364; VFP2-NEXT:    movgt.w r0, #-1
2365; VFP2-NEXT:    vcmp.f64 d17, d17
2366; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2367; VFP2-NEXT:    itttt vs
2368; VFP2-NEXT:    movvs r0, #0
2369; VFP2-NEXT:    movvs r1, #0
2370; VFP2-NEXT:    movvs r2, #0
2371; VFP2-NEXT:    movvs r3, #0
2372; VFP2-NEXT:    pop {r4, r5, r7, pc}
2373; VFP2-NEXT:    .p2align 3
2374; VFP2-NEXT:  @ %bb.1:
2375; VFP2-NEXT:  .LCPI19_0:
2376; VFP2-NEXT:    .long 0 @ double -1.7014118346046923E+38
2377; VFP2-NEXT:    .long 3353346048
2378; VFP2-NEXT:  .LCPI19_1:
2379; VFP2-NEXT:    .long 4294967295 @ double 1.7014118346046921E+38
2380; VFP2-NEXT:    .long 1205862399
2381;
2382; FP16-LABEL: test_signed_i128_f64:
2383; FP16:       @ %bb.0:
2384; FP16-NEXT:    .save {r4, r5, r7, lr}
2385; FP16-NEXT:    push {r4, r5, r7, lr}
2386; FP16-NEXT:    mov r4, r1
2387; FP16-NEXT:    mov r5, r0
2388; FP16-NEXT:    bl __fixdfti
2389; FP16-NEXT:    vldr d0, .LCPI19_0
2390; FP16-NEXT:    vmov d1, r5, r4
2391; FP16-NEXT:    vldr d2, .LCPI19_1
2392; FP16-NEXT:    vcmp.f64 d1, d0
2393; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2394; FP16-NEXT:    itttt lt
2395; FP16-NEXT:    movlt r0, #0
2396; FP16-NEXT:    movlt r1, #0
2397; FP16-NEXT:    movlt r2, #0
2398; FP16-NEXT:    movlt.w r3, #-2147483648
2399; FP16-NEXT:    vcmp.f64 d1, d2
2400; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2401; FP16-NEXT:    itttt gt
2402; FP16-NEXT:    mvngt r3, #-2147483648
2403; FP16-NEXT:    movgt.w r2, #-1
2404; FP16-NEXT:    movgt.w r1, #-1
2405; FP16-NEXT:    movgt.w r0, #-1
2406; FP16-NEXT:    vcmp.f64 d1, d1
2407; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2408; FP16-NEXT:    itttt vs
2409; FP16-NEXT:    movvs r0, #0
2410; FP16-NEXT:    movvs r1, #0
2411; FP16-NEXT:    movvs r2, #0
2412; FP16-NEXT:    movvs r3, #0
2413; FP16-NEXT:    pop {r4, r5, r7, pc}
2414; FP16-NEXT:    .p2align 3
2415; FP16-NEXT:  @ %bb.1:
2416; FP16-NEXT:  .LCPI19_0:
2417; FP16-NEXT:    .long 0 @ double -1.7014118346046923E+38
2418; FP16-NEXT:    .long 3353346048
2419; FP16-NEXT:  .LCPI19_1:
2420; FP16-NEXT:    .long 4294967295 @ double 1.7014118346046921E+38
2421; FP16-NEXT:    .long 1205862399
2422    %x = call i128 @llvm.fptosi.sat.i128.f64(double %f)
2423    ret i128 %x
2424}
2425
2426;
2427; 16-bit float to signed integer
2428;
2429
2430declare   i1 @llvm.fptosi.sat.i1.f16  (half)
2431declare   i8 @llvm.fptosi.sat.i8.f16  (half)
2432declare  i13 @llvm.fptosi.sat.i13.f16 (half)
2433declare  i16 @llvm.fptosi.sat.i16.f16 (half)
2434declare  i19 @llvm.fptosi.sat.i19.f16 (half)
2435declare  i32 @llvm.fptosi.sat.i32.f16 (half)
2436declare  i50 @llvm.fptosi.sat.i50.f16 (half)
2437declare  i64 @llvm.fptosi.sat.i64.f16 (half)
2438declare i100 @llvm.fptosi.sat.i100.f16(half)
2439declare i128 @llvm.fptosi.sat.i128.f16(half)
2440
2441define i1 @test_signed_i1_f16(half %f) nounwind {
2442; SOFT-LABEL: test_signed_i1_f16:
2443; SOFT:       @ %bb.0:
2444; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2445; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2446; SOFT-NEXT:    .pad #4
2447; SOFT-NEXT:    sub sp, #4
2448; SOFT-NEXT:    uxth r0, r0
2449; SOFT-NEXT:    bl __aeabi_h2f
2450; SOFT-NEXT:    mov r4, r0
2451; SOFT-NEXT:    ldr r1, .LCPI20_0
2452; SOFT-NEXT:    bl __aeabi_fcmpge
2453; SOFT-NEXT:    mov r7, r0
2454; SOFT-NEXT:    mov r0, r4
2455; SOFT-NEXT:    bl __aeabi_f2iz
2456; SOFT-NEXT:    movs r5, #0
2457; SOFT-NEXT:    cmp r7, #0
2458; SOFT-NEXT:    beq .LBB20_2
2459; SOFT-NEXT:  @ %bb.1:
2460; SOFT-NEXT:    mov r6, r0
2461; SOFT-NEXT:    b .LBB20_3
2462; SOFT-NEXT:  .LBB20_2:
2463; SOFT-NEXT:    mvns r6, r5
2464; SOFT-NEXT:  .LBB20_3:
2465; SOFT-NEXT:    mov r0, r4
2466; SOFT-NEXT:    mov r1, r5
2467; SOFT-NEXT:    bl __aeabi_fcmpgt
2468; SOFT-NEXT:    cmp r0, #0
2469; SOFT-NEXT:    mov r7, r5
2470; SOFT-NEXT:    bne .LBB20_5
2471; SOFT-NEXT:  @ %bb.4:
2472; SOFT-NEXT:    mov r7, r6
2473; SOFT-NEXT:  .LBB20_5:
2474; SOFT-NEXT:    mov r0, r4
2475; SOFT-NEXT:    mov r1, r4
2476; SOFT-NEXT:    bl __aeabi_fcmpun
2477; SOFT-NEXT:    cmp r0, #0
2478; SOFT-NEXT:    bne .LBB20_7
2479; SOFT-NEXT:  @ %bb.6:
2480; SOFT-NEXT:    mov r5, r7
2481; SOFT-NEXT:  .LBB20_7:
2482; SOFT-NEXT:    mov r0, r5
2483; SOFT-NEXT:    add sp, #4
2484; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2485; SOFT-NEXT:    .p2align 2
2486; SOFT-NEXT:  @ %bb.8:
2487; SOFT-NEXT:  .LCPI20_0:
2488; SOFT-NEXT:    .long 3212836864 @ 0xbf800000
2489;
2490; VFP2-LABEL: test_signed_i1_f16:
2491; VFP2:       @ %bb.0:
2492; VFP2-NEXT:    .save {r7, lr}
2493; VFP2-NEXT:    push {r7, lr}
2494; VFP2-NEXT:    bl __aeabi_h2f
2495; VFP2-NEXT:    vmov s2, r0
2496; VFP2-NEXT:    vmov.f32 s0, #-1.000000e+00
2497; VFP2-NEXT:    vcvt.s32.f32 s4, s2
2498; VFP2-NEXT:    vcmp.f32 s2, s0
2499; VFP2-NEXT:    vmov r0, s4
2500; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2501; VFP2-NEXT:    it lt
2502; VFP2-NEXT:    movlt.w r0, #-1
2503; VFP2-NEXT:    vcmp.f32 s2, #0
2504; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2505; VFP2-NEXT:    it gt
2506; VFP2-NEXT:    movgt r0, #0
2507; VFP2-NEXT:    vcmp.f32 s2, s2
2508; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2509; VFP2-NEXT:    it vs
2510; VFP2-NEXT:    movvs r0, #0
2511; VFP2-NEXT:    pop {r7, pc}
2512;
2513; FP16-LABEL: test_signed_i1_f16:
2514; FP16:       @ %bb.0:
2515; FP16-NEXT:    vmov.f16 s0, r0
2516; FP16-NEXT:    vldr s2, .LCPI20_0
2517; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2518; FP16-NEXT:    vmov.f32 s4, #-1.000000e+00
2519; FP16-NEXT:    vmaxnm.f32 s4, s0, s4
2520; FP16-NEXT:    vcmp.f32 s0, s0
2521; FP16-NEXT:    vminnm.f32 s2, s4, s2
2522; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2523; FP16-NEXT:    vcvt.s32.f32 s2, s2
2524; FP16-NEXT:    vmov r0, s2
2525; FP16-NEXT:    it vs
2526; FP16-NEXT:    movvs r0, #0
2527; FP16-NEXT:    bx lr
2528; FP16-NEXT:    .p2align 2
2529; FP16-NEXT:  @ %bb.1:
2530; FP16-NEXT:  .LCPI20_0:
2531; FP16-NEXT:    .long 0x00000000 @ float 0
2532    %x = call i1 @llvm.fptosi.sat.i1.f16(half %f)
2533    ret i1 %x
2534}
2535
2536define i8 @test_signed_i8_f16(half %f) nounwind {
2537; SOFT-LABEL: test_signed_i8_f16:
2538; SOFT:       @ %bb.0:
2539; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
2540; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
2541; SOFT-NEXT:    .pad #4
2542; SOFT-NEXT:    sub sp, #4
2543; SOFT-NEXT:    uxth r0, r0
2544; SOFT-NEXT:    bl __aeabi_h2f
2545; SOFT-NEXT:    mov r4, r0
2546; SOFT-NEXT:    movs r0, #195
2547; SOFT-NEXT:    lsls r1, r0, #24
2548; SOFT-NEXT:    mov r0, r4
2549; SOFT-NEXT:    bl __aeabi_fcmpge
2550; SOFT-NEXT:    mov r7, r0
2551; SOFT-NEXT:    mov r0, r4
2552; SOFT-NEXT:    bl __aeabi_f2iz
2553; SOFT-NEXT:    movs r5, #127
2554; SOFT-NEXT:    cmp r7, #0
2555; SOFT-NEXT:    beq .LBB21_2
2556; SOFT-NEXT:  @ %bb.1:
2557; SOFT-NEXT:    mov r6, r0
2558; SOFT-NEXT:    b .LBB21_3
2559; SOFT-NEXT:  .LBB21_2:
2560; SOFT-NEXT:    mvns r6, r5
2561; SOFT-NEXT:  .LBB21_3:
2562; SOFT-NEXT:    ldr r1, .LCPI21_0
2563; SOFT-NEXT:    mov r0, r4
2564; SOFT-NEXT:    bl __aeabi_fcmpgt
2565; SOFT-NEXT:    cmp r0, #0
2566; SOFT-NEXT:    bne .LBB21_5
2567; SOFT-NEXT:  @ %bb.4:
2568; SOFT-NEXT:    mov r5, r6
2569; SOFT-NEXT:  .LBB21_5:
2570; SOFT-NEXT:    mov r0, r4
2571; SOFT-NEXT:    mov r1, r4
2572; SOFT-NEXT:    bl __aeabi_fcmpun
2573; SOFT-NEXT:    cmp r0, #0
2574; SOFT-NEXT:    beq .LBB21_7
2575; SOFT-NEXT:  @ %bb.6:
2576; SOFT-NEXT:    movs r5, #0
2577; SOFT-NEXT:  .LBB21_7:
2578; SOFT-NEXT:    mov r0, r5
2579; SOFT-NEXT:    add sp, #4
2580; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
2581; SOFT-NEXT:    .p2align 2
2582; SOFT-NEXT:  @ %bb.8:
2583; SOFT-NEXT:  .LCPI21_0:
2584; SOFT-NEXT:    .long 1123942400 @ 0x42fe0000
2585;
2586; VFP2-LABEL: test_signed_i8_f16:
2587; VFP2:       @ %bb.0:
2588; VFP2-NEXT:    .save {r7, lr}
2589; VFP2-NEXT:    push {r7, lr}
2590; VFP2-NEXT:    bl __aeabi_h2f
2591; VFP2-NEXT:    vmov s0, r0
2592; VFP2-NEXT:    vldr s2, .LCPI21_0
2593; VFP2-NEXT:    vldr s6, .LCPI21_1
2594; VFP2-NEXT:    vcvt.s32.f32 s4, s0
2595; VFP2-NEXT:    vcmp.f32 s0, s2
2596; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2597; VFP2-NEXT:    vcmp.f32 s0, s6
2598; VFP2-NEXT:    vmov r0, s4
2599; VFP2-NEXT:    it lt
2600; VFP2-NEXT:    mvnlt r0, #127
2601; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2602; VFP2-NEXT:    it gt
2603; VFP2-NEXT:    movgt r0, #127
2604; VFP2-NEXT:    vcmp.f32 s0, s0
2605; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2606; VFP2-NEXT:    it vs
2607; VFP2-NEXT:    movvs r0, #0
2608; VFP2-NEXT:    pop {r7, pc}
2609; VFP2-NEXT:    .p2align 2
2610; VFP2-NEXT:  @ %bb.1:
2611; VFP2-NEXT:  .LCPI21_0:
2612; VFP2-NEXT:    .long 0xc3000000 @ float -128
2613; VFP2-NEXT:  .LCPI21_1:
2614; VFP2-NEXT:    .long 0x42fe0000 @ float 127
2615;
2616; FP16-LABEL: test_signed_i8_f16:
2617; FP16:       @ %bb.0:
2618; FP16-NEXT:    vmov.f16 s0, r0
2619; FP16-NEXT:    vldr s4, .LCPI21_1
2620; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2621; FP16-NEXT:    vldr s2, .LCPI21_0
2622; FP16-NEXT:    vmaxnm.f32 s4, s0, s4
2623; FP16-NEXT:    vcmp.f32 s0, s0
2624; FP16-NEXT:    vminnm.f32 s2, s4, s2
2625; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2626; FP16-NEXT:    vcvt.s32.f32 s2, s2
2627; FP16-NEXT:    vmov r0, s2
2628; FP16-NEXT:    it vs
2629; FP16-NEXT:    movvs r0, #0
2630; FP16-NEXT:    bx lr
2631; FP16-NEXT:    .p2align 2
2632; FP16-NEXT:  @ %bb.1:
2633; FP16-NEXT:  .LCPI21_0:
2634; FP16-NEXT:    .long 0x42fe0000 @ float 127
2635; FP16-NEXT:  .LCPI21_1:
2636; FP16-NEXT:    .long 0xc3000000 @ float -128
2637    %x = call i8 @llvm.fptosi.sat.i8.f16(half %f)
2638    ret i8 %x
2639}
2640
2641define i13 @test_signed_i13_f16(half %f) nounwind {
2642; SOFT-LABEL: test_signed_i13_f16:
2643; SOFT:       @ %bb.0:
2644; SOFT-NEXT:    .save {r4, r5, r6, lr}
2645; SOFT-NEXT:    push {r4, r5, r6, lr}
2646; SOFT-NEXT:    uxth r0, r0
2647; SOFT-NEXT:    bl __aeabi_h2f
2648; SOFT-NEXT:    mov r4, r0
2649; SOFT-NEXT:    ldr r1, .LCPI22_0
2650; SOFT-NEXT:    bl __aeabi_fcmpge
2651; SOFT-NEXT:    mov r6, r0
2652; SOFT-NEXT:    mov r0, r4
2653; SOFT-NEXT:    bl __aeabi_f2iz
2654; SOFT-NEXT:    cmp r6, #0
2655; SOFT-NEXT:    beq .LBB22_2
2656; SOFT-NEXT:  @ %bb.1:
2657; SOFT-NEXT:    mov r5, r0
2658; SOFT-NEXT:    b .LBB22_3
2659; SOFT-NEXT:  .LBB22_2:
2660; SOFT-NEXT:    ldr r5, .LCPI22_1
2661; SOFT-NEXT:  .LBB22_3:
2662; SOFT-NEXT:    ldr r1, .LCPI22_2
2663; SOFT-NEXT:    mov r0, r4
2664; SOFT-NEXT:    bl __aeabi_fcmpgt
2665; SOFT-NEXT:    cmp r0, #0
2666; SOFT-NEXT:    beq .LBB22_5
2667; SOFT-NEXT:  @ %bb.4:
2668; SOFT-NEXT:    ldr r5, .LCPI22_3
2669; SOFT-NEXT:  .LBB22_5:
2670; SOFT-NEXT:    mov r0, r4
2671; SOFT-NEXT:    mov r1, r4
2672; SOFT-NEXT:    bl __aeabi_fcmpun
2673; SOFT-NEXT:    cmp r0, #0
2674; SOFT-NEXT:    beq .LBB22_7
2675; SOFT-NEXT:  @ %bb.6:
2676; SOFT-NEXT:    movs r5, #0
2677; SOFT-NEXT:  .LBB22_7:
2678; SOFT-NEXT:    mov r0, r5
2679; SOFT-NEXT:    pop {r4, r5, r6, pc}
2680; SOFT-NEXT:    .p2align 2
2681; SOFT-NEXT:  @ %bb.8:
2682; SOFT-NEXT:  .LCPI22_0:
2683; SOFT-NEXT:    .long 3313500160 @ 0xc5800000
2684; SOFT-NEXT:  .LCPI22_1:
2685; SOFT-NEXT:    .long 4294963200 @ 0xfffff000
2686; SOFT-NEXT:  .LCPI22_2:
2687; SOFT-NEXT:    .long 1166012416 @ 0x457ff000
2688; SOFT-NEXT:  .LCPI22_3:
2689; SOFT-NEXT:    .long 4095 @ 0xfff
2690;
2691; VFP2-LABEL: test_signed_i13_f16:
2692; VFP2:       @ %bb.0:
2693; VFP2-NEXT:    .save {r7, lr}
2694; VFP2-NEXT:    push {r7, lr}
2695; VFP2-NEXT:    bl __aeabi_h2f
2696; VFP2-NEXT:    vmov s0, r0
2697; VFP2-NEXT:    vldr s2, .LCPI22_0
2698; VFP2-NEXT:    vldr s6, .LCPI22_1
2699; VFP2-NEXT:    vcvt.s32.f32 s4, s0
2700; VFP2-NEXT:    vcmp.f32 s0, s2
2701; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2702; VFP2-NEXT:    vcmp.f32 s0, s6
2703; VFP2-NEXT:    vmov r0, s4
2704; VFP2-NEXT:    itt lt
2705; VFP2-NEXT:    movwlt r0, #61440
2706; VFP2-NEXT:    movtlt r0, #65535
2707; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2708; VFP2-NEXT:    it gt
2709; VFP2-NEXT:    movwgt r0, #4095
2710; VFP2-NEXT:    vcmp.f32 s0, s0
2711; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2712; VFP2-NEXT:    it vs
2713; VFP2-NEXT:    movvs r0, #0
2714; VFP2-NEXT:    pop {r7, pc}
2715; VFP2-NEXT:    .p2align 2
2716; VFP2-NEXT:  @ %bb.1:
2717; VFP2-NEXT:  .LCPI22_0:
2718; VFP2-NEXT:    .long 0xc5800000 @ float -4096
2719; VFP2-NEXT:  .LCPI22_1:
2720; VFP2-NEXT:    .long 0x457ff000 @ float 4095
2721;
2722; FP16-LABEL: test_signed_i13_f16:
2723; FP16:       @ %bb.0:
2724; FP16-NEXT:    vmov.f16 s0, r0
2725; FP16-NEXT:    vldr s4, .LCPI22_1
2726; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2727; FP16-NEXT:    vldr s2, .LCPI22_0
2728; FP16-NEXT:    vmaxnm.f32 s4, s0, s4
2729; FP16-NEXT:    vcmp.f32 s0, s0
2730; FP16-NEXT:    vminnm.f32 s2, s4, s2
2731; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2732; FP16-NEXT:    vcvt.s32.f32 s2, s2
2733; FP16-NEXT:    vmov r0, s2
2734; FP16-NEXT:    it vs
2735; FP16-NEXT:    movvs r0, #0
2736; FP16-NEXT:    bx lr
2737; FP16-NEXT:    .p2align 2
2738; FP16-NEXT:  @ %bb.1:
2739; FP16-NEXT:  .LCPI22_0:
2740; FP16-NEXT:    .long 0x457ff000 @ float 4095
2741; FP16-NEXT:  .LCPI22_1:
2742; FP16-NEXT:    .long 0xc5800000 @ float -4096
2743    %x = call i13 @llvm.fptosi.sat.i13.f16(half %f)
2744    ret i13 %x
2745}
2746
2747define i16 @test_signed_i16_f16(half %f) nounwind {
2748; SOFT-LABEL: test_signed_i16_f16:
2749; SOFT:       @ %bb.0:
2750; SOFT-NEXT:    .save {r4, r5, r6, lr}
2751; SOFT-NEXT:    push {r4, r5, r6, lr}
2752; SOFT-NEXT:    uxth r0, r0
2753; SOFT-NEXT:    bl __aeabi_h2f
2754; SOFT-NEXT:    mov r4, r0
2755; SOFT-NEXT:    movs r0, #199
2756; SOFT-NEXT:    lsls r1, r0, #24
2757; SOFT-NEXT:    mov r0, r4
2758; SOFT-NEXT:    bl __aeabi_fcmpge
2759; SOFT-NEXT:    mov r6, r0
2760; SOFT-NEXT:    mov r0, r4
2761; SOFT-NEXT:    bl __aeabi_f2iz
2762; SOFT-NEXT:    cmp r6, #0
2763; SOFT-NEXT:    beq .LBB23_2
2764; SOFT-NEXT:  @ %bb.1:
2765; SOFT-NEXT:    mov r5, r0
2766; SOFT-NEXT:    b .LBB23_3
2767; SOFT-NEXT:  .LBB23_2:
2768; SOFT-NEXT:    ldr r5, .LCPI23_0
2769; SOFT-NEXT:  .LBB23_3:
2770; SOFT-NEXT:    ldr r1, .LCPI23_1
2771; SOFT-NEXT:    mov r0, r4
2772; SOFT-NEXT:    bl __aeabi_fcmpgt
2773; SOFT-NEXT:    cmp r0, #0
2774; SOFT-NEXT:    beq .LBB23_5
2775; SOFT-NEXT:  @ %bb.4:
2776; SOFT-NEXT:    ldr r5, .LCPI23_2
2777; SOFT-NEXT:  .LBB23_5:
2778; SOFT-NEXT:    mov r0, r4
2779; SOFT-NEXT:    mov r1, r4
2780; SOFT-NEXT:    bl __aeabi_fcmpun
2781; SOFT-NEXT:    cmp r0, #0
2782; SOFT-NEXT:    beq .LBB23_7
2783; SOFT-NEXT:  @ %bb.6:
2784; SOFT-NEXT:    movs r5, #0
2785; SOFT-NEXT:  .LBB23_7:
2786; SOFT-NEXT:    mov r0, r5
2787; SOFT-NEXT:    pop {r4, r5, r6, pc}
2788; SOFT-NEXT:    .p2align 2
2789; SOFT-NEXT:  @ %bb.8:
2790; SOFT-NEXT:  .LCPI23_0:
2791; SOFT-NEXT:    .long 4294934528 @ 0xffff8000
2792; SOFT-NEXT:  .LCPI23_1:
2793; SOFT-NEXT:    .long 1191181824 @ 0x46fffe00
2794; SOFT-NEXT:  .LCPI23_2:
2795; SOFT-NEXT:    .long 32767 @ 0x7fff
2796;
2797; VFP2-LABEL: test_signed_i16_f16:
2798; VFP2:       @ %bb.0:
2799; VFP2-NEXT:    .save {r7, lr}
2800; VFP2-NEXT:    push {r7, lr}
2801; VFP2-NEXT:    bl __aeabi_h2f
2802; VFP2-NEXT:    vmov s0, r0
2803; VFP2-NEXT:    vldr s2, .LCPI23_0
2804; VFP2-NEXT:    vldr s6, .LCPI23_1
2805; VFP2-NEXT:    vcvt.s32.f32 s4, s0
2806; VFP2-NEXT:    vcmp.f32 s0, s2
2807; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2808; VFP2-NEXT:    vcmp.f32 s0, s6
2809; VFP2-NEXT:    vmov r0, s4
2810; VFP2-NEXT:    itt lt
2811; VFP2-NEXT:    movwlt r0, #32768
2812; VFP2-NEXT:    movtlt r0, #65535
2813; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2814; VFP2-NEXT:    it gt
2815; VFP2-NEXT:    movwgt r0, #32767
2816; VFP2-NEXT:    vcmp.f32 s0, s0
2817; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2818; VFP2-NEXT:    it vs
2819; VFP2-NEXT:    movvs r0, #0
2820; VFP2-NEXT:    pop {r7, pc}
2821; VFP2-NEXT:    .p2align 2
2822; VFP2-NEXT:  @ %bb.1:
2823; VFP2-NEXT:  .LCPI23_0:
2824; VFP2-NEXT:    .long 0xc7000000 @ float -32768
2825; VFP2-NEXT:  .LCPI23_1:
2826; VFP2-NEXT:    .long 0x46fffe00 @ float 32767
2827;
2828; FP16-LABEL: test_signed_i16_f16:
2829; FP16:       @ %bb.0:
2830; FP16-NEXT:    vmov.f16 s0, r0
2831; FP16-NEXT:    vldr s4, .LCPI23_1
2832; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2833; FP16-NEXT:    vldr s2, .LCPI23_0
2834; FP16-NEXT:    vmaxnm.f32 s4, s0, s4
2835; FP16-NEXT:    vcmp.f32 s0, s0
2836; FP16-NEXT:    vminnm.f32 s2, s4, s2
2837; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2838; FP16-NEXT:    vcvt.s32.f32 s2, s2
2839; FP16-NEXT:    vmov r0, s2
2840; FP16-NEXT:    it vs
2841; FP16-NEXT:    movvs r0, #0
2842; FP16-NEXT:    bx lr
2843; FP16-NEXT:    .p2align 2
2844; FP16-NEXT:  @ %bb.1:
2845; FP16-NEXT:  .LCPI23_0:
2846; FP16-NEXT:    .long 0x46fffe00 @ float 32767
2847; FP16-NEXT:  .LCPI23_1:
2848; FP16-NEXT:    .long 0xc7000000 @ float -32768
2849    %x = call i16 @llvm.fptosi.sat.i16.f16(half %f)
2850    ret i16 %x
2851}
2852
2853define i19 @test_signed_i19_f16(half %f) nounwind {
2854; SOFT-LABEL: test_signed_i19_f16:
2855; SOFT:       @ %bb.0:
2856; SOFT-NEXT:    .save {r4, r5, r6, lr}
2857; SOFT-NEXT:    push {r4, r5, r6, lr}
2858; SOFT-NEXT:    uxth r0, r0
2859; SOFT-NEXT:    bl __aeabi_h2f
2860; SOFT-NEXT:    mov r4, r0
2861; SOFT-NEXT:    ldr r1, .LCPI24_0
2862; SOFT-NEXT:    bl __aeabi_fcmpge
2863; SOFT-NEXT:    mov r6, r0
2864; SOFT-NEXT:    mov r0, r4
2865; SOFT-NEXT:    bl __aeabi_f2iz
2866; SOFT-NEXT:    cmp r6, #0
2867; SOFT-NEXT:    beq .LBB24_2
2868; SOFT-NEXT:  @ %bb.1:
2869; SOFT-NEXT:    mov r5, r0
2870; SOFT-NEXT:    b .LBB24_3
2871; SOFT-NEXT:  .LBB24_2:
2872; SOFT-NEXT:    ldr r5, .LCPI24_1
2873; SOFT-NEXT:  .LBB24_3:
2874; SOFT-NEXT:    ldr r1, .LCPI24_2
2875; SOFT-NEXT:    mov r0, r4
2876; SOFT-NEXT:    bl __aeabi_fcmpgt
2877; SOFT-NEXT:    cmp r0, #0
2878; SOFT-NEXT:    beq .LBB24_5
2879; SOFT-NEXT:  @ %bb.4:
2880; SOFT-NEXT:    ldr r5, .LCPI24_3
2881; SOFT-NEXT:  .LBB24_5:
2882; SOFT-NEXT:    mov r0, r4
2883; SOFT-NEXT:    mov r1, r4
2884; SOFT-NEXT:    bl __aeabi_fcmpun
2885; SOFT-NEXT:    cmp r0, #0
2886; SOFT-NEXT:    beq .LBB24_7
2887; SOFT-NEXT:  @ %bb.6:
2888; SOFT-NEXT:    movs r5, #0
2889; SOFT-NEXT:  .LBB24_7:
2890; SOFT-NEXT:    mov r0, r5
2891; SOFT-NEXT:    pop {r4, r5, r6, pc}
2892; SOFT-NEXT:    .p2align 2
2893; SOFT-NEXT:  @ %bb.8:
2894; SOFT-NEXT:  .LCPI24_0:
2895; SOFT-NEXT:    .long 3363831808 @ 0xc8800000
2896; SOFT-NEXT:  .LCPI24_1:
2897; SOFT-NEXT:    .long 4294705152 @ 0xfffc0000
2898; SOFT-NEXT:  .LCPI24_2:
2899; SOFT-NEXT:    .long 1216348096 @ 0x487fffc0
2900; SOFT-NEXT:  .LCPI24_3:
2901; SOFT-NEXT:    .long 262143 @ 0x3ffff
2902;
2903; VFP2-LABEL: test_signed_i19_f16:
2904; VFP2:       @ %bb.0:
2905; VFP2-NEXT:    .save {r7, lr}
2906; VFP2-NEXT:    push {r7, lr}
2907; VFP2-NEXT:    bl __aeabi_h2f
2908; VFP2-NEXT:    vmov s0, r0
2909; VFP2-NEXT:    vldr s2, .LCPI24_0
2910; VFP2-NEXT:    vldr s6, .LCPI24_1
2911; VFP2-NEXT:    vcvt.s32.f32 s4, s0
2912; VFP2-NEXT:    vcmp.f32 s0, s2
2913; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2914; VFP2-NEXT:    vcmp.f32 s0, s6
2915; VFP2-NEXT:    vmov r0, s4
2916; VFP2-NEXT:    itt lt
2917; VFP2-NEXT:    movlt r0, #0
2918; VFP2-NEXT:    movtlt r0, #65532
2919; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2920; VFP2-NEXT:    vcmp.f32 s0, s0
2921; VFP2-NEXT:    itt gt
2922; VFP2-NEXT:    movwgt r0, #65535
2923; VFP2-NEXT:    movtgt r0, #3
2924; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
2925; VFP2-NEXT:    it vs
2926; VFP2-NEXT:    movvs r0, #0
2927; VFP2-NEXT:    pop {r7, pc}
2928; VFP2-NEXT:    .p2align 2
2929; VFP2-NEXT:  @ %bb.1:
2930; VFP2-NEXT:  .LCPI24_0:
2931; VFP2-NEXT:    .long 0xc8800000 @ float -262144
2932; VFP2-NEXT:  .LCPI24_1:
2933; VFP2-NEXT:    .long 0x487fffc0 @ float 262143
2934;
2935; FP16-LABEL: test_signed_i19_f16:
2936; FP16:       @ %bb.0:
2937; FP16-NEXT:    vmov.f16 s0, r0
2938; FP16-NEXT:    vldr s4, .LCPI24_1
2939; FP16-NEXT:    vcvtb.f32.f16 s0, s0
2940; FP16-NEXT:    vldr s2, .LCPI24_0
2941; FP16-NEXT:    vmaxnm.f32 s4, s0, s4
2942; FP16-NEXT:    vcmp.f32 s0, s0
2943; FP16-NEXT:    vminnm.f32 s2, s4, s2
2944; FP16-NEXT:    vmrs APSR_nzcv, fpscr
2945; FP16-NEXT:    vcvt.s32.f32 s2, s2
2946; FP16-NEXT:    vmov r0, s2
2947; FP16-NEXT:    it vs
2948; FP16-NEXT:    movvs r0, #0
2949; FP16-NEXT:    bx lr
2950; FP16-NEXT:    .p2align 2
2951; FP16-NEXT:  @ %bb.1:
2952; FP16-NEXT:  .LCPI24_0:
2953; FP16-NEXT:    .long 0x487fffc0 @ float 262143
2954; FP16-NEXT:  .LCPI24_1:
2955; FP16-NEXT:    .long 0xc8800000 @ float -262144
2956    %x = call i19 @llvm.fptosi.sat.i19.f16(half %f)
2957    ret i19 %x
2958}
2959
2960define i32 @test_signed_i32_f16(half %f) nounwind {
2961; SOFT-LABEL: test_signed_i32_f16:
2962; SOFT:       @ %bb.0:
2963; SOFT-NEXT:    .save {r4, r5, r6, lr}
2964; SOFT-NEXT:    push {r4, r5, r6, lr}
2965; SOFT-NEXT:    uxth r0, r0
2966; SOFT-NEXT:    bl __aeabi_h2f
2967; SOFT-NEXT:    mov r4, r0
2968; SOFT-NEXT:    movs r0, #207
2969; SOFT-NEXT:    lsls r1, r0, #24
2970; SOFT-NEXT:    mov r0, r4
2971; SOFT-NEXT:    bl __aeabi_fcmpge
2972; SOFT-NEXT:    mov r6, r0
2973; SOFT-NEXT:    mov r0, r4
2974; SOFT-NEXT:    bl __aeabi_f2iz
2975; SOFT-NEXT:    cmp r6, #0
2976; SOFT-NEXT:    beq .LBB25_2
2977; SOFT-NEXT:  @ %bb.1:
2978; SOFT-NEXT:    mov r5, r0
2979; SOFT-NEXT:    b .LBB25_3
2980; SOFT-NEXT:  .LBB25_2:
2981; SOFT-NEXT:    movs r0, #1
2982; SOFT-NEXT:    lsls r5, r0, #31
2983; SOFT-NEXT:  .LBB25_3:
2984; SOFT-NEXT:    ldr r1, .LCPI25_0
2985; SOFT-NEXT:    mov r0, r4
2986; SOFT-NEXT:    bl __aeabi_fcmpgt
2987; SOFT-NEXT:    cmp r0, #0
2988; SOFT-NEXT:    beq .LBB25_5
2989; SOFT-NEXT:  @ %bb.4:
2990; SOFT-NEXT:    ldr r5, .LCPI25_1
2991; SOFT-NEXT:  .LBB25_5:
2992; SOFT-NEXT:    mov r0, r4
2993; SOFT-NEXT:    mov r1, r4
2994; SOFT-NEXT:    bl __aeabi_fcmpun
2995; SOFT-NEXT:    cmp r0, #0
2996; SOFT-NEXT:    beq .LBB25_7
2997; SOFT-NEXT:  @ %bb.6:
2998; SOFT-NEXT:    movs r5, #0
2999; SOFT-NEXT:  .LBB25_7:
3000; SOFT-NEXT:    mov r0, r5
3001; SOFT-NEXT:    pop {r4, r5, r6, pc}
3002; SOFT-NEXT:    .p2align 2
3003; SOFT-NEXT:  @ %bb.8:
3004; SOFT-NEXT:  .LCPI25_0:
3005; SOFT-NEXT:    .long 1325400063 @ 0x4effffff
3006; SOFT-NEXT:  .LCPI25_1:
3007; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
3008;
3009; VFP2-LABEL: test_signed_i32_f16:
3010; VFP2:       @ %bb.0:
3011; VFP2-NEXT:    .save {r7, lr}
3012; VFP2-NEXT:    push {r7, lr}
3013; VFP2-NEXT:    bl __aeabi_h2f
3014; VFP2-NEXT:    vmov s0, r0
3015; VFP2-NEXT:    vcvt.s32.f32 s0, s0
3016; VFP2-NEXT:    vmov r0, s0
3017; VFP2-NEXT:    pop {r7, pc}
3018;
3019; FP16-LABEL: test_signed_i32_f16:
3020; FP16:       @ %bb.0:
3021; FP16-NEXT:    vmov.f16 s0, r0
3022; FP16-NEXT:    vcvt.s32.f16 s0, s0
3023; FP16-NEXT:    vmov r0, s0
3024; FP16-NEXT:    bx lr
3025    %x = call i32 @llvm.fptosi.sat.i32.f16(half %f)
3026    ret i32 %x
3027}
3028
3029define i50 @test_signed_i50_f16(half %f) nounwind {
3030; SOFT-LABEL: test_signed_i50_f16:
3031; SOFT:       @ %bb.0:
3032; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
3033; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
3034; SOFT-NEXT:    .pad #4
3035; SOFT-NEXT:    sub sp, #4
3036; SOFT-NEXT:    uxth r0, r0
3037; SOFT-NEXT:    bl __aeabi_h2f
3038; SOFT-NEXT:    mov r4, r0
3039; SOFT-NEXT:    movs r0, #27
3040; SOFT-NEXT:    lsls r1, r0, #27
3041; SOFT-NEXT:    mov r0, r4
3042; SOFT-NEXT:    bl __aeabi_fcmpge
3043; SOFT-NEXT:    mov r7, r0
3044; SOFT-NEXT:    mov r0, r4
3045; SOFT-NEXT:    bl __aeabi_f2lz
3046; SOFT-NEXT:    mov r5, r0
3047; SOFT-NEXT:    cmp r7, #0
3048; SOFT-NEXT:    bne .LBB26_2
3049; SOFT-NEXT:  @ %bb.1:
3050; SOFT-NEXT:    mov r5, r7
3051; SOFT-NEXT:  .LBB26_2:
3052; SOFT-NEXT:    beq .LBB26_4
3053; SOFT-NEXT:  @ %bb.3:
3054; SOFT-NEXT:    str r1, [sp] @ 4-byte Spill
3055; SOFT-NEXT:    b .LBB26_5
3056; SOFT-NEXT:  .LBB26_4:
3057; SOFT-NEXT:    ldr r0, .LCPI26_0
3058; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
3059; SOFT-NEXT:  .LBB26_5:
3060; SOFT-NEXT:    ldr r1, .LCPI26_1
3061; SOFT-NEXT:    mov r0, r4
3062; SOFT-NEXT:    bl __aeabi_fcmpgt
3063; SOFT-NEXT:    movs r7, #0
3064; SOFT-NEXT:    mvns r6, r7
3065; SOFT-NEXT:    cmp r0, #0
3066; SOFT-NEXT:    beq .LBB26_7
3067; SOFT-NEXT:  @ %bb.6:
3068; SOFT-NEXT:    ldr r0, .LCPI26_2
3069; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
3070; SOFT-NEXT:  .LBB26_7:
3071; SOFT-NEXT:    bne .LBB26_9
3072; SOFT-NEXT:  @ %bb.8:
3073; SOFT-NEXT:    mov r6, r5
3074; SOFT-NEXT:  .LBB26_9:
3075; SOFT-NEXT:    mov r0, r4
3076; SOFT-NEXT:    mov r1, r4
3077; SOFT-NEXT:    bl __aeabi_fcmpun
3078; SOFT-NEXT:    cmp r0, #0
3079; SOFT-NEXT:    mov r0, r7
3080; SOFT-NEXT:    bne .LBB26_11
3081; SOFT-NEXT:  @ %bb.10:
3082; SOFT-NEXT:    mov r0, r6
3083; SOFT-NEXT:  .LBB26_11:
3084; SOFT-NEXT:    bne .LBB26_13
3085; SOFT-NEXT:  @ %bb.12:
3086; SOFT-NEXT:    ldr r7, [sp] @ 4-byte Reload
3087; SOFT-NEXT:  .LBB26_13:
3088; SOFT-NEXT:    mov r1, r7
3089; SOFT-NEXT:    add sp, #4
3090; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
3091; SOFT-NEXT:    .p2align 2
3092; SOFT-NEXT:  @ %bb.14:
3093; SOFT-NEXT:  .LCPI26_0:
3094; SOFT-NEXT:    .long 4294836224 @ 0xfffe0000
3095; SOFT-NEXT:  .LCPI26_1:
3096; SOFT-NEXT:    .long 1476395007 @ 0x57ffffff
3097; SOFT-NEXT:  .LCPI26_2:
3098; SOFT-NEXT:    .long 131071 @ 0x1ffff
3099;
3100; VFP2-LABEL: test_signed_i50_f16:
3101; VFP2:       @ %bb.0:
3102; VFP2-NEXT:    .save {r4, lr}
3103; VFP2-NEXT:    push {r4, lr}
3104; VFP2-NEXT:    bl __aeabi_h2f
3105; VFP2-NEXT:    mov r4, r0
3106; VFP2-NEXT:    bl __aeabi_f2lz
3107; VFP2-NEXT:    vldr s0, .LCPI26_0
3108; VFP2-NEXT:    vmov s2, r4
3109; VFP2-NEXT:    vldr s4, .LCPI26_1
3110; VFP2-NEXT:    vcmp.f32 s2, s0
3111; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3112; VFP2-NEXT:    ittt lt
3113; VFP2-NEXT:    movlt r1, #0
3114; VFP2-NEXT:    movtlt r1, #65534
3115; VFP2-NEXT:    movlt r0, #0
3116; VFP2-NEXT:    vcmp.f32 s2, s4
3117; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3118; VFP2-NEXT:    it gt
3119; VFP2-NEXT:    movgt.w r0, #-1
3120; VFP2-NEXT:    vcmp.f32 s2, s2
3121; VFP2-NEXT:    itt gt
3122; VFP2-NEXT:    movwgt r1, #65535
3123; VFP2-NEXT:    movtgt r1, #1
3124; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3125; VFP2-NEXT:    itt vs
3126; VFP2-NEXT:    movvs r0, #0
3127; VFP2-NEXT:    movvs r1, #0
3128; VFP2-NEXT:    pop {r4, pc}
3129; VFP2-NEXT:    .p2align 2
3130; VFP2-NEXT:  @ %bb.1:
3131; VFP2-NEXT:  .LCPI26_0:
3132; VFP2-NEXT:    .long 0xd8000000 @ float -5.62949953E+14
3133; VFP2-NEXT:  .LCPI26_1:
3134; VFP2-NEXT:    .long 0x57ffffff @ float 5.6294992E+14
3135;
3136; FP16-LABEL: test_signed_i50_f16:
3137; FP16:       @ %bb.0:
3138; FP16-NEXT:    .save {r7, lr}
3139; FP16-NEXT:    push {r7, lr}
3140; FP16-NEXT:    .vsave {d8}
3141; FP16-NEXT:    vpush {d8}
3142; FP16-NEXT:    vmov.f16 s0, r0
3143; FP16-NEXT:    vcvtb.f32.f16 s16, s0
3144; FP16-NEXT:    vmov r0, s16
3145; FP16-NEXT:    bl __aeabi_f2lz
3146; FP16-NEXT:    vldr s0, .LCPI26_0
3147; FP16-NEXT:    vldr s2, .LCPI26_1
3148; FP16-NEXT:    vcmp.f32 s16, s0
3149; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3150; FP16-NEXT:    ittt lt
3151; FP16-NEXT:    movlt r1, #0
3152; FP16-NEXT:    movtlt r1, #65534
3153; FP16-NEXT:    movlt r0, #0
3154; FP16-NEXT:    vcmp.f32 s16, s2
3155; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3156; FP16-NEXT:    it gt
3157; FP16-NEXT:    movgt.w r0, #-1
3158; FP16-NEXT:    vcmp.f32 s16, s16
3159; FP16-NEXT:    itt gt
3160; FP16-NEXT:    movwgt r1, #65535
3161; FP16-NEXT:    movtgt r1, #1
3162; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3163; FP16-NEXT:    itt vs
3164; FP16-NEXT:    movvs r0, #0
3165; FP16-NEXT:    movvs r1, #0
3166; FP16-NEXT:    vpop {d8}
3167; FP16-NEXT:    pop {r7, pc}
3168; FP16-NEXT:    .p2align 2
3169; FP16-NEXT:  @ %bb.1:
3170; FP16-NEXT:  .LCPI26_0:
3171; FP16-NEXT:    .long 0xd8000000 @ float -5.62949953E+14
3172; FP16-NEXT:  .LCPI26_1:
3173; FP16-NEXT:    .long 0x57ffffff @ float 5.6294992E+14
3174    %x = call i50 @llvm.fptosi.sat.i50.f16(half %f)
3175    ret i50 %x
3176}
3177
3178define i64 @test_signed_i64_f16(half %f) nounwind {
3179; SOFT-LABEL: test_signed_i64_f16:
3180; SOFT:       @ %bb.0:
3181; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
3182; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
3183; SOFT-NEXT:    .pad #4
3184; SOFT-NEXT:    sub sp, #4
3185; SOFT-NEXT:    uxth r0, r0
3186; SOFT-NEXT:    bl __aeabi_h2f
3187; SOFT-NEXT:    mov r4, r0
3188; SOFT-NEXT:    movs r0, #223
3189; SOFT-NEXT:    lsls r1, r0, #24
3190; SOFT-NEXT:    mov r0, r4
3191; SOFT-NEXT:    bl __aeabi_fcmpge
3192; SOFT-NEXT:    mov r6, r0
3193; SOFT-NEXT:    mov r0, r4
3194; SOFT-NEXT:    bl __aeabi_f2lz
3195; SOFT-NEXT:    movs r2, #1
3196; SOFT-NEXT:    lsls r7, r2, #31
3197; SOFT-NEXT:    cmp r6, #0
3198; SOFT-NEXT:    bne .LBB27_2
3199; SOFT-NEXT:  @ %bb.1:
3200; SOFT-NEXT:    mov r0, r6
3201; SOFT-NEXT:  .LBB27_2:
3202; SOFT-NEXT:    str r0, [sp] @ 4-byte Spill
3203; SOFT-NEXT:    beq .LBB27_4
3204; SOFT-NEXT:  @ %bb.3:
3205; SOFT-NEXT:    mov r7, r1
3206; SOFT-NEXT:  .LBB27_4:
3207; SOFT-NEXT:    ldr r1, .LCPI27_0
3208; SOFT-NEXT:    mov r0, r4
3209; SOFT-NEXT:    bl __aeabi_fcmpgt
3210; SOFT-NEXT:    movs r6, #0
3211; SOFT-NEXT:    mvns r5, r6
3212; SOFT-NEXT:    cmp r0, #0
3213; SOFT-NEXT:    beq .LBB27_6
3214; SOFT-NEXT:  @ %bb.5:
3215; SOFT-NEXT:    ldr r7, .LCPI27_1
3216; SOFT-NEXT:  .LBB27_6:
3217; SOFT-NEXT:    bne .LBB27_8
3218; SOFT-NEXT:  @ %bb.7:
3219; SOFT-NEXT:    ldr r5, [sp] @ 4-byte Reload
3220; SOFT-NEXT:  .LBB27_8:
3221; SOFT-NEXT:    mov r0, r4
3222; SOFT-NEXT:    mov r1, r4
3223; SOFT-NEXT:    bl __aeabi_fcmpun
3224; SOFT-NEXT:    cmp r0, #0
3225; SOFT-NEXT:    mov r0, r6
3226; SOFT-NEXT:    bne .LBB27_10
3227; SOFT-NEXT:  @ %bb.9:
3228; SOFT-NEXT:    mov r0, r5
3229; SOFT-NEXT:  .LBB27_10:
3230; SOFT-NEXT:    bne .LBB27_12
3231; SOFT-NEXT:  @ %bb.11:
3232; SOFT-NEXT:    mov r6, r7
3233; SOFT-NEXT:  .LBB27_12:
3234; SOFT-NEXT:    mov r1, r6
3235; SOFT-NEXT:    add sp, #4
3236; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
3237; SOFT-NEXT:    .p2align 2
3238; SOFT-NEXT:  @ %bb.13:
3239; SOFT-NEXT:  .LCPI27_0:
3240; SOFT-NEXT:    .long 1593835519 @ 0x5effffff
3241; SOFT-NEXT:  .LCPI27_1:
3242; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
3243;
3244; VFP2-LABEL: test_signed_i64_f16:
3245; VFP2:       @ %bb.0:
3246; VFP2-NEXT:    .save {r4, lr}
3247; VFP2-NEXT:    push {r4, lr}
3248; VFP2-NEXT:    bl __aeabi_h2f
3249; VFP2-NEXT:    mov r4, r0
3250; VFP2-NEXT:    bl __aeabi_f2lz
3251; VFP2-NEXT:    vldr s0, .LCPI27_0
3252; VFP2-NEXT:    vmov s2, r4
3253; VFP2-NEXT:    vldr s4, .LCPI27_1
3254; VFP2-NEXT:    vcmp.f32 s2, s0
3255; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3256; VFP2-NEXT:    itt lt
3257; VFP2-NEXT:    movlt r0, #0
3258; VFP2-NEXT:    movlt.w r1, #-2147483648
3259; VFP2-NEXT:    vcmp.f32 s2, s4
3260; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3261; VFP2-NEXT:    itt gt
3262; VFP2-NEXT:    mvngt r1, #-2147483648
3263; VFP2-NEXT:    movgt.w r0, #-1
3264; VFP2-NEXT:    vcmp.f32 s2, s2
3265; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3266; VFP2-NEXT:    itt vs
3267; VFP2-NEXT:    movvs r0, #0
3268; VFP2-NEXT:    movvs r1, #0
3269; VFP2-NEXT:    pop {r4, pc}
3270; VFP2-NEXT:    .p2align 2
3271; VFP2-NEXT:  @ %bb.1:
3272; VFP2-NEXT:  .LCPI27_0:
3273; VFP2-NEXT:    .long 0xdf000000 @ float -9.22337203E+18
3274; VFP2-NEXT:  .LCPI27_1:
3275; VFP2-NEXT:    .long 0x5effffff @ float 9.22337149E+18
3276;
3277; FP16-LABEL: test_signed_i64_f16:
3278; FP16:       @ %bb.0:
3279; FP16-NEXT:    .save {r7, lr}
3280; FP16-NEXT:    push {r7, lr}
3281; FP16-NEXT:    .vsave {d8}
3282; FP16-NEXT:    vpush {d8}
3283; FP16-NEXT:    vmov.f16 s0, r0
3284; FP16-NEXT:    vcvtb.f32.f16 s16, s0
3285; FP16-NEXT:    vmov r0, s16
3286; FP16-NEXT:    bl __aeabi_f2lz
3287; FP16-NEXT:    vldr s0, .LCPI27_0
3288; FP16-NEXT:    vldr s2, .LCPI27_1
3289; FP16-NEXT:    vcmp.f32 s16, s0
3290; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3291; FP16-NEXT:    itt lt
3292; FP16-NEXT:    movlt r0, #0
3293; FP16-NEXT:    movlt.w r1, #-2147483648
3294; FP16-NEXT:    vcmp.f32 s16, s2
3295; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3296; FP16-NEXT:    itt gt
3297; FP16-NEXT:    mvngt r1, #-2147483648
3298; FP16-NEXT:    movgt.w r0, #-1
3299; FP16-NEXT:    vcmp.f32 s16, s16
3300; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3301; FP16-NEXT:    itt vs
3302; FP16-NEXT:    movvs r0, #0
3303; FP16-NEXT:    movvs r1, #0
3304; FP16-NEXT:    vpop {d8}
3305; FP16-NEXT:    pop {r7, pc}
3306; FP16-NEXT:    .p2align 2
3307; FP16-NEXT:  @ %bb.1:
3308; FP16-NEXT:  .LCPI27_0:
3309; FP16-NEXT:    .long 0xdf000000 @ float -9.22337203E+18
3310; FP16-NEXT:  .LCPI27_1:
3311; FP16-NEXT:    .long 0x5effffff @ float 9.22337149E+18
3312    %x = call i64 @llvm.fptosi.sat.i64.f16(half %f)
3313    ret i64 %x
3314}
3315
3316define i100 @test_signed_i100_f16(half %f) nounwind {
3317; SOFT-LABEL: test_signed_i100_f16:
3318; SOFT:       @ %bb.0:
3319; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
3320; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
3321; SOFT-NEXT:    .pad #20
3322; SOFT-NEXT:    sub sp, #20
3323; SOFT-NEXT:    uxth r0, r0
3324; SOFT-NEXT:    bl __aeabi_h2f
3325; SOFT-NEXT:    mov r4, r0
3326; SOFT-NEXT:    movs r0, #241
3327; SOFT-NEXT:    lsls r1, r0, #24
3328; SOFT-NEXT:    mov r0, r4
3329; SOFT-NEXT:    bl __aeabi_fcmpge
3330; SOFT-NEXT:    mov r6, r0
3331; SOFT-NEXT:    mov r0, r4
3332; SOFT-NEXT:    bl __fixsfti
3333; SOFT-NEXT:    movs r5, #7
3334; SOFT-NEXT:    str r5, [sp, #16] @ 4-byte Spill
3335; SOFT-NEXT:    mvns r7, r5
3336; SOFT-NEXT:    cmp r6, #0
3337; SOFT-NEXT:    beq .LBB28_17
3338; SOFT-NEXT:  @ %bb.1:
3339; SOFT-NEXT:    beq .LBB28_18
3340; SOFT-NEXT:  .LBB28_2:
3341; SOFT-NEXT:    bne .LBB28_4
3342; SOFT-NEXT:  .LBB28_3:
3343; SOFT-NEXT:    mov r2, r6
3344; SOFT-NEXT:  .LBB28_4:
3345; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
3346; SOFT-NEXT:    str r1, [sp, #8] @ 4-byte Spill
3347; SOFT-NEXT:    str r0, [sp, #12] @ 4-byte Spill
3348; SOFT-NEXT:    beq .LBB28_6
3349; SOFT-NEXT:  @ %bb.5:
3350; SOFT-NEXT:    mov r7, r3
3351; SOFT-NEXT:  .LBB28_6:
3352; SOFT-NEXT:    ldr r1, .LCPI28_0
3353; SOFT-NEXT:    mov r0, r4
3354; SOFT-NEXT:    bl __aeabi_fcmpgt
3355; SOFT-NEXT:    movs r6, #0
3356; SOFT-NEXT:    mvns r5, r6
3357; SOFT-NEXT:    cmp r0, #0
3358; SOFT-NEXT:    beq .LBB28_19
3359; SOFT-NEXT:  @ %bb.7:
3360; SOFT-NEXT:    mov r0, r5
3361; SOFT-NEXT:    beq .LBB28_20
3362; SOFT-NEXT:  .LBB28_8:
3363; SOFT-NEXT:    mov r7, r5
3364; SOFT-NEXT:    beq .LBB28_21
3365; SOFT-NEXT:  .LBB28_9:
3366; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
3367; SOFT-NEXT:    bne .LBB28_11
3368; SOFT-NEXT:  .LBB28_10:
3369; SOFT-NEXT:    ldr r5, [sp, #12] @ 4-byte Reload
3370; SOFT-NEXT:  .LBB28_11:
3371; SOFT-NEXT:    mov r0, r4
3372; SOFT-NEXT:    mov r1, r4
3373; SOFT-NEXT:    bl __aeabi_fcmpun
3374; SOFT-NEXT:    cmp r0, #0
3375; SOFT-NEXT:    mov r0, r6
3376; SOFT-NEXT:    beq .LBB28_22
3377; SOFT-NEXT:  @ %bb.12:
3378; SOFT-NEXT:    mov r1, r6
3379; SOFT-NEXT:    beq .LBB28_23
3380; SOFT-NEXT:  .LBB28_13:
3381; SOFT-NEXT:    mov r2, r6
3382; SOFT-NEXT:    beq .LBB28_24
3383; SOFT-NEXT:  .LBB28_14:
3384; SOFT-NEXT:    bne .LBB28_16
3385; SOFT-NEXT:  .LBB28_15:
3386; SOFT-NEXT:    ldr r6, [sp, #16] @ 4-byte Reload
3387; SOFT-NEXT:  .LBB28_16:
3388; SOFT-NEXT:    mov r3, r6
3389; SOFT-NEXT:    add sp, #20
3390; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
3391; SOFT-NEXT:  .LBB28_17:
3392; SOFT-NEXT:    mov r0, r6
3393; SOFT-NEXT:    bne .LBB28_2
3394; SOFT-NEXT:  .LBB28_18:
3395; SOFT-NEXT:    mov r1, r6
3396; SOFT-NEXT:    beq .LBB28_3
3397; SOFT-NEXT:    b .LBB28_4
3398; SOFT-NEXT:  .LBB28_19:
3399; SOFT-NEXT:    str r7, [sp, #16] @ 4-byte Spill
3400; SOFT-NEXT:    mov r0, r5
3401; SOFT-NEXT:    bne .LBB28_8
3402; SOFT-NEXT:  .LBB28_20:
3403; SOFT-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
3404; SOFT-NEXT:    mov r7, r5
3405; SOFT-NEXT:    bne .LBB28_9
3406; SOFT-NEXT:  .LBB28_21:
3407; SOFT-NEXT:    ldr r7, [sp, #8] @ 4-byte Reload
3408; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
3409; SOFT-NEXT:    beq .LBB28_10
3410; SOFT-NEXT:    b .LBB28_11
3411; SOFT-NEXT:  .LBB28_22:
3412; SOFT-NEXT:    mov r0, r5
3413; SOFT-NEXT:    mov r1, r6
3414; SOFT-NEXT:    bne .LBB28_13
3415; SOFT-NEXT:  .LBB28_23:
3416; SOFT-NEXT:    mov r1, r7
3417; SOFT-NEXT:    mov r2, r6
3418; SOFT-NEXT:    bne .LBB28_14
3419; SOFT-NEXT:  .LBB28_24:
3420; SOFT-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
3421; SOFT-NEXT:    beq .LBB28_15
3422; SOFT-NEXT:    b .LBB28_16
3423; SOFT-NEXT:    .p2align 2
3424; SOFT-NEXT:  @ %bb.25:
3425; SOFT-NEXT:  .LCPI28_0:
3426; SOFT-NEXT:    .long 1895825407 @ 0x70ffffff
3427;
3428; VFP2-LABEL: test_signed_i100_f16:
3429; VFP2:       @ %bb.0:
3430; VFP2-NEXT:    .save {r4, lr}
3431; VFP2-NEXT:    push {r4, lr}
3432; VFP2-NEXT:    bl __aeabi_h2f
3433; VFP2-NEXT:    mov r4, r0
3434; VFP2-NEXT:    bl __fixsfti
3435; VFP2-NEXT:    vldr s0, .LCPI28_0
3436; VFP2-NEXT:    vmov s2, r4
3437; VFP2-NEXT:    vldr s4, .LCPI28_1
3438; VFP2-NEXT:    vcmp.f32 s2, s0
3439; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3440; VFP2-NEXT:    itttt lt
3441; VFP2-NEXT:    movlt r0, #0
3442; VFP2-NEXT:    movlt r1, #0
3443; VFP2-NEXT:    movlt r2, #0
3444; VFP2-NEXT:    mvnlt r3, #7
3445; VFP2-NEXT:    vcmp.f32 s2, s4
3446; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3447; VFP2-NEXT:    itttt gt
3448; VFP2-NEXT:    movgt r3, #7
3449; VFP2-NEXT:    movgt.w r2, #-1
3450; VFP2-NEXT:    movgt.w r1, #-1
3451; VFP2-NEXT:    movgt.w r0, #-1
3452; VFP2-NEXT:    vcmp.f32 s2, s2
3453; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3454; VFP2-NEXT:    itttt vs
3455; VFP2-NEXT:    movvs r0, #0
3456; VFP2-NEXT:    movvs r1, #0
3457; VFP2-NEXT:    movvs r2, #0
3458; VFP2-NEXT:    movvs r3, #0
3459; VFP2-NEXT:    pop {r4, pc}
3460; VFP2-NEXT:    .p2align 2
3461; VFP2-NEXT:  @ %bb.1:
3462; VFP2-NEXT:  .LCPI28_0:
3463; VFP2-NEXT:    .long 0xf1000000 @ float -6.338253E+29
3464; VFP2-NEXT:  .LCPI28_1:
3465; VFP2-NEXT:    .long 0x70ffffff @ float 6.33825262E+29
3466;
3467; FP16-LABEL: test_signed_i100_f16:
3468; FP16:       @ %bb.0:
3469; FP16-NEXT:    .save {r7, lr}
3470; FP16-NEXT:    push {r7, lr}
3471; FP16-NEXT:    .vsave {d8}
3472; FP16-NEXT:    vpush {d8}
3473; FP16-NEXT:    vmov.f16 s0, r0
3474; FP16-NEXT:    vcvtb.f32.f16 s16, s0
3475; FP16-NEXT:    vmov r0, s16
3476; FP16-NEXT:    bl __fixsfti
3477; FP16-NEXT:    vldr s0, .LCPI28_0
3478; FP16-NEXT:    vldr s2, .LCPI28_1
3479; FP16-NEXT:    vcmp.f32 s16, s0
3480; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3481; FP16-NEXT:    itttt lt
3482; FP16-NEXT:    movlt r0, #0
3483; FP16-NEXT:    movlt r1, #0
3484; FP16-NEXT:    movlt r2, #0
3485; FP16-NEXT:    mvnlt r3, #7
3486; FP16-NEXT:    vcmp.f32 s16, s2
3487; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3488; FP16-NEXT:    itttt gt
3489; FP16-NEXT:    movgt r3, #7
3490; FP16-NEXT:    movgt.w r2, #-1
3491; FP16-NEXT:    movgt.w r1, #-1
3492; FP16-NEXT:    movgt.w r0, #-1
3493; FP16-NEXT:    vcmp.f32 s16, s16
3494; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3495; FP16-NEXT:    itttt vs
3496; FP16-NEXT:    movvs r0, #0
3497; FP16-NEXT:    movvs r1, #0
3498; FP16-NEXT:    movvs r2, #0
3499; FP16-NEXT:    movvs r3, #0
3500; FP16-NEXT:    vpop {d8}
3501; FP16-NEXT:    pop {r7, pc}
3502; FP16-NEXT:    .p2align 2
3503; FP16-NEXT:  @ %bb.1:
3504; FP16-NEXT:  .LCPI28_0:
3505; FP16-NEXT:    .long 0xf1000000 @ float -6.338253E+29
3506; FP16-NEXT:  .LCPI28_1:
3507; FP16-NEXT:    .long 0x70ffffff @ float 6.33825262E+29
3508    %x = call i100 @llvm.fptosi.sat.i100.f16(half %f)
3509    ret i100 %x
3510}
3511
3512define i128 @test_signed_i128_f16(half %f) nounwind {
3513; SOFT-LABEL: test_signed_i128_f16:
3514; SOFT:       @ %bb.0:
3515; SOFT-NEXT:    .save {r4, r5, r6, r7, lr}
3516; SOFT-NEXT:    push {r4, r5, r6, r7, lr}
3517; SOFT-NEXT:    .pad #20
3518; SOFT-NEXT:    sub sp, #20
3519; SOFT-NEXT:    uxth r0, r0
3520; SOFT-NEXT:    bl __aeabi_h2f
3521; SOFT-NEXT:    mov r4, r0
3522; SOFT-NEXT:    movs r0, #255
3523; SOFT-NEXT:    lsls r1, r0, #24
3524; SOFT-NEXT:    mov r0, r4
3525; SOFT-NEXT:    bl __aeabi_fcmpge
3526; SOFT-NEXT:    mov r6, r0
3527; SOFT-NEXT:    mov r0, r4
3528; SOFT-NEXT:    bl __fixsfti
3529; SOFT-NEXT:    movs r5, #1
3530; SOFT-NEXT:    lsls r7, r5, #31
3531; SOFT-NEXT:    cmp r6, #0
3532; SOFT-NEXT:    beq .LBB29_18
3533; SOFT-NEXT:  @ %bb.1:
3534; SOFT-NEXT:    beq .LBB29_19
3535; SOFT-NEXT:  .LBB29_2:
3536; SOFT-NEXT:    bne .LBB29_4
3537; SOFT-NEXT:  .LBB29_3:
3538; SOFT-NEXT:    mov r2, r6
3539; SOFT-NEXT:  .LBB29_4:
3540; SOFT-NEXT:    str r2, [sp, #4] @ 4-byte Spill
3541; SOFT-NEXT:    str r1, [sp, #8] @ 4-byte Spill
3542; SOFT-NEXT:    str r0, [sp, #12] @ 4-byte Spill
3543; SOFT-NEXT:    beq .LBB29_6
3544; SOFT-NEXT:  @ %bb.5:
3545; SOFT-NEXT:    mov r7, r3
3546; SOFT-NEXT:  .LBB29_6:
3547; SOFT-NEXT:    ldr r1, .LCPI29_0
3548; SOFT-NEXT:    mov r0, r4
3549; SOFT-NEXT:    bl __aeabi_fcmpgt
3550; SOFT-NEXT:    movs r6, #0
3551; SOFT-NEXT:    mvns r5, r6
3552; SOFT-NEXT:    cmp r0, #0
3553; SOFT-NEXT:    beq .LBB29_8
3554; SOFT-NEXT:  @ %bb.7:
3555; SOFT-NEXT:    ldr r7, .LCPI29_1
3556; SOFT-NEXT:  .LBB29_8:
3557; SOFT-NEXT:    str r7, [sp, #16] @ 4-byte Spill
3558; SOFT-NEXT:    mov r0, r5
3559; SOFT-NEXT:    beq .LBB29_20
3560; SOFT-NEXT:  @ %bb.9:
3561; SOFT-NEXT:    mov r7, r5
3562; SOFT-NEXT:    beq .LBB29_21
3563; SOFT-NEXT:  .LBB29_10:
3564; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
3565; SOFT-NEXT:    bne .LBB29_12
3566; SOFT-NEXT:  .LBB29_11:
3567; SOFT-NEXT:    ldr r5, [sp, #12] @ 4-byte Reload
3568; SOFT-NEXT:  .LBB29_12:
3569; SOFT-NEXT:    mov r0, r4
3570; SOFT-NEXT:    mov r1, r4
3571; SOFT-NEXT:    bl __aeabi_fcmpun
3572; SOFT-NEXT:    cmp r0, #0
3573; SOFT-NEXT:    mov r0, r6
3574; SOFT-NEXT:    beq .LBB29_22
3575; SOFT-NEXT:  @ %bb.13:
3576; SOFT-NEXT:    mov r1, r6
3577; SOFT-NEXT:    beq .LBB29_23
3578; SOFT-NEXT:  .LBB29_14:
3579; SOFT-NEXT:    mov r2, r6
3580; SOFT-NEXT:    beq .LBB29_24
3581; SOFT-NEXT:  .LBB29_15:
3582; SOFT-NEXT:    ldr r3, [sp, #16] @ 4-byte Reload
3583; SOFT-NEXT:    bne .LBB29_17
3584; SOFT-NEXT:  .LBB29_16:
3585; SOFT-NEXT:    mov r6, r3
3586; SOFT-NEXT:  .LBB29_17:
3587; SOFT-NEXT:    mov r3, r6
3588; SOFT-NEXT:    add sp, #20
3589; SOFT-NEXT:    pop {r4, r5, r6, r7, pc}
3590; SOFT-NEXT:  .LBB29_18:
3591; SOFT-NEXT:    mov r0, r6
3592; SOFT-NEXT:    bne .LBB29_2
3593; SOFT-NEXT:  .LBB29_19:
3594; SOFT-NEXT:    mov r1, r6
3595; SOFT-NEXT:    beq .LBB29_3
3596; SOFT-NEXT:    b .LBB29_4
3597; SOFT-NEXT:  .LBB29_20:
3598; SOFT-NEXT:    ldr r0, [sp, #4] @ 4-byte Reload
3599; SOFT-NEXT:    mov r7, r5
3600; SOFT-NEXT:    bne .LBB29_10
3601; SOFT-NEXT:  .LBB29_21:
3602; SOFT-NEXT:    ldr r7, [sp, #8] @ 4-byte Reload
3603; SOFT-NEXT:    str r0, [sp, #8] @ 4-byte Spill
3604; SOFT-NEXT:    beq .LBB29_11
3605; SOFT-NEXT:    b .LBB29_12
3606; SOFT-NEXT:  .LBB29_22:
3607; SOFT-NEXT:    mov r0, r5
3608; SOFT-NEXT:    mov r1, r6
3609; SOFT-NEXT:    bne .LBB29_14
3610; SOFT-NEXT:  .LBB29_23:
3611; SOFT-NEXT:    mov r1, r7
3612; SOFT-NEXT:    mov r2, r6
3613; SOFT-NEXT:    bne .LBB29_15
3614; SOFT-NEXT:  .LBB29_24:
3615; SOFT-NEXT:    ldr r2, [sp, #8] @ 4-byte Reload
3616; SOFT-NEXT:    ldr r3, [sp, #16] @ 4-byte Reload
3617; SOFT-NEXT:    beq .LBB29_16
3618; SOFT-NEXT:    b .LBB29_17
3619; SOFT-NEXT:    .p2align 2
3620; SOFT-NEXT:  @ %bb.25:
3621; SOFT-NEXT:  .LCPI29_0:
3622; SOFT-NEXT:    .long 2130706431 @ 0x7effffff
3623; SOFT-NEXT:  .LCPI29_1:
3624; SOFT-NEXT:    .long 2147483647 @ 0x7fffffff
3625;
3626; VFP2-LABEL: test_signed_i128_f16:
3627; VFP2:       @ %bb.0:
3628; VFP2-NEXT:    .save {r4, lr}
3629; VFP2-NEXT:    push {r4, lr}
3630; VFP2-NEXT:    bl __aeabi_h2f
3631; VFP2-NEXT:    mov r4, r0
3632; VFP2-NEXT:    bl __fixsfti
3633; VFP2-NEXT:    vldr s0, .LCPI29_0
3634; VFP2-NEXT:    vmov s2, r4
3635; VFP2-NEXT:    vldr s4, .LCPI29_1
3636; VFP2-NEXT:    vcmp.f32 s2, s0
3637; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3638; VFP2-NEXT:    itttt lt
3639; VFP2-NEXT:    movlt r0, #0
3640; VFP2-NEXT:    movlt r1, #0
3641; VFP2-NEXT:    movlt r2, #0
3642; VFP2-NEXT:    movlt.w r3, #-2147483648
3643; VFP2-NEXT:    vcmp.f32 s2, s4
3644; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3645; VFP2-NEXT:    itttt gt
3646; VFP2-NEXT:    mvngt r3, #-2147483648
3647; VFP2-NEXT:    movgt.w r2, #-1
3648; VFP2-NEXT:    movgt.w r1, #-1
3649; VFP2-NEXT:    movgt.w r0, #-1
3650; VFP2-NEXT:    vcmp.f32 s2, s2
3651; VFP2-NEXT:    vmrs APSR_nzcv, fpscr
3652; VFP2-NEXT:    itttt vs
3653; VFP2-NEXT:    movvs r0, #0
3654; VFP2-NEXT:    movvs r1, #0
3655; VFP2-NEXT:    movvs r2, #0
3656; VFP2-NEXT:    movvs r3, #0
3657; VFP2-NEXT:    pop {r4, pc}
3658; VFP2-NEXT:    .p2align 2
3659; VFP2-NEXT:  @ %bb.1:
3660; VFP2-NEXT:  .LCPI29_0:
3661; VFP2-NEXT:    .long 0xff000000 @ float -1.70141183E+38
3662; VFP2-NEXT:  .LCPI29_1:
3663; VFP2-NEXT:    .long 0x7effffff @ float 1.70141173E+38
3664;
3665; FP16-LABEL: test_signed_i128_f16:
3666; FP16:       @ %bb.0:
3667; FP16-NEXT:    .save {r7, lr}
3668; FP16-NEXT:    push {r7, lr}
3669; FP16-NEXT:    .vsave {d8}
3670; FP16-NEXT:    vpush {d8}
3671; FP16-NEXT:    vmov.f16 s0, r0
3672; FP16-NEXT:    vcvtb.f32.f16 s16, s0
3673; FP16-NEXT:    vmov r0, s16
3674; FP16-NEXT:    bl __fixsfti
3675; FP16-NEXT:    vldr s0, .LCPI29_0
3676; FP16-NEXT:    vldr s2, .LCPI29_1
3677; FP16-NEXT:    vcmp.f32 s16, s0
3678; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3679; FP16-NEXT:    itttt lt
3680; FP16-NEXT:    movlt r0, #0
3681; FP16-NEXT:    movlt r1, #0
3682; FP16-NEXT:    movlt r2, #0
3683; FP16-NEXT:    movlt.w r3, #-2147483648
3684; FP16-NEXT:    vcmp.f32 s16, s2
3685; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3686; FP16-NEXT:    itttt gt
3687; FP16-NEXT:    mvngt r3, #-2147483648
3688; FP16-NEXT:    movgt.w r2, #-1
3689; FP16-NEXT:    movgt.w r1, #-1
3690; FP16-NEXT:    movgt.w r0, #-1
3691; FP16-NEXT:    vcmp.f32 s16, s16
3692; FP16-NEXT:    vmrs APSR_nzcv, fpscr
3693; FP16-NEXT:    itttt vs
3694; FP16-NEXT:    movvs r0, #0
3695; FP16-NEXT:    movvs r1, #0
3696; FP16-NEXT:    movvs r2, #0
3697; FP16-NEXT:    movvs r3, #0
3698; FP16-NEXT:    vpop {d8}
3699; FP16-NEXT:    pop {r7, pc}
3700; FP16-NEXT:    .p2align 2
3701; FP16-NEXT:  @ %bb.1:
3702; FP16-NEXT:  .LCPI29_0:
3703; FP16-NEXT:    .long 0xff000000 @ float -1.70141183E+38
3704; FP16-NEXT:  .LCPI29_1:
3705; FP16-NEXT:    .long 0x7effffff @ float 1.70141173E+38
3706    %x = call i128 @llvm.fptosi.sat.i128.f16(half %f)
3707    ret i128 %x
3708}
3709