[InstCombine] Signed saturation patterns
[llvm-core.git] / test / CodeGen / Thumb2 / mve-masked-store.ll
blob1fc9793fd50d478891603feed96273abb818d1f3
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-arm-none-eabi -mattr=+mve,+fullfp16 -enable-arm-maskedldst -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-LE
3 ; RUN: llc -mtriple=thumbebv8.1m.main-arm-none-eabi -mattr=+mve,+fullfp16 -enable-arm-maskedldst -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-BE
5 define arm_aapcs_vfpcc void @masked_v4i32(<4 x i32> *%dest, <4 x i32> %a) {
6 ; CHECK-LE-LABEL: masked_v4i32:
7 ; CHECK-LE:       @ %bb.0: @ %entry
8 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
9 ; CHECK-LE-NEXT:    vstrwt.32 q0, [r0]
10 ; CHECK-LE-NEXT:    bx lr
12 ; CHECK-BE-LABEL: masked_v4i32:
13 ; CHECK-BE:       @ %bb.0: @ %entry
14 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
15 ; CHECK-BE-NEXT:    vpt.s32 gt, q1, zr
16 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0]
17 ; CHECK-BE-NEXT:    bx lr
18 entry:
19   %c = icmp sgt <4 x i32> %a, zeroinitializer
20   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %a, <4 x i32>* %dest, i32 4, <4 x i1> %c)
21   ret void
24 define arm_aapcs_vfpcc void @masked_v4i32_align1(<4 x i32> *%dest, <4 x i32> %a) {
25 ; CHECK-LE-LABEL: masked_v4i32_align1:
26 ; CHECK-LE:       @ %bb.0: @ %entry
27 ; CHECK-LE-NEXT:    .pad #4
28 ; CHECK-LE-NEXT:    sub sp, #4
29 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
30 ; CHECK-LE-NEXT:    vmrs r2, p0
31 ; CHECK-LE-NEXT:    and r1, r2, #1
32 ; CHECK-LE-NEXT:    rsbs r3, r1, #0
33 ; CHECK-LE-NEXT:    movs r1, #0
34 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
35 ; CHECK-LE-NEXT:    ubfx r3, r2, #4, #1
36 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
37 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
38 ; CHECK-LE-NEXT:    ubfx r3, r2, #8, #1
39 ; CHECK-LE-NEXT:    ubfx r2, r2, #12, #1
40 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
41 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
42 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
43 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
44 ; CHECK-LE-NEXT:    lsls r2, r1, #31
45 ; CHECK-LE-NEXT:    itt ne
46 ; CHECK-LE-NEXT:    vmovne r2, s0
47 ; CHECK-LE-NEXT:    strne r2, [r0]
48 ; CHECK-LE-NEXT:    lsls r2, r1, #30
49 ; CHECK-LE-NEXT:    itt mi
50 ; CHECK-LE-NEXT:    vmovmi r2, s1
51 ; CHECK-LE-NEXT:    strmi r2, [r0, #4]
52 ; CHECK-LE-NEXT:    lsls r2, r1, #29
53 ; CHECK-LE-NEXT:    itt mi
54 ; CHECK-LE-NEXT:    vmovmi r2, s2
55 ; CHECK-LE-NEXT:    strmi r2, [r0, #8]
56 ; CHECK-LE-NEXT:    lsls r1, r1, #28
57 ; CHECK-LE-NEXT:    itt mi
58 ; CHECK-LE-NEXT:    vmovmi r1, s3
59 ; CHECK-LE-NEXT:    strmi r1, [r0, #12]
60 ; CHECK-LE-NEXT:    add sp, #4
61 ; CHECK-LE-NEXT:    bx lr
63 ; CHECK-BE-LABEL: masked_v4i32_align1:
64 ; CHECK-BE:       @ %bb.0: @ %entry
65 ; CHECK-BE-NEXT:    .pad #4
66 ; CHECK-BE-NEXT:    sub sp, #4
67 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
68 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
69 ; CHECK-BE-NEXT:    vmrs r2, p0
70 ; CHECK-BE-NEXT:    and r1, r2, #1
71 ; CHECK-BE-NEXT:    rsbs r3, r1, #0
72 ; CHECK-BE-NEXT:    movs r1, #0
73 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
74 ; CHECK-BE-NEXT:    ubfx r3, r2, #4, #1
75 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
76 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
77 ; CHECK-BE-NEXT:    ubfx r3, r2, #8, #1
78 ; CHECK-BE-NEXT:    ubfx r2, r2, #12, #1
79 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
80 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
81 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
82 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
83 ; CHECK-BE-NEXT:    lsls r2, r1, #31
84 ; CHECK-BE-NEXT:    itt ne
85 ; CHECK-BE-NEXT:    vmovne r2, s4
86 ; CHECK-BE-NEXT:    strne r2, [r0]
87 ; CHECK-BE-NEXT:    lsls r2, r1, #30
88 ; CHECK-BE-NEXT:    itt mi
89 ; CHECK-BE-NEXT:    vmovmi r2, s5
90 ; CHECK-BE-NEXT:    strmi r2, [r0, #4]
91 ; CHECK-BE-NEXT:    lsls r2, r1, #29
92 ; CHECK-BE-NEXT:    itt mi
93 ; CHECK-BE-NEXT:    vmovmi r2, s6
94 ; CHECK-BE-NEXT:    strmi r2, [r0, #8]
95 ; CHECK-BE-NEXT:    lsls r1, r1, #28
96 ; CHECK-BE-NEXT:    itt mi
97 ; CHECK-BE-NEXT:    vmovmi r1, s7
98 ; CHECK-BE-NEXT:    strmi r1, [r0, #12]
99 ; CHECK-BE-NEXT:    add sp, #4
100 ; CHECK-BE-NEXT:    bx lr
101 entry:
102   %c = icmp sgt <4 x i32> %a, zeroinitializer
103   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %a, <4 x i32>* %dest, i32 1, <4 x i1> %c)
104   ret void
107 define i8* @masked_v4i32_pre(i8* %y, i8* %x, <4 x i32> %a) {
108 ; CHECK-LE-LABEL: masked_v4i32_pre:
109 ; CHECK-LE:       @ %bb.0: @ %entry
110 ; CHECK-LE-NEXT:    vldr d1, [sp]
111 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
112 ; CHECK-LE-NEXT:    vmov d0, r2, r3
113 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
114 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0, #4]
115 ; CHECK-LE-NEXT:    adds r0, #4
116 ; CHECK-LE-NEXT:    bx lr
118 ; CHECK-BE-LABEL: masked_v4i32_pre:
119 ; CHECK-BE:       @ %bb.0: @ %entry
120 ; CHECK-BE-NEXT:    vldr d1, [sp]
121 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
122 ; CHECK-BE-NEXT:    vmov d0, r3, r2
123 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
124 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
125 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0, #4]
126 ; CHECK-BE-NEXT:    adds r0, #4
127 ; CHECK-BE-NEXT:    bx lr
128 entry:
129   %z = getelementptr inbounds i8, i8* %y, i32 4
130   %0 = bitcast i8* %x to <4 x i32>*
131   %1 = load <4 x i32>, <4 x i32>* %0, align 4
132   %2 = bitcast i8* %z to <4 x i32>*
133   %c = icmp sgt <4 x i32> %a, zeroinitializer
134   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %1, <4 x i32>* %2, i32 4, <4 x i1> %c)
135   ret i8* %z
138 define i8* @masked_v4i32_post(i8* %y, i8* %x, <4 x i32> %a) {
139 ; CHECK-LE-LABEL: masked_v4i32_post:
140 ; CHECK-LE:       @ %bb.0: @ %entry
141 ; CHECK-LE-NEXT:    vldr d1, [sp]
142 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
143 ; CHECK-LE-NEXT:    vmov d0, r2, r3
144 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
145 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0]
146 ; CHECK-LE-NEXT:    adds r0, #4
147 ; CHECK-LE-NEXT:    bx lr
149 ; CHECK-BE-LABEL: masked_v4i32_post:
150 ; CHECK-BE:       @ %bb.0: @ %entry
151 ; CHECK-BE-NEXT:    vldr d1, [sp]
152 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
153 ; CHECK-BE-NEXT:    vmov d0, r3, r2
154 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
155 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
156 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0]
157 ; CHECK-BE-NEXT:    adds r0, #4
158 ; CHECK-BE-NEXT:    bx lr
159 entry:
160   %z = getelementptr inbounds i8, i8* %y, i32 4
161   %0 = bitcast i8* %x to <4 x i32>*
162   %1 = load <4 x i32>, <4 x i32>* %0, align 4
163   %2 = bitcast i8* %y to <4 x i32>*
164   %c = icmp sgt <4 x i32> %a, zeroinitializer
165   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %1, <4 x i32>* %2, i32 4, <4 x i1> %c)
166   ret i8* %z
170 define arm_aapcs_vfpcc void @masked_v8i16(<8 x i16> *%dest, <8 x i16> %a) {
171 ; CHECK-LE-LABEL: masked_v8i16:
172 ; CHECK-LE:       @ %bb.0: @ %entry
173 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
174 ; CHECK-LE-NEXT:    vstrht.16 q0, [r0]
175 ; CHECK-LE-NEXT:    bx lr
177 ; CHECK-BE-LABEL: masked_v8i16:
178 ; CHECK-BE:       @ %bb.0: @ %entry
179 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
180 ; CHECK-BE-NEXT:    vpt.s16 gt, q1, zr
181 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0]
182 ; CHECK-BE-NEXT:    bx lr
183 entry:
184   %c = icmp sgt <8 x i16> %a, zeroinitializer
185   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %a, <8 x i16>* %dest, i32 2, <8 x i1> %c)
186   ret void
189 define arm_aapcs_vfpcc void @masked_v8i16_align1(<8 x i16> *%dest, <8 x i16> %a) {
190 ; CHECK-LE-LABEL: masked_v8i16_align1:
191 ; CHECK-LE:       @ %bb.0: @ %entry
192 ; CHECK-LE-NEXT:    .pad #8
193 ; CHECK-LE-NEXT:    sub sp, #8
194 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
195 ; CHECK-LE-NEXT:    vmrs r1, p0
196 ; CHECK-LE-NEXT:    and r2, r1, #1
197 ; CHECK-LE-NEXT:    rsbs r3, r2, #0
198 ; CHECK-LE-NEXT:    movs r2, #0
199 ; CHECK-LE-NEXT:    bfi r2, r3, #0, #1
200 ; CHECK-LE-NEXT:    ubfx r3, r1, #2, #1
201 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
202 ; CHECK-LE-NEXT:    bfi r2, r3, #1, #1
203 ; CHECK-LE-NEXT:    ubfx r3, r1, #4, #1
204 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
205 ; CHECK-LE-NEXT:    bfi r2, r3, #2, #1
206 ; CHECK-LE-NEXT:    ubfx r3, r1, #6, #1
207 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
208 ; CHECK-LE-NEXT:    bfi r2, r3, #3, #1
209 ; CHECK-LE-NEXT:    ubfx r3, r1, #8, #1
210 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
211 ; CHECK-LE-NEXT:    bfi r2, r3, #4, #1
212 ; CHECK-LE-NEXT:    ubfx r3, r1, #10, #1
213 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
214 ; CHECK-LE-NEXT:    bfi r2, r3, #5, #1
215 ; CHECK-LE-NEXT:    ubfx r3, r1, #12, #1
216 ; CHECK-LE-NEXT:    ubfx r1, r1, #14, #1
217 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
218 ; CHECK-LE-NEXT:    bfi r2, r3, #6, #1
219 ; CHECK-LE-NEXT:    rsbs r1, r1, #0
220 ; CHECK-LE-NEXT:    bfi r2, r1, #7, #1
221 ; CHECK-LE-NEXT:    uxtb r1, r2
222 ; CHECK-LE-NEXT:    lsls r2, r2, #31
223 ; CHECK-LE-NEXT:    itt ne
224 ; CHECK-LE-NEXT:    vmovne.u16 r2, q0[0]
225 ; CHECK-LE-NEXT:    strhne r2, [r0]
226 ; CHECK-LE-NEXT:    lsls r2, r1, #30
227 ; CHECK-LE-NEXT:    itt mi
228 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[1]
229 ; CHECK-LE-NEXT:    strhmi r2, [r0, #2]
230 ; CHECK-LE-NEXT:    lsls r2, r1, #29
231 ; CHECK-LE-NEXT:    itt mi
232 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[2]
233 ; CHECK-LE-NEXT:    strhmi r2, [r0, #4]
234 ; CHECK-LE-NEXT:    lsls r2, r1, #28
235 ; CHECK-LE-NEXT:    itt mi
236 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[3]
237 ; CHECK-LE-NEXT:    strhmi r2, [r0, #6]
238 ; CHECK-LE-NEXT:    lsls r2, r1, #27
239 ; CHECK-LE-NEXT:    itt mi
240 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[4]
241 ; CHECK-LE-NEXT:    strhmi r2, [r0, #8]
242 ; CHECK-LE-NEXT:    lsls r2, r1, #26
243 ; CHECK-LE-NEXT:    itt mi
244 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[5]
245 ; CHECK-LE-NEXT:    strhmi r2, [r0, #10]
246 ; CHECK-LE-NEXT:    lsls r2, r1, #25
247 ; CHECK-LE-NEXT:    itt mi
248 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[6]
249 ; CHECK-LE-NEXT:    strhmi r2, [r0, #12]
250 ; CHECK-LE-NEXT:    lsls r1, r1, #24
251 ; CHECK-LE-NEXT:    itt mi
252 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[7]
253 ; CHECK-LE-NEXT:    strhmi r1, [r0, #14]
254 ; CHECK-LE-NEXT:    add sp, #8
255 ; CHECK-LE-NEXT:    bx lr
257 ; CHECK-BE-LABEL: masked_v8i16_align1:
258 ; CHECK-BE:       @ %bb.0: @ %entry
259 ; CHECK-BE-NEXT:    .pad #8
260 ; CHECK-BE-NEXT:    sub sp, #8
261 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
262 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
263 ; CHECK-BE-NEXT:    vmrs r1, p0
264 ; CHECK-BE-NEXT:    and r2, r1, #1
265 ; CHECK-BE-NEXT:    rsbs r3, r2, #0
266 ; CHECK-BE-NEXT:    movs r2, #0
267 ; CHECK-BE-NEXT:    bfi r2, r3, #0, #1
268 ; CHECK-BE-NEXT:    ubfx r3, r1, #2, #1
269 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
270 ; CHECK-BE-NEXT:    bfi r2, r3, #1, #1
271 ; CHECK-BE-NEXT:    ubfx r3, r1, #4, #1
272 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
273 ; CHECK-BE-NEXT:    bfi r2, r3, #2, #1
274 ; CHECK-BE-NEXT:    ubfx r3, r1, #6, #1
275 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
276 ; CHECK-BE-NEXT:    bfi r2, r3, #3, #1
277 ; CHECK-BE-NEXT:    ubfx r3, r1, #8, #1
278 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
279 ; CHECK-BE-NEXT:    bfi r2, r3, #4, #1
280 ; CHECK-BE-NEXT:    ubfx r3, r1, #10, #1
281 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
282 ; CHECK-BE-NEXT:    bfi r2, r3, #5, #1
283 ; CHECK-BE-NEXT:    ubfx r3, r1, #12, #1
284 ; CHECK-BE-NEXT:    ubfx r1, r1, #14, #1
285 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
286 ; CHECK-BE-NEXT:    bfi r2, r3, #6, #1
287 ; CHECK-BE-NEXT:    rsbs r1, r1, #0
288 ; CHECK-BE-NEXT:    bfi r2, r1, #7, #1
289 ; CHECK-BE-NEXT:    uxtb r1, r2
290 ; CHECK-BE-NEXT:    lsls r2, r2, #31
291 ; CHECK-BE-NEXT:    itt ne
292 ; CHECK-BE-NEXT:    vmovne.u16 r2, q1[0]
293 ; CHECK-BE-NEXT:    strhne r2, [r0]
294 ; CHECK-BE-NEXT:    lsls r2, r1, #30
295 ; CHECK-BE-NEXT:    itt mi
296 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[1]
297 ; CHECK-BE-NEXT:    strhmi r2, [r0, #2]
298 ; CHECK-BE-NEXT:    lsls r2, r1, #29
299 ; CHECK-BE-NEXT:    itt mi
300 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[2]
301 ; CHECK-BE-NEXT:    strhmi r2, [r0, #4]
302 ; CHECK-BE-NEXT:    lsls r2, r1, #28
303 ; CHECK-BE-NEXT:    itt mi
304 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[3]
305 ; CHECK-BE-NEXT:    strhmi r2, [r0, #6]
306 ; CHECK-BE-NEXT:    lsls r2, r1, #27
307 ; CHECK-BE-NEXT:    itt mi
308 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[4]
309 ; CHECK-BE-NEXT:    strhmi r2, [r0, #8]
310 ; CHECK-BE-NEXT:    lsls r2, r1, #26
311 ; CHECK-BE-NEXT:    itt mi
312 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[5]
313 ; CHECK-BE-NEXT:    strhmi r2, [r0, #10]
314 ; CHECK-BE-NEXT:    lsls r2, r1, #25
315 ; CHECK-BE-NEXT:    itt mi
316 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[6]
317 ; CHECK-BE-NEXT:    strhmi r2, [r0, #12]
318 ; CHECK-BE-NEXT:    lsls r1, r1, #24
319 ; CHECK-BE-NEXT:    itt mi
320 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q1[7]
321 ; CHECK-BE-NEXT:    strhmi r1, [r0, #14]
322 ; CHECK-BE-NEXT:    add sp, #8
323 ; CHECK-BE-NEXT:    bx lr
324 entry:
325   %c = icmp sgt <8 x i16> %a, zeroinitializer
326   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %a, <8 x i16>* %dest, i32 1, <8 x i1> %c)
327   ret void
330 define i8* @masked_v8i16_pre(i8* %y, i8* %x, <8 x i16> %a) {
331 ; CHECK-LE-LABEL: masked_v8i16_pre:
332 ; CHECK-LE:       @ %bb.0: @ %entry
333 ; CHECK-LE-NEXT:    vldr d1, [sp]
334 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
335 ; CHECK-LE-NEXT:    vmov d0, r2, r3
336 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
337 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0, #4]
338 ; CHECK-LE-NEXT:    adds r0, #4
339 ; CHECK-LE-NEXT:    bx lr
341 ; CHECK-BE-LABEL: masked_v8i16_pre:
342 ; CHECK-BE:       @ %bb.0: @ %entry
343 ; CHECK-BE-NEXT:    vldr d1, [sp]
344 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
345 ; CHECK-BE-NEXT:    vmov d0, r3, r2
346 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
347 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
348 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0, #4]
349 ; CHECK-BE-NEXT:    adds r0, #4
350 ; CHECK-BE-NEXT:    bx lr
351 entry:
352   %z = getelementptr inbounds i8, i8* %y, i32 4
353   %0 = bitcast i8* %x to <8 x i16>*
354   %1 = load <8 x i16>, <8 x i16>* %0, align 4
355   %2 = bitcast i8* %z to <8 x i16>*
356   %c = icmp sgt <8 x i16> %a, zeroinitializer
357   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %1, <8 x i16>* %2, i32 2, <8 x i1> %c)
358   ret i8* %z
361 define i8* @masked_v8i16_post(i8* %y, i8* %x, <8 x i16> %a) {
362 ; CHECK-LE-LABEL: masked_v8i16_post:
363 ; CHECK-LE:       @ %bb.0: @ %entry
364 ; CHECK-LE-NEXT:    vldr d1, [sp]
365 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
366 ; CHECK-LE-NEXT:    vmov d0, r2, r3
367 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
368 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0]
369 ; CHECK-LE-NEXT:    adds r0, #4
370 ; CHECK-LE-NEXT:    bx lr
372 ; CHECK-BE-LABEL: masked_v8i16_post:
373 ; CHECK-BE:       @ %bb.0: @ %entry
374 ; CHECK-BE-NEXT:    vldr d1, [sp]
375 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
376 ; CHECK-BE-NEXT:    vmov d0, r3, r2
377 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
378 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
379 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0]
380 ; CHECK-BE-NEXT:    adds r0, #4
381 ; CHECK-BE-NEXT:    bx lr
382 entry:
383   %z = getelementptr inbounds i8, i8* %y, i32 4
384   %0 = bitcast i8* %x to <8 x i16>*
385   %1 = load <8 x i16>, <8 x i16>* %0, align 4
386   %2 = bitcast i8* %y to <8 x i16>*
387   %c = icmp sgt <8 x i16> %a, zeroinitializer
388   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %1, <8 x i16>* %2, i32 2, <8 x i1> %c)
389   ret i8* %z
393 define arm_aapcs_vfpcc void @masked_v16i8(<16 x i8> *%dest, <16 x i8> %a) {
394 ; CHECK-LE-LABEL: masked_v16i8:
395 ; CHECK-LE:       @ %bb.0: @ %entry
396 ; CHECK-LE-NEXT:    vpt.s8 gt, q0, zr
397 ; CHECK-LE-NEXT:    vstrbt.8 q0, [r0]
398 ; CHECK-LE-NEXT:    bx lr
400 ; CHECK-BE-LABEL: masked_v16i8:
401 ; CHECK-BE:       @ %bb.0: @ %entry
402 ; CHECK-BE-NEXT:    vrev64.8 q1, q0
403 ; CHECK-BE-NEXT:    vpt.s8 gt, q1, zr
404 ; CHECK-BE-NEXT:    vstrbt.8 q1, [r0]
405 ; CHECK-BE-NEXT:    bx lr
406 entry:
407   %c = icmp sgt <16 x i8> %a, zeroinitializer
408   call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %a, <16 x i8>* %dest, i32 1, <16 x i1> %c)
409   ret void
412 define i8* @masked_v16i8_pre(i8* %y, i8* %x, <16 x i8> %a) {
413 ; CHECK-LE-LABEL: masked_v16i8_pre:
414 ; CHECK-LE:       @ %bb.0: @ %entry
415 ; CHECK-LE-NEXT:    vldr d1, [sp]
416 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
417 ; CHECK-LE-NEXT:    vmov d0, r2, r3
418 ; CHECK-LE-NEXT:    vpt.s8 gt, q0, zr
419 ; CHECK-LE-NEXT:    vstrbt.8 q1, [r0, #4]
420 ; CHECK-LE-NEXT:    adds r0, #4
421 ; CHECK-LE-NEXT:    bx lr
423 ; CHECK-BE-LABEL: masked_v16i8_pre:
424 ; CHECK-BE:       @ %bb.0: @ %entry
425 ; CHECK-BE-NEXT:    vldr d1, [sp]
426 ; CHECK-BE-NEXT:    vldrb.u8 q1, [r1]
427 ; CHECK-BE-NEXT:    vmov d0, r3, r2
428 ; CHECK-BE-NEXT:    vrev64.8 q2, q0
429 ; CHECK-BE-NEXT:    vpt.s8 gt, q2, zr
430 ; CHECK-BE-NEXT:    vstrbt.8 q1, [r0, #4]
431 ; CHECK-BE-NEXT:    adds r0, #4
432 ; CHECK-BE-NEXT:    bx lr
433 entry:
434   %z = getelementptr inbounds i8, i8* %y, i32 4
435   %0 = bitcast i8* %x to <16 x i8>*
436   %1 = load <16 x i8>, <16 x i8>* %0, align 4
437   %2 = bitcast i8* %z to <16 x i8>*
438   %c = icmp sgt <16 x i8> %a, zeroinitializer
439   call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %1, <16 x i8>* %2, i32 1, <16 x i1> %c)
440   ret i8* %z
443 define i8* @masked_v16i8_post(i8* %y, i8* %x, <16 x i8> %a) {
444 ; CHECK-LE-LABEL: masked_v16i8_post:
445 ; CHECK-LE:       @ %bb.0: @ %entry
446 ; CHECK-LE-NEXT:    vldr d1, [sp]
447 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
448 ; CHECK-LE-NEXT:    vmov d0, r2, r3
449 ; CHECK-LE-NEXT:    vpt.s8 gt, q0, zr
450 ; CHECK-LE-NEXT:    vstrbt.8 q1, [r0]
451 ; CHECK-LE-NEXT:    adds r0, #4
452 ; CHECK-LE-NEXT:    bx lr
454 ; CHECK-BE-LABEL: masked_v16i8_post:
455 ; CHECK-BE:       @ %bb.0: @ %entry
456 ; CHECK-BE-NEXT:    vldr d1, [sp]
457 ; CHECK-BE-NEXT:    vldrb.u8 q1, [r1]
458 ; CHECK-BE-NEXT:    vmov d0, r3, r2
459 ; CHECK-BE-NEXT:    vrev64.8 q2, q0
460 ; CHECK-BE-NEXT:    vpt.s8 gt, q2, zr
461 ; CHECK-BE-NEXT:    vstrbt.8 q1, [r0]
462 ; CHECK-BE-NEXT:    adds r0, #4
463 ; CHECK-BE-NEXT:    bx lr
464 entry:
465   %z = getelementptr inbounds i8, i8* %y, i32 4
466   %0 = bitcast i8* %x to <16 x i8>*
467   %1 = load <16 x i8>, <16 x i8>* %0, align 4
468   %2 = bitcast i8* %y to <16 x i8>*
469   %c = icmp sgt <16 x i8> %a, zeroinitializer
470   call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %1, <16 x i8>* %2, i32 1, <16 x i1> %c)
471   ret i8* %z
475 define arm_aapcs_vfpcc void @masked_v4f32(<4 x float> *%dest, <4 x float> %a, <4 x i32> %b) {
476 ; CHECK-LE-LABEL: masked_v4f32:
477 ; CHECK-LE:       @ %bb.0: @ %entry
478 ; CHECK-LE-NEXT:    vpt.i32 ne, q1, zr
479 ; CHECK-LE-NEXT:    vstrwt.32 q0, [r0]
480 ; CHECK-LE-NEXT:    bx lr
482 ; CHECK-BE-LABEL: masked_v4f32:
483 ; CHECK-BE:       @ %bb.0: @ %entry
484 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
485 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
486 ; CHECK-BE-NEXT:    vpt.i32 ne, q2, zr
487 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0]
488 ; CHECK-BE-NEXT:    bx lr
489 entry:
490   %c = icmp ugt <4 x i32> %b, zeroinitializer
491   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %a, <4 x float>* %dest, i32 4, <4 x i1> %c)
492   ret void
495 define arm_aapcs_vfpcc void @masked_v4f32_align1(<4 x float> *%dest, <4 x float> %a, <4 x i32> %b) {
496 ; CHECK-LE-LABEL: masked_v4f32_align1:
497 ; CHECK-LE:       @ %bb.0: @ %entry
498 ; CHECK-LE-NEXT:    .pad #20
499 ; CHECK-LE-NEXT:    sub sp, #20
500 ; CHECK-LE-NEXT:    vcmp.i32 ne, q1, zr
501 ; CHECK-LE-NEXT:    movs r1, #0
502 ; CHECK-LE-NEXT:    vmrs r2, p0
503 ; CHECK-LE-NEXT:    and r3, r2, #1
504 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
505 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
506 ; CHECK-LE-NEXT:    ubfx r3, r2, #4, #1
507 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
508 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
509 ; CHECK-LE-NEXT:    ubfx r3, r2, #8, #1
510 ; CHECK-LE-NEXT:    ubfx r2, r2, #12, #1
511 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
512 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
513 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
514 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
515 ; CHECK-LE-NEXT:    lsls r2, r1, #31
516 ; CHECK-LE-NEXT:    ittt ne
517 ; CHECK-LE-NEXT:    vstrne s0, [sp, #12]
518 ; CHECK-LE-NEXT:    ldrne r2, [sp, #12]
519 ; CHECK-LE-NEXT:    strne r2, [r0]
520 ; CHECK-LE-NEXT:    lsls r2, r1, #30
521 ; CHECK-LE-NEXT:    ittt mi
522 ; CHECK-LE-NEXT:    vstrmi s1, [sp, #8]
523 ; CHECK-LE-NEXT:    ldrmi r2, [sp, #8]
524 ; CHECK-LE-NEXT:    strmi r2, [r0, #4]
525 ; CHECK-LE-NEXT:    lsls r2, r1, #29
526 ; CHECK-LE-NEXT:    ittt mi
527 ; CHECK-LE-NEXT:    vstrmi s2, [sp, #4]
528 ; CHECK-LE-NEXT:    ldrmi r2, [sp, #4]
529 ; CHECK-LE-NEXT:    strmi r2, [r0, #8]
530 ; CHECK-LE-NEXT:    lsls r1, r1, #28
531 ; CHECK-LE-NEXT:    ittt mi
532 ; CHECK-LE-NEXT:    vstrmi s3, [sp]
533 ; CHECK-LE-NEXT:    ldrmi r1, [sp]
534 ; CHECK-LE-NEXT:    strmi r1, [r0, #12]
535 ; CHECK-LE-NEXT:    add sp, #20
536 ; CHECK-LE-NEXT:    bx lr
538 ; CHECK-BE-LABEL: masked_v4f32_align1:
539 ; CHECK-BE:       @ %bb.0: @ %entry
540 ; CHECK-BE-NEXT:    .pad #20
541 ; CHECK-BE-NEXT:    sub sp, #20
542 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
543 ; CHECK-BE-NEXT:    movs r1, #0
544 ; CHECK-BE-NEXT:    vcmp.i32 ne, q2, zr
545 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
546 ; CHECK-BE-NEXT:    vmrs r2, p0
547 ; CHECK-BE-NEXT:    and r3, r2, #1
548 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
549 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
550 ; CHECK-BE-NEXT:    ubfx r3, r2, #4, #1
551 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
552 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
553 ; CHECK-BE-NEXT:    ubfx r3, r2, #8, #1
554 ; CHECK-BE-NEXT:    ubfx r2, r2, #12, #1
555 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
556 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
557 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
558 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
559 ; CHECK-BE-NEXT:    lsls r2, r1, #31
560 ; CHECK-BE-NEXT:    ittt ne
561 ; CHECK-BE-NEXT:    vstrne s4, [sp, #12]
562 ; CHECK-BE-NEXT:    ldrne r2, [sp, #12]
563 ; CHECK-BE-NEXT:    strne r2, [r0]
564 ; CHECK-BE-NEXT:    lsls r2, r1, #30
565 ; CHECK-BE-NEXT:    ittt mi
566 ; CHECK-BE-NEXT:    vstrmi s5, [sp, #8]
567 ; CHECK-BE-NEXT:    ldrmi r2, [sp, #8]
568 ; CHECK-BE-NEXT:    strmi r2, [r0, #4]
569 ; CHECK-BE-NEXT:    lsls r2, r1, #29
570 ; CHECK-BE-NEXT:    ittt mi
571 ; CHECK-BE-NEXT:    vstrmi s6, [sp, #4]
572 ; CHECK-BE-NEXT:    ldrmi r2, [sp, #4]
573 ; CHECK-BE-NEXT:    strmi r2, [r0, #8]
574 ; CHECK-BE-NEXT:    lsls r1, r1, #28
575 ; CHECK-BE-NEXT:    ittt mi
576 ; CHECK-BE-NEXT:    vstrmi s7, [sp]
577 ; CHECK-BE-NEXT:    ldrmi r1, [sp]
578 ; CHECK-BE-NEXT:    strmi r1, [r0, #12]
579 ; CHECK-BE-NEXT:    add sp, #20
580 ; CHECK-BE-NEXT:    bx lr
581 entry:
582   %c = icmp ugt <4 x i32> %b, zeroinitializer
583   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %a, <4 x float>* %dest, i32 1, <4 x i1> %c)
584   ret void
587 define i8* @masked_v4f32_pre(i8* %y, i8* %x, <4 x i32> %a) {
588 ; CHECK-LE-LABEL: masked_v4f32_pre:
589 ; CHECK-LE:       @ %bb.0: @ %entry
590 ; CHECK-LE-NEXT:    vldr d1, [sp]
591 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
592 ; CHECK-LE-NEXT:    vmov d0, r2, r3
593 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
594 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0, #4]
595 ; CHECK-LE-NEXT:    adds r0, #4
596 ; CHECK-LE-NEXT:    bx lr
598 ; CHECK-BE-LABEL: masked_v4f32_pre:
599 ; CHECK-BE:       @ %bb.0: @ %entry
600 ; CHECK-BE-NEXT:    vldr d1, [sp]
601 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
602 ; CHECK-BE-NEXT:    vmov d0, r3, r2
603 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
604 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
605 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0, #4]
606 ; CHECK-BE-NEXT:    adds r0, #4
607 ; CHECK-BE-NEXT:    bx lr
608 entry:
609   %z = getelementptr inbounds i8, i8* %y, i32 4
610   %0 = bitcast i8* %x to <4 x float>*
611   %1 = load <4 x float>, <4 x float>* %0, align 4
612   %2 = bitcast i8* %z to <4 x float>*
613   %c = icmp sgt <4 x i32> %a, zeroinitializer
614   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %1, <4 x float>* %2, i32 4, <4 x i1> %c)
615   ret i8* %z
618 define i8* @masked_v4f32_post(i8* %y, i8* %x, <4 x i32> %a) {
619 ; CHECK-LE-LABEL: masked_v4f32_post:
620 ; CHECK-LE:       @ %bb.0: @ %entry
621 ; CHECK-LE-NEXT:    vldr d1, [sp]
622 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
623 ; CHECK-LE-NEXT:    vmov d0, r2, r3
624 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
625 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0]
626 ; CHECK-LE-NEXT:    adds r0, #4
627 ; CHECK-LE-NEXT:    bx lr
629 ; CHECK-BE-LABEL: masked_v4f32_post:
630 ; CHECK-BE:       @ %bb.0: @ %entry
631 ; CHECK-BE-NEXT:    vldr d1, [sp]
632 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
633 ; CHECK-BE-NEXT:    vmov d0, r3, r2
634 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
635 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
636 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0]
637 ; CHECK-BE-NEXT:    adds r0, #4
638 ; CHECK-BE-NEXT:    bx lr
639 entry:
640   %z = getelementptr inbounds i8, i8* %y, i32 4
641   %0 = bitcast i8* %x to <4 x float>*
642   %1 = load <4 x float>, <4 x float>* %0, align 4
643   %2 = bitcast i8* %y to <4 x float>*
644   %c = icmp sgt <4 x i32> %a, zeroinitializer
645   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %1, <4 x float>* %2, i32 4, <4 x i1> %c)
646   ret i8* %z
650 define arm_aapcs_vfpcc void @masked_v8f16(<8 x half> *%dest, <8 x half> %a, <8 x i16> %b) {
651 ; CHECK-LE-LABEL: masked_v8f16:
652 ; CHECK-LE:       @ %bb.0: @ %entry
653 ; CHECK-LE-NEXT:    vpt.i16 ne, q1, zr
654 ; CHECK-LE-NEXT:    vstrht.16 q0, [r0]
655 ; CHECK-LE-NEXT:    bx lr
657 ; CHECK-BE-LABEL: masked_v8f16:
658 ; CHECK-BE:       @ %bb.0: @ %entry
659 ; CHECK-BE-NEXT:    vrev64.16 q2, q1
660 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
661 ; CHECK-BE-NEXT:    vpt.i16 ne, q2, zr
662 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0]
663 ; CHECK-BE-NEXT:    bx lr
664 entry:
665   %c = icmp ugt <8 x i16> %b, zeroinitializer
666   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %a, <8 x half>* %dest, i32 2, <8 x i1> %c)
667   ret void
670 define arm_aapcs_vfpcc void @masked_v8f16_align1(<8 x half> *%dest, <8 x half> %a, <8 x i16> %b) {
671 ; CHECK-LE-LABEL: masked_v8f16_align1:
672 ; CHECK-LE:       @ %bb.0: @ %entry
673 ; CHECK-LE-NEXT:    .pad #40
674 ; CHECK-LE-NEXT:    sub sp, #40
675 ; CHECK-LE-NEXT:    vcmp.i16 ne, q1, zr
676 ; CHECK-LE-NEXT:    movs r2, #0
677 ; CHECK-LE-NEXT:    vmrs r1, p0
678 ; CHECK-LE-NEXT:    and r3, r1, #1
679 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
680 ; CHECK-LE-NEXT:    bfi r2, r3, #0, #1
681 ; CHECK-LE-NEXT:    ubfx r3, r1, #2, #1
682 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
683 ; CHECK-LE-NEXT:    bfi r2, r3, #1, #1
684 ; CHECK-LE-NEXT:    ubfx r3, r1, #4, #1
685 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
686 ; CHECK-LE-NEXT:    bfi r2, r3, #2, #1
687 ; CHECK-LE-NEXT:    ubfx r3, r1, #6, #1
688 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
689 ; CHECK-LE-NEXT:    bfi r2, r3, #3, #1
690 ; CHECK-LE-NEXT:    ubfx r3, r1, #8, #1
691 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
692 ; CHECK-LE-NEXT:    bfi r2, r3, #4, #1
693 ; CHECK-LE-NEXT:    ubfx r3, r1, #10, #1
694 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
695 ; CHECK-LE-NEXT:    bfi r2, r3, #5, #1
696 ; CHECK-LE-NEXT:    ubfx r3, r1, #12, #1
697 ; CHECK-LE-NEXT:    ubfx r1, r1, #14, #1
698 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
699 ; CHECK-LE-NEXT:    bfi r2, r3, #6, #1
700 ; CHECK-LE-NEXT:    rsbs r1, r1, #0
701 ; CHECK-LE-NEXT:    bfi r2, r1, #7, #1
702 ; CHECK-LE-NEXT:    uxtb r1, r2
703 ; CHECK-LE-NEXT:    lsls r2, r2, #31
704 ; CHECK-LE-NEXT:    bne .LBB16_9
705 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
706 ; CHECK-LE-NEXT:    lsls r2, r1, #30
707 ; CHECK-LE-NEXT:    bmi .LBB16_10
708 ; CHECK-LE-NEXT:  .LBB16_2: @ %else2
709 ; CHECK-LE-NEXT:    lsls r2, r1, #29
710 ; CHECK-LE-NEXT:    bmi .LBB16_11
711 ; CHECK-LE-NEXT:  .LBB16_3: @ %else4
712 ; CHECK-LE-NEXT:    lsls r2, r1, #28
713 ; CHECK-LE-NEXT:    bmi .LBB16_12
714 ; CHECK-LE-NEXT:  .LBB16_4: @ %else6
715 ; CHECK-LE-NEXT:    lsls r2, r1, #27
716 ; CHECK-LE-NEXT:    bmi .LBB16_13
717 ; CHECK-LE-NEXT:  .LBB16_5: @ %else8
718 ; CHECK-LE-NEXT:    lsls r2, r1, #26
719 ; CHECK-LE-NEXT:    bmi .LBB16_14
720 ; CHECK-LE-NEXT:  .LBB16_6: @ %else10
721 ; CHECK-LE-NEXT:    lsls r2, r1, #25
722 ; CHECK-LE-NEXT:    bmi .LBB16_15
723 ; CHECK-LE-NEXT:  .LBB16_7: @ %else12
724 ; CHECK-LE-NEXT:    lsls r1, r1, #24
725 ; CHECK-LE-NEXT:    bmi .LBB16_16
726 ; CHECK-LE-NEXT:  .LBB16_8: @ %else14
727 ; CHECK-LE-NEXT:    add sp, #40
728 ; CHECK-LE-NEXT:    bx lr
729 ; CHECK-LE-NEXT:  .LBB16_9: @ %cond.store
730 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #28]
731 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #28]
732 ; CHECK-LE-NEXT:    strh r2, [r0]
733 ; CHECK-LE-NEXT:    lsls r2, r1, #30
734 ; CHECK-LE-NEXT:    bpl .LBB16_2
735 ; CHECK-LE-NEXT:  .LBB16_10: @ %cond.store1
736 ; CHECK-LE-NEXT:    vmovx.f16 s4, s0
737 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #24]
738 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #24]
739 ; CHECK-LE-NEXT:    strh r2, [r0, #2]
740 ; CHECK-LE-NEXT:    lsls r2, r1, #29
741 ; CHECK-LE-NEXT:    bpl .LBB16_3
742 ; CHECK-LE-NEXT:  .LBB16_11: @ %cond.store3
743 ; CHECK-LE-NEXT:    vstr.16 s1, [sp, #20]
744 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #20]
745 ; CHECK-LE-NEXT:    strh r2, [r0, #4]
746 ; CHECK-LE-NEXT:    lsls r2, r1, #28
747 ; CHECK-LE-NEXT:    bpl .LBB16_4
748 ; CHECK-LE-NEXT:  .LBB16_12: @ %cond.store5
749 ; CHECK-LE-NEXT:    vmovx.f16 s4, s1
750 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #16]
751 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #16]
752 ; CHECK-LE-NEXT:    strh r2, [r0, #6]
753 ; CHECK-LE-NEXT:    lsls r2, r1, #27
754 ; CHECK-LE-NEXT:    bpl .LBB16_5
755 ; CHECK-LE-NEXT:  .LBB16_13: @ %cond.store7
756 ; CHECK-LE-NEXT:    vstr.16 s2, [sp, #12]
757 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #12]
758 ; CHECK-LE-NEXT:    strh r2, [r0, #8]
759 ; CHECK-LE-NEXT:    lsls r2, r1, #26
760 ; CHECK-LE-NEXT:    bpl .LBB16_6
761 ; CHECK-LE-NEXT:  .LBB16_14: @ %cond.store9
762 ; CHECK-LE-NEXT:    vmovx.f16 s4, s2
763 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #8]
764 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #8]
765 ; CHECK-LE-NEXT:    strh r2, [r0, #10]
766 ; CHECK-LE-NEXT:    lsls r2, r1, #25
767 ; CHECK-LE-NEXT:    bpl .LBB16_7
768 ; CHECK-LE-NEXT:  .LBB16_15: @ %cond.store11
769 ; CHECK-LE-NEXT:    vstr.16 s3, [sp, #4]
770 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #4]
771 ; CHECK-LE-NEXT:    strh r2, [r0, #12]
772 ; CHECK-LE-NEXT:    lsls r1, r1, #24
773 ; CHECK-LE-NEXT:    bpl .LBB16_8
774 ; CHECK-LE-NEXT:  .LBB16_16: @ %cond.store13
775 ; CHECK-LE-NEXT:    vmovx.f16 s0, s3
776 ; CHECK-LE-NEXT:    vstr.16 s0, [sp]
777 ; CHECK-LE-NEXT:    ldrh.w r1, [sp]
778 ; CHECK-LE-NEXT:    strh r1, [r0, #14]
779 ; CHECK-LE-NEXT:    add sp, #40
780 ; CHECK-LE-NEXT:    bx lr
782 ; CHECK-BE-LABEL: masked_v8f16_align1:
783 ; CHECK-BE:       @ %bb.0: @ %entry
784 ; CHECK-BE-NEXT:    .pad #40
785 ; CHECK-BE-NEXT:    sub sp, #40
786 ; CHECK-BE-NEXT:    vrev64.16 q2, q1
787 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
788 ; CHECK-BE-NEXT:    vcmp.i16 ne, q2, zr
789 ; CHECK-BE-NEXT:    vmrs r1, p0
790 ; CHECK-BE-NEXT:    and r2, r1, #1
791 ; CHECK-BE-NEXT:    rsbs r3, r2, #0
792 ; CHECK-BE-NEXT:    movs r2, #0
793 ; CHECK-BE-NEXT:    bfi r2, r3, #0, #1
794 ; CHECK-BE-NEXT:    ubfx r3, r1, #2, #1
795 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
796 ; CHECK-BE-NEXT:    bfi r2, r3, #1, #1
797 ; CHECK-BE-NEXT:    ubfx r3, r1, #4, #1
798 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
799 ; CHECK-BE-NEXT:    bfi r2, r3, #2, #1
800 ; CHECK-BE-NEXT:    ubfx r3, r1, #6, #1
801 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
802 ; CHECK-BE-NEXT:    bfi r2, r3, #3, #1
803 ; CHECK-BE-NEXT:    ubfx r3, r1, #8, #1
804 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
805 ; CHECK-BE-NEXT:    bfi r2, r3, #4, #1
806 ; CHECK-BE-NEXT:    ubfx r3, r1, #10, #1
807 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
808 ; CHECK-BE-NEXT:    bfi r2, r3, #5, #1
809 ; CHECK-BE-NEXT:    ubfx r3, r1, #12, #1
810 ; CHECK-BE-NEXT:    ubfx r1, r1, #14, #1
811 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
812 ; CHECK-BE-NEXT:    bfi r2, r3, #6, #1
813 ; CHECK-BE-NEXT:    rsbs r1, r1, #0
814 ; CHECK-BE-NEXT:    bfi r2, r1, #7, #1
815 ; CHECK-BE-NEXT:    uxtb r1, r2
816 ; CHECK-BE-NEXT:    lsls r2, r2, #31
817 ; CHECK-BE-NEXT:    bne .LBB16_9
818 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
819 ; CHECK-BE-NEXT:    lsls r2, r1, #30
820 ; CHECK-BE-NEXT:    bmi .LBB16_10
821 ; CHECK-BE-NEXT:  .LBB16_2: @ %else2
822 ; CHECK-BE-NEXT:    lsls r2, r1, #29
823 ; CHECK-BE-NEXT:    bmi .LBB16_11
824 ; CHECK-BE-NEXT:  .LBB16_3: @ %else4
825 ; CHECK-BE-NEXT:    lsls r2, r1, #28
826 ; CHECK-BE-NEXT:    bmi .LBB16_12
827 ; CHECK-BE-NEXT:  .LBB16_4: @ %else6
828 ; CHECK-BE-NEXT:    lsls r2, r1, #27
829 ; CHECK-BE-NEXT:    bmi .LBB16_13
830 ; CHECK-BE-NEXT:  .LBB16_5: @ %else8
831 ; CHECK-BE-NEXT:    lsls r2, r1, #26
832 ; CHECK-BE-NEXT:    bmi .LBB16_14
833 ; CHECK-BE-NEXT:  .LBB16_6: @ %else10
834 ; CHECK-BE-NEXT:    lsls r2, r1, #25
835 ; CHECK-BE-NEXT:    bmi .LBB16_15
836 ; CHECK-BE-NEXT:  .LBB16_7: @ %else12
837 ; CHECK-BE-NEXT:    lsls r1, r1, #24
838 ; CHECK-BE-NEXT:    bmi .LBB16_16
839 ; CHECK-BE-NEXT:  .LBB16_8: @ %else14
840 ; CHECK-BE-NEXT:    add sp, #40
841 ; CHECK-BE-NEXT:    bx lr
842 ; CHECK-BE-NEXT:  .LBB16_9: @ %cond.store
843 ; CHECK-BE-NEXT:    vstr.16 s4, [sp, #28]
844 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #28]
845 ; CHECK-BE-NEXT:    strh r2, [r0]
846 ; CHECK-BE-NEXT:    lsls r2, r1, #30
847 ; CHECK-BE-NEXT:    bpl .LBB16_2
848 ; CHECK-BE-NEXT:  .LBB16_10: @ %cond.store1
849 ; CHECK-BE-NEXT:    vmovx.f16 s0, s4
850 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #24]
851 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #24]
852 ; CHECK-BE-NEXT:    strh r2, [r0, #2]
853 ; CHECK-BE-NEXT:    lsls r2, r1, #29
854 ; CHECK-BE-NEXT:    bpl .LBB16_3
855 ; CHECK-BE-NEXT:  .LBB16_11: @ %cond.store3
856 ; CHECK-BE-NEXT:    vstr.16 s5, [sp, #20]
857 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #20]
858 ; CHECK-BE-NEXT:    strh r2, [r0, #4]
859 ; CHECK-BE-NEXT:    lsls r2, r1, #28
860 ; CHECK-BE-NEXT:    bpl .LBB16_4
861 ; CHECK-BE-NEXT:  .LBB16_12: @ %cond.store5
862 ; CHECK-BE-NEXT:    vmovx.f16 s0, s5
863 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #16]
864 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #16]
865 ; CHECK-BE-NEXT:    strh r2, [r0, #6]
866 ; CHECK-BE-NEXT:    lsls r2, r1, #27
867 ; CHECK-BE-NEXT:    bpl .LBB16_5
868 ; CHECK-BE-NEXT:  .LBB16_13: @ %cond.store7
869 ; CHECK-BE-NEXT:    vstr.16 s6, [sp, #12]
870 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #12]
871 ; CHECK-BE-NEXT:    strh r2, [r0, #8]
872 ; CHECK-BE-NEXT:    lsls r2, r1, #26
873 ; CHECK-BE-NEXT:    bpl .LBB16_6
874 ; CHECK-BE-NEXT:  .LBB16_14: @ %cond.store9
875 ; CHECK-BE-NEXT:    vmovx.f16 s0, s6
876 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #8]
877 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #8]
878 ; CHECK-BE-NEXT:    strh r2, [r0, #10]
879 ; CHECK-BE-NEXT:    lsls r2, r1, #25
880 ; CHECK-BE-NEXT:    bpl .LBB16_7
881 ; CHECK-BE-NEXT:  .LBB16_15: @ %cond.store11
882 ; CHECK-BE-NEXT:    vstr.16 s7, [sp, #4]
883 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #4]
884 ; CHECK-BE-NEXT:    strh r2, [r0, #12]
885 ; CHECK-BE-NEXT:    lsls r1, r1, #24
886 ; CHECK-BE-NEXT:    bpl .LBB16_8
887 ; CHECK-BE-NEXT:  .LBB16_16: @ %cond.store13
888 ; CHECK-BE-NEXT:    vmovx.f16 s0, s7
889 ; CHECK-BE-NEXT:    vstr.16 s0, [sp]
890 ; CHECK-BE-NEXT:    ldrh.w r1, [sp]
891 ; CHECK-BE-NEXT:    strh r1, [r0, #14]
892 ; CHECK-BE-NEXT:    add sp, #40
893 ; CHECK-BE-NEXT:    bx lr
894 entry:
895   %c = icmp ugt <8 x i16> %b, zeroinitializer
896   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %a, <8 x half>* %dest, i32 1, <8 x i1> %c)
897   ret void
900 define i8* @masked_v8f16_pre(i8* %y, i8* %x, <8 x i16> %a) {
901 ; CHECK-LE-LABEL: masked_v8f16_pre:
902 ; CHECK-LE:       @ %bb.0: @ %entry
903 ; CHECK-LE-NEXT:    vldr d1, [sp]
904 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
905 ; CHECK-LE-NEXT:    vmov d0, r2, r3
906 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
907 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0, #4]
908 ; CHECK-LE-NEXT:    adds r0, #4
909 ; CHECK-LE-NEXT:    bx lr
911 ; CHECK-BE-LABEL: masked_v8f16_pre:
912 ; CHECK-BE:       @ %bb.0: @ %entry
913 ; CHECK-BE-NEXT:    vldr d1, [sp]
914 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
915 ; CHECK-BE-NEXT:    vmov d0, r3, r2
916 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
917 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
918 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0, #4]
919 ; CHECK-BE-NEXT:    adds r0, #4
920 ; CHECK-BE-NEXT:    bx lr
921 entry:
922   %z = getelementptr inbounds i8, i8* %y, i32 4
923   %0 = bitcast i8* %x to <8 x half>*
924   %1 = load <8 x half>, <8 x half>* %0, align 4
925   %2 = bitcast i8* %z to <8 x half>*
926   %c = icmp sgt <8 x i16> %a, zeroinitializer
927   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %1, <8 x half>* %2, i32 2, <8 x i1> %c)
928   ret i8* %z
931 define i8* @masked_v8f16_post(i8* %y, i8* %x, <8 x i16> %a) {
932 ; CHECK-LE-LABEL: masked_v8f16_post:
933 ; CHECK-LE:       @ %bb.0: @ %entry
934 ; CHECK-LE-NEXT:    vldr d1, [sp]
935 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
936 ; CHECK-LE-NEXT:    vmov d0, r2, r3
937 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
938 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0]
939 ; CHECK-LE-NEXT:    adds r0, #4
940 ; CHECK-LE-NEXT:    bx lr
942 ; CHECK-BE-LABEL: masked_v8f16_post:
943 ; CHECK-BE:       @ %bb.0: @ %entry
944 ; CHECK-BE-NEXT:    vldr d1, [sp]
945 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
946 ; CHECK-BE-NEXT:    vmov d0, r3, r2
947 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
948 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
949 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0]
950 ; CHECK-BE-NEXT:    adds r0, #4
951 ; CHECK-BE-NEXT:    bx lr
952 entry:
953   %z = getelementptr inbounds i8, i8* %y, i32 4
954   %0 = bitcast i8* %x to <8 x half>*
955   %1 = load <8 x half>, <8 x half>* %0, align 4
956   %2 = bitcast i8* %y to <8 x half>*
957   %c = icmp sgt <8 x i16> %a, zeroinitializer
958   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %1, <8 x half>* %2, i32 2, <8 x i1> %c)
959   ret i8* %z
963 define arm_aapcs_vfpcc void @masked_v2i64(<2 x i64> *%dest, <2 x i64> %a) {
964 ; CHECK-LE-LABEL: masked_v2i64:
965 ; CHECK-LE:       @ %bb.0: @ %entry
966 ; CHECK-LE-NEXT:    .pad #4
967 ; CHECK-LE-NEXT:    sub sp, #4
968 ; CHECK-LE-NEXT:    vmov r2, s0
969 ; CHECK-LE-NEXT:    movs r3, #0
970 ; CHECK-LE-NEXT:    vmov r1, s1
971 ; CHECK-LE-NEXT:    vmov r12, s3
972 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
973 ; CHECK-LE-NEXT:    vmov r2, s2
974 ; CHECK-LE-NEXT:    sbcs.w r1, r3, r1
975 ; CHECK-LE-NEXT:    mov.w r1, #0
976 ; CHECK-LE-NEXT:    it lt
977 ; CHECK-LE-NEXT:    movlt r1, #1
978 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
979 ; CHECK-LE-NEXT:    sbcs.w r2, r3, r12
980 ; CHECK-LE-NEXT:    it lt
981 ; CHECK-LE-NEXT:    movlt r3, #1
982 ; CHECK-LE-NEXT:    cmp r3, #0
983 ; CHECK-LE-NEXT:    it ne
984 ; CHECK-LE-NEXT:    mvnne r3, #1
985 ; CHECK-LE-NEXT:    bfi r3, r1, #0, #1
986 ; CHECK-LE-NEXT:    and r1, r3, #3
987 ; CHECK-LE-NEXT:    lsls r2, r3, #31
988 ; CHECK-LE-NEXT:    it ne
989 ; CHECK-LE-NEXT:    vstrne d0, [r0]
990 ; CHECK-LE-NEXT:    lsls r1, r1, #30
991 ; CHECK-LE-NEXT:    it mi
992 ; CHECK-LE-NEXT:    vstrmi d1, [r0, #8]
993 ; CHECK-LE-NEXT:    add sp, #4
994 ; CHECK-LE-NEXT:    bx lr
996 ; CHECK-BE-LABEL: masked_v2i64:
997 ; CHECK-BE:       @ %bb.0: @ %entry
998 ; CHECK-BE-NEXT:    .pad #4
999 ; CHECK-BE-NEXT:    sub sp, #4
1000 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1001 ; CHECK-BE-NEXT:    movs r3, #0
1002 ; CHECK-BE-NEXT:    vmov r2, s7
1003 ; CHECK-BE-NEXT:    vmov r1, s6
1004 ; CHECK-BE-NEXT:    vmov r12, s4
1005 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1006 ; CHECK-BE-NEXT:    vmov r2, s5
1007 ; CHECK-BE-NEXT:    sbcs.w r1, r3, r1
1008 ; CHECK-BE-NEXT:    mov.w r1, #0
1009 ; CHECK-BE-NEXT:    it lt
1010 ; CHECK-BE-NEXT:    movlt r1, #1
1011 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1012 ; CHECK-BE-NEXT:    sbcs.w r2, r3, r12
1013 ; CHECK-BE-NEXT:    it lt
1014 ; CHECK-BE-NEXT:    movlt r3, #1
1015 ; CHECK-BE-NEXT:    cmp r3, #0
1016 ; CHECK-BE-NEXT:    it ne
1017 ; CHECK-BE-NEXT:    mvnne r3, #1
1018 ; CHECK-BE-NEXT:    bfi r3, r1, #0, #1
1019 ; CHECK-BE-NEXT:    and r1, r3, #3
1020 ; CHECK-BE-NEXT:    lsls r2, r3, #31
1021 ; CHECK-BE-NEXT:    it ne
1022 ; CHECK-BE-NEXT:    vstrne d0, [r0]
1023 ; CHECK-BE-NEXT:    lsls r1, r1, #30
1024 ; CHECK-BE-NEXT:    it mi
1025 ; CHECK-BE-NEXT:    vstrmi d1, [r0, #8]
1026 ; CHECK-BE-NEXT:    add sp, #4
1027 ; CHECK-BE-NEXT:    bx lr
1028 entry:
1029   %c = icmp sgt <2 x i64> %a, zeroinitializer
1030   call void @llvm.masked.store.v2i64.p0v2i64(<2 x i64> %a, <2 x i64>* %dest, i32 8, <2 x i1> %c)
1031   ret void
1034 define arm_aapcs_vfpcc void @masked_v2f64(<2 x double> *%dest, <2 x double> %a, <2 x i64> %b) {
1035 ; CHECK-LE-LABEL: masked_v2f64:
1036 ; CHECK-LE:       @ %bb.0: @ %entry
1037 ; CHECK-LE-NEXT:    .pad #4
1038 ; CHECK-LE-NEXT:    sub sp, #4
1039 ; CHECK-LE-NEXT:    vmov r2, s4
1040 ; CHECK-LE-NEXT:    movs r3, #0
1041 ; CHECK-LE-NEXT:    vmov r1, s5
1042 ; CHECK-LE-NEXT:    vmov r12, s7
1043 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
1044 ; CHECK-LE-NEXT:    vmov r2, s6
1045 ; CHECK-LE-NEXT:    sbcs.w r1, r3, r1
1046 ; CHECK-LE-NEXT:    mov.w r1, #0
1047 ; CHECK-LE-NEXT:    it lt
1048 ; CHECK-LE-NEXT:    movlt r1, #1
1049 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
1050 ; CHECK-LE-NEXT:    sbcs.w r2, r3, r12
1051 ; CHECK-LE-NEXT:    it lt
1052 ; CHECK-LE-NEXT:    movlt r3, #1
1053 ; CHECK-LE-NEXT:    cmp r3, #0
1054 ; CHECK-LE-NEXT:    it ne
1055 ; CHECK-LE-NEXT:    mvnne r3, #1
1056 ; CHECK-LE-NEXT:    bfi r3, r1, #0, #1
1057 ; CHECK-LE-NEXT:    and r1, r3, #3
1058 ; CHECK-LE-NEXT:    lsls r2, r3, #31
1059 ; CHECK-LE-NEXT:    it ne
1060 ; CHECK-LE-NEXT:    vstrne d0, [r0]
1061 ; CHECK-LE-NEXT:    lsls r1, r1, #30
1062 ; CHECK-LE-NEXT:    it mi
1063 ; CHECK-LE-NEXT:    vstrmi d1, [r0, #8]
1064 ; CHECK-LE-NEXT:    add sp, #4
1065 ; CHECK-LE-NEXT:    bx lr
1067 ; CHECK-BE-LABEL: masked_v2f64:
1068 ; CHECK-BE:       @ %bb.0: @ %entry
1069 ; CHECK-BE-NEXT:    .pad #4
1070 ; CHECK-BE-NEXT:    sub sp, #4
1071 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
1072 ; CHECK-BE-NEXT:    movs r3, #0
1073 ; CHECK-BE-NEXT:    vmov r2, s11
1074 ; CHECK-BE-NEXT:    vmov r1, s10
1075 ; CHECK-BE-NEXT:    vmov r12, s8
1076 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1077 ; CHECK-BE-NEXT:    vmov r2, s9
1078 ; CHECK-BE-NEXT:    sbcs.w r1, r3, r1
1079 ; CHECK-BE-NEXT:    mov.w r1, #0
1080 ; CHECK-BE-NEXT:    it lt
1081 ; CHECK-BE-NEXT:    movlt r1, #1
1082 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1083 ; CHECK-BE-NEXT:    sbcs.w r2, r3, r12
1084 ; CHECK-BE-NEXT:    it lt
1085 ; CHECK-BE-NEXT:    movlt r3, #1
1086 ; CHECK-BE-NEXT:    cmp r3, #0
1087 ; CHECK-BE-NEXT:    it ne
1088 ; CHECK-BE-NEXT:    mvnne r3, #1
1089 ; CHECK-BE-NEXT:    bfi r3, r1, #0, #1
1090 ; CHECK-BE-NEXT:    and r1, r3, #3
1091 ; CHECK-BE-NEXT:    lsls r2, r3, #31
1092 ; CHECK-BE-NEXT:    it ne
1093 ; CHECK-BE-NEXT:    vstrne d0, [r0]
1094 ; CHECK-BE-NEXT:    lsls r1, r1, #30
1095 ; CHECK-BE-NEXT:    it mi
1096 ; CHECK-BE-NEXT:    vstrmi d1, [r0, #8]
1097 ; CHECK-BE-NEXT:    add sp, #4
1098 ; CHECK-BE-NEXT:    bx lr
1099 entry:
1100   %c = icmp sgt <2 x i64> %b, zeroinitializer
1101   call void @llvm.masked.store.v2f64.p0v2f64(<2 x double> %a, <2 x double>* %dest, i32 8, <2 x i1> %c)
1102   ret void
1105 define arm_aapcs_vfpcc void @masked_v4i16(<4 x i16> *%dest, <4 x i32> %a) {
1106 ; CHECK-LE-LABEL: masked_v4i16:
1107 ; CHECK-LE:       @ %bb.0: @ %entry
1108 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
1109 ; CHECK-LE-NEXT:    vstrht.32 q0, [r0]
1110 ; CHECK-LE-NEXT:    bx lr
1112 ; CHECK-BE-LABEL: masked_v4i16:
1113 ; CHECK-BE:       @ %bb.0: @ %entry
1114 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1115 ; CHECK-BE-NEXT:    vpt.s32 gt, q1, zr
1116 ; CHECK-BE-NEXT:    vstrht.32 q1, [r0]
1117 ; CHECK-BE-NEXT:    bx lr
1118 entry:
1119   %c = icmp sgt <4 x i32> %a, zeroinitializer
1120   %trunc = trunc <4 x i32> %a to <4 x i16>
1121   call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %trunc, <4 x i16>* %dest, i32 2, <4 x i1> %c)
1122   ret void
1125 define arm_aapcs_vfpcc void @masked_v4i8(<4 x i8> *%dest, <4 x i32> %a) {
1126 ; CHECK-LE-LABEL: masked_v4i8:
1127 ; CHECK-LE:       @ %bb.0: @ %entry
1128 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
1129 ; CHECK-LE-NEXT:    vstrbt.32 q0, [r0]
1130 ; CHECK-LE-NEXT:    bx lr
1132 ; CHECK-BE-LABEL: masked_v4i8:
1133 ; CHECK-BE:       @ %bb.0: @ %entry
1134 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1135 ; CHECK-BE-NEXT:    vpt.s32 gt, q1, zr
1136 ; CHECK-BE-NEXT:    vstrbt.32 q1, [r0]
1137 ; CHECK-BE-NEXT:    bx lr
1138 entry:
1139   %c = icmp sgt <4 x i32> %a, zeroinitializer
1140   %trunc = trunc <4 x i32> %a to <4 x i8>
1141   call void @llvm.masked.store.v4i8.p0v4i8(<4 x i8> %trunc, <4 x i8>* %dest, i32 1, <4 x i1> %c)
1142   ret void
1145 define arm_aapcs_vfpcc void @masked_v8i8(<8 x i8> *%dest, <8 x i16> %a) {
1146 ; CHECK-LE-LABEL: masked_v8i8:
1147 ; CHECK-LE:       @ %bb.0: @ %entry
1148 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
1149 ; CHECK-LE-NEXT:    vstrbt.16 q0, [r0]
1150 ; CHECK-LE-NEXT:    bx lr
1152 ; CHECK-BE-LABEL: masked_v8i8:
1153 ; CHECK-BE:       @ %bb.0: @ %entry
1154 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
1155 ; CHECK-BE-NEXT:    vpt.s16 gt, q1, zr
1156 ; CHECK-BE-NEXT:    vstrbt.16 q1, [r0]
1157 ; CHECK-BE-NEXT:    bx lr
1158 entry:
1159   %c = icmp sgt <8 x i16> %a, zeroinitializer
1160   %trunc = trunc <8 x i16> %a to <8 x i8>
1161   call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %trunc, <8 x i8>* %dest, i32 1, <8 x i1> %c)
1162   ret void
1165 define arm_aapcs_vfpcc void @masked_v4i16_align1(<4 x i16> *%dest, <4 x i32> %a) {
1166 ; CHECK-LE-LABEL: masked_v4i16_align1:
1167 ; CHECK-LE:       @ %bb.0: @ %entry
1168 ; CHECK-LE-NEXT:    .pad #4
1169 ; CHECK-LE-NEXT:    sub sp, #4
1170 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
1171 ; CHECK-LE-NEXT:    vmrs r2, p0
1172 ; CHECK-LE-NEXT:    and r1, r2, #1
1173 ; CHECK-LE-NEXT:    rsbs r3, r1, #0
1174 ; CHECK-LE-NEXT:    movs r1, #0
1175 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
1176 ; CHECK-LE-NEXT:    ubfx r3, r2, #4, #1
1177 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
1178 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
1179 ; CHECK-LE-NEXT:    ubfx r3, r2, #8, #1
1180 ; CHECK-LE-NEXT:    ubfx r2, r2, #12, #1
1181 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
1182 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
1183 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
1184 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1185 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1186 ; CHECK-LE-NEXT:    itt ne
1187 ; CHECK-LE-NEXT:    vmovne r2, s0
1188 ; CHECK-LE-NEXT:    strhne r2, [r0]
1189 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1190 ; CHECK-LE-NEXT:    itt mi
1191 ; CHECK-LE-NEXT:    vmovmi r2, s1
1192 ; CHECK-LE-NEXT:    strhmi r2, [r0, #2]
1193 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1194 ; CHECK-LE-NEXT:    itt mi
1195 ; CHECK-LE-NEXT:    vmovmi r2, s2
1196 ; CHECK-LE-NEXT:    strhmi r2, [r0, #4]
1197 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1198 ; CHECK-LE-NEXT:    itt mi
1199 ; CHECK-LE-NEXT:    vmovmi r1, s3
1200 ; CHECK-LE-NEXT:    strhmi r1, [r0, #6]
1201 ; CHECK-LE-NEXT:    add sp, #4
1202 ; CHECK-LE-NEXT:    bx lr
1204 ; CHECK-BE-LABEL: masked_v4i16_align1:
1205 ; CHECK-BE:       @ %bb.0: @ %entry
1206 ; CHECK-BE-NEXT:    .pad #4
1207 ; CHECK-BE-NEXT:    sub sp, #4
1208 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1209 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
1210 ; CHECK-BE-NEXT:    vmrs r2, p0
1211 ; CHECK-BE-NEXT:    and r1, r2, #1
1212 ; CHECK-BE-NEXT:    rsbs r3, r1, #0
1213 ; CHECK-BE-NEXT:    movs r1, #0
1214 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
1215 ; CHECK-BE-NEXT:    ubfx r3, r2, #4, #1
1216 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1217 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
1218 ; CHECK-BE-NEXT:    ubfx r3, r2, #8, #1
1219 ; CHECK-BE-NEXT:    ubfx r2, r2, #12, #1
1220 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1221 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
1222 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1223 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1224 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1225 ; CHECK-BE-NEXT:    itt ne
1226 ; CHECK-BE-NEXT:    vmovne r2, s4
1227 ; CHECK-BE-NEXT:    strhne r2, [r0]
1228 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1229 ; CHECK-BE-NEXT:    itt mi
1230 ; CHECK-BE-NEXT:    vmovmi r2, s5
1231 ; CHECK-BE-NEXT:    strhmi r2, [r0, #2]
1232 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1233 ; CHECK-BE-NEXT:    itt mi
1234 ; CHECK-BE-NEXT:    vmovmi r2, s6
1235 ; CHECK-BE-NEXT:    strhmi r2, [r0, #4]
1236 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1237 ; CHECK-BE-NEXT:    itt mi
1238 ; CHECK-BE-NEXT:    vmovmi r1, s7
1239 ; CHECK-BE-NEXT:    strhmi r1, [r0, #6]
1240 ; CHECK-BE-NEXT:    add sp, #4
1241 ; CHECK-BE-NEXT:    bx lr
1242 entry:
1243   %c = icmp sgt <4 x i32> %a, zeroinitializer
1244   %trunc = trunc <4 x i32> %a to <4 x i16>
1245   call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %trunc, <4 x i16>* %dest, i32 1, <4 x i1> %c)
1246   ret void
1249 define arm_aapcs_vfpcc void @masked_v4f16_align4(<4 x half> *%dest, <4 x float> %a) {
1250 ; CHECK-LE-LABEL: masked_v4f16_align4:
1251 ; CHECK-LE:       @ %bb.0: @ %entry
1252 ; CHECK-LE-NEXT:    .pad #4
1253 ; CHECK-LE-NEXT:    sub sp, #4
1254 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s0
1255 ; CHECK-LE-NEXT:    vcmp.f32 s0, #0
1256 ; CHECK-LE-NEXT:    vmov r1, s4
1257 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s1
1258 ; CHECK-LE-NEXT:    vmov r2, s4
1259 ; CHECK-LE-NEXT:    vmov.16 q1[0], r1
1260 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s8, s2
1261 ; CHECK-LE-NEXT:    vmov.16 q1[1], r2
1262 ; CHECK-LE-NEXT:    vmov r1, s8
1263 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s8, s3
1264 ; CHECK-LE-NEXT:    vmov.16 q1[2], r1
1265 ; CHECK-LE-NEXT:    vmov r1, s8
1266 ; CHECK-LE-NEXT:    vmov.16 q1[3], r1
1267 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1268 ; CHECK-LE-NEXT:    mov.w r1, #0
1269 ; CHECK-LE-NEXT:    vcmp.f32 s1, #0
1270 ; CHECK-LE-NEXT:    it gt
1271 ; CHECK-LE-NEXT:    movgt r1, #1
1272 ; CHECK-LE-NEXT:    cmp r1, #0
1273 ; CHECK-LE-NEXT:    cset r1, ne
1274 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1275 ; CHECK-LE-NEXT:    and r1, r1, #1
1276 ; CHECK-LE-NEXT:    vcmp.f32 s2, #0
1277 ; CHECK-LE-NEXT:    rsb.w r3, r1, #0
1278 ; CHECK-LE-NEXT:    mov.w r1, #0
1279 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
1280 ; CHECK-LE-NEXT:    mov.w r3, #0
1281 ; CHECK-LE-NEXT:    it gt
1282 ; CHECK-LE-NEXT:    movgt r3, #1
1283 ; CHECK-LE-NEXT:    cmp r3, #0
1284 ; CHECK-LE-NEXT:    cset r3, ne
1285 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1286 ; CHECK-LE-NEXT:    and r3, r3, #1
1287 ; CHECK-LE-NEXT:    vcmp.f32 s3, #0
1288 ; CHECK-LE-NEXT:    rsb.w r3, r3, #0
1289 ; CHECK-LE-NEXT:    mov.w r2, #0
1290 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
1291 ; CHECK-LE-NEXT:    mov.w r3, #0
1292 ; CHECK-LE-NEXT:    it gt
1293 ; CHECK-LE-NEXT:    movgt r3, #1
1294 ; CHECK-LE-NEXT:    cmp r3, #0
1295 ; CHECK-LE-NEXT:    cset r3, ne
1296 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1297 ; CHECK-LE-NEXT:    it gt
1298 ; CHECK-LE-NEXT:    movgt r2, #1
1299 ; CHECK-LE-NEXT:    cmp r2, #0
1300 ; CHECK-LE-NEXT:    and r3, r3, #1
1301 ; CHECK-LE-NEXT:    cset r2, ne
1302 ; CHECK-LE-NEXT:    and r2, r2, #1
1303 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
1304 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
1305 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
1306 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1307 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1308 ; CHECK-LE-NEXT:    bne .LBB25_5
1309 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1310 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1311 ; CHECK-LE-NEXT:    bmi .LBB25_6
1312 ; CHECK-LE-NEXT:  .LBB25_2: @ %else2
1313 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1314 ; CHECK-LE-NEXT:    bmi .LBB25_7
1315 ; CHECK-LE-NEXT:  .LBB25_3: @ %else4
1316 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1317 ; CHECK-LE-NEXT:    bmi .LBB25_8
1318 ; CHECK-LE-NEXT:  .LBB25_4: @ %else6
1319 ; CHECK-LE-NEXT:    add sp, #4
1320 ; CHECK-LE-NEXT:    bx lr
1321 ; CHECK-LE-NEXT:  .LBB25_5: @ %cond.store
1322 ; CHECK-LE-NEXT:    vstr.16 s4, [r0]
1323 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1324 ; CHECK-LE-NEXT:    bpl .LBB25_2
1325 ; CHECK-LE-NEXT:  .LBB25_6: @ %cond.store1
1326 ; CHECK-LE-NEXT:    vmovx.f16 s0, s4
1327 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #2]
1328 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1329 ; CHECK-LE-NEXT:    bpl .LBB25_3
1330 ; CHECK-LE-NEXT:  .LBB25_7: @ %cond.store3
1331 ; CHECK-LE-NEXT:    vstr.16 s5, [r0, #4]
1332 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1333 ; CHECK-LE-NEXT:    bpl .LBB25_4
1334 ; CHECK-LE-NEXT:  .LBB25_8: @ %cond.store5
1335 ; CHECK-LE-NEXT:    vmovx.f16 s0, s5
1336 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #6]
1337 ; CHECK-LE-NEXT:    add sp, #4
1338 ; CHECK-LE-NEXT:    bx lr
1340 ; CHECK-BE-LABEL: masked_v4f16_align4:
1341 ; CHECK-BE:       @ %bb.0: @ %entry
1342 ; CHECK-BE-NEXT:    .pad #4
1343 ; CHECK-BE-NEXT:    sub sp, #4
1344 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1345 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s4
1346 ; CHECK-BE-NEXT:    vcmp.f32 s4, #0
1347 ; CHECK-BE-NEXT:    vmov r1, s0
1348 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s5
1349 ; CHECK-BE-NEXT:    vmov r2, s0
1350 ; CHECK-BE-NEXT:    vmov.16 q0[0], r1
1351 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s8, s6
1352 ; CHECK-BE-NEXT:    vmov.16 q0[1], r2
1353 ; CHECK-BE-NEXT:    vmov r1, s8
1354 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s8, s7
1355 ; CHECK-BE-NEXT:    vmov.16 q0[2], r1
1356 ; CHECK-BE-NEXT:    vmov r1, s8
1357 ; CHECK-BE-NEXT:    vmov.16 q0[3], r1
1358 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1359 ; CHECK-BE-NEXT:    mov.w r1, #0
1360 ; CHECK-BE-NEXT:    vcmp.f32 s5, #0
1361 ; CHECK-BE-NEXT:    it gt
1362 ; CHECK-BE-NEXT:    movgt r1, #1
1363 ; CHECK-BE-NEXT:    cmp r1, #0
1364 ; CHECK-BE-NEXT:    cset r1, ne
1365 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1366 ; CHECK-BE-NEXT:    and r1, r1, #1
1367 ; CHECK-BE-NEXT:    vcmp.f32 s6, #0
1368 ; CHECK-BE-NEXT:    rsb.w r3, r1, #0
1369 ; CHECK-BE-NEXT:    mov.w r1, #0
1370 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
1371 ; CHECK-BE-NEXT:    mov.w r3, #0
1372 ; CHECK-BE-NEXT:    it gt
1373 ; CHECK-BE-NEXT:    movgt r3, #1
1374 ; CHECK-BE-NEXT:    cmp r3, #0
1375 ; CHECK-BE-NEXT:    cset r3, ne
1376 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1377 ; CHECK-BE-NEXT:    and r3, r3, #1
1378 ; CHECK-BE-NEXT:    vcmp.f32 s7, #0
1379 ; CHECK-BE-NEXT:    rsb.w r3, r3, #0
1380 ; CHECK-BE-NEXT:    mov.w r2, #0
1381 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
1382 ; CHECK-BE-NEXT:    mov.w r3, #0
1383 ; CHECK-BE-NEXT:    it gt
1384 ; CHECK-BE-NEXT:    movgt r3, #1
1385 ; CHECK-BE-NEXT:    cmp r3, #0
1386 ; CHECK-BE-NEXT:    cset r3, ne
1387 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1388 ; CHECK-BE-NEXT:    it gt
1389 ; CHECK-BE-NEXT:    movgt r2, #1
1390 ; CHECK-BE-NEXT:    cmp r2, #0
1391 ; CHECK-BE-NEXT:    and r3, r3, #1
1392 ; CHECK-BE-NEXT:    cset r2, ne
1393 ; CHECK-BE-NEXT:    and r2, r2, #1
1394 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1395 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
1396 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1397 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1398 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1399 ; CHECK-BE-NEXT:    bne .LBB25_5
1400 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1401 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1402 ; CHECK-BE-NEXT:    bmi .LBB25_6
1403 ; CHECK-BE-NEXT:  .LBB25_2: @ %else2
1404 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1405 ; CHECK-BE-NEXT:    bmi .LBB25_7
1406 ; CHECK-BE-NEXT:  .LBB25_3: @ %else4
1407 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1408 ; CHECK-BE-NEXT:    bmi .LBB25_8
1409 ; CHECK-BE-NEXT:  .LBB25_4: @ %else6
1410 ; CHECK-BE-NEXT:    add sp, #4
1411 ; CHECK-BE-NEXT:    bx lr
1412 ; CHECK-BE-NEXT:  .LBB25_5: @ %cond.store
1413 ; CHECK-BE-NEXT:    vstr.16 s0, [r0]
1414 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1415 ; CHECK-BE-NEXT:    bpl .LBB25_2
1416 ; CHECK-BE-NEXT:  .LBB25_6: @ %cond.store1
1417 ; CHECK-BE-NEXT:    vmovx.f16 s4, s0
1418 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #2]
1419 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1420 ; CHECK-BE-NEXT:    bpl .LBB25_3
1421 ; CHECK-BE-NEXT:  .LBB25_7: @ %cond.store3
1422 ; CHECK-BE-NEXT:    vstr.16 s1, [r0, #4]
1423 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1424 ; CHECK-BE-NEXT:    bpl .LBB25_4
1425 ; CHECK-BE-NEXT:  .LBB25_8: @ %cond.store5
1426 ; CHECK-BE-NEXT:    vmovx.f16 s0, s1
1427 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #6]
1428 ; CHECK-BE-NEXT:    add sp, #4
1429 ; CHECK-BE-NEXT:    bx lr
1430 entry:
1431   %c = fcmp ogt <4 x float> %a, zeroinitializer
1432   %trunc = fptrunc <4 x float> %a to <4 x half>
1433   call void @llvm.masked.store.v4f16.p0v4f16(<4 x half> %trunc, <4 x half>* %dest, i32 4, <4 x i1> %c)
1434   ret void
1437 define arm_aapcs_vfpcc void @masked_v4f16_align2(<4 x half> *%dest, <4 x float> %a) {
1438 ; CHECK-LE-LABEL: masked_v4f16_align2:
1439 ; CHECK-LE:       @ %bb.0: @ %entry
1440 ; CHECK-LE-NEXT:    .pad #4
1441 ; CHECK-LE-NEXT:    sub sp, #4
1442 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s0
1443 ; CHECK-LE-NEXT:    vcmp.f32 s0, #0
1444 ; CHECK-LE-NEXT:    vmov r1, s4
1445 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s1
1446 ; CHECK-LE-NEXT:    vmov r2, s4
1447 ; CHECK-LE-NEXT:    vmov.16 q1[0], r1
1448 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s8, s2
1449 ; CHECK-LE-NEXT:    vmov.16 q1[1], r2
1450 ; CHECK-LE-NEXT:    vmov r1, s8
1451 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s8, s3
1452 ; CHECK-LE-NEXT:    vmov.16 q1[2], r1
1453 ; CHECK-LE-NEXT:    vmov r1, s8
1454 ; CHECK-LE-NEXT:    vmov.16 q1[3], r1
1455 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1456 ; CHECK-LE-NEXT:    mov.w r1, #0
1457 ; CHECK-LE-NEXT:    vcmp.f32 s1, #0
1458 ; CHECK-LE-NEXT:    it gt
1459 ; CHECK-LE-NEXT:    movgt r1, #1
1460 ; CHECK-LE-NEXT:    cmp r1, #0
1461 ; CHECK-LE-NEXT:    cset r1, ne
1462 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1463 ; CHECK-LE-NEXT:    and r1, r1, #1
1464 ; CHECK-LE-NEXT:    vcmp.f32 s2, #0
1465 ; CHECK-LE-NEXT:    rsb.w r3, r1, #0
1466 ; CHECK-LE-NEXT:    mov.w r1, #0
1467 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
1468 ; CHECK-LE-NEXT:    mov.w r3, #0
1469 ; CHECK-LE-NEXT:    it gt
1470 ; CHECK-LE-NEXT:    movgt r3, #1
1471 ; CHECK-LE-NEXT:    cmp r3, #0
1472 ; CHECK-LE-NEXT:    cset r3, ne
1473 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1474 ; CHECK-LE-NEXT:    and r3, r3, #1
1475 ; CHECK-LE-NEXT:    vcmp.f32 s3, #0
1476 ; CHECK-LE-NEXT:    rsb.w r3, r3, #0
1477 ; CHECK-LE-NEXT:    mov.w r2, #0
1478 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
1479 ; CHECK-LE-NEXT:    mov.w r3, #0
1480 ; CHECK-LE-NEXT:    it gt
1481 ; CHECK-LE-NEXT:    movgt r3, #1
1482 ; CHECK-LE-NEXT:    cmp r3, #0
1483 ; CHECK-LE-NEXT:    cset r3, ne
1484 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1485 ; CHECK-LE-NEXT:    it gt
1486 ; CHECK-LE-NEXT:    movgt r2, #1
1487 ; CHECK-LE-NEXT:    cmp r2, #0
1488 ; CHECK-LE-NEXT:    and r3, r3, #1
1489 ; CHECK-LE-NEXT:    cset r2, ne
1490 ; CHECK-LE-NEXT:    and r2, r2, #1
1491 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
1492 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
1493 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
1494 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1495 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1496 ; CHECK-LE-NEXT:    bne .LBB26_5
1497 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1498 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1499 ; CHECK-LE-NEXT:    bmi .LBB26_6
1500 ; CHECK-LE-NEXT:  .LBB26_2: @ %else2
1501 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1502 ; CHECK-LE-NEXT:    bmi .LBB26_7
1503 ; CHECK-LE-NEXT:  .LBB26_3: @ %else4
1504 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1505 ; CHECK-LE-NEXT:    bmi .LBB26_8
1506 ; CHECK-LE-NEXT:  .LBB26_4: @ %else6
1507 ; CHECK-LE-NEXT:    add sp, #4
1508 ; CHECK-LE-NEXT:    bx lr
1509 ; CHECK-LE-NEXT:  .LBB26_5: @ %cond.store
1510 ; CHECK-LE-NEXT:    vstr.16 s4, [r0]
1511 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1512 ; CHECK-LE-NEXT:    bpl .LBB26_2
1513 ; CHECK-LE-NEXT:  .LBB26_6: @ %cond.store1
1514 ; CHECK-LE-NEXT:    vmovx.f16 s0, s4
1515 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #2]
1516 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1517 ; CHECK-LE-NEXT:    bpl .LBB26_3
1518 ; CHECK-LE-NEXT:  .LBB26_7: @ %cond.store3
1519 ; CHECK-LE-NEXT:    vstr.16 s5, [r0, #4]
1520 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1521 ; CHECK-LE-NEXT:    bpl .LBB26_4
1522 ; CHECK-LE-NEXT:  .LBB26_8: @ %cond.store5
1523 ; CHECK-LE-NEXT:    vmovx.f16 s0, s5
1524 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #6]
1525 ; CHECK-LE-NEXT:    add sp, #4
1526 ; CHECK-LE-NEXT:    bx lr
1528 ; CHECK-BE-LABEL: masked_v4f16_align2:
1529 ; CHECK-BE:       @ %bb.0: @ %entry
1530 ; CHECK-BE-NEXT:    .pad #4
1531 ; CHECK-BE-NEXT:    sub sp, #4
1532 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1533 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s4
1534 ; CHECK-BE-NEXT:    vcmp.f32 s4, #0
1535 ; CHECK-BE-NEXT:    vmov r1, s0
1536 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s5
1537 ; CHECK-BE-NEXT:    vmov r2, s0
1538 ; CHECK-BE-NEXT:    vmov.16 q0[0], r1
1539 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s8, s6
1540 ; CHECK-BE-NEXT:    vmov.16 q0[1], r2
1541 ; CHECK-BE-NEXT:    vmov r1, s8
1542 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s8, s7
1543 ; CHECK-BE-NEXT:    vmov.16 q0[2], r1
1544 ; CHECK-BE-NEXT:    vmov r1, s8
1545 ; CHECK-BE-NEXT:    vmov.16 q0[3], r1
1546 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1547 ; CHECK-BE-NEXT:    mov.w r1, #0
1548 ; CHECK-BE-NEXT:    vcmp.f32 s5, #0
1549 ; CHECK-BE-NEXT:    it gt
1550 ; CHECK-BE-NEXT:    movgt r1, #1
1551 ; CHECK-BE-NEXT:    cmp r1, #0
1552 ; CHECK-BE-NEXT:    cset r1, ne
1553 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1554 ; CHECK-BE-NEXT:    and r1, r1, #1
1555 ; CHECK-BE-NEXT:    vcmp.f32 s6, #0
1556 ; CHECK-BE-NEXT:    rsb.w r3, r1, #0
1557 ; CHECK-BE-NEXT:    mov.w r1, #0
1558 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
1559 ; CHECK-BE-NEXT:    mov.w r3, #0
1560 ; CHECK-BE-NEXT:    it gt
1561 ; CHECK-BE-NEXT:    movgt r3, #1
1562 ; CHECK-BE-NEXT:    cmp r3, #0
1563 ; CHECK-BE-NEXT:    cset r3, ne
1564 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1565 ; CHECK-BE-NEXT:    and r3, r3, #1
1566 ; CHECK-BE-NEXT:    vcmp.f32 s7, #0
1567 ; CHECK-BE-NEXT:    rsb.w r3, r3, #0
1568 ; CHECK-BE-NEXT:    mov.w r2, #0
1569 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
1570 ; CHECK-BE-NEXT:    mov.w r3, #0
1571 ; CHECK-BE-NEXT:    it gt
1572 ; CHECK-BE-NEXT:    movgt r3, #1
1573 ; CHECK-BE-NEXT:    cmp r3, #0
1574 ; CHECK-BE-NEXT:    cset r3, ne
1575 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1576 ; CHECK-BE-NEXT:    it gt
1577 ; CHECK-BE-NEXT:    movgt r2, #1
1578 ; CHECK-BE-NEXT:    cmp r2, #0
1579 ; CHECK-BE-NEXT:    and r3, r3, #1
1580 ; CHECK-BE-NEXT:    cset r2, ne
1581 ; CHECK-BE-NEXT:    and r2, r2, #1
1582 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1583 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
1584 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1585 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1586 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1587 ; CHECK-BE-NEXT:    bne .LBB26_5
1588 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1589 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1590 ; CHECK-BE-NEXT:    bmi .LBB26_6
1591 ; CHECK-BE-NEXT:  .LBB26_2: @ %else2
1592 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1593 ; CHECK-BE-NEXT:    bmi .LBB26_7
1594 ; CHECK-BE-NEXT:  .LBB26_3: @ %else4
1595 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1596 ; CHECK-BE-NEXT:    bmi .LBB26_8
1597 ; CHECK-BE-NEXT:  .LBB26_4: @ %else6
1598 ; CHECK-BE-NEXT:    add sp, #4
1599 ; CHECK-BE-NEXT:    bx lr
1600 ; CHECK-BE-NEXT:  .LBB26_5: @ %cond.store
1601 ; CHECK-BE-NEXT:    vstr.16 s0, [r0]
1602 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1603 ; CHECK-BE-NEXT:    bpl .LBB26_2
1604 ; CHECK-BE-NEXT:  .LBB26_6: @ %cond.store1
1605 ; CHECK-BE-NEXT:    vmovx.f16 s4, s0
1606 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #2]
1607 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1608 ; CHECK-BE-NEXT:    bpl .LBB26_3
1609 ; CHECK-BE-NEXT:  .LBB26_7: @ %cond.store3
1610 ; CHECK-BE-NEXT:    vstr.16 s1, [r0, #4]
1611 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1612 ; CHECK-BE-NEXT:    bpl .LBB26_4
1613 ; CHECK-BE-NEXT:  .LBB26_8: @ %cond.store5
1614 ; CHECK-BE-NEXT:    vmovx.f16 s0, s1
1615 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #6]
1616 ; CHECK-BE-NEXT:    add sp, #4
1617 ; CHECK-BE-NEXT:    bx lr
1618 entry:
1619   %c = fcmp ogt <4 x float> %a, zeroinitializer
1620   %trunc = fptrunc <4 x float> %a to <4 x half>
1621   call void @llvm.masked.store.v4f16.p0v4f16(<4 x half> %trunc, <4 x half>* %dest, i32 2, <4 x i1> %c)
1622   ret void
1625 define arm_aapcs_vfpcc void @masked_v4f16_align1(<4 x half> *%dest, <4 x float> %a) {
1626 ; CHECK-LE-LABEL: masked_v4f16_align1:
1627 ; CHECK-LE:       @ %bb.0: @ %entry
1628 ; CHECK-LE-NEXT:    .pad #20
1629 ; CHECK-LE-NEXT:    sub sp, #20
1630 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s0
1631 ; CHECK-LE-NEXT:    vcmp.f32 s0, #0
1632 ; CHECK-LE-NEXT:    vmov r1, s4
1633 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s1
1634 ; CHECK-LE-NEXT:    vmov r2, s4
1635 ; CHECK-LE-NEXT:    vmov.16 q1[0], r1
1636 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s8, s2
1637 ; CHECK-LE-NEXT:    vmov.16 q1[1], r2
1638 ; CHECK-LE-NEXT:    vmov r1, s8
1639 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s8, s3
1640 ; CHECK-LE-NEXT:    vmov.16 q1[2], r1
1641 ; CHECK-LE-NEXT:    vmov r1, s8
1642 ; CHECK-LE-NEXT:    vmov.16 q1[3], r1
1643 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1644 ; CHECK-LE-NEXT:    mov.w r1, #0
1645 ; CHECK-LE-NEXT:    vcmp.f32 s1, #0
1646 ; CHECK-LE-NEXT:    it gt
1647 ; CHECK-LE-NEXT:    movgt r1, #1
1648 ; CHECK-LE-NEXT:    cmp r1, #0
1649 ; CHECK-LE-NEXT:    cset r1, ne
1650 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1651 ; CHECK-LE-NEXT:    and r1, r1, #1
1652 ; CHECK-LE-NEXT:    vcmp.f32 s2, #0
1653 ; CHECK-LE-NEXT:    rsb.w r3, r1, #0
1654 ; CHECK-LE-NEXT:    mov.w r1, #0
1655 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
1656 ; CHECK-LE-NEXT:    mov.w r3, #0
1657 ; CHECK-LE-NEXT:    it gt
1658 ; CHECK-LE-NEXT:    movgt r3, #1
1659 ; CHECK-LE-NEXT:    cmp r3, #0
1660 ; CHECK-LE-NEXT:    cset r3, ne
1661 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1662 ; CHECK-LE-NEXT:    and r3, r3, #1
1663 ; CHECK-LE-NEXT:    vcmp.f32 s3, #0
1664 ; CHECK-LE-NEXT:    rsb.w r3, r3, #0
1665 ; CHECK-LE-NEXT:    mov.w r2, #0
1666 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
1667 ; CHECK-LE-NEXT:    mov.w r3, #0
1668 ; CHECK-LE-NEXT:    it gt
1669 ; CHECK-LE-NEXT:    movgt r3, #1
1670 ; CHECK-LE-NEXT:    cmp r3, #0
1671 ; CHECK-LE-NEXT:    cset r3, ne
1672 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1673 ; CHECK-LE-NEXT:    it gt
1674 ; CHECK-LE-NEXT:    movgt r2, #1
1675 ; CHECK-LE-NEXT:    cmp r2, #0
1676 ; CHECK-LE-NEXT:    and r3, r3, #1
1677 ; CHECK-LE-NEXT:    cset r2, ne
1678 ; CHECK-LE-NEXT:    and r2, r2, #1
1679 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
1680 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
1681 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
1682 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1683 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1684 ; CHECK-LE-NEXT:    bne .LBB27_5
1685 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1686 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1687 ; CHECK-LE-NEXT:    bmi .LBB27_6
1688 ; CHECK-LE-NEXT:  .LBB27_2: @ %else2
1689 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1690 ; CHECK-LE-NEXT:    bmi .LBB27_7
1691 ; CHECK-LE-NEXT:  .LBB27_3: @ %else4
1692 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1693 ; CHECK-LE-NEXT:    bmi .LBB27_8
1694 ; CHECK-LE-NEXT:  .LBB27_4: @ %else6
1695 ; CHECK-LE-NEXT:    add sp, #20
1696 ; CHECK-LE-NEXT:    bx lr
1697 ; CHECK-LE-NEXT:  .LBB27_5: @ %cond.store
1698 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #12]
1699 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #12]
1700 ; CHECK-LE-NEXT:    strh r2, [r0]
1701 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1702 ; CHECK-LE-NEXT:    bpl .LBB27_2
1703 ; CHECK-LE-NEXT:  .LBB27_6: @ %cond.store1
1704 ; CHECK-LE-NEXT:    vmovx.f16 s0, s4
1705 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #8]
1706 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #8]
1707 ; CHECK-LE-NEXT:    strh r2, [r0, #2]
1708 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1709 ; CHECK-LE-NEXT:    bpl .LBB27_3
1710 ; CHECK-LE-NEXT:  .LBB27_7: @ %cond.store3
1711 ; CHECK-LE-NEXT:    vstr.16 s5, [sp, #4]
1712 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #4]
1713 ; CHECK-LE-NEXT:    strh r2, [r0, #4]
1714 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1715 ; CHECK-LE-NEXT:    bpl .LBB27_4
1716 ; CHECK-LE-NEXT:  .LBB27_8: @ %cond.store5
1717 ; CHECK-LE-NEXT:    vmovx.f16 s0, s5
1718 ; CHECK-LE-NEXT:    vstr.16 s0, [sp]
1719 ; CHECK-LE-NEXT:    ldrh.w r1, [sp]
1720 ; CHECK-LE-NEXT:    strh r1, [r0, #6]
1721 ; CHECK-LE-NEXT:    add sp, #20
1722 ; CHECK-LE-NEXT:    bx lr
1724 ; CHECK-BE-LABEL: masked_v4f16_align1:
1725 ; CHECK-BE:       @ %bb.0: @ %entry
1726 ; CHECK-BE-NEXT:    .pad #20
1727 ; CHECK-BE-NEXT:    sub sp, #20
1728 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1729 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s4
1730 ; CHECK-BE-NEXT:    vcmp.f32 s4, #0
1731 ; CHECK-BE-NEXT:    vmov r1, s0
1732 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s5
1733 ; CHECK-BE-NEXT:    vmov r2, s0
1734 ; CHECK-BE-NEXT:    vmov.16 q0[0], r1
1735 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s8, s6
1736 ; CHECK-BE-NEXT:    vmov.16 q0[1], r2
1737 ; CHECK-BE-NEXT:    vmov r1, s8
1738 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s8, s7
1739 ; CHECK-BE-NEXT:    vmov.16 q0[2], r1
1740 ; CHECK-BE-NEXT:    vmov r1, s8
1741 ; CHECK-BE-NEXT:    vmov.16 q0[3], r1
1742 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1743 ; CHECK-BE-NEXT:    mov.w r1, #0
1744 ; CHECK-BE-NEXT:    vcmp.f32 s5, #0
1745 ; CHECK-BE-NEXT:    it gt
1746 ; CHECK-BE-NEXT:    movgt r1, #1
1747 ; CHECK-BE-NEXT:    cmp r1, #0
1748 ; CHECK-BE-NEXT:    cset r1, ne
1749 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1750 ; CHECK-BE-NEXT:    and r1, r1, #1
1751 ; CHECK-BE-NEXT:    vcmp.f32 s6, #0
1752 ; CHECK-BE-NEXT:    rsb.w r3, r1, #0
1753 ; CHECK-BE-NEXT:    mov.w r1, #0
1754 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
1755 ; CHECK-BE-NEXT:    mov.w r3, #0
1756 ; CHECK-BE-NEXT:    it gt
1757 ; CHECK-BE-NEXT:    movgt r3, #1
1758 ; CHECK-BE-NEXT:    cmp r3, #0
1759 ; CHECK-BE-NEXT:    cset r3, ne
1760 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1761 ; CHECK-BE-NEXT:    and r3, r3, #1
1762 ; CHECK-BE-NEXT:    vcmp.f32 s7, #0
1763 ; CHECK-BE-NEXT:    rsb.w r3, r3, #0
1764 ; CHECK-BE-NEXT:    mov.w r2, #0
1765 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
1766 ; CHECK-BE-NEXT:    mov.w r3, #0
1767 ; CHECK-BE-NEXT:    it gt
1768 ; CHECK-BE-NEXT:    movgt r3, #1
1769 ; CHECK-BE-NEXT:    cmp r3, #0
1770 ; CHECK-BE-NEXT:    cset r3, ne
1771 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1772 ; CHECK-BE-NEXT:    it gt
1773 ; CHECK-BE-NEXT:    movgt r2, #1
1774 ; CHECK-BE-NEXT:    cmp r2, #0
1775 ; CHECK-BE-NEXT:    and r3, r3, #1
1776 ; CHECK-BE-NEXT:    cset r2, ne
1777 ; CHECK-BE-NEXT:    and r2, r2, #1
1778 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1779 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
1780 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1781 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1782 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1783 ; CHECK-BE-NEXT:    bne .LBB27_5
1784 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1785 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1786 ; CHECK-BE-NEXT:    bmi .LBB27_6
1787 ; CHECK-BE-NEXT:  .LBB27_2: @ %else2
1788 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1789 ; CHECK-BE-NEXT:    bmi .LBB27_7
1790 ; CHECK-BE-NEXT:  .LBB27_3: @ %else4
1791 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1792 ; CHECK-BE-NEXT:    bmi .LBB27_8
1793 ; CHECK-BE-NEXT:  .LBB27_4: @ %else6
1794 ; CHECK-BE-NEXT:    add sp, #20
1795 ; CHECK-BE-NEXT:    bx lr
1796 ; CHECK-BE-NEXT:  .LBB27_5: @ %cond.store
1797 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #12]
1798 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #12]
1799 ; CHECK-BE-NEXT:    strh r2, [r0]
1800 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1801 ; CHECK-BE-NEXT:    bpl .LBB27_2
1802 ; CHECK-BE-NEXT:  .LBB27_6: @ %cond.store1
1803 ; CHECK-BE-NEXT:    vmovx.f16 s4, s0
1804 ; CHECK-BE-NEXT:    vstr.16 s4, [sp, #8]
1805 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #8]
1806 ; CHECK-BE-NEXT:    strh r2, [r0, #2]
1807 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1808 ; CHECK-BE-NEXT:    bpl .LBB27_3
1809 ; CHECK-BE-NEXT:  .LBB27_7: @ %cond.store3
1810 ; CHECK-BE-NEXT:    vstr.16 s1, [sp, #4]
1811 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #4]
1812 ; CHECK-BE-NEXT:    strh r2, [r0, #4]
1813 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1814 ; CHECK-BE-NEXT:    bpl .LBB27_4
1815 ; CHECK-BE-NEXT:  .LBB27_8: @ %cond.store5
1816 ; CHECK-BE-NEXT:    vmovx.f16 s0, s1
1817 ; CHECK-BE-NEXT:    vstr.16 s0, [sp]
1818 ; CHECK-BE-NEXT:    ldrh.w r1, [sp]
1819 ; CHECK-BE-NEXT:    strh r1, [r0, #6]
1820 ; CHECK-BE-NEXT:    add sp, #20
1821 ; CHECK-BE-NEXT:    bx lr
1822 entry:
1823   %c = fcmp ogt <4 x float> %a, zeroinitializer
1824   %trunc = fptrunc <4 x float> %a to <4 x half>
1825   call void @llvm.masked.store.v4f16.p0v4f16(<4 x half> %trunc, <4 x half>* %dest, i32 1, <4 x i1> %c)
1826   ret void
1829 declare void @llvm.masked.store.v4i8.p0v4i8(<4 x i8>, <4 x i8>*, i32, <4 x i1>)
1830 declare void @llvm.masked.store.v8i8.p0v8i8(<8 x i8>, <8 x i8>*, i32, <8 x i1>)
1831 declare void @llvm.masked.store.v4i16.p0v4i16(<4 x i16>, <4 x i16>*, i32, <4 x i1>)
1832 declare void @llvm.masked.store.v4i32.p0v4i32(<4 x i32>, <4 x i32>*, i32, <4 x i1>)
1833 declare void @llvm.masked.store.v8i16.p0v8i16(<8 x i16>, <8 x i16>*, i32, <8 x i1>)
1834 declare void @llvm.masked.store.v16i8.p0v16i8(<16 x i8>, <16 x i8>*, i32, <16 x i1>)
1835 declare void @llvm.masked.store.v4f32.p0v4f32(<4 x float>, <4 x float>*, i32, <4 x i1>)
1836 declare void @llvm.masked.store.v4f16.p0v4f16(<4 x half>, <4 x half>*, i32, <4 x i1>)
1837 declare void @llvm.masked.store.v8f16.p0v8f16(<8 x half>, <8 x half>*, i32, <8 x i1>)
1838 declare void @llvm.masked.store.v2i64.p0v2i64(<2 x i64>, <2 x i64>*, i32, <2 x i1>)
1839 declare void @llvm.masked.store.v2f64.p0v2f64(<2 x double>, <2 x double>*, i32, <2 x i1>)