[LLVM][IR] Use splat syntax when printing ConstantExpr based splats. (#116856)
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-fpclamptosat_vec.ll
blobf2ac5268921800c7463c1308892036836b5ab622
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve.fp | FileCheck %s
4 ; i32 saturate
6 define arm_aapcs_vfpcc <2 x i32> @stest_f64i32(<2 x double> %x) {
7 ; CHECK-LABEL: stest_f64i32:
8 ; CHECK:       @ %bb.0: @ %entry
9 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
10 ; CHECK-NEXT:    push {r4, r5, r7, lr}
11 ; CHECK-NEXT:    .vsave {d8, d9}
12 ; CHECK-NEXT:    vpush {d8, d9}
13 ; CHECK-NEXT:    vmov q4, q0
14 ; CHECK-NEXT:    vmov r0, r1, d8
15 ; CHECK-NEXT:    bl __aeabi_d2lz
16 ; CHECK-NEXT:    mov r4, r0
17 ; CHECK-NEXT:    mov r5, r1
18 ; CHECK-NEXT:    vmov r0, r1, d9
19 ; CHECK-NEXT:    bl __aeabi_d2lz
20 ; CHECK-NEXT:    adr r3, .LCPI0_0
21 ; CHECK-NEXT:    mvn r12, #-2147483648
22 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
23 ; CHECK-NEXT:    subs.w r3, r4, r12
24 ; CHECK-NEXT:    sbcs r3, r5, #0
25 ; CHECK-NEXT:    vmov q1[2], q1[0], r4, r0
26 ; CHECK-NEXT:    csetm r3, lt
27 ; CHECK-NEXT:    subs.w r0, r0, r12
28 ; CHECK-NEXT:    sbcs r0, r1, #0
29 ; CHECK-NEXT:    vmov q1[3], q1[1], r5, r1
30 ; CHECK-NEXT:    mov.w r5, #0
31 ; CHECK-NEXT:    csetm r0, lt
32 ; CHECK-NEXT:    bfi r5, r3, #0, #8
33 ; CHECK-NEXT:    mov.w r12, #-1
34 ; CHECK-NEXT:    bfi r5, r0, #8, #8
35 ; CHECK-NEXT:    movs r2, #0
36 ; CHECK-NEXT:    vmsr p0, r5
37 ; CHECK-NEXT:    adr r4, .LCPI0_1
38 ; CHECK-NEXT:    vpsel q0, q1, q0
39 ; CHECK-NEXT:    vldrw.u32 q1, [r4]
40 ; CHECK-NEXT:    vmov r0, r1, d0
41 ; CHECK-NEXT:    vmov r3, r5, d1
42 ; CHECK-NEXT:    rsbs.w r0, r0, #-2147483648
43 ; CHECK-NEXT:    sbcs.w r0, r12, r1
44 ; CHECK-NEXT:    csetm r0, lt
45 ; CHECK-NEXT:    bfi r2, r0, #0, #8
46 ; CHECK-NEXT:    rsbs.w r0, r3, #-2147483648
47 ; CHECK-NEXT:    sbcs.w r0, r12, r5
48 ; CHECK-NEXT:    csetm r0, lt
49 ; CHECK-NEXT:    bfi r2, r0, #8, #8
50 ; CHECK-NEXT:    vmsr p0, r2
51 ; CHECK-NEXT:    vpsel q0, q0, q1
52 ; CHECK-NEXT:    vpop {d8, d9}
53 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
54 ; CHECK-NEXT:    .p2align 4
55 ; CHECK-NEXT:  @ %bb.1:
56 ; CHECK-NEXT:  .LCPI0_0:
57 ; CHECK-NEXT:    .long 2147483647 @ 0x7fffffff
58 ; CHECK-NEXT:    .long 0 @ 0x0
59 ; CHECK-NEXT:    .long 2147483647 @ 0x7fffffff
60 ; CHECK-NEXT:    .long 0 @ 0x0
61 ; CHECK-NEXT:  .LCPI0_1:
62 ; CHECK-NEXT:    .long 2147483648 @ 0x80000000
63 ; CHECK-NEXT:    .long 4294967295 @ 0xffffffff
64 ; CHECK-NEXT:    .long 2147483648 @ 0x80000000
65 ; CHECK-NEXT:    .long 4294967295 @ 0xffffffff
66 entry:
67   %conv = fptosi <2 x double> %x to <2 x i64>
68   %0 = icmp slt <2 x i64> %conv, <i64 2147483647, i64 2147483647>
69   %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>
70   %1 = icmp sgt <2 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648>
71   %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>
72   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
73   ret <2 x i32> %conv6
76 define arm_aapcs_vfpcc <2 x i32> @utest_f64i32(<2 x double> %x) {
77 ; CHECK-LABEL: utest_f64i32:
78 ; CHECK:       @ %bb.0: @ %entry
79 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
80 ; CHECK-NEXT:    push {r4, r5, r7, lr}
81 ; CHECK-NEXT:    .vsave {d8, d9}
82 ; CHECK-NEXT:    vpush {d8, d9}
83 ; CHECK-NEXT:    vmov q4, q0
84 ; CHECK-NEXT:    vmov r0, r1, d8
85 ; CHECK-NEXT:    bl __aeabi_d2ulz
86 ; CHECK-NEXT:    mov r4, r0
87 ; CHECK-NEXT:    mov r5, r1
88 ; CHECK-NEXT:    vmov r0, r1, d9
89 ; CHECK-NEXT:    bl __aeabi_d2ulz
90 ; CHECK-NEXT:    subs.w r3, r4, #-1
91 ; CHECK-NEXT:    vmov q1[2], q1[0], r4, r0
92 ; CHECK-NEXT:    sbcs r3, r5, #0
93 ; CHECK-NEXT:    mov.w r2, #0
94 ; CHECK-NEXT:    csetm r3, lo
95 ; CHECK-NEXT:    subs.w r0, r0, #-1
96 ; CHECK-NEXT:    sbcs r0, r1, #0
97 ; CHECK-NEXT:    bfi r2, r3, #0, #8
98 ; CHECK-NEXT:    csetm r0, lo
99 ; CHECK-NEXT:    vmov.i64 q0, #0xffffffff
100 ; CHECK-NEXT:    bfi r2, r0, #8, #8
101 ; CHECK-NEXT:    vmov q1[3], q1[1], r5, r1
102 ; CHECK-NEXT:    vmsr p0, r2
103 ; CHECK-NEXT:    vpsel q0, q1, q0
104 ; CHECK-NEXT:    vpop {d8, d9}
105 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
106 entry:
107   %conv = fptoui <2 x double> %x to <2 x i64>
108   %0 = icmp ult <2 x i64> %conv, <i64 4294967295, i64 4294967295>
109   %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>
110   %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>
111   ret <2 x i32> %conv6
114 define arm_aapcs_vfpcc <2 x i32> @ustest_f64i32(<2 x double> %x) {
115 ; CHECK-LABEL: ustest_f64i32:
116 ; CHECK:       @ %bb.0: @ %entry
117 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
118 ; CHECK-NEXT:    push {r4, r5, r7, lr}
119 ; CHECK-NEXT:    .vsave {d8, d9}
120 ; CHECK-NEXT:    vpush {d8, d9}
121 ; CHECK-NEXT:    vmov q4, q0
122 ; CHECK-NEXT:    vmov r0, r1, d8
123 ; CHECK-NEXT:    bl __aeabi_d2lz
124 ; CHECK-NEXT:    mov r4, r0
125 ; CHECK-NEXT:    mov r5, r1
126 ; CHECK-NEXT:    vmov r0, r1, d9
127 ; CHECK-NEXT:    bl __aeabi_d2lz
128 ; CHECK-NEXT:    subs.w r3, r4, #-1
129 ; CHECK-NEXT:    vmov q1[2], q1[0], r4, r0
130 ; CHECK-NEXT:    sbcs r3, r5, #0
131 ; CHECK-NEXT:    vmov q1[3], q1[1], r5, r1
132 ; CHECK-NEXT:    csetm r3, lt
133 ; CHECK-NEXT:    subs.w r0, r0, #-1
134 ; CHECK-NEXT:    mov.w r5, #0
135 ; CHECK-NEXT:    sbcs r0, r1, #0
136 ; CHECK-NEXT:    bfi r5, r3, #0, #8
137 ; CHECK-NEXT:    csetm r0, lt
138 ; CHECK-NEXT:    bfi r5, r0, #8, #8
139 ; CHECK-NEXT:    vmov.i64 q0, #0xffffffff
140 ; CHECK-NEXT:    vmsr p0, r5
141 ; CHECK-NEXT:    movs r2, #0
142 ; CHECK-NEXT:    vpsel q0, q1, q0
143 ; CHECK-NEXT:    vmov.i32 q1, #0x0
144 ; CHECK-NEXT:    vmov r0, r1, d0
145 ; CHECK-NEXT:    vmov r3, r5, d1
146 ; CHECK-NEXT:    rsbs r0, r0, #0
147 ; CHECK-NEXT:    sbcs.w r0, r2, r1
148 ; CHECK-NEXT:    csetm r0, lt
149 ; CHECK-NEXT:    rsbs r1, r3, #0
150 ; CHECK-NEXT:    sbcs.w r1, r2, r5
151 ; CHECK-NEXT:    bfi r2, r0, #0, #8
152 ; CHECK-NEXT:    csetm r0, lt
153 ; CHECK-NEXT:    bfi r2, r0, #8, #8
154 ; CHECK-NEXT:    vmsr p0, r2
155 ; CHECK-NEXT:    vpsel q0, q0, q1
156 ; CHECK-NEXT:    vpop {d8, d9}
157 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
158 entry:
159   %conv = fptosi <2 x double> %x to <2 x i64>
160   %0 = icmp slt <2 x i64> %conv, <i64 4294967295, i64 4294967295>
161   %spec.store.select = select <2 x i1> %0, <2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>
162   %1 = icmp sgt <2 x i64> %spec.store.select, zeroinitializer
163   %spec.store.select7 = select <2 x i1> %1, <2 x i64> %spec.store.select, <2 x i64> zeroinitializer
164   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
165   ret <2 x i32> %conv6
168 define arm_aapcs_vfpcc <4 x i32> @stest_f32i32(<4 x float> %x) {
169 ; CHECK-LABEL: stest_f32i32:
170 ; CHECK:       @ %bb.0: @ %entry
171 ; CHECK-NEXT:    vcvt.s32.f32 q0, q0
172 ; CHECK-NEXT:    bx lr
173 entry:
174   %conv = fptosi <4 x float> %x to <4 x i64>
175   %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
176   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
177   %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
178   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
179   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
180   ret <4 x i32> %conv6
183 define arm_aapcs_vfpcc <4 x i32> @utest_f32i32(<4 x float> %x) {
184 ; CHECK-LABEL: utest_f32i32:
185 ; CHECK:       @ %bb.0: @ %entry
186 ; CHECK-NEXT:    vcvt.u32.f32 q0, q0
187 ; CHECK-NEXT:    bx lr
188 entry:
189   %conv = fptoui <4 x float> %x to <4 x i64>
190   %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
191   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
192   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
193   ret <4 x i32> %conv6
196 define arm_aapcs_vfpcc <4 x i32> @ustest_f32i32(<4 x float> %x) {
197 ; CHECK-LABEL: ustest_f32i32:
198 ; CHECK:       @ %bb.0: @ %entry
199 ; CHECK-NEXT:    vcvt.u32.f32 q0, q0
200 ; CHECK-NEXT:    bx lr
201 entry:
202   %conv = fptosi <4 x float> %x to <4 x i64>
203   %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
204   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
205   %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer
206   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer
207   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
208   ret <4 x i32> %conv6
211 define arm_aapcs_vfpcc <4 x i32> @stest_f16i32(<4 x half> %x) {
212 ; CHECK-LABEL: stest_f16i32:
213 ; CHECK:       @ %bb.0: @ %entry
214 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
215 ; CHECK-NEXT:    push {r4, r5, r7, lr}
216 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
217 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
218 ; CHECK-NEXT:    vmov.u16 r0, q0[3]
219 ; CHECK-NEXT:    vmov q4, q0
220 ; CHECK-NEXT:    bl __fixhfdi
221 ; CHECK-NEXT:    mov r4, r0
222 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
223 ; CHECK-NEXT:    bl __fixhfdi
224 ; CHECK-NEXT:    mov r5, r0
225 ; CHECK-NEXT:    vmov.u16 r0, q4[2]
226 ; CHECK-NEXT:    bl __fixhfdi
227 ; CHECK-NEXT:    vmov q5[2], q5[0], r5, r0
228 ; CHECK-NEXT:    vmov.u16 r0, q4[1]
229 ; CHECK-NEXT:    bl __fixhfdi
230 ; CHECK-NEXT:    vmov q5[3], q5[1], r0, r4
231 ; CHECK-NEXT:    vmov q0, q5
232 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
233 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
234 entry:
235   %conv = fptosi <4 x half> %x to <4 x i64>
236   %0 = icmp slt <4 x i64> %conv, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
237   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>
238   %1 = icmp sgt <4 x i64> %spec.store.select, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
239   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>
240   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
241   ret <4 x i32> %conv6
244 define arm_aapcs_vfpcc <4 x i32> @utesth_f16i32(<4 x half> %x) {
245 ; CHECK-LABEL: utesth_f16i32:
246 ; CHECK:       @ %bb.0: @ %entry
247 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
248 ; CHECK-NEXT:    push {r4, r5, r7, lr}
249 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
250 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
251 ; CHECK-NEXT:    vmov.u16 r0, q0[3]
252 ; CHECK-NEXT:    vmov q4, q0
253 ; CHECK-NEXT:    bl __fixunshfdi
254 ; CHECK-NEXT:    mov r4, r0
255 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
256 ; CHECK-NEXT:    bl __fixunshfdi
257 ; CHECK-NEXT:    mov r5, r0
258 ; CHECK-NEXT:    vmov.u16 r0, q4[2]
259 ; CHECK-NEXT:    bl __fixunshfdi
260 ; CHECK-NEXT:    vmov q5[2], q5[0], r5, r0
261 ; CHECK-NEXT:    vmov.u16 r0, q4[1]
262 ; CHECK-NEXT:    bl __fixunshfdi
263 ; CHECK-NEXT:    vmov q5[3], q5[1], r0, r4
264 ; CHECK-NEXT:    vmov q0, q5
265 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
266 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
267 entry:
268   %conv = fptoui <4 x half> %x to <4 x i64>
269   %0 = icmp ult <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
270   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
271   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
272   ret <4 x i32> %conv6
275 define arm_aapcs_vfpcc <4 x i32> @ustest_f16i32(<4 x half> %x) {
276 ; CHECK-LABEL: ustest_f16i32:
277 ; CHECK:       @ %bb.0: @ %entry
278 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
279 ; CHECK-NEXT:    push {r4, r5, r6, lr}
280 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13}
281 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13}
282 ; CHECK-NEXT:    vmov.u16 r0, q0[3]
283 ; CHECK-NEXT:    vmov q4, q0
284 ; CHECK-NEXT:    bl __fixhfdi
285 ; CHECK-NEXT:    mov r4, r0
286 ; CHECK-NEXT:    vmov.u16 r0, q4[2]
287 ; CHECK-NEXT:    mov r5, r1
288 ; CHECK-NEXT:    bl __fixhfdi
289 ; CHECK-NEXT:    rsbs r2, r0, #0
290 ; CHECK-NEXT:    mov.w r6, #0
291 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
292 ; CHECK-NEXT:    sbcs.w r0, r6, r1
293 ; CHECK-NEXT:    csetm r0, lt
294 ; CHECK-NEXT:    movs r1, #0
295 ; CHECK-NEXT:    bfi r1, r0, #0, #8
296 ; CHECK-NEXT:    rsbs r0, r4, #0
297 ; CHECK-NEXT:    sbcs.w r0, r6, r5
298 ; CHECK-NEXT:    vmov.i32 q5, #0x0
299 ; CHECK-NEXT:    csetm r0, lt
300 ; CHECK-NEXT:    bfi r1, r0, #8, #8
301 ; CHECK-NEXT:    vmov.u16 r0, q4[1]
302 ; CHECK-NEXT:    vmsr p0, r1
303 ; CHECK-NEXT:    vpsel q6, q0, q5
304 ; CHECK-NEXT:    bl __fixhfdi
305 ; CHECK-NEXT:    mov r4, r0
306 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
307 ; CHECK-NEXT:    mov r5, r1
308 ; CHECK-NEXT:    bl __fixhfdi
309 ; CHECK-NEXT:    rsbs r2, r0, #0
310 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
311 ; CHECK-NEXT:    sbcs.w r0, r6, r1
312 ; CHECK-NEXT:    csetm r0, lt
313 ; CHECK-NEXT:    rsbs r1, r4, #0
314 ; CHECK-NEXT:    sbcs.w r1, r6, r5
315 ; CHECK-NEXT:    bfi r6, r0, #0, #8
316 ; CHECK-NEXT:    csetm r0, lt
317 ; CHECK-NEXT:    bfi r6, r0, #8, #8
318 ; CHECK-NEXT:    vmsr p0, r6
319 ; CHECK-NEXT:    vpsel q0, q0, q5
320 ; CHECK-NEXT:    vmov.f32 s1, s2
321 ; CHECK-NEXT:    vmov.f32 s2, s24
322 ; CHECK-NEXT:    vmov.f32 s3, s26
323 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13}
324 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
325 entry:
326   %conv = fptosi <4 x half> %x to <4 x i64>
327   %0 = icmp slt <4 x i64> %conv, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
328   %spec.store.select = select <4 x i1> %0, <4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>
329   %1 = icmp sgt <4 x i64> %spec.store.select, zeroinitializer
330   %spec.store.select7 = select <4 x i1> %1, <4 x i64> %spec.store.select, <4 x i64> zeroinitializer
331   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
332   ret <4 x i32> %conv6
335 ; i16 saturate
337 define arm_aapcs_vfpcc <2 x i16> @stest_f64i16(<2 x double> %x) {
338 ; CHECK-LABEL: stest_f64i16:
339 ; CHECK:       @ %bb.0: @ %entry
340 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
341 ; CHECK-NEXT:    push {r4, r5, r7, lr}
342 ; CHECK-NEXT:    .vsave {d8, d9}
343 ; CHECK-NEXT:    vpush {d8, d9}
344 ; CHECK-NEXT:    vmov q4, q0
345 ; CHECK-NEXT:    vmov r0, r1, d9
346 ; CHECK-NEXT:    bl __aeabi_d2lz
347 ; CHECK-NEXT:    mov r4, r0
348 ; CHECK-NEXT:    mov r5, r1
349 ; CHECK-NEXT:    vmov r0, r1, d8
350 ; CHECK-NEXT:    bl __aeabi_d2lz
351 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
352 ; CHECK-NEXT:    movw r4, #32767
353 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
354 ; CHECK-NEXT:    adr.w r12, .LCPI9_0
355 ; CHECK-NEXT:    vmov r1, r2, d0
356 ; CHECK-NEXT:    vldrw.u32 q1, [r12]
357 ; CHECK-NEXT:    vmov r3, r5, d1
358 ; CHECK-NEXT:    movw lr, #32768
359 ; CHECK-NEXT:    movt lr, #65535
360 ; CHECK-NEXT:    mov.w r12, #-1
361 ; CHECK-NEXT:    movs r0, #0
362 ; CHECK-NEXT:    subs r1, r1, r4
363 ; CHECK-NEXT:    sbcs r1, r2, #0
364 ; CHECK-NEXT:    mov.w r2, #0
365 ; CHECK-NEXT:    csetm r1, lt
366 ; CHECK-NEXT:    bfi r2, r1, #0, #8
367 ; CHECK-NEXT:    subs r1, r3, r4
368 ; CHECK-NEXT:    sbcs r1, r5, #0
369 ; CHECK-NEXT:    adr r4, .LCPI9_1
370 ; CHECK-NEXT:    csetm r1, lt
371 ; CHECK-NEXT:    bfi r2, r1, #8, #8
372 ; CHECK-NEXT:    vmsr p0, r2
373 ; CHECK-NEXT:    vpsel q0, q0, q1
374 ; CHECK-NEXT:    vldrw.u32 q1, [r4]
375 ; CHECK-NEXT:    vmov r1, r2, d0
376 ; CHECK-NEXT:    vmov r3, r5, d1
377 ; CHECK-NEXT:    subs.w r1, lr, r1
378 ; CHECK-NEXT:    sbcs.w r1, r12, r2
379 ; CHECK-NEXT:    csetm r1, lt
380 ; CHECK-NEXT:    bfi r0, r1, #0, #8
381 ; CHECK-NEXT:    subs.w r1, lr, r3
382 ; CHECK-NEXT:    sbcs.w r1, r12, r5
383 ; CHECK-NEXT:    csetm r1, lt
384 ; CHECK-NEXT:    bfi r0, r1, #8, #8
385 ; CHECK-NEXT:    vmsr p0, r0
386 ; CHECK-NEXT:    vpsel q0, q0, q1
387 ; CHECK-NEXT:    vpop {d8, d9}
388 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
389 ; CHECK-NEXT:    .p2align 4
390 ; CHECK-NEXT:  @ %bb.1:
391 ; CHECK-NEXT:  .LCPI9_0:
392 ; CHECK-NEXT:    .long 32767 @ 0x7fff
393 ; CHECK-NEXT:    .long 0 @ 0x0
394 ; CHECK-NEXT:    .long 32767 @ 0x7fff
395 ; CHECK-NEXT:    .long 0 @ 0x0
396 ; CHECK-NEXT:  .LCPI9_1:
397 ; CHECK-NEXT:    .long 4294934528 @ 0xffff8000
398 ; CHECK-NEXT:    .long 0 @ 0x0
399 ; CHECK-NEXT:    .long 4294934528 @ 0xffff8000
400 ; CHECK-NEXT:    .long 0 @ 0x0
401 entry:
402   %conv = fptosi <2 x double> %x to <2 x i32>
403   %0 = icmp slt <2 x i32> %conv, <i32 32767, i32 32767>
404   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>
405   %1 = icmp sgt <2 x i32> %spec.store.select, <i32 -32768, i32 -32768>
406   %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>
407   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
408   ret <2 x i16> %conv6
411 define arm_aapcs_vfpcc <2 x i16> @utest_f64i16(<2 x double> %x) {
412 ; CHECK-LABEL: utest_f64i16:
413 ; CHECK:       @ %bb.0: @ %entry
414 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
415 ; CHECK-NEXT:    push {r4, r5, r7, lr}
416 ; CHECK-NEXT:    .vsave {d8, d9}
417 ; CHECK-NEXT:    vpush {d8, d9}
418 ; CHECK-NEXT:    vmov q4, q0
419 ; CHECK-NEXT:    vmov r0, r1, d9
420 ; CHECK-NEXT:    bl __aeabi_d2ulz
421 ; CHECK-NEXT:    mov r4, r0
422 ; CHECK-NEXT:    mov r5, r1
423 ; CHECK-NEXT:    vmov r0, r1, d8
424 ; CHECK-NEXT:    bl __aeabi_d2ulz
425 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
426 ; CHECK-NEXT:    movw r4, #65535
427 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
428 ; CHECK-NEXT:    movs r5, #0
429 ; CHECK-NEXT:    vmov r0, r1, d0
430 ; CHECK-NEXT:    vmov.i64 q1, #0xffff
431 ; CHECK-NEXT:    vmov r2, r3, d1
432 ; CHECK-NEXT:    subs r0, r0, r4
433 ; CHECK-NEXT:    sbcs r0, r1, #0
434 ; CHECK-NEXT:    csetm r0, lo
435 ; CHECK-NEXT:    bfi r5, r0, #0, #8
436 ; CHECK-NEXT:    subs r0, r2, r4
437 ; CHECK-NEXT:    sbcs r0, r3, #0
438 ; CHECK-NEXT:    csetm r0, lo
439 ; CHECK-NEXT:    bfi r5, r0, #8, #8
440 ; CHECK-NEXT:    vmsr p0, r5
441 ; CHECK-NEXT:    vpsel q0, q0, q1
442 ; CHECK-NEXT:    vpop {d8, d9}
443 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
444 entry:
445   %conv = fptoui <2 x double> %x to <2 x i32>
446   %0 = icmp ult <2 x i32> %conv, <i32 65535, i32 65535>
447   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>
448   %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>
449   ret <2 x i16> %conv6
452 define arm_aapcs_vfpcc <2 x i16> @ustest_f64i16(<2 x double> %x) {
453 ; CHECK-LABEL: ustest_f64i16:
454 ; CHECK:       @ %bb.0: @ %entry
455 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
456 ; CHECK-NEXT:    push {r4, r5, r7, lr}
457 ; CHECK-NEXT:    .vsave {d8, d9}
458 ; CHECK-NEXT:    vpush {d8, d9}
459 ; CHECK-NEXT:    vmov q4, q0
460 ; CHECK-NEXT:    vmov r0, r1, d9
461 ; CHECK-NEXT:    bl __aeabi_d2lz
462 ; CHECK-NEXT:    mov r4, r0
463 ; CHECK-NEXT:    mov r5, r1
464 ; CHECK-NEXT:    vmov r0, r1, d8
465 ; CHECK-NEXT:    bl __aeabi_d2lz
466 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
467 ; CHECK-NEXT:    movw r4, #65535
468 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
469 ; CHECK-NEXT:    vmov.i64 q1, #0xffff
470 ; CHECK-NEXT:    vmov r1, r2, d0
471 ; CHECK-NEXT:    movs r0, #0
472 ; CHECK-NEXT:    vmov r3, r5, d1
473 ; CHECK-NEXT:    subs r1, r1, r4
474 ; CHECK-NEXT:    sbcs r1, r2, #0
475 ; CHECK-NEXT:    mov.w r2, #0
476 ; CHECK-NEXT:    csetm r1, lt
477 ; CHECK-NEXT:    bfi r2, r1, #0, #8
478 ; CHECK-NEXT:    subs r1, r3, r4
479 ; CHECK-NEXT:    sbcs r1, r5, #0
480 ; CHECK-NEXT:    csetm r1, lt
481 ; CHECK-NEXT:    bfi r2, r1, #8, #8
482 ; CHECK-NEXT:    vmsr p0, r2
483 ; CHECK-NEXT:    vpsel q0, q0, q1
484 ; CHECK-NEXT:    vmov.i32 q1, #0x0
485 ; CHECK-NEXT:    vmov r1, r2, d0
486 ; CHECK-NEXT:    vmov r3, r5, d1
487 ; CHECK-NEXT:    rsbs r1, r1, #0
488 ; CHECK-NEXT:    sbcs.w r1, r0, r2
489 ; CHECK-NEXT:    csetm r1, lt
490 ; CHECK-NEXT:    rsbs r2, r3, #0
491 ; CHECK-NEXT:    sbcs.w r2, r0, r5
492 ; CHECK-NEXT:    bfi r0, r1, #0, #8
493 ; CHECK-NEXT:    csetm r1, lt
494 ; CHECK-NEXT:    bfi r0, r1, #8, #8
495 ; CHECK-NEXT:    vmsr p0, r0
496 ; CHECK-NEXT:    vpsel q0, q0, q1
497 ; CHECK-NEXT:    vpop {d8, d9}
498 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
499 entry:
500   %conv = fptosi <2 x double> %x to <2 x i32>
501   %0 = icmp slt <2 x i32> %conv, <i32 65535, i32 65535>
502   %spec.store.select = select <2 x i1> %0, <2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>
503   %1 = icmp sgt <2 x i32> %spec.store.select, zeroinitializer
504   %spec.store.select7 = select <2 x i1> %1, <2 x i32> %spec.store.select, <2 x i32> zeroinitializer
505   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
506   ret <2 x i16> %conv6
509 define arm_aapcs_vfpcc <4 x i16> @stest_f32i16(<4 x float> %x) {
510 ; CHECK-LABEL: stest_f32i16:
511 ; CHECK:       @ %bb.0: @ %entry
512 ; CHECK-NEXT:    vcvt.s32.f32 q0, q0
513 ; CHECK-NEXT:    vqmovnb.s32 q0, q0
514 ; CHECK-NEXT:    vmovlb.s16 q0, q0
515 ; CHECK-NEXT:    bx lr
516 entry:
517   %conv = fptosi <4 x float> %x to <4 x i32>
518   %0 = icmp slt <4 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767>
519   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>
520   %1 = icmp sgt <4 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
521   %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>
522   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
523   ret <4 x i16> %conv6
526 define arm_aapcs_vfpcc <4 x i16> @utest_f32i16(<4 x float> %x) {
527 ; CHECK-LABEL: utest_f32i16:
528 ; CHECK:       @ %bb.0: @ %entry
529 ; CHECK-NEXT:    vcvt.u32.f32 q0, q0
530 ; CHECK-NEXT:    vqmovnb.u32 q0, q0
531 ; CHECK-NEXT:    vmovlb.u16 q0, q0
532 ; CHECK-NEXT:    bx lr
533 entry:
534   %conv = fptoui <4 x float> %x to <4 x i32>
535   %0 = icmp ult <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>
536   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
537   %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>
538   ret <4 x i16> %conv6
541 define arm_aapcs_vfpcc <4 x i16> @ustest_f32i16(<4 x float> %x) {
542 ; CHECK-LABEL: ustest_f32i16:
543 ; CHECK:       @ %bb.0: @ %entry
544 ; CHECK-NEXT:    vmov.i32 q1, #0xffff
545 ; CHECK-NEXT:    vcvt.s32.f32 q0, q0
546 ; CHECK-NEXT:    vmov.i32 q2, #0x0
547 ; CHECK-NEXT:    vmin.s32 q0, q0, q1
548 ; CHECK-NEXT:    vmax.s32 q0, q0, q2
549 ; CHECK-NEXT:    bx lr
550 entry:
551   %conv = fptosi <4 x float> %x to <4 x i32>
552   %0 = icmp slt <4 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535>
553   %spec.store.select = select <4 x i1> %0, <4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>
554   %1 = icmp sgt <4 x i32> %spec.store.select, zeroinitializer
555   %spec.store.select7 = select <4 x i1> %1, <4 x i32> %spec.store.select, <4 x i32> zeroinitializer
556   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
557   ret <4 x i16> %conv6
560 define arm_aapcs_vfpcc <8 x i16> @stest_f16i16(<8 x half> %x) {
561 ; CHECK-LABEL: stest_f16i16:
562 ; CHECK:       @ %bb.0: @ %entry
563 ; CHECK-NEXT:    vcvt.s16.f16 q0, q0
564 ; CHECK-NEXT:    bx lr
565 entry:
566   %conv = fptosi <8 x half> %x to <8 x i32>
567   %0 = icmp slt <8 x i32> %conv, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
568   %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>
569   %1 = icmp sgt <8 x i32> %spec.store.select, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
570   %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>
571   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
572   ret <8 x i16> %conv6
575 define arm_aapcs_vfpcc <8 x i16> @utesth_f16i16(<8 x half> %x) {
576 ; CHECK-LABEL: utesth_f16i16:
577 ; CHECK:       @ %bb.0: @ %entry
578 ; CHECK-NEXT:    vmovx.f16 s6, s2
579 ; CHECK-NEXT:    vcvt.u32.f16 s12, s2
580 ; CHECK-NEXT:    vmovx.f16 s2, s0
581 ; CHECK-NEXT:    vcvt.u32.f16 s0, s0
582 ; CHECK-NEXT:    vcvt.u32.f16 s14, s2
583 ; CHECK-NEXT:    vmov r0, s0
584 ; CHECK-NEXT:    vmovx.f16 s4, s3
585 ; CHECK-NEXT:    vmovx.f16 s10, s1
586 ; CHECK-NEXT:    vcvt.u32.f16 s8, s3
587 ; CHECK-NEXT:    vcvt.u32.f16 s5, s1
588 ; CHECK-NEXT:    vmov.16 q0[0], r0
589 ; CHECK-NEXT:    vmov r0, s14
590 ; CHECK-NEXT:    vmov.16 q0[1], r0
591 ; CHECK-NEXT:    vmov r0, s5
592 ; CHECK-NEXT:    vcvt.u32.f16 s10, s10
593 ; CHECK-NEXT:    vmov.16 q0[2], r0
594 ; CHECK-NEXT:    vmov r0, s10
595 ; CHECK-NEXT:    vcvt.u32.f16 s6, s6
596 ; CHECK-NEXT:    vmov.16 q0[3], r0
597 ; CHECK-NEXT:    vmov r0, s12
598 ; CHECK-NEXT:    vmov.16 q0[4], r0
599 ; CHECK-NEXT:    vmov r0, s6
600 ; CHECK-NEXT:    vmov.16 q0[5], r0
601 ; CHECK-NEXT:    vmov r0, s8
602 ; CHECK-NEXT:    vcvt.u32.f16 s4, s4
603 ; CHECK-NEXT:    vmov.16 q0[6], r0
604 ; CHECK-NEXT:    vmov r0, s4
605 ; CHECK-NEXT:    vmov.16 q0[7], r0
606 ; CHECK-NEXT:    bx lr
607 entry:
608   %conv = fptoui <8 x half> %x to <8 x i32>
609   %0 = icmp ult <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
610   %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
611   %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>
612   ret <8 x i16> %conv6
615 define arm_aapcs_vfpcc <8 x i16> @ustest_f16i16(<8 x half> %x) {
616 ; CHECK-LABEL: ustest_f16i16:
617 ; CHECK:       @ %bb.0: @ %entry
618 ; CHECK-NEXT:    .vsave {d8, d9}
619 ; CHECK-NEXT:    vpush {d8, d9}
620 ; CHECK-NEXT:    .pad #16
621 ; CHECK-NEXT:    sub sp, #16
622 ; CHECK-NEXT:    vmovx.f16 s6, s0
623 ; CHECK-NEXT:    vcvt.s32.f16 s10, s0
624 ; CHECK-NEXT:    vmovx.f16 s0, s3
625 ; CHECK-NEXT:    vcvt.s32.f16 s5, s3
626 ; CHECK-NEXT:    vcvt.s32.f16 s12, s0
627 ; CHECK-NEXT:    vmovx.f16 s0, s2
628 ; CHECK-NEXT:    vcvt.s32.f16 s7, s2
629 ; CHECK-NEXT:    vcvt.s32.f16 s14, s0
630 ; CHECK-NEXT:    vmov r1, s5
631 ; CHECK-NEXT:    vmovx.f16 s4, s1
632 ; CHECK-NEXT:    vmov r2, s7
633 ; CHECK-NEXT:    vcvt.s32.f16 s8, s1
634 ; CHECK-NEXT:    vmov q4[2], q4[0], r2, r1
635 ; CHECK-NEXT:    vmov r1, s12
636 ; CHECK-NEXT:    vmov r2, s14
637 ; CHECK-NEXT:    vcvt.s32.f16 s4, s4
638 ; CHECK-NEXT:    vmov q4[3], q4[1], r2, r1
639 ; CHECK-NEXT:    vcvt.s32.f16 s6, s6
640 ; CHECK-NEXT:    vmov r1, s8
641 ; CHECK-NEXT:    vmov.i32 q0, #0x0
642 ; CHECK-NEXT:    vmov r2, s10
643 ; CHECK-NEXT:    mov r0, sp
644 ; CHECK-NEXT:    vmov q2[2], q2[0], r2, r1
645 ; CHECK-NEXT:    vmov r1, s4
646 ; CHECK-NEXT:    vmov r2, s6
647 ; CHECK-NEXT:    vmax.s32 q3, q4, q0
648 ; CHECK-NEXT:    vmov q2[3], q2[1], r2, r1
649 ; CHECK-NEXT:    vstrh.32 q3, [r0, #8]
650 ; CHECK-NEXT:    vmax.s32 q0, q2, q0
651 ; CHECK-NEXT:    vstrh.32 q0, [r0]
652 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
653 ; CHECK-NEXT:    add sp, #16
654 ; CHECK-NEXT:    vpop {d8, d9}
655 ; CHECK-NEXT:    bx lr
656 entry:
657   %conv = fptosi <8 x half> %x to <8 x i32>
658   %0 = icmp slt <8 x i32> %conv, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
659   %spec.store.select = select <8 x i1> %0, <8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>
660   %1 = icmp sgt <8 x i32> %spec.store.select, zeroinitializer
661   %spec.store.select7 = select <8 x i1> %1, <8 x i32> %spec.store.select, <8 x i32> zeroinitializer
662   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
663   ret <8 x i16> %conv6
666 ; i64 saturate
668 define arm_aapcs_vfpcc <2 x i64> @stest_f64i64(<2 x double> %x) {
669 ; CHECK-LABEL: stest_f64i64:
670 ; CHECK:       @ %bb.0: @ %entry
671 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, lr}
672 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, lr}
673 ; CHECK-NEXT:    .vsave {d8, d9}
674 ; CHECK-NEXT:    vpush {d8, d9}
675 ; CHECK-NEXT:    vmov q4, q0
676 ; CHECK-NEXT:    vmov r0, r1, d9
677 ; CHECK-NEXT:    bl __fixdfti
678 ; CHECK-NEXT:    vmov r12, lr, d8
679 ; CHECK-NEXT:    subs.w r4, r0, #-1
680 ; CHECK-NEXT:    mvn r9, #-2147483648
681 ; CHECK-NEXT:    sbcs.w r4, r1, r9
682 ; CHECK-NEXT:    sbcs r4, r2, #0
683 ; CHECK-NEXT:    mov.w r7, #-1
684 ; CHECK-NEXT:    sbcs r4, r3, #0
685 ; CHECK-NEXT:    mov.w r10, #-2147483648
686 ; CHECK-NEXT:    cset r4, lt
687 ; CHECK-NEXT:    cmp r4, #0
688 ; CHECK-NEXT:    csel r3, r3, r4, ne
689 ; CHECK-NEXT:    csel r2, r2, r4, ne
690 ; CHECK-NEXT:    csel r4, r0, r7, ne
691 ; CHECK-NEXT:    csel r1, r1, r9, ne
692 ; CHECK-NEXT:    rsbs r0, r4, #0
693 ; CHECK-NEXT:    sbcs.w r0, r10, r1
694 ; CHECK-NEXT:    sbcs.w r0, r7, r2
695 ; CHECK-NEXT:    sbcs.w r0, r7, r3
696 ; CHECK-NEXT:    cset r5, lt
697 ; CHECK-NEXT:    cmp r5, #0
698 ; CHECK-NEXT:    csel r8, r1, r10, ne
699 ; CHECK-NEXT:    mov r0, r12
700 ; CHECK-NEXT:    mov r1, lr
701 ; CHECK-NEXT:    bl __fixdfti
702 ; CHECK-NEXT:    subs.w r6, r0, #-1
703 ; CHECK-NEXT:    sbcs.w r6, r1, r9
704 ; CHECK-NEXT:    sbcs r6, r2, #0
705 ; CHECK-NEXT:    sbcs r6, r3, #0
706 ; CHECK-NEXT:    cset r6, lt
707 ; CHECK-NEXT:    cmp r6, #0
708 ; CHECK-NEXT:    csel r0, r0, r7, ne
709 ; CHECK-NEXT:    csel r1, r1, r9, ne
710 ; CHECK-NEXT:    csel r3, r3, r6, ne
711 ; CHECK-NEXT:    csel r2, r2, r6, ne
712 ; CHECK-NEXT:    rsbs r6, r0, #0
713 ; CHECK-NEXT:    sbcs.w r6, r10, r1
714 ; CHECK-NEXT:    sbcs.w r2, r7, r2
715 ; CHECK-NEXT:    sbcs.w r2, r7, r3
716 ; CHECK-NEXT:    cset r2, lt
717 ; CHECK-NEXT:    cmp r2, #0
718 ; CHECK-NEXT:    csel r1, r1, r10, ne
719 ; CHECK-NEXT:    cmp r5, #0
720 ; CHECK-NEXT:    csel r3, r4, r5, ne
721 ; CHECK-NEXT:    cmp r2, #0
722 ; CHECK-NEXT:    csel r0, r0, r2, ne
723 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r3
724 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r8
725 ; CHECK-NEXT:    vpop {d8, d9}
726 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, pc}
727 entry:
728   %conv = fptosi <2 x double> %x to <2 x i128>
729   %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
730   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
731   %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
732   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
733   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
734   ret <2 x i64> %conv6
737 define arm_aapcs_vfpcc <2 x i64> @utest_f64i64(<2 x double> %x) {
738 ; CHECK-LABEL: utest_f64i64:
739 ; CHECK:       @ %bb.0: @ %entry
740 ; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
741 ; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
742 ; CHECK-NEXT:    .pad #4
743 ; CHECK-NEXT:    sub sp, #4
744 ; CHECK-NEXT:    .vsave {d8, d9}
745 ; CHECK-NEXT:    vpush {d8, d9}
746 ; CHECK-NEXT:    vmov q4, q0
747 ; CHECK-NEXT:    vmov r0, r1, d9
748 ; CHECK-NEXT:    bl __fixunsdfti
749 ; CHECK-NEXT:    mov r5, r1
750 ; CHECK-NEXT:    vmov r4, r1, d8
751 ; CHECK-NEXT:    subs r2, #1
752 ; CHECK-NEXT:    sbcs r2, r3, #0
753 ; CHECK-NEXT:    cset r6, lo
754 ; CHECK-NEXT:    cmp r6, #0
755 ; CHECK-NEXT:    csel r7, r0, r6, ne
756 ; CHECK-NEXT:    mov r0, r4
757 ; CHECK-NEXT:    bl __fixunsdfti
758 ; CHECK-NEXT:    subs r2, #1
759 ; CHECK-NEXT:    sbcs r2, r3, #0
760 ; CHECK-NEXT:    cset r2, lo
761 ; CHECK-NEXT:    cmp r2, #0
762 ; CHECK-NEXT:    csel r0, r0, r2, ne
763 ; CHECK-NEXT:    cmp r6, #0
764 ; CHECK-NEXT:    csel r3, r5, r6, ne
765 ; CHECK-NEXT:    cmp r2, #0
766 ; CHECK-NEXT:    csel r1, r1, r2, ne
767 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r7
768 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r3
769 ; CHECK-NEXT:    vpop {d8, d9}
770 ; CHECK-NEXT:    add sp, #4
771 ; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
772 entry:
773   %conv = fptoui <2 x double> %x to <2 x i128>
774   %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
775   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
776   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
777   ret <2 x i64> %conv6
780 define arm_aapcs_vfpcc <2 x i64> @ustest_f64i64(<2 x double> %x) {
781 ; CHECK-LABEL: ustest_f64i64:
782 ; CHECK:       @ %bb.0: @ %entry
783 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
784 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
785 ; CHECK-NEXT:    .pad #4
786 ; CHECK-NEXT:    sub sp, #4
787 ; CHECK-NEXT:    .vsave {d8, d9}
788 ; CHECK-NEXT:    vpush {d8, d9}
789 ; CHECK-NEXT:    vmov q4, q0
790 ; CHECK-NEXT:    vmov r0, r1, d9
791 ; CHECK-NEXT:    bl __fixdfti
792 ; CHECK-NEXT:    vmov r12, lr, d8
793 ; CHECK-NEXT:    subs r4, r2, #1
794 ; CHECK-NEXT:    sbcs r4, r3, #0
795 ; CHECK-NEXT:    mov.w r8, #1
796 ; CHECK-NEXT:    cset r5, lt
797 ; CHECK-NEXT:    movs r7, #0
798 ; CHECK-NEXT:    cmp r5, #0
799 ; CHECK-NEXT:    csel r0, r0, r5, ne
800 ; CHECK-NEXT:    csel r3, r3, r5, ne
801 ; CHECK-NEXT:    csel r2, r2, r8, ne
802 ; CHECK-NEXT:    csel r4, r1, r5, ne
803 ; CHECK-NEXT:    rsbs r1, r0, #0
804 ; CHECK-NEXT:    sbcs.w r1, r7, r4
805 ; CHECK-NEXT:    sbcs.w r1, r7, r2
806 ; CHECK-NEXT:    sbcs.w r1, r7, r3
807 ; CHECK-NEXT:    cset r6, lt
808 ; CHECK-NEXT:    cmp r6, #0
809 ; CHECK-NEXT:    csel r9, r0, r6, ne
810 ; CHECK-NEXT:    mov r0, r12
811 ; CHECK-NEXT:    mov r1, lr
812 ; CHECK-NEXT:    bl __fixdfti
813 ; CHECK-NEXT:    subs r5, r2, #1
814 ; CHECK-NEXT:    sbcs r5, r3, #0
815 ; CHECK-NEXT:    cset r5, lt
816 ; CHECK-NEXT:    cmp r5, #0
817 ; CHECK-NEXT:    csel r0, r0, r5, ne
818 ; CHECK-NEXT:    csel r2, r2, r8, ne
819 ; CHECK-NEXT:    csel r3, r3, r5, ne
820 ; CHECK-NEXT:    csel r1, r1, r5, ne
821 ; CHECK-NEXT:    rsbs r5, r0, #0
822 ; CHECK-NEXT:    sbcs.w r5, r7, r1
823 ; CHECK-NEXT:    sbcs.w r2, r7, r2
824 ; CHECK-NEXT:    sbcs.w r2, r7, r3
825 ; CHECK-NEXT:    cset r2, lt
826 ; CHECK-NEXT:    cmp r2, #0
827 ; CHECK-NEXT:    csel r0, r0, r2, ne
828 ; CHECK-NEXT:    cmp r6, #0
829 ; CHECK-NEXT:    csel r3, r4, r6, ne
830 ; CHECK-NEXT:    cmp r2, #0
831 ; CHECK-NEXT:    csel r1, r1, r2, ne
832 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r9
833 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r3
834 ; CHECK-NEXT:    vpop {d8, d9}
835 ; CHECK-NEXT:    add sp, #4
836 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
837 entry:
838   %conv = fptosi <2 x double> %x to <2 x i128>
839   %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
840   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
841   %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
842   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
843   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
844   ret <2 x i64> %conv6
847 define arm_aapcs_vfpcc <2 x i64> @stest_f32i64(<2 x float> %x) {
848 ; CHECK-LABEL: stest_f32i64:
849 ; CHECK:       @ %bb.0: @ %entry
850 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
851 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
852 ; CHECK-NEXT:    .pad #4
853 ; CHECK-NEXT:    sub sp, #4
854 ; CHECK-NEXT:    vmov r9, r0, d0
855 ; CHECK-NEXT:    bl __fixsfti
856 ; CHECK-NEXT:    subs.w r7, r0, #-1
857 ; CHECK-NEXT:    mvn r10, #-2147483648
858 ; CHECK-NEXT:    sbcs.w r7, r1, r10
859 ; CHECK-NEXT:    mov.w r4, #-1
860 ; CHECK-NEXT:    sbcs r7, r2, #0
861 ; CHECK-NEXT:    mov.w r11, #-2147483648
862 ; CHECK-NEXT:    sbcs r7, r3, #0
863 ; CHECK-NEXT:    cset r7, lt
864 ; CHECK-NEXT:    cmp r7, #0
865 ; CHECK-NEXT:    csel r5, r0, r4, ne
866 ; CHECK-NEXT:    csel r3, r3, r7, ne
867 ; CHECK-NEXT:    csel r2, r2, r7, ne
868 ; CHECK-NEXT:    csel r1, r1, r10, ne
869 ; CHECK-NEXT:    rsbs r0, r5, #0
870 ; CHECK-NEXT:    sbcs.w r0, r11, r1
871 ; CHECK-NEXT:    sbcs.w r0, r4, r2
872 ; CHECK-NEXT:    sbcs.w r0, r4, r3
873 ; CHECK-NEXT:    cset r6, lt
874 ; CHECK-NEXT:    mov r0, r9
875 ; CHECK-NEXT:    cmp r6, #0
876 ; CHECK-NEXT:    csel r8, r1, r11, ne
877 ; CHECK-NEXT:    bl __fixsfti
878 ; CHECK-NEXT:    subs.w r7, r0, #-1
879 ; CHECK-NEXT:    sbcs.w r7, r1, r10
880 ; CHECK-NEXT:    sbcs r7, r2, #0
881 ; CHECK-NEXT:    sbcs r7, r3, #0
882 ; CHECK-NEXT:    cset r7, lt
883 ; CHECK-NEXT:    cmp r7, #0
884 ; CHECK-NEXT:    csel r0, r0, r4, ne
885 ; CHECK-NEXT:    csel r1, r1, r10, ne
886 ; CHECK-NEXT:    csel r3, r3, r7, ne
887 ; CHECK-NEXT:    csel r2, r2, r7, ne
888 ; CHECK-NEXT:    rsbs r7, r0, #0
889 ; CHECK-NEXT:    sbcs.w r7, r11, r1
890 ; CHECK-NEXT:    sbcs.w r2, r4, r2
891 ; CHECK-NEXT:    sbcs.w r2, r4, r3
892 ; CHECK-NEXT:    cset r2, lt
893 ; CHECK-NEXT:    cmp r2, #0
894 ; CHECK-NEXT:    csel r1, r1, r11, ne
895 ; CHECK-NEXT:    cmp r6, #0
896 ; CHECK-NEXT:    csel r3, r5, r6, ne
897 ; CHECK-NEXT:    cmp r2, #0
898 ; CHECK-NEXT:    csel r0, r0, r2, ne
899 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r3
900 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r8
901 ; CHECK-NEXT:    add sp, #4
902 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
903 entry:
904   %conv = fptosi <2 x float> %x to <2 x i128>
905   %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
906   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
907   %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
908   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
909   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
910   ret <2 x i64> %conv6
913 define arm_aapcs_vfpcc <2 x i64> @utest_f32i64(<2 x float> %x) {
914 ; CHECK-LABEL: utest_f32i64:
915 ; CHECK:       @ %bb.0: @ %entry
916 ; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
917 ; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
918 ; CHECK-NEXT:    .pad #4
919 ; CHECK-NEXT:    sub sp, #4
920 ; CHECK-NEXT:    vmov r4, r0, d0
921 ; CHECK-NEXT:    bl __fixunssfti
922 ; CHECK-NEXT:    mov r5, r1
923 ; CHECK-NEXT:    subs r1, r2, #1
924 ; CHECK-NEXT:    sbcs r1, r3, #0
925 ; CHECK-NEXT:    cset r6, lo
926 ; CHECK-NEXT:    cmp r6, #0
927 ; CHECK-NEXT:    csel r7, r0, r6, ne
928 ; CHECK-NEXT:    mov r0, r4
929 ; CHECK-NEXT:    bl __fixunssfti
930 ; CHECK-NEXT:    subs r2, #1
931 ; CHECK-NEXT:    sbcs r2, r3, #0
932 ; CHECK-NEXT:    cset r2, lo
933 ; CHECK-NEXT:    cmp r2, #0
934 ; CHECK-NEXT:    csel r0, r0, r2, ne
935 ; CHECK-NEXT:    cmp r6, #0
936 ; CHECK-NEXT:    csel r3, r5, r6, ne
937 ; CHECK-NEXT:    cmp r2, #0
938 ; CHECK-NEXT:    csel r1, r1, r2, ne
939 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r7
940 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r3
941 ; CHECK-NEXT:    add sp, #4
942 ; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
943 entry:
944   %conv = fptoui <2 x float> %x to <2 x i128>
945   %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
946   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
947   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
948   ret <2 x i64> %conv6
951 define arm_aapcs_vfpcc <2 x i64> @ustest_f32i64(<2 x float> %x) {
952 ; CHECK-LABEL: ustest_f32i64:
953 ; CHECK:       @ %bb.0: @ %entry
954 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, lr}
955 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, lr}
956 ; CHECK-NEXT:    .pad #4
957 ; CHECK-NEXT:    sub sp, #4
958 ; CHECK-NEXT:    vmov r6, r0, d0
959 ; CHECK-NEXT:    bl __fixsfti
960 ; CHECK-NEXT:    subs r5, r2, #1
961 ; CHECK-NEXT:    mov.w r8, #1
962 ; CHECK-NEXT:    sbcs r5, r3, #0
963 ; CHECK-NEXT:    cset r4, lt
964 ; CHECK-NEXT:    cmp r4, #0
965 ; CHECK-NEXT:    csel r0, r0, r4, ne
966 ; CHECK-NEXT:    csel r3, r3, r4, ne
967 ; CHECK-NEXT:    csel r5, r1, r4, ne
968 ; CHECK-NEXT:    csel r2, r2, r8, ne
969 ; CHECK-NEXT:    rsbs r1, r0, #0
970 ; CHECK-NEXT:    mov.w r4, #0
971 ; CHECK-NEXT:    sbcs.w r1, r4, r5
972 ; CHECK-NEXT:    sbcs.w r1, r4, r2
973 ; CHECK-NEXT:    sbcs.w r1, r4, r3
974 ; CHECK-NEXT:    cset r7, lt
975 ; CHECK-NEXT:    cmp r7, #0
976 ; CHECK-NEXT:    csel r9, r0, r7, ne
977 ; CHECK-NEXT:    mov r0, r6
978 ; CHECK-NEXT:    bl __fixsfti
979 ; CHECK-NEXT:    subs r6, r2, #1
980 ; CHECK-NEXT:    sbcs r6, r3, #0
981 ; CHECK-NEXT:    cset r6, lt
982 ; CHECK-NEXT:    cmp r6, #0
983 ; CHECK-NEXT:    csel r0, r0, r6, ne
984 ; CHECK-NEXT:    csel r2, r2, r8, ne
985 ; CHECK-NEXT:    csel r3, r3, r6, ne
986 ; CHECK-NEXT:    csel r1, r1, r6, ne
987 ; CHECK-NEXT:    rsbs r6, r0, #0
988 ; CHECK-NEXT:    sbcs.w r6, r4, r1
989 ; CHECK-NEXT:    sbcs.w r2, r4, r2
990 ; CHECK-NEXT:    sbcs.w r2, r4, r3
991 ; CHECK-NEXT:    cset r2, lt
992 ; CHECK-NEXT:    cmp r2, #0
993 ; CHECK-NEXT:    csel r0, r0, r2, ne
994 ; CHECK-NEXT:    cmp r7, #0
995 ; CHECK-NEXT:    csel r3, r5, r7, ne
996 ; CHECK-NEXT:    cmp r2, #0
997 ; CHECK-NEXT:    csel r1, r1, r2, ne
998 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r9
999 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r3
1000 ; CHECK-NEXT:    add sp, #4
1001 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, pc}
1002 entry:
1003   %conv = fptosi <2 x float> %x to <2 x i128>
1004   %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1005   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1006   %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
1007   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
1008   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1009   ret <2 x i64> %conv6
1012 define arm_aapcs_vfpcc <2 x i64> @stest_f16i64(<2 x half> %x) {
1013 ; CHECK-LABEL: stest_f16i64:
1014 ; CHECK:       @ %bb.0: @ %entry
1015 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1016 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1017 ; CHECK-NEXT:    .vsave {d8, d9}
1018 ; CHECK-NEXT:    vpush {d8, d9}
1019 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
1020 ; CHECK-NEXT:    vmov q4, q0
1021 ; CHECK-NEXT:    bl __fixhfti
1022 ; CHECK-NEXT:    mov r4, r0
1023 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
1024 ; CHECK-NEXT:    mov r5, r1
1025 ; CHECK-NEXT:    bl __fixhfti
1026 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
1027 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
1028 ; CHECK-NEXT:    vpop {d8, d9}
1029 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1030 entry:
1031   %conv = fptosi <2 x half> %x to <2 x i128>
1032   %0 = icmp slt <2 x i128> %conv, <i128 9223372036854775807, i128 9223372036854775807>
1033   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>
1034   %1 = icmp sgt <2 x i128> %spec.store.select, <i128 -9223372036854775808, i128 -9223372036854775808>
1035   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>
1036   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1037   ret <2 x i64> %conv6
1040 define arm_aapcs_vfpcc <2 x i64> @utesth_f16i64(<2 x half> %x) {
1041 ; CHECK-LABEL: utesth_f16i64:
1042 ; CHECK:       @ %bb.0: @ %entry
1043 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1044 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1045 ; CHECK-NEXT:    .vsave {d8, d9}
1046 ; CHECK-NEXT:    vpush {d8, d9}
1047 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
1048 ; CHECK-NEXT:    vmov q4, q0
1049 ; CHECK-NEXT:    bl __fixunshfti
1050 ; CHECK-NEXT:    mov r4, r0
1051 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
1052 ; CHECK-NEXT:    mov r5, r1
1053 ; CHECK-NEXT:    bl __fixunshfti
1054 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
1055 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
1056 ; CHECK-NEXT:    vpop {d8, d9}
1057 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1058 entry:
1059   %conv = fptoui <2 x half> %x to <2 x i128>
1060   %0 = icmp ult <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1061   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1062   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
1063   ret <2 x i64> %conv6
1066 define arm_aapcs_vfpcc <2 x i64> @ustest_f16i64(<2 x half> %x) {
1067 ; CHECK-LABEL: ustest_f16i64:
1068 ; CHECK:       @ %bb.0: @ %entry
1069 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, lr}
1070 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}
1071 ; CHECK-NEXT:    .vsave {d8, d9}
1072 ; CHECK-NEXT:    vpush {d8, d9}
1073 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
1074 ; CHECK-NEXT:    vmov q4, q0
1075 ; CHECK-NEXT:    bl __fixhfti
1076 ; CHECK-NEXT:    mov r4, r1
1077 ; CHECK-NEXT:    rsbs r1, r0, #0
1078 ; CHECK-NEXT:    mov.w r5, #0
1079 ; CHECK-NEXT:    sbcs.w r1, r5, r4
1080 ; CHECK-NEXT:    sbcs.w r1, r5, r2
1081 ; CHECK-NEXT:    sbcs.w r1, r5, r3
1082 ; CHECK-NEXT:    cset r6, lt
1083 ; CHECK-NEXT:    cmp r6, #0
1084 ; CHECK-NEXT:    csel r8, r0, r6, ne
1085 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
1086 ; CHECK-NEXT:    bl __fixhfti
1087 ; CHECK-NEXT:    rsbs r7, r0, #0
1088 ; CHECK-NEXT:    sbcs.w r7, r5, r1
1089 ; CHECK-NEXT:    sbcs.w r2, r5, r2
1090 ; CHECK-NEXT:    sbcs.w r2, r5, r3
1091 ; CHECK-NEXT:    cset r2, lt
1092 ; CHECK-NEXT:    cmp r2, #0
1093 ; CHECK-NEXT:    csel r0, r0, r2, ne
1094 ; CHECK-NEXT:    cmp r6, #0
1095 ; CHECK-NEXT:    csel r3, r4, r6, ne
1096 ; CHECK-NEXT:    cmp r2, #0
1097 ; CHECK-NEXT:    csel r1, r1, r2, ne
1098 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r8
1099 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r3
1100 ; CHECK-NEXT:    vpop {d8, d9}
1101 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}
1102 entry:
1103   %conv = fptosi <2 x half> %x to <2 x i128>
1104   %0 = icmp slt <2 x i128> %conv, <i128 18446744073709551616, i128 18446744073709551616>
1105   %spec.store.select = select <2 x i1> %0, <2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>
1106   %1 = icmp sgt <2 x i128> %spec.store.select, zeroinitializer
1107   %spec.store.select7 = select <2 x i1> %1, <2 x i128> %spec.store.select, <2 x i128> zeroinitializer
1108   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1109   ret <2 x i64> %conv6
1114 ; i32 saturate
1116 define arm_aapcs_vfpcc <2 x i32> @stest_f64i32_mm(<2 x double> %x) {
1117 ; CHECK-LABEL: stest_f64i32_mm:
1118 ; CHECK:       @ %bb.0: @ %entry
1119 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1120 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1121 ; CHECK-NEXT:    .vsave {d8, d9}
1122 ; CHECK-NEXT:    vpush {d8, d9}
1123 ; CHECK-NEXT:    vmov q4, q0
1124 ; CHECK-NEXT:    vmov r0, r1, d8
1125 ; CHECK-NEXT:    bl __aeabi_d2lz
1126 ; CHECK-NEXT:    mov r4, r0
1127 ; CHECK-NEXT:    mov r5, r1
1128 ; CHECK-NEXT:    vmov r0, r1, d9
1129 ; CHECK-NEXT:    bl __aeabi_d2lz
1130 ; CHECK-NEXT:    adr r3, .LCPI27_0
1131 ; CHECK-NEXT:    mvn r12, #-2147483648
1132 ; CHECK-NEXT:    vldrw.u32 q0, [r3]
1133 ; CHECK-NEXT:    subs.w r3, r4, r12
1134 ; CHECK-NEXT:    sbcs r3, r5, #0
1135 ; CHECK-NEXT:    vmov q1[2], q1[0], r4, r0
1136 ; CHECK-NEXT:    csetm r3, lt
1137 ; CHECK-NEXT:    subs.w r0, r0, r12
1138 ; CHECK-NEXT:    sbcs r0, r1, #0
1139 ; CHECK-NEXT:    vmov q1[3], q1[1], r5, r1
1140 ; CHECK-NEXT:    mov.w r5, #0
1141 ; CHECK-NEXT:    csetm r0, lt
1142 ; CHECK-NEXT:    bfi r5, r3, #0, #8
1143 ; CHECK-NEXT:    mov.w r12, #-1
1144 ; CHECK-NEXT:    bfi r5, r0, #8, #8
1145 ; CHECK-NEXT:    movs r2, #0
1146 ; CHECK-NEXT:    vmsr p0, r5
1147 ; CHECK-NEXT:    adr r4, .LCPI27_1
1148 ; CHECK-NEXT:    vpsel q0, q1, q0
1149 ; CHECK-NEXT:    vldrw.u32 q1, [r4]
1150 ; CHECK-NEXT:    vmov r0, r1, d0
1151 ; CHECK-NEXT:    vmov r3, r5, d1
1152 ; CHECK-NEXT:    rsbs.w r0, r0, #-2147483648
1153 ; CHECK-NEXT:    sbcs.w r0, r12, r1
1154 ; CHECK-NEXT:    csetm r0, lt
1155 ; CHECK-NEXT:    bfi r2, r0, #0, #8
1156 ; CHECK-NEXT:    rsbs.w r0, r3, #-2147483648
1157 ; CHECK-NEXT:    sbcs.w r0, r12, r5
1158 ; CHECK-NEXT:    csetm r0, lt
1159 ; CHECK-NEXT:    bfi r2, r0, #8, #8
1160 ; CHECK-NEXT:    vmsr p0, r2
1161 ; CHECK-NEXT:    vpsel q0, q0, q1
1162 ; CHECK-NEXT:    vpop {d8, d9}
1163 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1164 ; CHECK-NEXT:    .p2align 4
1165 ; CHECK-NEXT:  @ %bb.1:
1166 ; CHECK-NEXT:  .LCPI27_0:
1167 ; CHECK-NEXT:    .long 2147483647 @ 0x7fffffff
1168 ; CHECK-NEXT:    .long 0 @ 0x0
1169 ; CHECK-NEXT:    .long 2147483647 @ 0x7fffffff
1170 ; CHECK-NEXT:    .long 0 @ 0x0
1171 ; CHECK-NEXT:  .LCPI27_1:
1172 ; CHECK-NEXT:    .long 2147483648 @ 0x80000000
1173 ; CHECK-NEXT:    .long 4294967295 @ 0xffffffff
1174 ; CHECK-NEXT:    .long 2147483648 @ 0x80000000
1175 ; CHECK-NEXT:    .long 4294967295 @ 0xffffffff
1176 entry:
1177   %conv = fptosi <2 x double> %x to <2 x i64>
1178   %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 2147483647, i64 2147483647>)
1179   %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> <i64 -2147483648, i64 -2147483648>)
1180   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
1181   ret <2 x i32> %conv6
1184 define arm_aapcs_vfpcc <2 x i32> @utest_f64i32_mm(<2 x double> %x) {
1185 ; CHECK-LABEL: utest_f64i32_mm:
1186 ; CHECK:       @ %bb.0: @ %entry
1187 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1188 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1189 ; CHECK-NEXT:    .vsave {d8, d9}
1190 ; CHECK-NEXT:    vpush {d8, d9}
1191 ; CHECK-NEXT:    vmov q4, q0
1192 ; CHECK-NEXT:    vmov r0, r1, d8
1193 ; CHECK-NEXT:    bl __aeabi_d2ulz
1194 ; CHECK-NEXT:    mov r4, r0
1195 ; CHECK-NEXT:    mov r5, r1
1196 ; CHECK-NEXT:    vmov r0, r1, d9
1197 ; CHECK-NEXT:    bl __aeabi_d2ulz
1198 ; CHECK-NEXT:    subs.w r3, r4, #-1
1199 ; CHECK-NEXT:    vmov q1[2], q1[0], r4, r0
1200 ; CHECK-NEXT:    sbcs r3, r5, #0
1201 ; CHECK-NEXT:    mov.w r2, #0
1202 ; CHECK-NEXT:    csetm r3, lo
1203 ; CHECK-NEXT:    subs.w r0, r0, #-1
1204 ; CHECK-NEXT:    sbcs r0, r1, #0
1205 ; CHECK-NEXT:    bfi r2, r3, #0, #8
1206 ; CHECK-NEXT:    csetm r0, lo
1207 ; CHECK-NEXT:    vmov.i64 q0, #0xffffffff
1208 ; CHECK-NEXT:    bfi r2, r0, #8, #8
1209 ; CHECK-NEXT:    vmov q1[3], q1[1], r5, r1
1210 ; CHECK-NEXT:    vmsr p0, r2
1211 ; CHECK-NEXT:    vpsel q0, q1, q0
1212 ; CHECK-NEXT:    vpop {d8, d9}
1213 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1214 entry:
1215   %conv = fptoui <2 x double> %x to <2 x i64>
1216   %spec.store.select = call <2 x i64> @llvm.umin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)
1217   %conv6 = trunc <2 x i64> %spec.store.select to <2 x i32>
1218   ret <2 x i32> %conv6
1221 define arm_aapcs_vfpcc <2 x i32> @ustest_f64i32_mm(<2 x double> %x) {
1222 ; CHECK-LABEL: ustest_f64i32_mm:
1223 ; CHECK:       @ %bb.0: @ %entry
1224 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1225 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1226 ; CHECK-NEXT:    .vsave {d8, d9}
1227 ; CHECK-NEXT:    vpush {d8, d9}
1228 ; CHECK-NEXT:    vmov q4, q0
1229 ; CHECK-NEXT:    vmov r0, r1, d8
1230 ; CHECK-NEXT:    bl __aeabi_d2lz
1231 ; CHECK-NEXT:    mov r4, r0
1232 ; CHECK-NEXT:    mov r5, r1
1233 ; CHECK-NEXT:    vmov r0, r1, d9
1234 ; CHECK-NEXT:    bl __aeabi_d2lz
1235 ; CHECK-NEXT:    subs.w r3, r4, #-1
1236 ; CHECK-NEXT:    vmov q1[2], q1[0], r4, r0
1237 ; CHECK-NEXT:    sbcs r3, r5, #0
1238 ; CHECK-NEXT:    vmov q1[3], q1[1], r5, r1
1239 ; CHECK-NEXT:    csetm r3, lt
1240 ; CHECK-NEXT:    subs.w r0, r0, #-1
1241 ; CHECK-NEXT:    mov.w r5, #0
1242 ; CHECK-NEXT:    sbcs r0, r1, #0
1243 ; CHECK-NEXT:    bfi r5, r3, #0, #8
1244 ; CHECK-NEXT:    csetm r0, lt
1245 ; CHECK-NEXT:    bfi r5, r0, #8, #8
1246 ; CHECK-NEXT:    vmov.i64 q0, #0xffffffff
1247 ; CHECK-NEXT:    vmsr p0, r5
1248 ; CHECK-NEXT:    movs r2, #0
1249 ; CHECK-NEXT:    vpsel q0, q1, q0
1250 ; CHECK-NEXT:    vmov.i32 q1, #0x0
1251 ; CHECK-NEXT:    vmov r0, r1, d0
1252 ; CHECK-NEXT:    vmov r3, r5, d1
1253 ; CHECK-NEXT:    rsbs r0, r0, #0
1254 ; CHECK-NEXT:    sbcs.w r0, r2, r1
1255 ; CHECK-NEXT:    csetm r0, lt
1256 ; CHECK-NEXT:    rsbs r1, r3, #0
1257 ; CHECK-NEXT:    sbcs.w r1, r2, r5
1258 ; CHECK-NEXT:    bfi r2, r0, #0, #8
1259 ; CHECK-NEXT:    csetm r0, lt
1260 ; CHECK-NEXT:    bfi r2, r0, #8, #8
1261 ; CHECK-NEXT:    vmsr p0, r2
1262 ; CHECK-NEXT:    vpsel q0, q0, q1
1263 ; CHECK-NEXT:    vpop {d8, d9}
1264 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1265 entry:
1266   %conv = fptosi <2 x double> %x to <2 x i64>
1267   %spec.store.select = call <2 x i64> @llvm.smin.v2i64(<2 x i64> %conv, <2 x i64> <i64 4294967295, i64 4294967295>)
1268   %spec.store.select7 = call <2 x i64> @llvm.smax.v2i64(<2 x i64> %spec.store.select, <2 x i64> zeroinitializer)
1269   %conv6 = trunc <2 x i64> %spec.store.select7 to <2 x i32>
1270   ret <2 x i32> %conv6
1273 define arm_aapcs_vfpcc <4 x i32> @stest_f32i32_mm(<4 x float> %x) {
1274 ; CHECK-LABEL: stest_f32i32_mm:
1275 ; CHECK:       @ %bb.0: @ %entry
1276 ; CHECK-NEXT:    vcvt.s32.f32 q0, q0
1277 ; CHECK-NEXT:    bx lr
1278 entry:
1279   %conv = fptosi <4 x float> %x to <4 x i64>
1280   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
1281   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
1282   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1283   ret <4 x i32> %conv6
1286 define arm_aapcs_vfpcc <4 x i32> @utest_f32i32_mm(<4 x float> %x) {
1287 ; CHECK-LABEL: utest_f32i32_mm:
1288 ; CHECK:       @ %bb.0: @ %entry
1289 ; CHECK-NEXT:    vcvt.u32.f32 q0, q0
1290 ; CHECK-NEXT:    bx lr
1291 entry:
1292   %conv = fptoui <4 x float> %x to <4 x i64>
1293   %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1294   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
1295   ret <4 x i32> %conv6
1298 define arm_aapcs_vfpcc <4 x i32> @ustest_f32i32_mm(<4 x float> %x) {
1299 ; CHECK-LABEL: ustest_f32i32_mm:
1300 ; CHECK:       @ %bb.0: @ %entry
1301 ; CHECK-NEXT:    vcvt.u32.f32 q0, q0
1302 ; CHECK-NEXT:    bx lr
1303 entry:
1304   %conv = fptosi <4 x float> %x to <4 x i64>
1305   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1306   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)
1307   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1308   ret <4 x i32> %conv6
1311 define arm_aapcs_vfpcc <4 x i32> @stest_f16i32_mm(<4 x half> %x) {
1312 ; CHECK-LABEL: stest_f16i32_mm:
1313 ; CHECK:       @ %bb.0: @ %entry
1314 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1315 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1316 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
1317 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
1318 ; CHECK-NEXT:    vmov.u16 r0, q0[3]
1319 ; CHECK-NEXT:    vmov q4, q0
1320 ; CHECK-NEXT:    bl __fixhfdi
1321 ; CHECK-NEXT:    mov r4, r0
1322 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
1323 ; CHECK-NEXT:    bl __fixhfdi
1324 ; CHECK-NEXT:    mov r5, r0
1325 ; CHECK-NEXT:    vmov.u16 r0, q4[2]
1326 ; CHECK-NEXT:    bl __fixhfdi
1327 ; CHECK-NEXT:    vmov q5[2], q5[0], r5, r0
1328 ; CHECK-NEXT:    vmov.u16 r0, q4[1]
1329 ; CHECK-NEXT:    bl __fixhfdi
1330 ; CHECK-NEXT:    vmov q5[3], q5[1], r0, r4
1331 ; CHECK-NEXT:    vmov q0, q5
1332 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
1333 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1334 entry:
1335   %conv = fptosi <4 x half> %x to <4 x i64>
1336   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647>)
1337   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648>)
1338   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1339   ret <4 x i32> %conv6
1342 define arm_aapcs_vfpcc <4 x i32> @utesth_f16i32_mm(<4 x half> %x) {
1343 ; CHECK-LABEL: utesth_f16i32_mm:
1344 ; CHECK:       @ %bb.0: @ %entry
1345 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1346 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1347 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11}
1348 ; CHECK-NEXT:    vpush {d8, d9, d10, d11}
1349 ; CHECK-NEXT:    vmov.u16 r0, q0[3]
1350 ; CHECK-NEXT:    vmov q4, q0
1351 ; CHECK-NEXT:    bl __fixunshfdi
1352 ; CHECK-NEXT:    mov r4, r0
1353 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
1354 ; CHECK-NEXT:    bl __fixunshfdi
1355 ; CHECK-NEXT:    mov r5, r0
1356 ; CHECK-NEXT:    vmov.u16 r0, q4[2]
1357 ; CHECK-NEXT:    bl __fixunshfdi
1358 ; CHECK-NEXT:    vmov q5[2], q5[0], r5, r0
1359 ; CHECK-NEXT:    vmov.u16 r0, q4[1]
1360 ; CHECK-NEXT:    bl __fixunshfdi
1361 ; CHECK-NEXT:    vmov q5[3], q5[1], r0, r4
1362 ; CHECK-NEXT:    vmov q0, q5
1363 ; CHECK-NEXT:    vpop {d8, d9, d10, d11}
1364 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1365 entry:
1366   %conv = fptoui <4 x half> %x to <4 x i64>
1367   %spec.store.select = call <4 x i64> @llvm.umin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1368   %conv6 = trunc <4 x i64> %spec.store.select to <4 x i32>
1369   ret <4 x i32> %conv6
1372 define arm_aapcs_vfpcc <4 x i32> @ustest_f16i32_mm(<4 x half> %x) {
1373 ; CHECK-LABEL: ustest_f16i32_mm:
1374 ; CHECK:       @ %bb.0: @ %entry
1375 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
1376 ; CHECK-NEXT:    push {r4, r5, r6, lr}
1377 ; CHECK-NEXT:    .vsave {d8, d9, d10, d11, d12, d13}
1378 ; CHECK-NEXT:    vpush {d8, d9, d10, d11, d12, d13}
1379 ; CHECK-NEXT:    vmov.u16 r0, q0[3]
1380 ; CHECK-NEXT:    vmov q4, q0
1381 ; CHECK-NEXT:    bl __fixhfdi
1382 ; CHECK-NEXT:    mov r4, r0
1383 ; CHECK-NEXT:    vmov.u16 r0, q4[2]
1384 ; CHECK-NEXT:    mov r5, r1
1385 ; CHECK-NEXT:    bl __fixhfdi
1386 ; CHECK-NEXT:    rsbs r2, r0, #0
1387 ; CHECK-NEXT:    mov.w r6, #0
1388 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
1389 ; CHECK-NEXT:    sbcs.w r0, r6, r1
1390 ; CHECK-NEXT:    csetm r0, lt
1391 ; CHECK-NEXT:    movs r1, #0
1392 ; CHECK-NEXT:    bfi r1, r0, #0, #8
1393 ; CHECK-NEXT:    rsbs r0, r4, #0
1394 ; CHECK-NEXT:    sbcs.w r0, r6, r5
1395 ; CHECK-NEXT:    vmov.i32 q5, #0x0
1396 ; CHECK-NEXT:    csetm r0, lt
1397 ; CHECK-NEXT:    bfi r1, r0, #8, #8
1398 ; CHECK-NEXT:    vmov.u16 r0, q4[1]
1399 ; CHECK-NEXT:    vmsr p0, r1
1400 ; CHECK-NEXT:    vpsel q6, q0, q5
1401 ; CHECK-NEXT:    bl __fixhfdi
1402 ; CHECK-NEXT:    mov r4, r0
1403 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
1404 ; CHECK-NEXT:    mov r5, r1
1405 ; CHECK-NEXT:    bl __fixhfdi
1406 ; CHECK-NEXT:    rsbs r2, r0, #0
1407 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
1408 ; CHECK-NEXT:    sbcs.w r0, r6, r1
1409 ; CHECK-NEXT:    csetm r0, lt
1410 ; CHECK-NEXT:    rsbs r1, r4, #0
1411 ; CHECK-NEXT:    sbcs.w r1, r6, r5
1412 ; CHECK-NEXT:    bfi r6, r0, #0, #8
1413 ; CHECK-NEXT:    csetm r0, lt
1414 ; CHECK-NEXT:    bfi r6, r0, #8, #8
1415 ; CHECK-NEXT:    vmsr p0, r6
1416 ; CHECK-NEXT:    vpsel q0, q0, q5
1417 ; CHECK-NEXT:    vmov.f32 s1, s2
1418 ; CHECK-NEXT:    vmov.f32 s2, s24
1419 ; CHECK-NEXT:    vmov.f32 s3, s26
1420 ; CHECK-NEXT:    vpop {d8, d9, d10, d11, d12, d13}
1421 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
1422 entry:
1423   %conv = fptosi <4 x half> %x to <4 x i64>
1424   %spec.store.select = call <4 x i64> @llvm.smin.v4i64(<4 x i64> %conv, <4 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295>)
1425   %spec.store.select7 = call <4 x i64> @llvm.smax.v4i64(<4 x i64> %spec.store.select, <4 x i64> zeroinitializer)
1426   %conv6 = trunc <4 x i64> %spec.store.select7 to <4 x i32>
1427   ret <4 x i32> %conv6
1430 ; i16 saturate
1432 define arm_aapcs_vfpcc <2 x i16> @stest_f64i16_mm(<2 x double> %x) {
1433 ; CHECK-LABEL: stest_f64i16_mm:
1434 ; CHECK:       @ %bb.0: @ %entry
1435 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1436 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1437 ; CHECK-NEXT:    .vsave {d8, d9}
1438 ; CHECK-NEXT:    vpush {d8, d9}
1439 ; CHECK-NEXT:    vmov q4, q0
1440 ; CHECK-NEXT:    vmov r0, r1, d9
1441 ; CHECK-NEXT:    bl __aeabi_d2lz
1442 ; CHECK-NEXT:    mov r4, r0
1443 ; CHECK-NEXT:    mov r5, r1
1444 ; CHECK-NEXT:    vmov r0, r1, d8
1445 ; CHECK-NEXT:    bl __aeabi_d2lz
1446 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
1447 ; CHECK-NEXT:    movw r4, #32767
1448 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
1449 ; CHECK-NEXT:    adr.w r12, .LCPI36_0
1450 ; CHECK-NEXT:    vmov r1, r2, d0
1451 ; CHECK-NEXT:    vldrw.u32 q1, [r12]
1452 ; CHECK-NEXT:    vmov r3, r5, d1
1453 ; CHECK-NEXT:    movw lr, #32768
1454 ; CHECK-NEXT:    movt lr, #65535
1455 ; CHECK-NEXT:    mov.w r12, #-1
1456 ; CHECK-NEXT:    movs r0, #0
1457 ; CHECK-NEXT:    subs r1, r1, r4
1458 ; CHECK-NEXT:    sbcs r1, r2, #0
1459 ; CHECK-NEXT:    mov.w r2, #0
1460 ; CHECK-NEXT:    csetm r1, lt
1461 ; CHECK-NEXT:    bfi r2, r1, #0, #8
1462 ; CHECK-NEXT:    subs r1, r3, r4
1463 ; CHECK-NEXT:    sbcs r1, r5, #0
1464 ; CHECK-NEXT:    adr r4, .LCPI36_1
1465 ; CHECK-NEXT:    csetm r1, lt
1466 ; CHECK-NEXT:    bfi r2, r1, #8, #8
1467 ; CHECK-NEXT:    vmsr p0, r2
1468 ; CHECK-NEXT:    vpsel q0, q0, q1
1469 ; CHECK-NEXT:    vldrw.u32 q1, [r4]
1470 ; CHECK-NEXT:    vmov r1, r2, d0
1471 ; CHECK-NEXT:    vmov r3, r5, d1
1472 ; CHECK-NEXT:    subs.w r1, lr, r1
1473 ; CHECK-NEXT:    sbcs.w r1, r12, r2
1474 ; CHECK-NEXT:    csetm r1, lt
1475 ; CHECK-NEXT:    bfi r0, r1, #0, #8
1476 ; CHECK-NEXT:    subs.w r1, lr, r3
1477 ; CHECK-NEXT:    sbcs.w r1, r12, r5
1478 ; CHECK-NEXT:    csetm r1, lt
1479 ; CHECK-NEXT:    bfi r0, r1, #8, #8
1480 ; CHECK-NEXT:    vmsr p0, r0
1481 ; CHECK-NEXT:    vpsel q0, q0, q1
1482 ; CHECK-NEXT:    vpop {d8, d9}
1483 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1484 ; CHECK-NEXT:    .p2align 4
1485 ; CHECK-NEXT:  @ %bb.1:
1486 ; CHECK-NEXT:  .LCPI36_0:
1487 ; CHECK-NEXT:    .long 32767 @ 0x7fff
1488 ; CHECK-NEXT:    .long 0 @ 0x0
1489 ; CHECK-NEXT:    .long 32767 @ 0x7fff
1490 ; CHECK-NEXT:    .long 0 @ 0x0
1491 ; CHECK-NEXT:  .LCPI36_1:
1492 ; CHECK-NEXT:    .long 4294934528 @ 0xffff8000
1493 ; CHECK-NEXT:    .long 4294967295 @ 0xffffffff
1494 ; CHECK-NEXT:    .long 4294934528 @ 0xffff8000
1495 ; CHECK-NEXT:    .long 4294967295 @ 0xffffffff
1496 entry:
1497   %conv = fptosi <2 x double> %x to <2 x i32>
1498   %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 32767, i32 32767>)
1499   %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> <i32 -32768, i32 -32768>)
1500   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
1501   ret <2 x i16> %conv6
1504 define arm_aapcs_vfpcc <2 x i16> @utest_f64i16_mm(<2 x double> %x) {
1505 ; CHECK-LABEL: utest_f64i16_mm:
1506 ; CHECK:       @ %bb.0: @ %entry
1507 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1508 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1509 ; CHECK-NEXT:    .vsave {d8, d9}
1510 ; CHECK-NEXT:    vpush {d8, d9}
1511 ; CHECK-NEXT:    vmov q4, q0
1512 ; CHECK-NEXT:    vmov r0, r1, d9
1513 ; CHECK-NEXT:    bl __aeabi_d2ulz
1514 ; CHECK-NEXT:    mov r4, r0
1515 ; CHECK-NEXT:    mov r5, r1
1516 ; CHECK-NEXT:    vmov r0, r1, d8
1517 ; CHECK-NEXT:    bl __aeabi_d2ulz
1518 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
1519 ; CHECK-NEXT:    movw r4, #65535
1520 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
1521 ; CHECK-NEXT:    movs r5, #0
1522 ; CHECK-NEXT:    vmov r0, r1, d0
1523 ; CHECK-NEXT:    vmov.i64 q1, #0xffff
1524 ; CHECK-NEXT:    vmov r2, r3, d1
1525 ; CHECK-NEXT:    subs r0, r0, r4
1526 ; CHECK-NEXT:    sbcs r0, r1, #0
1527 ; CHECK-NEXT:    csetm r0, lo
1528 ; CHECK-NEXT:    bfi r5, r0, #0, #8
1529 ; CHECK-NEXT:    subs r0, r2, r4
1530 ; CHECK-NEXT:    sbcs r0, r3, #0
1531 ; CHECK-NEXT:    csetm r0, lo
1532 ; CHECK-NEXT:    bfi r5, r0, #8, #8
1533 ; CHECK-NEXT:    vmsr p0, r5
1534 ; CHECK-NEXT:    vpsel q0, q0, q1
1535 ; CHECK-NEXT:    vpop {d8, d9}
1536 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1537 entry:
1538   %conv = fptoui <2 x double> %x to <2 x i32>
1539   %spec.store.select = call <2 x i32> @llvm.umin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)
1540   %conv6 = trunc <2 x i32> %spec.store.select to <2 x i16>
1541   ret <2 x i16> %conv6
1544 define arm_aapcs_vfpcc <2 x i16> @ustest_f64i16_mm(<2 x double> %x) {
1545 ; CHECK-LABEL: ustest_f64i16_mm:
1546 ; CHECK:       @ %bb.0: @ %entry
1547 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
1548 ; CHECK-NEXT:    push {r4, r5, r7, lr}
1549 ; CHECK-NEXT:    .vsave {d8, d9}
1550 ; CHECK-NEXT:    vpush {d8, d9}
1551 ; CHECK-NEXT:    vmov q4, q0
1552 ; CHECK-NEXT:    vmov r0, r1, d9
1553 ; CHECK-NEXT:    bl __aeabi_d2lz
1554 ; CHECK-NEXT:    mov r4, r0
1555 ; CHECK-NEXT:    mov r5, r1
1556 ; CHECK-NEXT:    vmov r0, r1, d8
1557 ; CHECK-NEXT:    bl __aeabi_d2lz
1558 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
1559 ; CHECK-NEXT:    movw r4, #65535
1560 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
1561 ; CHECK-NEXT:    vmov.i64 q1, #0xffff
1562 ; CHECK-NEXT:    vmov r1, r2, d0
1563 ; CHECK-NEXT:    movs r0, #0
1564 ; CHECK-NEXT:    vmov r3, r5, d1
1565 ; CHECK-NEXT:    subs r1, r1, r4
1566 ; CHECK-NEXT:    sbcs r1, r2, #0
1567 ; CHECK-NEXT:    mov.w r2, #0
1568 ; CHECK-NEXT:    csetm r1, lt
1569 ; CHECK-NEXT:    bfi r2, r1, #0, #8
1570 ; CHECK-NEXT:    subs r1, r3, r4
1571 ; CHECK-NEXT:    sbcs r1, r5, #0
1572 ; CHECK-NEXT:    csetm r1, lt
1573 ; CHECK-NEXT:    bfi r2, r1, #8, #8
1574 ; CHECK-NEXT:    vmsr p0, r2
1575 ; CHECK-NEXT:    vpsel q0, q0, q1
1576 ; CHECK-NEXT:    vmov.i32 q1, #0x0
1577 ; CHECK-NEXT:    vmov r1, r2, d0
1578 ; CHECK-NEXT:    vmov r3, r5, d1
1579 ; CHECK-NEXT:    rsbs r1, r1, #0
1580 ; CHECK-NEXT:    sbcs.w r1, r0, r2
1581 ; CHECK-NEXT:    csetm r1, lt
1582 ; CHECK-NEXT:    rsbs r2, r3, #0
1583 ; CHECK-NEXT:    sbcs.w r2, r0, r5
1584 ; CHECK-NEXT:    bfi r0, r1, #0, #8
1585 ; CHECK-NEXT:    csetm r1, lt
1586 ; CHECK-NEXT:    bfi r0, r1, #8, #8
1587 ; CHECK-NEXT:    vmsr p0, r0
1588 ; CHECK-NEXT:    vpsel q0, q0, q1
1589 ; CHECK-NEXT:    vpop {d8, d9}
1590 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
1591 entry:
1592   %conv = fptosi <2 x double> %x to <2 x i32>
1593   %spec.store.select = call <2 x i32> @llvm.smin.v2i32(<2 x i32> %conv, <2 x i32> <i32 65535, i32 65535>)
1594   %spec.store.select7 = call <2 x i32> @llvm.smax.v2i32(<2 x i32> %spec.store.select, <2 x i32> zeroinitializer)
1595   %conv6 = trunc <2 x i32> %spec.store.select7 to <2 x i16>
1596   ret <2 x i16> %conv6
1599 define arm_aapcs_vfpcc <4 x i16> @stest_f32i16_mm(<4 x float> %x) {
1600 ; CHECK-LABEL: stest_f32i16_mm:
1601 ; CHECK:       @ %bb.0: @ %entry
1602 ; CHECK-NEXT:    vcvt.s32.f32 q0, q0
1603 ; CHECK-NEXT:    vqmovnb.s32 q0, q0
1604 ; CHECK-NEXT:    vmovlb.s16 q0, q0
1605 ; CHECK-NEXT:    bx lr
1606 entry:
1607   %conv = fptosi <4 x float> %x to <4 x i32>
1608   %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767>)
1609   %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
1610   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
1611   ret <4 x i16> %conv6
1614 define arm_aapcs_vfpcc <4 x i16> @utest_f32i16_mm(<4 x float> %x) {
1615 ; CHECK-LABEL: utest_f32i16_mm:
1616 ; CHECK:       @ %bb.0: @ %entry
1617 ; CHECK-NEXT:    vcvt.u32.f32 q0, q0
1618 ; CHECK-NEXT:    vqmovnb.u32 q0, q0
1619 ; CHECK-NEXT:    vmovlb.u16 q0, q0
1620 ; CHECK-NEXT:    bx lr
1621 entry:
1622   %conv = fptoui <4 x float> %x to <4 x i32>
1623   %spec.store.select = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
1624   %conv6 = trunc <4 x i32> %spec.store.select to <4 x i16>
1625   ret <4 x i16> %conv6
1628 define arm_aapcs_vfpcc <4 x i16> @ustest_f32i16_mm(<4 x float> %x) {
1629 ; CHECK-LABEL: ustest_f32i16_mm:
1630 ; CHECK:       @ %bb.0: @ %entry
1631 ; CHECK-NEXT:    vmov.i32 q1, #0xffff
1632 ; CHECK-NEXT:    vcvt.s32.f32 q0, q0
1633 ; CHECK-NEXT:    vmov.i32 q2, #0x0
1634 ; CHECK-NEXT:    vmin.s32 q0, q0, q1
1635 ; CHECK-NEXT:    vmax.s32 q0, q0, q2
1636 ; CHECK-NEXT:    bx lr
1637 entry:
1638   %conv = fptosi <4 x float> %x to <4 x i32>
1639   %spec.store.select = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %conv, <4 x i32> <i32 65535, i32 65535, i32 65535, i32 65535>)
1640   %spec.store.select7 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %spec.store.select, <4 x i32> zeroinitializer)
1641   %conv6 = trunc <4 x i32> %spec.store.select7 to <4 x i16>
1642   ret <4 x i16> %conv6
1645 define arm_aapcs_vfpcc <8 x i16> @stest_f16i16_mm(<8 x half> %x) {
1646 ; CHECK-LABEL: stest_f16i16_mm:
1647 ; CHECK:       @ %bb.0: @ %entry
1648 ; CHECK-NEXT:    vcvt.s16.f16 q0, q0
1649 ; CHECK-NEXT:    bx lr
1650 entry:
1651   %conv = fptosi <8 x half> %x to <8 x i32>
1652   %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767>)
1653   %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768>)
1654   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
1655   ret <8 x i16> %conv6
1658 define arm_aapcs_vfpcc <8 x i16> @utesth_f16i16_mm(<8 x half> %x) {
1659 ; CHECK-LABEL: utesth_f16i16_mm:
1660 ; CHECK:       @ %bb.0: @ %entry
1661 ; CHECK-NEXT:    vmovx.f16 s6, s2
1662 ; CHECK-NEXT:    vcvt.u32.f16 s12, s2
1663 ; CHECK-NEXT:    vmovx.f16 s2, s0
1664 ; CHECK-NEXT:    vcvt.u32.f16 s0, s0
1665 ; CHECK-NEXT:    vcvt.u32.f16 s14, s2
1666 ; CHECK-NEXT:    vmov r0, s0
1667 ; CHECK-NEXT:    vmovx.f16 s4, s3
1668 ; CHECK-NEXT:    vmovx.f16 s10, s1
1669 ; CHECK-NEXT:    vcvt.u32.f16 s8, s3
1670 ; CHECK-NEXT:    vcvt.u32.f16 s5, s1
1671 ; CHECK-NEXT:    vmov.16 q0[0], r0
1672 ; CHECK-NEXT:    vmov r0, s14
1673 ; CHECK-NEXT:    vmov.16 q0[1], r0
1674 ; CHECK-NEXT:    vmov r0, s5
1675 ; CHECK-NEXT:    vcvt.u32.f16 s10, s10
1676 ; CHECK-NEXT:    vmov.16 q0[2], r0
1677 ; CHECK-NEXT:    vmov r0, s10
1678 ; CHECK-NEXT:    vcvt.u32.f16 s6, s6
1679 ; CHECK-NEXT:    vmov.16 q0[3], r0
1680 ; CHECK-NEXT:    vmov r0, s12
1681 ; CHECK-NEXT:    vmov.16 q0[4], r0
1682 ; CHECK-NEXT:    vmov r0, s6
1683 ; CHECK-NEXT:    vmov.16 q0[5], r0
1684 ; CHECK-NEXT:    vmov r0, s8
1685 ; CHECK-NEXT:    vcvt.u32.f16 s4, s4
1686 ; CHECK-NEXT:    vmov.16 q0[6], r0
1687 ; CHECK-NEXT:    vmov r0, s4
1688 ; CHECK-NEXT:    vmov.16 q0[7], r0
1689 ; CHECK-NEXT:    bx lr
1690 entry:
1691   %conv = fptoui <8 x half> %x to <8 x i32>
1692   %spec.store.select = call <8 x i32> @llvm.umin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
1693   %conv6 = trunc <8 x i32> %spec.store.select to <8 x i16>
1694   ret <8 x i16> %conv6
1697 define arm_aapcs_vfpcc <8 x i16> @ustest_f16i16_mm(<8 x half> %x) {
1698 ; CHECK-LABEL: ustest_f16i16_mm:
1699 ; CHECK:       @ %bb.0: @ %entry
1700 ; CHECK-NEXT:    .vsave {d8, d9}
1701 ; CHECK-NEXT:    vpush {d8, d9}
1702 ; CHECK-NEXT:    .pad #16
1703 ; CHECK-NEXT:    sub sp, #16
1704 ; CHECK-NEXT:    vmovx.f16 s6, s0
1705 ; CHECK-NEXT:    vcvt.s32.f16 s10, s0
1706 ; CHECK-NEXT:    vmovx.f16 s0, s3
1707 ; CHECK-NEXT:    vcvt.s32.f16 s5, s3
1708 ; CHECK-NEXT:    vcvt.s32.f16 s12, s0
1709 ; CHECK-NEXT:    vmovx.f16 s0, s2
1710 ; CHECK-NEXT:    vcvt.s32.f16 s7, s2
1711 ; CHECK-NEXT:    vcvt.s32.f16 s14, s0
1712 ; CHECK-NEXT:    vmov r1, s5
1713 ; CHECK-NEXT:    vmovx.f16 s4, s1
1714 ; CHECK-NEXT:    vmov r2, s7
1715 ; CHECK-NEXT:    vcvt.s32.f16 s8, s1
1716 ; CHECK-NEXT:    vmov q4[2], q4[0], r2, r1
1717 ; CHECK-NEXT:    vmov r1, s12
1718 ; CHECK-NEXT:    vmov r2, s14
1719 ; CHECK-NEXT:    vcvt.s32.f16 s4, s4
1720 ; CHECK-NEXT:    vmov q4[3], q4[1], r2, r1
1721 ; CHECK-NEXT:    vcvt.s32.f16 s6, s6
1722 ; CHECK-NEXT:    vmov r1, s8
1723 ; CHECK-NEXT:    vmov.i32 q0, #0x0
1724 ; CHECK-NEXT:    vmov r2, s10
1725 ; CHECK-NEXT:    mov r0, sp
1726 ; CHECK-NEXT:    vmov q2[2], q2[0], r2, r1
1727 ; CHECK-NEXT:    vmov r1, s4
1728 ; CHECK-NEXT:    vmov r2, s6
1729 ; CHECK-NEXT:    vmax.s32 q3, q4, q0
1730 ; CHECK-NEXT:    vmov q2[3], q2[1], r2, r1
1731 ; CHECK-NEXT:    vstrh.32 q3, [r0, #8]
1732 ; CHECK-NEXT:    vmax.s32 q0, q2, q0
1733 ; CHECK-NEXT:    vstrh.32 q0, [r0]
1734 ; CHECK-NEXT:    vldrw.u32 q0, [r0]
1735 ; CHECK-NEXT:    add sp, #16
1736 ; CHECK-NEXT:    vpop {d8, d9}
1737 ; CHECK-NEXT:    bx lr
1738 entry:
1739   %conv = fptosi <8 x half> %x to <8 x i32>
1740   %spec.store.select = call <8 x i32> @llvm.smin.v8i32(<8 x i32> %conv, <8 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535>)
1741   %spec.store.select7 = call <8 x i32> @llvm.smax.v8i32(<8 x i32> %spec.store.select, <8 x i32> zeroinitializer)
1742   %conv6 = trunc <8 x i32> %spec.store.select7 to <8 x i16>
1743   ret <8 x i16> %conv6
1746 ; i64 saturate
1748 define arm_aapcs_vfpcc <2 x i64> @stest_f64i64_mm(<2 x double> %x) {
1749 ; CHECK-LABEL: stest_f64i64_mm:
1750 ; CHECK:       @ %bb.0: @ %entry
1751 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, lr}
1752 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, lr}
1753 ; CHECK-NEXT:    .vsave {d8, d9}
1754 ; CHECK-NEXT:    vpush {d8, d9}
1755 ; CHECK-NEXT:    vmov q4, q0
1756 ; CHECK-NEXT:    vmov r0, r1, d9
1757 ; CHECK-NEXT:    bl __fixdfti
1758 ; CHECK-NEXT:    vmov r12, lr, d8
1759 ; CHECK-NEXT:    subs.w r4, r0, #-1
1760 ; CHECK-NEXT:    mvn r9, #-2147483648
1761 ; CHECK-NEXT:    sbcs.w r4, r1, r9
1762 ; CHECK-NEXT:    sbcs r4, r2, #0
1763 ; CHECK-NEXT:    mov.w r7, #-1
1764 ; CHECK-NEXT:    sbcs r4, r3, #0
1765 ; CHECK-NEXT:    mov.w r10, #-2147483648
1766 ; CHECK-NEXT:    cset r4, lt
1767 ; CHECK-NEXT:    cmp r4, #0
1768 ; CHECK-NEXT:    csel r3, r3, r4, ne
1769 ; CHECK-NEXT:    csel r2, r2, r4, ne
1770 ; CHECK-NEXT:    csel r4, r0, r7, ne
1771 ; CHECK-NEXT:    csel r1, r1, r9, ne
1772 ; CHECK-NEXT:    rsbs r0, r4, #0
1773 ; CHECK-NEXT:    sbcs.w r0, r10, r1
1774 ; CHECK-NEXT:    sbcs.w r0, r7, r2
1775 ; CHECK-NEXT:    sbcs.w r0, r7, r3
1776 ; CHECK-NEXT:    cset r5, lt
1777 ; CHECK-NEXT:    cmp r5, #0
1778 ; CHECK-NEXT:    csel r8, r1, r10, ne
1779 ; CHECK-NEXT:    mov r0, r12
1780 ; CHECK-NEXT:    mov r1, lr
1781 ; CHECK-NEXT:    bl __fixdfti
1782 ; CHECK-NEXT:    subs.w r6, r0, #-1
1783 ; CHECK-NEXT:    sbcs.w r6, r1, r9
1784 ; CHECK-NEXT:    sbcs r6, r2, #0
1785 ; CHECK-NEXT:    sbcs r6, r3, #0
1786 ; CHECK-NEXT:    cset r6, lt
1787 ; CHECK-NEXT:    cmp r6, #0
1788 ; CHECK-NEXT:    csel r0, r0, r7, ne
1789 ; CHECK-NEXT:    csel r1, r1, r9, ne
1790 ; CHECK-NEXT:    csel r3, r3, r6, ne
1791 ; CHECK-NEXT:    csel r2, r2, r6, ne
1792 ; CHECK-NEXT:    rsbs r6, r0, #0
1793 ; CHECK-NEXT:    sbcs.w r6, r10, r1
1794 ; CHECK-NEXT:    sbcs.w r2, r7, r2
1795 ; CHECK-NEXT:    sbcs.w r2, r7, r3
1796 ; CHECK-NEXT:    cset r2, lt
1797 ; CHECK-NEXT:    cmp r2, #0
1798 ; CHECK-NEXT:    csel r1, r1, r10, ne
1799 ; CHECK-NEXT:    cmp r5, #0
1800 ; CHECK-NEXT:    csel r3, r4, r5, ne
1801 ; CHECK-NEXT:    cmp r2, #0
1802 ; CHECK-NEXT:    csel r0, r0, r2, ne
1803 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r3
1804 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r8
1805 ; CHECK-NEXT:    vpop {d8, d9}
1806 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, pc}
1807 entry:
1808   %conv = fptosi <2 x double> %x to <2 x i128>
1809   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
1810   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
1811   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1812   ret <2 x i64> %conv6
1815 define arm_aapcs_vfpcc <2 x i64> @utest_f64i64_mm(<2 x double> %x) {
1816 ; CHECK-LABEL: utest_f64i64_mm:
1817 ; CHECK:       @ %bb.0: @ %entry
1818 ; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
1819 ; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
1820 ; CHECK-NEXT:    .pad #4
1821 ; CHECK-NEXT:    sub sp, #4
1822 ; CHECK-NEXT:    .vsave {d8, d9}
1823 ; CHECK-NEXT:    vpush {d8, d9}
1824 ; CHECK-NEXT:    vmov q4, q0
1825 ; CHECK-NEXT:    vmov r0, r1, d9
1826 ; CHECK-NEXT:    bl __fixunsdfti
1827 ; CHECK-NEXT:    mov r5, r1
1828 ; CHECK-NEXT:    vmov r4, r1, d8
1829 ; CHECK-NEXT:    subs r2, #1
1830 ; CHECK-NEXT:    sbcs r2, r3, #0
1831 ; CHECK-NEXT:    cset r6, lo
1832 ; CHECK-NEXT:    cmp r6, #0
1833 ; CHECK-NEXT:    csel r7, r0, r6, ne
1834 ; CHECK-NEXT:    mov r0, r4
1835 ; CHECK-NEXT:    bl __fixunsdfti
1836 ; CHECK-NEXT:    subs r2, #1
1837 ; CHECK-NEXT:    sbcs r2, r3, #0
1838 ; CHECK-NEXT:    cset r2, lo
1839 ; CHECK-NEXT:    cmp r2, #0
1840 ; CHECK-NEXT:    csel r0, r0, r2, ne
1841 ; CHECK-NEXT:    cmp r6, #0
1842 ; CHECK-NEXT:    csel r3, r5, r6, ne
1843 ; CHECK-NEXT:    cmp r2, #0
1844 ; CHECK-NEXT:    csel r1, r1, r2, ne
1845 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r7
1846 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r3
1847 ; CHECK-NEXT:    vpop {d8, d9}
1848 ; CHECK-NEXT:    add sp, #4
1849 ; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
1850 entry:
1851   %conv = fptoui <2 x double> %x to <2 x i128>
1852   %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
1853   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
1854   ret <2 x i64> %conv6
1857 define arm_aapcs_vfpcc <2 x i64> @ustest_f64i64_mm(<2 x double> %x) {
1858 ; CHECK-LABEL: ustest_f64i64_mm:
1859 ; CHECK:       @ %bb.0: @ %entry
1860 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, lr}
1861 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}
1862 ; CHECK-NEXT:    .vsave {d8, d9}
1863 ; CHECK-NEXT:    vpush {d8, d9}
1864 ; CHECK-NEXT:    vmov q4, q0
1865 ; CHECK-NEXT:    vmov r0, r1, d9
1866 ; CHECK-NEXT:    bl __fixdfti
1867 ; CHECK-NEXT:    mov r8, r1
1868 ; CHECK-NEXT:    vmov r4, r1, d8
1869 ; CHECK-NEXT:    subs r2, #1
1870 ; CHECK-NEXT:    sbcs r2, r3, #0
1871 ; CHECK-NEXT:    cset r7, lt
1872 ; CHECK-NEXT:    cmp r7, #0
1873 ; CHECK-NEXT:    csel r6, r0, r7, ne
1874 ; CHECK-NEXT:    csel r5, r3, r7, ne
1875 ; CHECK-NEXT:    cmp r5, #0
1876 ; CHECK-NEXT:    it mi
1877 ; CHECK-NEXT:    movmi r6, #0
1878 ; CHECK-NEXT:    mov r0, r4
1879 ; CHECK-NEXT:    bl __fixdfti
1880 ; CHECK-NEXT:    subs r2, #1
1881 ; CHECK-NEXT:    sbcs r2, r3, #0
1882 ; CHECK-NEXT:    cset r2, lt
1883 ; CHECK-NEXT:    cmp r2, #0
1884 ; CHECK-NEXT:    csel r3, r3, r2, ne
1885 ; CHECK-NEXT:    csel r0, r0, r2, ne
1886 ; CHECK-NEXT:    cmp r3, #0
1887 ; CHECK-NEXT:    it mi
1888 ; CHECK-NEXT:    movmi r0, #0
1889 ; CHECK-NEXT:    cmp r7, #0
1890 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r6
1891 ; CHECK-NEXT:    csel r7, r8, r7, ne
1892 ; CHECK-NEXT:    cmp r5, #0
1893 ; CHECK-NEXT:    it mi
1894 ; CHECK-NEXT:    movmi r7, #0
1895 ; CHECK-NEXT:    cmp r2, #0
1896 ; CHECK-NEXT:    csel r1, r1, r2, ne
1897 ; CHECK-NEXT:    cmp r3, #0
1898 ; CHECK-NEXT:    it mi
1899 ; CHECK-NEXT:    movmi r1, #0
1900 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r7
1901 ; CHECK-NEXT:    vpop {d8, d9}
1902 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}
1903 entry:
1904   %conv = fptosi <2 x double> %x to <2 x i128>
1905   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
1906   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
1907   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1908   ret <2 x i64> %conv6
1911 define arm_aapcs_vfpcc <2 x i64> @stest_f32i64_mm(<2 x float> %x) {
1912 ; CHECK-LABEL: stest_f32i64_mm:
1913 ; CHECK:       @ %bb.0: @ %entry
1914 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
1915 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, r9, r10, r11, lr}
1916 ; CHECK-NEXT:    .pad #4
1917 ; CHECK-NEXT:    sub sp, #4
1918 ; CHECK-NEXT:    vmov r9, r0, d0
1919 ; CHECK-NEXT:    bl __fixsfti
1920 ; CHECK-NEXT:    subs.w r7, r0, #-1
1921 ; CHECK-NEXT:    mvn r10, #-2147483648
1922 ; CHECK-NEXT:    sbcs.w r7, r1, r10
1923 ; CHECK-NEXT:    mov.w r4, #-1
1924 ; CHECK-NEXT:    sbcs r7, r2, #0
1925 ; CHECK-NEXT:    mov.w r11, #-2147483648
1926 ; CHECK-NEXT:    sbcs r7, r3, #0
1927 ; CHECK-NEXT:    cset r7, lt
1928 ; CHECK-NEXT:    cmp r7, #0
1929 ; CHECK-NEXT:    csel r5, r0, r4, ne
1930 ; CHECK-NEXT:    csel r3, r3, r7, ne
1931 ; CHECK-NEXT:    csel r2, r2, r7, ne
1932 ; CHECK-NEXT:    csel r1, r1, r10, ne
1933 ; CHECK-NEXT:    rsbs r0, r5, #0
1934 ; CHECK-NEXT:    sbcs.w r0, r11, r1
1935 ; CHECK-NEXT:    sbcs.w r0, r4, r2
1936 ; CHECK-NEXT:    sbcs.w r0, r4, r3
1937 ; CHECK-NEXT:    cset r6, lt
1938 ; CHECK-NEXT:    mov r0, r9
1939 ; CHECK-NEXT:    cmp r6, #0
1940 ; CHECK-NEXT:    csel r8, r1, r11, ne
1941 ; CHECK-NEXT:    bl __fixsfti
1942 ; CHECK-NEXT:    subs.w r7, r0, #-1
1943 ; CHECK-NEXT:    sbcs.w r7, r1, r10
1944 ; CHECK-NEXT:    sbcs r7, r2, #0
1945 ; CHECK-NEXT:    sbcs r7, r3, #0
1946 ; CHECK-NEXT:    cset r7, lt
1947 ; CHECK-NEXT:    cmp r7, #0
1948 ; CHECK-NEXT:    csel r0, r0, r4, ne
1949 ; CHECK-NEXT:    csel r1, r1, r10, ne
1950 ; CHECK-NEXT:    csel r3, r3, r7, ne
1951 ; CHECK-NEXT:    csel r2, r2, r7, ne
1952 ; CHECK-NEXT:    rsbs r7, r0, #0
1953 ; CHECK-NEXT:    sbcs.w r7, r11, r1
1954 ; CHECK-NEXT:    sbcs.w r2, r4, r2
1955 ; CHECK-NEXT:    sbcs.w r2, r4, r3
1956 ; CHECK-NEXT:    cset r2, lt
1957 ; CHECK-NEXT:    cmp r2, #0
1958 ; CHECK-NEXT:    csel r1, r1, r11, ne
1959 ; CHECK-NEXT:    cmp r6, #0
1960 ; CHECK-NEXT:    csel r3, r5, r6, ne
1961 ; CHECK-NEXT:    cmp r2, #0
1962 ; CHECK-NEXT:    csel r0, r0, r2, ne
1963 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r3
1964 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r8
1965 ; CHECK-NEXT:    add sp, #4
1966 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, r9, r10, r11, pc}
1967 entry:
1968   %conv = fptosi <2 x float> %x to <2 x i128>
1969   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
1970   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
1971   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
1972   ret <2 x i64> %conv6
1975 define arm_aapcs_vfpcc <2 x i64> @utest_f32i64_mm(<2 x float> %x) {
1976 ; CHECK-LABEL: utest_f32i64_mm:
1977 ; CHECK:       @ %bb.0: @ %entry
1978 ; CHECK-NEXT:    .save {r4, r5, r6, r7, lr}
1979 ; CHECK-NEXT:    push {r4, r5, r6, r7, lr}
1980 ; CHECK-NEXT:    .pad #4
1981 ; CHECK-NEXT:    sub sp, #4
1982 ; CHECK-NEXT:    vmov r4, r0, d0
1983 ; CHECK-NEXT:    bl __fixunssfti
1984 ; CHECK-NEXT:    mov r5, r1
1985 ; CHECK-NEXT:    subs r1, r2, #1
1986 ; CHECK-NEXT:    sbcs r1, r3, #0
1987 ; CHECK-NEXT:    cset r6, lo
1988 ; CHECK-NEXT:    cmp r6, #0
1989 ; CHECK-NEXT:    csel r7, r0, r6, ne
1990 ; CHECK-NEXT:    mov r0, r4
1991 ; CHECK-NEXT:    bl __fixunssfti
1992 ; CHECK-NEXT:    subs r2, #1
1993 ; CHECK-NEXT:    sbcs r2, r3, #0
1994 ; CHECK-NEXT:    cset r2, lo
1995 ; CHECK-NEXT:    cmp r2, #0
1996 ; CHECK-NEXT:    csel r0, r0, r2, ne
1997 ; CHECK-NEXT:    cmp r6, #0
1998 ; CHECK-NEXT:    csel r3, r5, r6, ne
1999 ; CHECK-NEXT:    cmp r2, #0
2000 ; CHECK-NEXT:    csel r1, r1, r2, ne
2001 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r7
2002 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r3
2003 ; CHECK-NEXT:    add sp, #4
2004 ; CHECK-NEXT:    pop {r4, r5, r6, r7, pc}
2005 entry:
2006   %conv = fptoui <2 x float> %x to <2 x i128>
2007   %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2008   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
2009   ret <2 x i64> %conv6
2012 define arm_aapcs_vfpcc <2 x i64> @ustest_f32i64_mm(<2 x float> %x) {
2013 ; CHECK-LABEL: ustest_f32i64_mm:
2014 ; CHECK:       @ %bb.0: @ %entry
2015 ; CHECK-NEXT:    .save {r4, r5, r6, r7, r8, lr}
2016 ; CHECK-NEXT:    push.w {r4, r5, r6, r7, r8, lr}
2017 ; CHECK-NEXT:    vmov r5, r0, d0
2018 ; CHECK-NEXT:    bl __fixsfti
2019 ; CHECK-NEXT:    mov r8, r1
2020 ; CHECK-NEXT:    subs r1, r2, #1
2021 ; CHECK-NEXT:    sbcs r1, r3, #0
2022 ; CHECK-NEXT:    cset r7, lt
2023 ; CHECK-NEXT:    cmp r7, #0
2024 ; CHECK-NEXT:    csel r6, r0, r7, ne
2025 ; CHECK-NEXT:    csel r4, r3, r7, ne
2026 ; CHECK-NEXT:    mov r0, r5
2027 ; CHECK-NEXT:    cmp r4, #0
2028 ; CHECK-NEXT:    it mi
2029 ; CHECK-NEXT:    movmi r6, #0
2030 ; CHECK-NEXT:    bl __fixsfti
2031 ; CHECK-NEXT:    subs r2, #1
2032 ; CHECK-NEXT:    sbcs r2, r3, #0
2033 ; CHECK-NEXT:    cset r2, lt
2034 ; CHECK-NEXT:    cmp r2, #0
2035 ; CHECK-NEXT:    csel r3, r3, r2, ne
2036 ; CHECK-NEXT:    csel r0, r0, r2, ne
2037 ; CHECK-NEXT:    cmp r3, #0
2038 ; CHECK-NEXT:    it mi
2039 ; CHECK-NEXT:    movmi r0, #0
2040 ; CHECK-NEXT:    cmp r7, #0
2041 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r6
2042 ; CHECK-NEXT:    csel r7, r8, r7, ne
2043 ; CHECK-NEXT:    cmp r4, #0
2044 ; CHECK-NEXT:    it mi
2045 ; CHECK-NEXT:    movmi r7, #0
2046 ; CHECK-NEXT:    cmp r2, #0
2047 ; CHECK-NEXT:    csel r1, r1, r2, ne
2048 ; CHECK-NEXT:    cmp r3, #0
2049 ; CHECK-NEXT:    it mi
2050 ; CHECK-NEXT:    movmi r1, #0
2051 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r7
2052 ; CHECK-NEXT:    pop.w {r4, r5, r6, r7, r8, pc}
2053 entry:
2054   %conv = fptosi <2 x float> %x to <2 x i128>
2055   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2056   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
2057   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2058   ret <2 x i64> %conv6
2061 define arm_aapcs_vfpcc <2 x i64> @stest_f16i64_mm(<2 x half> %x) {
2062 ; CHECK-LABEL: stest_f16i64_mm:
2063 ; CHECK:       @ %bb.0: @ %entry
2064 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
2065 ; CHECK-NEXT:    push {r4, r5, r7, lr}
2066 ; CHECK-NEXT:    .vsave {d8, d9}
2067 ; CHECK-NEXT:    vpush {d8, d9}
2068 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
2069 ; CHECK-NEXT:    vmov q4, q0
2070 ; CHECK-NEXT:    bl __fixhfti
2071 ; CHECK-NEXT:    mov r4, r0
2072 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
2073 ; CHECK-NEXT:    mov r5, r1
2074 ; CHECK-NEXT:    bl __fixhfti
2075 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
2076 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
2077 ; CHECK-NEXT:    vpop {d8, d9}
2078 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
2079 entry:
2080   %conv = fptosi <2 x half> %x to <2 x i128>
2081   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 9223372036854775807, i128 9223372036854775807>)
2082   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> <i128 -9223372036854775808, i128 -9223372036854775808>)
2083   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2084   ret <2 x i64> %conv6
2087 define arm_aapcs_vfpcc <2 x i64> @utesth_f16i64_mm(<2 x half> %x) {
2088 ; CHECK-LABEL: utesth_f16i64_mm:
2089 ; CHECK:       @ %bb.0: @ %entry
2090 ; CHECK-NEXT:    .save {r4, r5, r7, lr}
2091 ; CHECK-NEXT:    push {r4, r5, r7, lr}
2092 ; CHECK-NEXT:    .vsave {d8, d9}
2093 ; CHECK-NEXT:    vpush {d8, d9}
2094 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
2095 ; CHECK-NEXT:    vmov q4, q0
2096 ; CHECK-NEXT:    bl __fixunshfti
2097 ; CHECK-NEXT:    mov r4, r0
2098 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
2099 ; CHECK-NEXT:    mov r5, r1
2100 ; CHECK-NEXT:    bl __fixunshfti
2101 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
2102 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
2103 ; CHECK-NEXT:    vpop {d8, d9}
2104 ; CHECK-NEXT:    pop {r4, r5, r7, pc}
2105 entry:
2106   %conv = fptoui <2 x half> %x to <2 x i128>
2107   %spec.store.select = call <2 x i128> @llvm.umin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2108   %conv6 = trunc <2 x i128> %spec.store.select to <2 x i64>
2109   ret <2 x i64> %conv6
2112 define arm_aapcs_vfpcc <2 x i64> @ustest_f16i64_mm(<2 x half> %x) {
2113 ; CHECK-LABEL: ustest_f16i64_mm:
2114 ; CHECK:       @ %bb.0: @ %entry
2115 ; CHECK-NEXT:    .save {r4, r5, r6, lr}
2116 ; CHECK-NEXT:    push {r4, r5, r6, lr}
2117 ; CHECK-NEXT:    .vsave {d8, d9}
2118 ; CHECK-NEXT:    vpush {d8, d9}
2119 ; CHECK-NEXT:    vmov.u16 r0, q0[1]
2120 ; CHECK-NEXT:    vmov q4, q0
2121 ; CHECK-NEXT:    bl __fixhfti
2122 ; CHECK-NEXT:    mov r4, r0
2123 ; CHECK-NEXT:    vmov.u16 r0, q4[0]
2124 ; CHECK-NEXT:    mov r5, r1
2125 ; CHECK-NEXT:    mov r6, r3
2126 ; CHECK-NEXT:    bl __fixhfti
2127 ; CHECK-NEXT:    cmp r6, #0
2128 ; CHECK-NEXT:    it mi
2129 ; CHECK-NEXT:    movmi r4, #0
2130 ; CHECK-NEXT:    cmp r3, #0
2131 ; CHECK-NEXT:    it mi
2132 ; CHECK-NEXT:    movmi r0, #0
2133 ; CHECK-NEXT:    cmp r6, #0
2134 ; CHECK-NEXT:    vmov q0[2], q0[0], r0, r4
2135 ; CHECK-NEXT:    it mi
2136 ; CHECK-NEXT:    movmi r5, #0
2137 ; CHECK-NEXT:    cmp r3, #0
2138 ; CHECK-NEXT:    it mi
2139 ; CHECK-NEXT:    movmi r1, #0
2140 ; CHECK-NEXT:    vmov q0[3], q0[1], r1, r5
2141 ; CHECK-NEXT:    vpop {d8, d9}
2142 ; CHECK-NEXT:    pop {r4, r5, r6, pc}
2143 entry:
2144   %conv = fptosi <2 x half> %x to <2 x i128>
2145   %spec.store.select = call <2 x i128> @llvm.smin.v2i128(<2 x i128> %conv, <2 x i128> <i128 18446744073709551616, i128 18446744073709551616>)
2146   %spec.store.select7 = call <2 x i128> @llvm.smax.v2i128(<2 x i128> %spec.store.select, <2 x i128> zeroinitializer)
2147   %conv6 = trunc <2 x i128> %spec.store.select7 to <2 x i64>
2148   ret <2 x i64> %conv6
2151 declare <2 x i32> @llvm.smin.v2i32(<2 x i32>, <2 x i32>)
2152 declare <2 x i32> @llvm.smax.v2i32(<2 x i32>, <2 x i32>)
2153 declare <2 x i32> @llvm.umin.v2i32(<2 x i32>, <2 x i32>)
2154 declare <4 x i32> @llvm.smin.v4i32(<4 x i32>, <4 x i32>)
2155 declare <4 x i32> @llvm.smax.v4i32(<4 x i32>, <4 x i32>)
2156 declare <4 x i32> @llvm.umin.v4i32(<4 x i32>, <4 x i32>)
2157 declare <8 x i32> @llvm.smin.v8i32(<8 x i32>, <8 x i32>)
2158 declare <8 x i32> @llvm.smax.v8i32(<8 x i32>, <8 x i32>)
2159 declare <8 x i32> @llvm.umin.v8i32(<8 x i32>, <8 x i32>)
2160 declare <2 x i64> @llvm.smin.v2i64(<2 x i64>, <2 x i64>)
2161 declare <2 x i64> @llvm.smax.v2i64(<2 x i64>, <2 x i64>)
2162 declare <2 x i64> @llvm.umin.v2i64(<2 x i64>, <2 x i64>)
2163 declare <4 x i64> @llvm.smin.v4i64(<4 x i64>, <4 x i64>)
2164 declare <4 x i64> @llvm.smax.v4i64(<4 x i64>, <4 x i64>)
2165 declare <4 x i64> @llvm.umin.v4i64(<4 x i64>, <4 x i64>)
2166 declare <2 x i128> @llvm.smin.v2i128(<2 x i128>, <2 x i128>)
2167 declare <2 x i128> @llvm.smax.v2i128(<2 x i128>, <2 x i128>)
2168 declare <2 x i128> @llvm.umin.v2i128(<2 x i128>, <2 x i128>)