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