[ARM] Generate 8.1-m CSINC, CSNEG and CSINV instructions.
[llvm-core.git] / test / CodeGen / Thumb2 / mve-masked-store.ll
blob3ff1dec821dff3a94849de4ca4610447b5626359
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 -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 -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:    .pad #4
9 ; CHECK-LE-NEXT:    sub sp, #4
10 ; CHECK-LE-NEXT:    mov r1, sp
11 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
12 ; CHECK-LE-NEXT:    vstr p0, [r1]
13 ; CHECK-LE-NEXT:    ldrb.w r1, [sp]
14 ; CHECK-LE-NEXT:    lsls r2, r1, #31
15 ; CHECK-LE-NEXT:    itt ne
16 ; CHECK-LE-NEXT:    vmovne r2, s0
17 ; CHECK-LE-NEXT:    strne r2, [r0]
18 ; CHECK-LE-NEXT:    lsls r2, r1, #30
19 ; CHECK-LE-NEXT:    itt mi
20 ; CHECK-LE-NEXT:    vmovmi r2, s1
21 ; CHECK-LE-NEXT:    strmi r2, [r0, #4]
22 ; CHECK-LE-NEXT:    lsls r2, r1, #29
23 ; CHECK-LE-NEXT:    itt mi
24 ; CHECK-LE-NEXT:    vmovmi r2, s2
25 ; CHECK-LE-NEXT:    strmi r2, [r0, #8]
26 ; CHECK-LE-NEXT:    lsls r1, r1, #28
27 ; CHECK-LE-NEXT:    itt mi
28 ; CHECK-LE-NEXT:    vmovmi r1, s3
29 ; CHECK-LE-NEXT:    strmi r1, [r0, #12]
30 ; CHECK-LE-NEXT:    add sp, #4
31 ; CHECK-LE-NEXT:    bx lr
33 ; CHECK-BE-LABEL: masked_v4i32:
34 ; CHECK-BE:       @ %bb.0: @ %entry
35 ; CHECK-BE-NEXT:    .pad #4
36 ; CHECK-BE-NEXT:    sub sp, #4
37 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
38 ; CHECK-BE-NEXT:    mov r1, sp
39 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
40 ; CHECK-BE-NEXT:    vstr p0, [r1]
41 ; CHECK-BE-NEXT:    ldrb.w r1, [sp]
42 ; CHECK-BE-NEXT:    lsls r2, r1, #31
43 ; CHECK-BE-NEXT:    itt ne
44 ; CHECK-BE-NEXT:    vmovne r2, s4
45 ; CHECK-BE-NEXT:    strne r2, [r0]
46 ; CHECK-BE-NEXT:    lsls r2, r1, #30
47 ; CHECK-BE-NEXT:    itt mi
48 ; CHECK-BE-NEXT:    vmovmi r2, s5
49 ; CHECK-BE-NEXT:    strmi r2, [r0, #4]
50 ; CHECK-BE-NEXT:    lsls r2, r1, #29
51 ; CHECK-BE-NEXT:    itt mi
52 ; CHECK-BE-NEXT:    vmovmi r2, s6
53 ; CHECK-BE-NEXT:    strmi r2, [r0, #8]
54 ; CHECK-BE-NEXT:    lsls r1, r1, #28
55 ; CHECK-BE-NEXT:    itt mi
56 ; CHECK-BE-NEXT:    vmovmi r1, s7
57 ; CHECK-BE-NEXT:    strmi r1, [r0, #12]
58 ; CHECK-BE-NEXT:    add sp, #4
59 ; CHECK-BE-NEXT:    bx lr
60 entry:
61   %c = icmp sgt <4 x i32> %a, zeroinitializer
62   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %a, <4 x i32>* %dest, i32 4, <4 x i1> %c)
63   ret void
66 define arm_aapcs_vfpcc void @masked_v4i32_align1(<4 x i32> *%dest, <4 x i32> %a) {
67 ; CHECK-LE-LABEL: masked_v4i32_align1:
68 ; CHECK-LE:       @ %bb.0: @ %entry
69 ; CHECK-LE-NEXT:    .pad #4
70 ; CHECK-LE-NEXT:    sub sp, #4
71 ; CHECK-LE-NEXT:    mov r1, sp
72 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
73 ; CHECK-LE-NEXT:    vstr p0, [r1]
74 ; CHECK-LE-NEXT:    ldrb.w r1, [sp]
75 ; CHECK-LE-NEXT:    lsls r2, r1, #31
76 ; CHECK-LE-NEXT:    itt ne
77 ; CHECK-LE-NEXT:    vmovne r2, s0
78 ; CHECK-LE-NEXT:    strne r2, [r0]
79 ; CHECK-LE-NEXT:    lsls r2, r1, #30
80 ; CHECK-LE-NEXT:    itt mi
81 ; CHECK-LE-NEXT:    vmovmi r2, s1
82 ; CHECK-LE-NEXT:    strmi r2, [r0, #4]
83 ; CHECK-LE-NEXT:    lsls r2, r1, #29
84 ; CHECK-LE-NEXT:    itt mi
85 ; CHECK-LE-NEXT:    vmovmi r2, s2
86 ; CHECK-LE-NEXT:    strmi r2, [r0, #8]
87 ; CHECK-LE-NEXT:    lsls r1, r1, #28
88 ; CHECK-LE-NEXT:    itt mi
89 ; CHECK-LE-NEXT:    vmovmi r1, s3
90 ; CHECK-LE-NEXT:    strmi r1, [r0, #12]
91 ; CHECK-LE-NEXT:    add sp, #4
92 ; CHECK-LE-NEXT:    bx lr
94 ; CHECK-BE-LABEL: masked_v4i32_align1:
95 ; CHECK-BE:       @ %bb.0: @ %entry
96 ; CHECK-BE-NEXT:    .pad #4
97 ; CHECK-BE-NEXT:    sub sp, #4
98 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
99 ; CHECK-BE-NEXT:    mov r1, sp
100 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
101 ; CHECK-BE-NEXT:    vstr p0, [r1]
102 ; CHECK-BE-NEXT:    ldrb.w r1, [sp]
103 ; CHECK-BE-NEXT:    lsls r2, r1, #31
104 ; CHECK-BE-NEXT:    itt ne
105 ; CHECK-BE-NEXT:    vmovne r2, s4
106 ; CHECK-BE-NEXT:    strne r2, [r0]
107 ; CHECK-BE-NEXT:    lsls r2, r1, #30
108 ; CHECK-BE-NEXT:    itt mi
109 ; CHECK-BE-NEXT:    vmovmi r2, s5
110 ; CHECK-BE-NEXT:    strmi r2, [r0, #4]
111 ; CHECK-BE-NEXT:    lsls r2, r1, #29
112 ; CHECK-BE-NEXT:    itt mi
113 ; CHECK-BE-NEXT:    vmovmi r2, s6
114 ; CHECK-BE-NEXT:    strmi r2, [r0, #8]
115 ; CHECK-BE-NEXT:    lsls r1, r1, #28
116 ; CHECK-BE-NEXT:    itt mi
117 ; CHECK-BE-NEXT:    vmovmi r1, s7
118 ; CHECK-BE-NEXT:    strmi r1, [r0, #12]
119 ; CHECK-BE-NEXT:    add sp, #4
120 ; CHECK-BE-NEXT:    bx lr
121 entry:
122   %c = icmp sgt <4 x i32> %a, zeroinitializer
123   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %a, <4 x i32>* %dest, i32 1, <4 x i1> %c)
124   ret void
127 define i8* @masked_v4i32_pre(i8* %y, i8* %x, <4 x i32> %a) {
128 ; CHECK-LE-LABEL: masked_v4i32_pre:
129 ; CHECK-LE:       @ %bb.0: @ %entry
130 ; CHECK-LE-NEXT:    .pad #8
131 ; CHECK-LE-NEXT:    sub sp, #8
132 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
133 ; CHECK-LE-NEXT:    adds r0, #4
134 ; CHECK-LE-NEXT:    vmov d0, r2, r3
135 ; CHECK-LE-NEXT:    add r2, sp, #4
136 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
137 ; CHECK-LE-NEXT:    vstr p0, [r2]
138 ; CHECK-LE-NEXT:    ldrb.w r2, [sp, #4]
139 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
140 ; CHECK-LE-NEXT:    lsls r1, r2, #31
141 ; CHECK-LE-NEXT:    itt ne
142 ; CHECK-LE-NEXT:    vmovne r1, s0
143 ; CHECK-LE-NEXT:    strne r1, [r0]
144 ; CHECK-LE-NEXT:    lsls r1, r2, #30
145 ; CHECK-LE-NEXT:    itt mi
146 ; CHECK-LE-NEXT:    vmovmi r1, s1
147 ; CHECK-LE-NEXT:    strmi r1, [r0, #4]
148 ; CHECK-LE-NEXT:    lsls r1, r2, #29
149 ; CHECK-LE-NEXT:    itt mi
150 ; CHECK-LE-NEXT:    vmovmi r1, s2
151 ; CHECK-LE-NEXT:    strmi r1, [r0, #8]
152 ; CHECK-LE-NEXT:    lsls r1, r2, #28
153 ; CHECK-LE-NEXT:    itt mi
154 ; CHECK-LE-NEXT:    vmovmi r1, s3
155 ; CHECK-LE-NEXT:    strmi r1, [r0, #12]
156 ; CHECK-LE-NEXT:    add sp, #8
157 ; CHECK-LE-NEXT:    bx lr
159 ; CHECK-BE-LABEL: masked_v4i32_pre:
160 ; CHECK-BE:       @ %bb.0: @ %entry
161 ; CHECK-BE-NEXT:    .pad #8
162 ; CHECK-BE-NEXT:    sub sp, #8
163 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
164 ; CHECK-BE-NEXT:    adds r0, #4
165 ; CHECK-BE-NEXT:    vmov d0, r3, r2
166 ; CHECK-BE-NEXT:    add r2, sp, #4
167 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
168 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
169 ; CHECK-BE-NEXT:    vstr p0, [r2]
170 ; CHECK-BE-NEXT:    ldrb.w r2, [sp, #4]
171 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
172 ; CHECK-BE-NEXT:    lsls r1, r2, #31
173 ; CHECK-BE-NEXT:    itt ne
174 ; CHECK-BE-NEXT:    vmovne r1, s0
175 ; CHECK-BE-NEXT:    strne r1, [r0]
176 ; CHECK-BE-NEXT:    lsls r1, r2, #30
177 ; CHECK-BE-NEXT:    itt mi
178 ; CHECK-BE-NEXT:    vmovmi r1, s1
179 ; CHECK-BE-NEXT:    strmi r1, [r0, #4]
180 ; CHECK-BE-NEXT:    lsls r1, r2, #29
181 ; CHECK-BE-NEXT:    itt mi
182 ; CHECK-BE-NEXT:    vmovmi r1, s2
183 ; CHECK-BE-NEXT:    strmi r1, [r0, #8]
184 ; CHECK-BE-NEXT:    lsls r1, r2, #28
185 ; CHECK-BE-NEXT:    itt mi
186 ; CHECK-BE-NEXT:    vmovmi r1, s3
187 ; CHECK-BE-NEXT:    strmi r1, [r0, #12]
188 ; CHECK-BE-NEXT:    add sp, #8
189 ; CHECK-BE-NEXT:    bx lr
190 entry:
191   %z = getelementptr inbounds i8, i8* %y, i32 4
192   %0 = bitcast i8* %x to <4 x i32>*
193   %1 = load <4 x i32>, <4 x i32>* %0, align 4
194   %2 = bitcast i8* %z to <4 x i32>*
195   %c = icmp sgt <4 x i32> %a, zeroinitializer
196   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %1, <4 x i32>* %2, i32 4, <4 x i1> %c)
197   ret i8* %z
200 define i8* @masked_v4i32_post(i8* %y, i8* %x, <4 x i32> %a) {
201 ; CHECK-LE-LABEL: masked_v4i32_post:
202 ; CHECK-LE:       @ %bb.0: @ %entry
203 ; CHECK-LE-NEXT:    .pad #8
204 ; CHECK-LE-NEXT:    sub sp, #8
205 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
206 ; CHECK-LE-NEXT:    vmov d0, r2, r3
207 ; CHECK-LE-NEXT:    add r2, sp, #4
208 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
209 ; CHECK-LE-NEXT:    vstr p0, [r2]
210 ; CHECK-LE-NEXT:    ldrb.w r2, [sp, #4]
211 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
212 ; CHECK-LE-NEXT:    lsls r1, r2, #31
213 ; CHECK-LE-NEXT:    itt ne
214 ; CHECK-LE-NEXT:    vmovne r1, s0
215 ; CHECK-LE-NEXT:    strne r1, [r0]
216 ; CHECK-LE-NEXT:    lsls r1, r2, #30
217 ; CHECK-LE-NEXT:    itt mi
218 ; CHECK-LE-NEXT:    vmovmi r1, s1
219 ; CHECK-LE-NEXT:    strmi r1, [r0, #4]
220 ; CHECK-LE-NEXT:    adds r1, r0, #4
221 ; CHECK-LE-NEXT:    lsls r3, r2, #29
222 ; CHECK-LE-NEXT:    itt mi
223 ; CHECK-LE-NEXT:    vmovmi r3, s2
224 ; CHECK-LE-NEXT:    strmi r3, [r0, #8]
225 ; CHECK-LE-NEXT:    lsls r2, r2, #28
226 ; CHECK-LE-NEXT:    itt mi
227 ; CHECK-LE-NEXT:    vmovmi r2, s3
228 ; CHECK-LE-NEXT:    strmi r2, [r0, #12]
229 ; CHECK-LE-NEXT:    mov r0, r1
230 ; CHECK-LE-NEXT:    add sp, #8
231 ; CHECK-LE-NEXT:    bx lr
233 ; CHECK-BE-LABEL: masked_v4i32_post:
234 ; CHECK-BE:       @ %bb.0: @ %entry
235 ; CHECK-BE-NEXT:    .pad #8
236 ; CHECK-BE-NEXT:    sub sp, #8
237 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
238 ; CHECK-BE-NEXT:    vmov d0, r3, r2
239 ; CHECK-BE-NEXT:    add r2, sp, #4
240 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
241 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
242 ; CHECK-BE-NEXT:    vstr p0, [r2]
243 ; CHECK-BE-NEXT:    ldrb.w r2, [sp, #4]
244 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
245 ; CHECK-BE-NEXT:    lsls r1, r2, #31
246 ; CHECK-BE-NEXT:    itt ne
247 ; CHECK-BE-NEXT:    vmovne r1, s0
248 ; CHECK-BE-NEXT:    strne r1, [r0]
249 ; CHECK-BE-NEXT:    lsls r1, r2, #30
250 ; CHECK-BE-NEXT:    itt mi
251 ; CHECK-BE-NEXT:    vmovmi r1, s1
252 ; CHECK-BE-NEXT:    strmi r1, [r0, #4]
253 ; CHECK-BE-NEXT:    adds r1, r0, #4
254 ; CHECK-BE-NEXT:    lsls r3, r2, #29
255 ; CHECK-BE-NEXT:    itt mi
256 ; CHECK-BE-NEXT:    vmovmi r3, s2
257 ; CHECK-BE-NEXT:    strmi r3, [r0, #8]
258 ; CHECK-BE-NEXT:    lsls r2, r2, #28
259 ; CHECK-BE-NEXT:    itt mi
260 ; CHECK-BE-NEXT:    vmovmi r2, s3
261 ; CHECK-BE-NEXT:    strmi r2, [r0, #12]
262 ; CHECK-BE-NEXT:    mov r0, r1
263 ; CHECK-BE-NEXT:    add sp, #8
264 ; CHECK-BE-NEXT:    bx lr
265 entry:
266   %z = getelementptr inbounds i8, i8* %y, i32 4
267   %0 = bitcast i8* %x to <4 x i32>*
268   %1 = load <4 x i32>, <4 x i32>* %0, align 4
269   %2 = bitcast i8* %y to <4 x i32>*
270   %c = icmp sgt <4 x i32> %a, zeroinitializer
271   call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %1, <4 x i32>* %2, i32 4, <4 x i1> %c)
272   ret i8* %z
276 define arm_aapcs_vfpcc void @masked_v8i16(<8 x i16> *%dest, <8 x i16> %a) {
277 ; CHECK-LE-LABEL: masked_v8i16:
278 ; CHECK-LE:       @ %bb.0: @ %entry
279 ; CHECK-LE-NEXT:    .pad #8
280 ; CHECK-LE-NEXT:    sub sp, #8
281 ; CHECK-LE-NEXT:    mov r1, sp
282 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
283 ; CHECK-LE-NEXT:    vstr p0, [r1]
284 ; CHECK-LE-NEXT:    ldrb.w r1, [sp]
285 ; CHECK-LE-NEXT:    lsls r2, r1, #31
286 ; CHECK-LE-NEXT:    itt ne
287 ; CHECK-LE-NEXT:    vmovne.u16 r2, q0[0]
288 ; CHECK-LE-NEXT:    strhne r2, [r0]
289 ; CHECK-LE-NEXT:    lsls r2, r1, #30
290 ; CHECK-LE-NEXT:    itt mi
291 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[1]
292 ; CHECK-LE-NEXT:    strhmi r2, [r0, #2]
293 ; CHECK-LE-NEXT:    lsls r2, r1, #29
294 ; CHECK-LE-NEXT:    itt mi
295 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[2]
296 ; CHECK-LE-NEXT:    strhmi r2, [r0, #4]
297 ; CHECK-LE-NEXT:    lsls r2, r1, #28
298 ; CHECK-LE-NEXT:    itt mi
299 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[3]
300 ; CHECK-LE-NEXT:    strhmi r2, [r0, #6]
301 ; CHECK-LE-NEXT:    lsls r2, r1, #27
302 ; CHECK-LE-NEXT:    itt mi
303 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[4]
304 ; CHECK-LE-NEXT:    strhmi r2, [r0, #8]
305 ; CHECK-LE-NEXT:    lsls r2, r1, #26
306 ; CHECK-LE-NEXT:    itt mi
307 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[5]
308 ; CHECK-LE-NEXT:    strhmi r2, [r0, #10]
309 ; CHECK-LE-NEXT:    lsls r2, r1, #25
310 ; CHECK-LE-NEXT:    itt mi
311 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[6]
312 ; CHECK-LE-NEXT:    strhmi r2, [r0, #12]
313 ; CHECK-LE-NEXT:    lsls r1, r1, #24
314 ; CHECK-LE-NEXT:    itt mi
315 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[7]
316 ; CHECK-LE-NEXT:    strhmi r1, [r0, #14]
317 ; CHECK-LE-NEXT:    add sp, #8
318 ; CHECK-LE-NEXT:    bx lr
320 ; CHECK-BE-LABEL: masked_v8i16:
321 ; CHECK-BE:       @ %bb.0: @ %entry
322 ; CHECK-BE-NEXT:    .pad #8
323 ; CHECK-BE-NEXT:    sub sp, #8
324 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
325 ; CHECK-BE-NEXT:    mov r1, sp
326 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
327 ; CHECK-BE-NEXT:    vstr p0, [r1]
328 ; CHECK-BE-NEXT:    ldrb.w r1, [sp]
329 ; CHECK-BE-NEXT:    lsls r2, r1, #31
330 ; CHECK-BE-NEXT:    itt ne
331 ; CHECK-BE-NEXT:    vmovne.u16 r2, q1[0]
332 ; CHECK-BE-NEXT:    strhne r2, [r0]
333 ; CHECK-BE-NEXT:    lsls r2, r1, #30
334 ; CHECK-BE-NEXT:    itt mi
335 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[1]
336 ; CHECK-BE-NEXT:    strhmi r2, [r0, #2]
337 ; CHECK-BE-NEXT:    lsls r2, r1, #29
338 ; CHECK-BE-NEXT:    itt mi
339 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[2]
340 ; CHECK-BE-NEXT:    strhmi r2, [r0, #4]
341 ; CHECK-BE-NEXT:    lsls r2, r1, #28
342 ; CHECK-BE-NEXT:    itt mi
343 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[3]
344 ; CHECK-BE-NEXT:    strhmi r2, [r0, #6]
345 ; CHECK-BE-NEXT:    lsls r2, r1, #27
346 ; CHECK-BE-NEXT:    itt mi
347 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[4]
348 ; CHECK-BE-NEXT:    strhmi r2, [r0, #8]
349 ; CHECK-BE-NEXT:    lsls r2, r1, #26
350 ; CHECK-BE-NEXT:    itt mi
351 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[5]
352 ; CHECK-BE-NEXT:    strhmi r2, [r0, #10]
353 ; CHECK-BE-NEXT:    lsls r2, r1, #25
354 ; CHECK-BE-NEXT:    itt mi
355 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[6]
356 ; CHECK-BE-NEXT:    strhmi r2, [r0, #12]
357 ; CHECK-BE-NEXT:    lsls r1, r1, #24
358 ; CHECK-BE-NEXT:    itt mi
359 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q1[7]
360 ; CHECK-BE-NEXT:    strhmi r1, [r0, #14]
361 ; CHECK-BE-NEXT:    add sp, #8
362 ; CHECK-BE-NEXT:    bx lr
363 entry:
364   %c = icmp sgt <8 x i16> %a, zeroinitializer
365   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %a, <8 x i16>* %dest, i32 2, <8 x i1> %c)
366   ret void
369 define arm_aapcs_vfpcc void @masked_v8i16_align1(<8 x i16> *%dest, <8 x i16> %a) {
370 ; CHECK-LE-LABEL: masked_v8i16_align1:
371 ; CHECK-LE:       @ %bb.0: @ %entry
372 ; CHECK-LE-NEXT:    .pad #8
373 ; CHECK-LE-NEXT:    sub sp, #8
374 ; CHECK-LE-NEXT:    mov r1, sp
375 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
376 ; CHECK-LE-NEXT:    vstr p0, [r1]
377 ; CHECK-LE-NEXT:    ldrb.w r1, [sp]
378 ; CHECK-LE-NEXT:    lsls r2, r1, #31
379 ; CHECK-LE-NEXT:    itt ne
380 ; CHECK-LE-NEXT:    vmovne.u16 r2, q0[0]
381 ; CHECK-LE-NEXT:    strhne r2, [r0]
382 ; CHECK-LE-NEXT:    lsls r2, r1, #30
383 ; CHECK-LE-NEXT:    itt mi
384 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[1]
385 ; CHECK-LE-NEXT:    strhmi r2, [r0, #2]
386 ; CHECK-LE-NEXT:    lsls r2, r1, #29
387 ; CHECK-LE-NEXT:    itt mi
388 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[2]
389 ; CHECK-LE-NEXT:    strhmi r2, [r0, #4]
390 ; CHECK-LE-NEXT:    lsls r2, r1, #28
391 ; CHECK-LE-NEXT:    itt mi
392 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[3]
393 ; CHECK-LE-NEXT:    strhmi r2, [r0, #6]
394 ; CHECK-LE-NEXT:    lsls r2, r1, #27
395 ; CHECK-LE-NEXT:    itt mi
396 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[4]
397 ; CHECK-LE-NEXT:    strhmi r2, [r0, #8]
398 ; CHECK-LE-NEXT:    lsls r2, r1, #26
399 ; CHECK-LE-NEXT:    itt mi
400 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[5]
401 ; CHECK-LE-NEXT:    strhmi r2, [r0, #10]
402 ; CHECK-LE-NEXT:    lsls r2, r1, #25
403 ; CHECK-LE-NEXT:    itt mi
404 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[6]
405 ; CHECK-LE-NEXT:    strhmi r2, [r0, #12]
406 ; CHECK-LE-NEXT:    lsls r1, r1, #24
407 ; CHECK-LE-NEXT:    itt mi
408 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[7]
409 ; CHECK-LE-NEXT:    strhmi r1, [r0, #14]
410 ; CHECK-LE-NEXT:    add sp, #8
411 ; CHECK-LE-NEXT:    bx lr
413 ; CHECK-BE-LABEL: masked_v8i16_align1:
414 ; CHECK-BE:       @ %bb.0: @ %entry
415 ; CHECK-BE-NEXT:    .pad #8
416 ; CHECK-BE-NEXT:    sub sp, #8
417 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
418 ; CHECK-BE-NEXT:    mov r1, sp
419 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
420 ; CHECK-BE-NEXT:    vstr p0, [r1]
421 ; CHECK-BE-NEXT:    ldrb.w r1, [sp]
422 ; CHECK-BE-NEXT:    lsls r2, r1, #31
423 ; CHECK-BE-NEXT:    itt ne
424 ; CHECK-BE-NEXT:    vmovne.u16 r2, q1[0]
425 ; CHECK-BE-NEXT:    strhne r2, [r0]
426 ; CHECK-BE-NEXT:    lsls r2, r1, #30
427 ; CHECK-BE-NEXT:    itt mi
428 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[1]
429 ; CHECK-BE-NEXT:    strhmi r2, [r0, #2]
430 ; CHECK-BE-NEXT:    lsls r2, r1, #29
431 ; CHECK-BE-NEXT:    itt mi
432 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[2]
433 ; CHECK-BE-NEXT:    strhmi r2, [r0, #4]
434 ; CHECK-BE-NEXT:    lsls r2, r1, #28
435 ; CHECK-BE-NEXT:    itt mi
436 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[3]
437 ; CHECK-BE-NEXT:    strhmi r2, [r0, #6]
438 ; CHECK-BE-NEXT:    lsls r2, r1, #27
439 ; CHECK-BE-NEXT:    itt mi
440 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[4]
441 ; CHECK-BE-NEXT:    strhmi r2, [r0, #8]
442 ; CHECK-BE-NEXT:    lsls r2, r1, #26
443 ; CHECK-BE-NEXT:    itt mi
444 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[5]
445 ; CHECK-BE-NEXT:    strhmi r2, [r0, #10]
446 ; CHECK-BE-NEXT:    lsls r2, r1, #25
447 ; CHECK-BE-NEXT:    itt mi
448 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[6]
449 ; CHECK-BE-NEXT:    strhmi r2, [r0, #12]
450 ; CHECK-BE-NEXT:    lsls r1, r1, #24
451 ; CHECK-BE-NEXT:    itt mi
452 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q1[7]
453 ; CHECK-BE-NEXT:    strhmi r1, [r0, #14]
454 ; CHECK-BE-NEXT:    add sp, #8
455 ; CHECK-BE-NEXT:    bx lr
456 entry:
457   %c = icmp sgt <8 x i16> %a, zeroinitializer
458   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %a, <8 x i16>* %dest, i32 1, <8 x i1> %c)
459   ret void
462 define i8* @masked_v8i16_pre(i8* %y, i8* %x, <8 x i16> %a) {
463 ; CHECK-LE-LABEL: masked_v8i16_pre:
464 ; CHECK-LE:       @ %bb.0: @ %entry
465 ; CHECK-LE-NEXT:    .pad #8
466 ; CHECK-LE-NEXT:    sub sp, #8
467 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
468 ; CHECK-LE-NEXT:    adds r0, #4
469 ; CHECK-LE-NEXT:    vmov d0, r2, r3
470 ; CHECK-LE-NEXT:    mov r2, sp
471 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
472 ; CHECK-LE-NEXT:    vstr p0, [r2]
473 ; CHECK-LE-NEXT:    ldrb.w r2, [sp]
474 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
475 ; CHECK-LE-NEXT:    lsls r1, r2, #31
476 ; CHECK-LE-NEXT:    itt ne
477 ; CHECK-LE-NEXT:    vmovne.u16 r1, q0[0]
478 ; CHECK-LE-NEXT:    strhne r1, [r0]
479 ; CHECK-LE-NEXT:    lsls r1, r2, #30
480 ; CHECK-LE-NEXT:    itt mi
481 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[1]
482 ; CHECK-LE-NEXT:    strhmi r1, [r0, #2]
483 ; CHECK-LE-NEXT:    lsls r1, r2, #29
484 ; CHECK-LE-NEXT:    itt mi
485 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[2]
486 ; CHECK-LE-NEXT:    strhmi r1, [r0, #4]
487 ; CHECK-LE-NEXT:    lsls r1, r2, #28
488 ; CHECK-LE-NEXT:    itt mi
489 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[3]
490 ; CHECK-LE-NEXT:    strhmi r1, [r0, #6]
491 ; CHECK-LE-NEXT:    lsls r1, r2, #27
492 ; CHECK-LE-NEXT:    itt mi
493 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[4]
494 ; CHECK-LE-NEXT:    strhmi r1, [r0, #8]
495 ; CHECK-LE-NEXT:    lsls r1, r2, #26
496 ; CHECK-LE-NEXT:    itt mi
497 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[5]
498 ; CHECK-LE-NEXT:    strhmi r1, [r0, #10]
499 ; CHECK-LE-NEXT:    lsls r1, r2, #25
500 ; CHECK-LE-NEXT:    itt mi
501 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[6]
502 ; CHECK-LE-NEXT:    strhmi r1, [r0, #12]
503 ; CHECK-LE-NEXT:    lsls r1, r2, #24
504 ; CHECK-LE-NEXT:    itt mi
505 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[7]
506 ; CHECK-LE-NEXT:    strhmi r1, [r0, #14]
507 ; CHECK-LE-NEXT:    add sp, #8
508 ; CHECK-LE-NEXT:    bx lr
510 ; CHECK-BE-LABEL: masked_v8i16_pre:
511 ; CHECK-BE:       @ %bb.0: @ %entry
512 ; CHECK-BE-NEXT:    .pad #8
513 ; CHECK-BE-NEXT:    sub sp, #8
514 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
515 ; CHECK-BE-NEXT:    adds r0, #4
516 ; CHECK-BE-NEXT:    vmov d0, r3, r2
517 ; CHECK-BE-NEXT:    mov r2, sp
518 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
519 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
520 ; CHECK-BE-NEXT:    vstr p0, [r2]
521 ; CHECK-BE-NEXT:    ldrb.w r2, [sp]
522 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
523 ; CHECK-BE-NEXT:    lsls r1, r2, #31
524 ; CHECK-BE-NEXT:    itt ne
525 ; CHECK-BE-NEXT:    vmovne.u16 r1, q0[0]
526 ; CHECK-BE-NEXT:    strhne r1, [r0]
527 ; CHECK-BE-NEXT:    lsls r1, r2, #30
528 ; CHECK-BE-NEXT:    itt mi
529 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[1]
530 ; CHECK-BE-NEXT:    strhmi r1, [r0, #2]
531 ; CHECK-BE-NEXT:    lsls r1, r2, #29
532 ; CHECK-BE-NEXT:    itt mi
533 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[2]
534 ; CHECK-BE-NEXT:    strhmi r1, [r0, #4]
535 ; CHECK-BE-NEXT:    lsls r1, r2, #28
536 ; CHECK-BE-NEXT:    itt mi
537 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[3]
538 ; CHECK-BE-NEXT:    strhmi r1, [r0, #6]
539 ; CHECK-BE-NEXT:    lsls r1, r2, #27
540 ; CHECK-BE-NEXT:    itt mi
541 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[4]
542 ; CHECK-BE-NEXT:    strhmi r1, [r0, #8]
543 ; CHECK-BE-NEXT:    lsls r1, r2, #26
544 ; CHECK-BE-NEXT:    itt mi
545 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[5]
546 ; CHECK-BE-NEXT:    strhmi r1, [r0, #10]
547 ; CHECK-BE-NEXT:    lsls r1, r2, #25
548 ; CHECK-BE-NEXT:    itt mi
549 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[6]
550 ; CHECK-BE-NEXT:    strhmi r1, [r0, #12]
551 ; CHECK-BE-NEXT:    lsls r1, r2, #24
552 ; CHECK-BE-NEXT:    itt mi
553 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[7]
554 ; CHECK-BE-NEXT:    strhmi r1, [r0, #14]
555 ; CHECK-BE-NEXT:    add sp, #8
556 ; CHECK-BE-NEXT:    bx lr
557 entry:
558   %z = getelementptr inbounds i8, i8* %y, i32 4
559   %0 = bitcast i8* %x to <8 x i16>*
560   %1 = load <8 x i16>, <8 x i16>* %0, align 4
561   %2 = bitcast i8* %z to <8 x i16>*
562   %c = icmp sgt <8 x i16> %a, zeroinitializer
563   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %1, <8 x i16>* %2, i32 2, <8 x i1> %c)
564   ret i8* %z
567 define i8* @masked_v8i16_post(i8* %y, i8* %x, <8 x i16> %a) {
568 ; CHECK-LE-LABEL: masked_v8i16_post:
569 ; CHECK-LE:       @ %bb.0: @ %entry
570 ; CHECK-LE-NEXT:    .pad #8
571 ; CHECK-LE-NEXT:    sub sp, #8
572 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
573 ; CHECK-LE-NEXT:    vmov d0, r2, r3
574 ; CHECK-LE-NEXT:    mov r2, sp
575 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
576 ; CHECK-LE-NEXT:    vstr p0, [r2]
577 ; CHECK-LE-NEXT:    ldrb.w r2, [sp]
578 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
579 ; CHECK-LE-NEXT:    lsls r1, r2, #31
580 ; CHECK-LE-NEXT:    itt ne
581 ; CHECK-LE-NEXT:    vmovne.u16 r1, q0[0]
582 ; CHECK-LE-NEXT:    strhne r1, [r0]
583 ; CHECK-LE-NEXT:    lsls r1, r2, #30
584 ; CHECK-LE-NEXT:    itt mi
585 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[1]
586 ; CHECK-LE-NEXT:    strhmi r1, [r0, #2]
587 ; CHECK-LE-NEXT:    lsls r1, r2, #29
588 ; CHECK-LE-NEXT:    itt mi
589 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[2]
590 ; CHECK-LE-NEXT:    strhmi r1, [r0, #4]
591 ; CHECK-LE-NEXT:    lsls r1, r2, #28
592 ; CHECK-LE-NEXT:    itt mi
593 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[3]
594 ; CHECK-LE-NEXT:    strhmi r1, [r0, #6]
595 ; CHECK-LE-NEXT:    lsls r1, r2, #27
596 ; CHECK-LE-NEXT:    itt mi
597 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[4]
598 ; CHECK-LE-NEXT:    strhmi r1, [r0, #8]
599 ; CHECK-LE-NEXT:    lsls r1, r2, #26
600 ; CHECK-LE-NEXT:    itt mi
601 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[5]
602 ; CHECK-LE-NEXT:    strhmi r1, [r0, #10]
603 ; CHECK-LE-NEXT:    adds r1, r0, #4
604 ; CHECK-LE-NEXT:    lsls r3, r2, #25
605 ; CHECK-LE-NEXT:    itt mi
606 ; CHECK-LE-NEXT:    vmovmi.u16 r3, q0[6]
607 ; CHECK-LE-NEXT:    strhmi r3, [r0, #12]
608 ; CHECK-LE-NEXT:    lsls r2, r2, #24
609 ; CHECK-LE-NEXT:    itt mi
610 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[7]
611 ; CHECK-LE-NEXT:    strhmi r2, [r0, #14]
612 ; CHECK-LE-NEXT:    mov r0, r1
613 ; CHECK-LE-NEXT:    add sp, #8
614 ; CHECK-LE-NEXT:    bx lr
616 ; CHECK-BE-LABEL: masked_v8i16_post:
617 ; CHECK-BE:       @ %bb.0: @ %entry
618 ; CHECK-BE-NEXT:    .pad #8
619 ; CHECK-BE-NEXT:    sub sp, #8
620 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
621 ; CHECK-BE-NEXT:    vmov d0, r3, r2
622 ; CHECK-BE-NEXT:    mov r2, sp
623 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
624 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
625 ; CHECK-BE-NEXT:    vstr p0, [r2]
626 ; CHECK-BE-NEXT:    ldrb.w r2, [sp]
627 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
628 ; CHECK-BE-NEXT:    lsls r1, r2, #31
629 ; CHECK-BE-NEXT:    itt ne
630 ; CHECK-BE-NEXT:    vmovne.u16 r1, q0[0]
631 ; CHECK-BE-NEXT:    strhne r1, [r0]
632 ; CHECK-BE-NEXT:    lsls r1, r2, #30
633 ; CHECK-BE-NEXT:    itt mi
634 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[1]
635 ; CHECK-BE-NEXT:    strhmi r1, [r0, #2]
636 ; CHECK-BE-NEXT:    lsls r1, r2, #29
637 ; CHECK-BE-NEXT:    itt mi
638 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[2]
639 ; CHECK-BE-NEXT:    strhmi r1, [r0, #4]
640 ; CHECK-BE-NEXT:    lsls r1, r2, #28
641 ; CHECK-BE-NEXT:    itt mi
642 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[3]
643 ; CHECK-BE-NEXT:    strhmi r1, [r0, #6]
644 ; CHECK-BE-NEXT:    lsls r1, r2, #27
645 ; CHECK-BE-NEXT:    itt mi
646 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[4]
647 ; CHECK-BE-NEXT:    strhmi r1, [r0, #8]
648 ; CHECK-BE-NEXT:    lsls r1, r2, #26
649 ; CHECK-BE-NEXT:    itt mi
650 ; CHECK-BE-NEXT:    vmovmi.u16 r1, q0[5]
651 ; CHECK-BE-NEXT:    strhmi r1, [r0, #10]
652 ; CHECK-BE-NEXT:    adds r1, r0, #4
653 ; CHECK-BE-NEXT:    lsls r3, r2, #25
654 ; CHECK-BE-NEXT:    itt mi
655 ; CHECK-BE-NEXT:    vmovmi.u16 r3, q0[6]
656 ; CHECK-BE-NEXT:    strhmi r3, [r0, #12]
657 ; CHECK-BE-NEXT:    lsls r2, r2, #24
658 ; CHECK-BE-NEXT:    itt mi
659 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q0[7]
660 ; CHECK-BE-NEXT:    strhmi r2, [r0, #14]
661 ; CHECK-BE-NEXT:    mov r0, r1
662 ; CHECK-BE-NEXT:    add sp, #8
663 ; CHECK-BE-NEXT:    bx lr
664 entry:
665   %z = getelementptr inbounds i8, i8* %y, i32 4
666   %0 = bitcast i8* %x to <8 x i16>*
667   %1 = load <8 x i16>, <8 x i16>* %0, align 4
668   %2 = bitcast i8* %y to <8 x i16>*
669   %c = icmp sgt <8 x i16> %a, zeroinitializer
670   call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %1, <8 x i16>* %2, i32 2, <8 x i1> %c)
671   ret i8* %z
675 define arm_aapcs_vfpcc void @masked_v16i8(<16 x i8> *%dest, <16 x i8> %a) {
676 ; CHECK-LE-LABEL: masked_v16i8:
677 ; CHECK-LE:       @ %bb.0: @ %entry
678 ; CHECK-LE-NEXT:    .save {r4, r6, r7, lr}
679 ; CHECK-LE-NEXT:    push {r4, r6, r7, lr}
680 ; CHECK-LE-NEXT:    .setfp r7, sp, #8
681 ; CHECK-LE-NEXT:    add r7, sp, #8
682 ; CHECK-LE-NEXT:    .pad #16
683 ; CHECK-LE-NEXT:    sub sp, #16
684 ; CHECK-LE-NEXT:    mov r4, sp
685 ; CHECK-LE-NEXT:    bfc r4, #0, #4
686 ; CHECK-LE-NEXT:    mov sp, r4
687 ; CHECK-LE-NEXT:    mov r1, sp
688 ; CHECK-LE-NEXT:    vcmp.s8 gt, q0, zr
689 ; CHECK-LE-NEXT:    vstr p0, [r1]
690 ; CHECK-LE-NEXT:    sub.w r4, r7, #8
691 ; CHECK-LE-NEXT:    ldrh.w r1, [sp]
692 ; CHECK-LE-NEXT:    lsls r2, r1, #31
693 ; CHECK-LE-NEXT:    itt ne
694 ; CHECK-LE-NEXT:    vmovne.u8 r2, q0[0]
695 ; CHECK-LE-NEXT:    strbne r2, [r0]
696 ; CHECK-LE-NEXT:    lsls r2, r1, #30
697 ; CHECK-LE-NEXT:    itt mi
698 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[1]
699 ; CHECK-LE-NEXT:    strbmi r2, [r0, #1]
700 ; CHECK-LE-NEXT:    lsls r2, r1, #29
701 ; CHECK-LE-NEXT:    itt mi
702 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[2]
703 ; CHECK-LE-NEXT:    strbmi r2, [r0, #2]
704 ; CHECK-LE-NEXT:    lsls r2, r1, #28
705 ; CHECK-LE-NEXT:    itt mi
706 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[3]
707 ; CHECK-LE-NEXT:    strbmi r2, [r0, #3]
708 ; CHECK-LE-NEXT:    lsls r2, r1, #27
709 ; CHECK-LE-NEXT:    itt mi
710 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[4]
711 ; CHECK-LE-NEXT:    strbmi r2, [r0, #4]
712 ; CHECK-LE-NEXT:    lsls r2, r1, #26
713 ; CHECK-LE-NEXT:    itt mi
714 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[5]
715 ; CHECK-LE-NEXT:    strbmi r2, [r0, #5]
716 ; CHECK-LE-NEXT:    lsls r2, r1, #25
717 ; CHECK-LE-NEXT:    itt mi
718 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[6]
719 ; CHECK-LE-NEXT:    strbmi r2, [r0, #6]
720 ; CHECK-LE-NEXT:    lsls r2, r1, #24
721 ; CHECK-LE-NEXT:    itt mi
722 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[7]
723 ; CHECK-LE-NEXT:    strbmi r2, [r0, #7]
724 ; CHECK-LE-NEXT:    lsls r2, r1, #23
725 ; CHECK-LE-NEXT:    itt mi
726 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[8]
727 ; CHECK-LE-NEXT:    strbmi r2, [r0, #8]
728 ; CHECK-LE-NEXT:    lsls r2, r1, #22
729 ; CHECK-LE-NEXT:    itt mi
730 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[9]
731 ; CHECK-LE-NEXT:    strbmi r2, [r0, #9]
732 ; CHECK-LE-NEXT:    lsls r2, r1, #21
733 ; CHECK-LE-NEXT:    itt mi
734 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[10]
735 ; CHECK-LE-NEXT:    strbmi r2, [r0, #10]
736 ; CHECK-LE-NEXT:    lsls r2, r1, #20
737 ; CHECK-LE-NEXT:    itt mi
738 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[11]
739 ; CHECK-LE-NEXT:    strbmi r2, [r0, #11]
740 ; CHECK-LE-NEXT:    lsls r2, r1, #19
741 ; CHECK-LE-NEXT:    itt mi
742 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[12]
743 ; CHECK-LE-NEXT:    strbmi r2, [r0, #12]
744 ; CHECK-LE-NEXT:    lsls r2, r1, #18
745 ; CHECK-LE-NEXT:    itt mi
746 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[13]
747 ; CHECK-LE-NEXT:    strbmi r2, [r0, #13]
748 ; CHECK-LE-NEXT:    lsls r2, r1, #17
749 ; CHECK-LE-NEXT:    itt mi
750 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[14]
751 ; CHECK-LE-NEXT:    strbmi r2, [r0, #14]
752 ; CHECK-LE-NEXT:    lsls r1, r1, #16
753 ; CHECK-LE-NEXT:    itt mi
754 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[15]
755 ; CHECK-LE-NEXT:    strbmi r1, [r0, #15]
756 ; CHECK-LE-NEXT:    mov sp, r4
757 ; CHECK-LE-NEXT:    pop {r4, r6, r7, pc}
759 ; CHECK-BE-LABEL: masked_v16i8:
760 ; CHECK-BE:       @ %bb.0: @ %entry
761 ; CHECK-BE-NEXT:    .save {r4, r6, r7, lr}
762 ; CHECK-BE-NEXT:    push {r4, r6, r7, lr}
763 ; CHECK-BE-NEXT:    .setfp r7, sp, #8
764 ; CHECK-BE-NEXT:    add r7, sp, #8
765 ; CHECK-BE-NEXT:    .pad #16
766 ; CHECK-BE-NEXT:    sub sp, #16
767 ; CHECK-BE-NEXT:    mov r4, sp
768 ; CHECK-BE-NEXT:    bfc r4, #0, #4
769 ; CHECK-BE-NEXT:    mov sp, r4
770 ; CHECK-BE-NEXT:    vrev64.8 q1, q0
771 ; CHECK-BE-NEXT:    mov r1, sp
772 ; CHECK-BE-NEXT:    vcmp.s8 gt, q1, zr
773 ; CHECK-BE-NEXT:    sub.w r4, r7, #8
774 ; CHECK-BE-NEXT:    vstr p0, [r1]
775 ; CHECK-BE-NEXT:    ldrh.w r1, [sp]
776 ; CHECK-BE-NEXT:    lsls r2, r1, #31
777 ; CHECK-BE-NEXT:    itt ne
778 ; CHECK-BE-NEXT:    vmovne.u8 r2, q1[0]
779 ; CHECK-BE-NEXT:    strbne r2, [r0]
780 ; CHECK-BE-NEXT:    lsls r2, r1, #30
781 ; CHECK-BE-NEXT:    itt mi
782 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[1]
783 ; CHECK-BE-NEXT:    strbmi r2, [r0, #1]
784 ; CHECK-BE-NEXT:    lsls r2, r1, #29
785 ; CHECK-BE-NEXT:    itt mi
786 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[2]
787 ; CHECK-BE-NEXT:    strbmi r2, [r0, #2]
788 ; CHECK-BE-NEXT:    lsls r2, r1, #28
789 ; CHECK-BE-NEXT:    itt mi
790 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[3]
791 ; CHECK-BE-NEXT:    strbmi r2, [r0, #3]
792 ; CHECK-BE-NEXT:    lsls r2, r1, #27
793 ; CHECK-BE-NEXT:    itt mi
794 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[4]
795 ; CHECK-BE-NEXT:    strbmi r2, [r0, #4]
796 ; CHECK-BE-NEXT:    lsls r2, r1, #26
797 ; CHECK-BE-NEXT:    itt mi
798 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[5]
799 ; CHECK-BE-NEXT:    strbmi r2, [r0, #5]
800 ; CHECK-BE-NEXT:    lsls r2, r1, #25
801 ; CHECK-BE-NEXT:    itt mi
802 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[6]
803 ; CHECK-BE-NEXT:    strbmi r2, [r0, #6]
804 ; CHECK-BE-NEXT:    lsls r2, r1, #24
805 ; CHECK-BE-NEXT:    itt mi
806 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[7]
807 ; CHECK-BE-NEXT:    strbmi r2, [r0, #7]
808 ; CHECK-BE-NEXT:    lsls r2, r1, #23
809 ; CHECK-BE-NEXT:    itt mi
810 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[8]
811 ; CHECK-BE-NEXT:    strbmi r2, [r0, #8]
812 ; CHECK-BE-NEXT:    lsls r2, r1, #22
813 ; CHECK-BE-NEXT:    itt mi
814 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[9]
815 ; CHECK-BE-NEXT:    strbmi r2, [r0, #9]
816 ; CHECK-BE-NEXT:    lsls r2, r1, #21
817 ; CHECK-BE-NEXT:    itt mi
818 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[10]
819 ; CHECK-BE-NEXT:    strbmi r2, [r0, #10]
820 ; CHECK-BE-NEXT:    lsls r2, r1, #20
821 ; CHECK-BE-NEXT:    itt mi
822 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[11]
823 ; CHECK-BE-NEXT:    strbmi r2, [r0, #11]
824 ; CHECK-BE-NEXT:    lsls r2, r1, #19
825 ; CHECK-BE-NEXT:    itt mi
826 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[12]
827 ; CHECK-BE-NEXT:    strbmi r2, [r0, #12]
828 ; CHECK-BE-NEXT:    lsls r2, r1, #18
829 ; CHECK-BE-NEXT:    itt mi
830 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[13]
831 ; CHECK-BE-NEXT:    strbmi r2, [r0, #13]
832 ; CHECK-BE-NEXT:    lsls r2, r1, #17
833 ; CHECK-BE-NEXT:    itt mi
834 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q1[14]
835 ; CHECK-BE-NEXT:    strbmi r2, [r0, #14]
836 ; CHECK-BE-NEXT:    lsls r1, r1, #16
837 ; CHECK-BE-NEXT:    itt mi
838 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q1[15]
839 ; CHECK-BE-NEXT:    strbmi r1, [r0, #15]
840 ; CHECK-BE-NEXT:    mov sp, r4
841 ; CHECK-BE-NEXT:    pop {r4, r6, r7, pc}
842 entry:
843   %c = icmp sgt <16 x i8> %a, zeroinitializer
844   call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %a, <16 x i8>* %dest, i32 1, <16 x i1> %c)
845   ret void
848 define i8* @masked_v16i8_pre(i8* %y, i8* %x, <16 x i8> %a) {
849 ; CHECK-LE-LABEL: masked_v16i8_pre:
850 ; CHECK-LE:       @ %bb.0: @ %entry
851 ; CHECK-LE-NEXT:    .save {r4, r6, r7, lr}
852 ; CHECK-LE-NEXT:    push {r4, r6, r7, lr}
853 ; CHECK-LE-NEXT:    .setfp r7, sp, #8
854 ; CHECK-LE-NEXT:    add r7, sp, #8
855 ; CHECK-LE-NEXT:    .pad #16
856 ; CHECK-LE-NEXT:    sub sp, #16
857 ; CHECK-LE-NEXT:    mov r4, sp
858 ; CHECK-LE-NEXT:    bfc r4, #0, #4
859 ; CHECK-LE-NEXT:    mov sp, r4
860 ; CHECK-LE-NEXT:    vldr d1, [r7, #8]
861 ; CHECK-LE-NEXT:    adds r0, #4
862 ; CHECK-LE-NEXT:    vmov d0, r2, r3
863 ; CHECK-LE-NEXT:    mov r2, sp
864 ; CHECK-LE-NEXT:    vcmp.s8 gt, q0, zr
865 ; CHECK-LE-NEXT:    sub.w r4, r7, #8
866 ; CHECK-LE-NEXT:    vstr p0, [r2]
867 ; CHECK-LE-NEXT:    ldrh.w r2, [sp]
868 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
869 ; CHECK-LE-NEXT:    lsls r1, r2, #31
870 ; CHECK-LE-NEXT:    itt ne
871 ; CHECK-LE-NEXT:    vmovne.u8 r1, q0[0]
872 ; CHECK-LE-NEXT:    strbne r1, [r0]
873 ; CHECK-LE-NEXT:    lsls r1, r2, #30
874 ; CHECK-LE-NEXT:    itt mi
875 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[1]
876 ; CHECK-LE-NEXT:    strbmi r1, [r0, #1]
877 ; CHECK-LE-NEXT:    lsls r1, r2, #29
878 ; CHECK-LE-NEXT:    itt mi
879 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[2]
880 ; CHECK-LE-NEXT:    strbmi r1, [r0, #2]
881 ; CHECK-LE-NEXT:    lsls r1, r2, #28
882 ; CHECK-LE-NEXT:    itt mi
883 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[3]
884 ; CHECK-LE-NEXT:    strbmi r1, [r0, #3]
885 ; CHECK-LE-NEXT:    lsls r1, r2, #27
886 ; CHECK-LE-NEXT:    itt mi
887 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[4]
888 ; CHECK-LE-NEXT:    strbmi r1, [r0, #4]
889 ; CHECK-LE-NEXT:    lsls r1, r2, #26
890 ; CHECK-LE-NEXT:    itt mi
891 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[5]
892 ; CHECK-LE-NEXT:    strbmi r1, [r0, #5]
893 ; CHECK-LE-NEXT:    lsls r1, r2, #25
894 ; CHECK-LE-NEXT:    itt mi
895 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[6]
896 ; CHECK-LE-NEXT:    strbmi r1, [r0, #6]
897 ; CHECK-LE-NEXT:    lsls r1, r2, #24
898 ; CHECK-LE-NEXT:    itt mi
899 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[7]
900 ; CHECK-LE-NEXT:    strbmi r1, [r0, #7]
901 ; CHECK-LE-NEXT:    lsls r1, r2, #23
902 ; CHECK-LE-NEXT:    itt mi
903 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[8]
904 ; CHECK-LE-NEXT:    strbmi r1, [r0, #8]
905 ; CHECK-LE-NEXT:    lsls r1, r2, #22
906 ; CHECK-LE-NEXT:    itt mi
907 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[9]
908 ; CHECK-LE-NEXT:    strbmi r1, [r0, #9]
909 ; CHECK-LE-NEXT:    lsls r1, r2, #21
910 ; CHECK-LE-NEXT:    itt mi
911 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[10]
912 ; CHECK-LE-NEXT:    strbmi r1, [r0, #10]
913 ; CHECK-LE-NEXT:    lsls r1, r2, #20
914 ; CHECK-LE-NEXT:    itt mi
915 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[11]
916 ; CHECK-LE-NEXT:    strbmi r1, [r0, #11]
917 ; CHECK-LE-NEXT:    lsls r1, r2, #19
918 ; CHECK-LE-NEXT:    itt mi
919 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[12]
920 ; CHECK-LE-NEXT:    strbmi r1, [r0, #12]
921 ; CHECK-LE-NEXT:    lsls r1, r2, #18
922 ; CHECK-LE-NEXT:    itt mi
923 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[13]
924 ; CHECK-LE-NEXT:    strbmi r1, [r0, #13]
925 ; CHECK-LE-NEXT:    lsls r1, r2, #17
926 ; CHECK-LE-NEXT:    itt mi
927 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[14]
928 ; CHECK-LE-NEXT:    strbmi r1, [r0, #14]
929 ; CHECK-LE-NEXT:    lsls r1, r2, #16
930 ; CHECK-LE-NEXT:    itt mi
931 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[15]
932 ; CHECK-LE-NEXT:    strbmi r1, [r0, #15]
933 ; CHECK-LE-NEXT:    mov sp, r4
934 ; CHECK-LE-NEXT:    pop {r4, r6, r7, pc}
936 ; CHECK-BE-LABEL: masked_v16i8_pre:
937 ; CHECK-BE:       @ %bb.0: @ %entry
938 ; CHECK-BE-NEXT:    .save {r4, r6, r7, lr}
939 ; CHECK-BE-NEXT:    push {r4, r6, r7, lr}
940 ; CHECK-BE-NEXT:    .setfp r7, sp, #8
941 ; CHECK-BE-NEXT:    add r7, sp, #8
942 ; CHECK-BE-NEXT:    .pad #16
943 ; CHECK-BE-NEXT:    sub sp, #16
944 ; CHECK-BE-NEXT:    mov r4, sp
945 ; CHECK-BE-NEXT:    bfc r4, #0, #4
946 ; CHECK-BE-NEXT:    mov sp, r4
947 ; CHECK-BE-NEXT:    vldr d1, [r7, #8]
948 ; CHECK-BE-NEXT:    adds r0, #4
949 ; CHECK-BE-NEXT:    vmov d0, r3, r2
950 ; CHECK-BE-NEXT:    mov r2, sp
951 ; CHECK-BE-NEXT:    vrev64.8 q1, q0
952 ; CHECK-BE-NEXT:    sub.w r4, r7, #8
953 ; CHECK-BE-NEXT:    vcmp.s8 gt, q1, zr
954 ; CHECK-BE-NEXT:    vstr p0, [r2]
955 ; CHECK-BE-NEXT:    ldrh.w r2, [sp]
956 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r1]
957 ; CHECK-BE-NEXT:    lsls r1, r2, #31
958 ; CHECK-BE-NEXT:    itt ne
959 ; CHECK-BE-NEXT:    vmovne.u8 r1, q0[0]
960 ; CHECK-BE-NEXT:    strbne r1, [r0]
961 ; CHECK-BE-NEXT:    lsls r1, r2, #30
962 ; CHECK-BE-NEXT:    itt mi
963 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[1]
964 ; CHECK-BE-NEXT:    strbmi r1, [r0, #1]
965 ; CHECK-BE-NEXT:    lsls r1, r2, #29
966 ; CHECK-BE-NEXT:    itt mi
967 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[2]
968 ; CHECK-BE-NEXT:    strbmi r1, [r0, #2]
969 ; CHECK-BE-NEXT:    lsls r1, r2, #28
970 ; CHECK-BE-NEXT:    itt mi
971 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[3]
972 ; CHECK-BE-NEXT:    strbmi r1, [r0, #3]
973 ; CHECK-BE-NEXT:    lsls r1, r2, #27
974 ; CHECK-BE-NEXT:    itt mi
975 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[4]
976 ; CHECK-BE-NEXT:    strbmi r1, [r0, #4]
977 ; CHECK-BE-NEXT:    lsls r1, r2, #26
978 ; CHECK-BE-NEXT:    itt mi
979 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[5]
980 ; CHECK-BE-NEXT:    strbmi r1, [r0, #5]
981 ; CHECK-BE-NEXT:    lsls r1, r2, #25
982 ; CHECK-BE-NEXT:    itt mi
983 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[6]
984 ; CHECK-BE-NEXT:    strbmi r1, [r0, #6]
985 ; CHECK-BE-NEXT:    lsls r1, r2, #24
986 ; CHECK-BE-NEXT:    itt mi
987 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[7]
988 ; CHECK-BE-NEXT:    strbmi r1, [r0, #7]
989 ; CHECK-BE-NEXT:    lsls r1, r2, #23
990 ; CHECK-BE-NEXT:    itt mi
991 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[8]
992 ; CHECK-BE-NEXT:    strbmi r1, [r0, #8]
993 ; CHECK-BE-NEXT:    lsls r1, r2, #22
994 ; CHECK-BE-NEXT:    itt mi
995 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[9]
996 ; CHECK-BE-NEXT:    strbmi r1, [r0, #9]
997 ; CHECK-BE-NEXT:    lsls r1, r2, #21
998 ; CHECK-BE-NEXT:    itt mi
999 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[10]
1000 ; CHECK-BE-NEXT:    strbmi r1, [r0, #10]
1001 ; CHECK-BE-NEXT:    lsls r1, r2, #20
1002 ; CHECK-BE-NEXT:    itt mi
1003 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[11]
1004 ; CHECK-BE-NEXT:    strbmi r1, [r0, #11]
1005 ; CHECK-BE-NEXT:    lsls r1, r2, #19
1006 ; CHECK-BE-NEXT:    itt mi
1007 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[12]
1008 ; CHECK-BE-NEXT:    strbmi r1, [r0, #12]
1009 ; CHECK-BE-NEXT:    lsls r1, r2, #18
1010 ; CHECK-BE-NEXT:    itt mi
1011 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[13]
1012 ; CHECK-BE-NEXT:    strbmi r1, [r0, #13]
1013 ; CHECK-BE-NEXT:    lsls r1, r2, #17
1014 ; CHECK-BE-NEXT:    itt mi
1015 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[14]
1016 ; CHECK-BE-NEXT:    strbmi r1, [r0, #14]
1017 ; CHECK-BE-NEXT:    lsls r1, r2, #16
1018 ; CHECK-BE-NEXT:    itt mi
1019 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[15]
1020 ; CHECK-BE-NEXT:    strbmi r1, [r0, #15]
1021 ; CHECK-BE-NEXT:    mov sp, r4
1022 ; CHECK-BE-NEXT:    pop {r4, r6, r7, pc}
1023 entry:
1024   %z = getelementptr inbounds i8, i8* %y, i32 4
1025   %0 = bitcast i8* %x to <16 x i8>*
1026   %1 = load <16 x i8>, <16 x i8>* %0, align 4
1027   %2 = bitcast i8* %z to <16 x i8>*
1028   %c = icmp sgt <16 x i8> %a, zeroinitializer
1029   call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %1, <16 x i8>* %2, i32 1, <16 x i1> %c)
1030   ret i8* %z
1033 define i8* @masked_v16i8_post(i8* %y, i8* %x, <16 x i8> %a) {
1034 ; CHECK-LE-LABEL: masked_v16i8_post:
1035 ; CHECK-LE:       @ %bb.0: @ %entry
1036 ; CHECK-LE-NEXT:    .save {r4, r6, r7, lr}
1037 ; CHECK-LE-NEXT:    push {r4, r6, r7, lr}
1038 ; CHECK-LE-NEXT:    .setfp r7, sp, #8
1039 ; CHECK-LE-NEXT:    add r7, sp, #8
1040 ; CHECK-LE-NEXT:    .pad #16
1041 ; CHECK-LE-NEXT:    sub sp, #16
1042 ; CHECK-LE-NEXT:    mov r4, sp
1043 ; CHECK-LE-NEXT:    bfc r4, #0, #4
1044 ; CHECK-LE-NEXT:    mov sp, r4
1045 ; CHECK-LE-NEXT:    vldr d1, [r7, #8]
1046 ; CHECK-LE-NEXT:    sub.w r4, r7, #8
1047 ; CHECK-LE-NEXT:    vmov d0, r2, r3
1048 ; CHECK-LE-NEXT:    mov r2, sp
1049 ; CHECK-LE-NEXT:    vcmp.s8 gt, q0, zr
1050 ; CHECK-LE-NEXT:    vstr p0, [r2]
1051 ; CHECK-LE-NEXT:    ldrh.w r2, [sp]
1052 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1053 ; CHECK-LE-NEXT:    lsls r1, r2, #31
1054 ; CHECK-LE-NEXT:    itt ne
1055 ; CHECK-LE-NEXT:    vmovne.u8 r1, q0[0]
1056 ; CHECK-LE-NEXT:    strbne r1, [r0]
1057 ; CHECK-LE-NEXT:    lsls r1, r2, #30
1058 ; CHECK-LE-NEXT:    itt mi
1059 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[1]
1060 ; CHECK-LE-NEXT:    strbmi r1, [r0, #1]
1061 ; CHECK-LE-NEXT:    lsls r1, r2, #29
1062 ; CHECK-LE-NEXT:    itt mi
1063 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[2]
1064 ; CHECK-LE-NEXT:    strbmi r1, [r0, #2]
1065 ; CHECK-LE-NEXT:    lsls r1, r2, #28
1066 ; CHECK-LE-NEXT:    itt mi
1067 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[3]
1068 ; CHECK-LE-NEXT:    strbmi r1, [r0, #3]
1069 ; CHECK-LE-NEXT:    lsls r1, r2, #27
1070 ; CHECK-LE-NEXT:    itt mi
1071 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[4]
1072 ; CHECK-LE-NEXT:    strbmi r1, [r0, #4]
1073 ; CHECK-LE-NEXT:    lsls r1, r2, #26
1074 ; CHECK-LE-NEXT:    itt mi
1075 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[5]
1076 ; CHECK-LE-NEXT:    strbmi r1, [r0, #5]
1077 ; CHECK-LE-NEXT:    lsls r1, r2, #25
1078 ; CHECK-LE-NEXT:    itt mi
1079 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[6]
1080 ; CHECK-LE-NEXT:    strbmi r1, [r0, #6]
1081 ; CHECK-LE-NEXT:    lsls r1, r2, #24
1082 ; CHECK-LE-NEXT:    itt mi
1083 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[7]
1084 ; CHECK-LE-NEXT:    strbmi r1, [r0, #7]
1085 ; CHECK-LE-NEXT:    lsls r1, r2, #23
1086 ; CHECK-LE-NEXT:    itt mi
1087 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[8]
1088 ; CHECK-LE-NEXT:    strbmi r1, [r0, #8]
1089 ; CHECK-LE-NEXT:    lsls r1, r2, #22
1090 ; CHECK-LE-NEXT:    itt mi
1091 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[9]
1092 ; CHECK-LE-NEXT:    strbmi r1, [r0, #9]
1093 ; CHECK-LE-NEXT:    lsls r1, r2, #21
1094 ; CHECK-LE-NEXT:    itt mi
1095 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[10]
1096 ; CHECK-LE-NEXT:    strbmi r1, [r0, #10]
1097 ; CHECK-LE-NEXT:    lsls r1, r2, #20
1098 ; CHECK-LE-NEXT:    itt mi
1099 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[11]
1100 ; CHECK-LE-NEXT:    strbmi r1, [r0, #11]
1101 ; CHECK-LE-NEXT:    lsls r1, r2, #19
1102 ; CHECK-LE-NEXT:    itt mi
1103 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[12]
1104 ; CHECK-LE-NEXT:    strbmi r1, [r0, #12]
1105 ; CHECK-LE-NEXT:    lsls r1, r2, #18
1106 ; CHECK-LE-NEXT:    itt mi
1107 ; CHECK-LE-NEXT:    vmovmi.u8 r1, q0[13]
1108 ; CHECK-LE-NEXT:    strbmi r1, [r0, #13]
1109 ; CHECK-LE-NEXT:    adds r1, r0, #4
1110 ; CHECK-LE-NEXT:    lsls r3, r2, #17
1111 ; CHECK-LE-NEXT:    itt mi
1112 ; CHECK-LE-NEXT:    vmovmi.u8 r3, q0[14]
1113 ; CHECK-LE-NEXT:    strbmi r3, [r0, #14]
1114 ; CHECK-LE-NEXT:    lsls r2, r2, #16
1115 ; CHECK-LE-NEXT:    itt mi
1116 ; CHECK-LE-NEXT:    vmovmi.u8 r2, q0[15]
1117 ; CHECK-LE-NEXT:    strbmi r2, [r0, #15]
1118 ; CHECK-LE-NEXT:    mov r0, r1
1119 ; CHECK-LE-NEXT:    mov sp, r4
1120 ; CHECK-LE-NEXT:    pop {r4, r6, r7, pc}
1122 ; CHECK-BE-LABEL: masked_v16i8_post:
1123 ; CHECK-BE:       @ %bb.0: @ %entry
1124 ; CHECK-BE-NEXT:    .save {r4, r6, r7, lr}
1125 ; CHECK-BE-NEXT:    push {r4, r6, r7, lr}
1126 ; CHECK-BE-NEXT:    .setfp r7, sp, #8
1127 ; CHECK-BE-NEXT:    add r7, sp, #8
1128 ; CHECK-BE-NEXT:    .pad #16
1129 ; CHECK-BE-NEXT:    sub sp, #16
1130 ; CHECK-BE-NEXT:    mov r4, sp
1131 ; CHECK-BE-NEXT:    bfc r4, #0, #4
1132 ; CHECK-BE-NEXT:    mov sp, r4
1133 ; CHECK-BE-NEXT:    vldr d1, [r7, #8]
1134 ; CHECK-BE-NEXT:    sub.w r4, r7, #8
1135 ; CHECK-BE-NEXT:    vmov d0, r3, r2
1136 ; CHECK-BE-NEXT:    mov r2, sp
1137 ; CHECK-BE-NEXT:    vrev64.8 q1, q0
1138 ; CHECK-BE-NEXT:    vcmp.s8 gt, q1, zr
1139 ; CHECK-BE-NEXT:    vstr p0, [r2]
1140 ; CHECK-BE-NEXT:    ldrh.w r2, [sp]
1141 ; CHECK-BE-NEXT:    vldrb.u8 q0, [r1]
1142 ; CHECK-BE-NEXT:    lsls r1, r2, #31
1143 ; CHECK-BE-NEXT:    itt ne
1144 ; CHECK-BE-NEXT:    vmovne.u8 r1, q0[0]
1145 ; CHECK-BE-NEXT:    strbne r1, [r0]
1146 ; CHECK-BE-NEXT:    lsls r1, r2, #30
1147 ; CHECK-BE-NEXT:    itt mi
1148 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[1]
1149 ; CHECK-BE-NEXT:    strbmi r1, [r0, #1]
1150 ; CHECK-BE-NEXT:    lsls r1, r2, #29
1151 ; CHECK-BE-NEXT:    itt mi
1152 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[2]
1153 ; CHECK-BE-NEXT:    strbmi r1, [r0, #2]
1154 ; CHECK-BE-NEXT:    lsls r1, r2, #28
1155 ; CHECK-BE-NEXT:    itt mi
1156 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[3]
1157 ; CHECK-BE-NEXT:    strbmi r1, [r0, #3]
1158 ; CHECK-BE-NEXT:    lsls r1, r2, #27
1159 ; CHECK-BE-NEXT:    itt mi
1160 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[4]
1161 ; CHECK-BE-NEXT:    strbmi r1, [r0, #4]
1162 ; CHECK-BE-NEXT:    lsls r1, r2, #26
1163 ; CHECK-BE-NEXT:    itt mi
1164 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[5]
1165 ; CHECK-BE-NEXT:    strbmi r1, [r0, #5]
1166 ; CHECK-BE-NEXT:    lsls r1, r2, #25
1167 ; CHECK-BE-NEXT:    itt mi
1168 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[6]
1169 ; CHECK-BE-NEXT:    strbmi r1, [r0, #6]
1170 ; CHECK-BE-NEXT:    lsls r1, r2, #24
1171 ; CHECK-BE-NEXT:    itt mi
1172 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[7]
1173 ; CHECK-BE-NEXT:    strbmi r1, [r0, #7]
1174 ; CHECK-BE-NEXT:    lsls r1, r2, #23
1175 ; CHECK-BE-NEXT:    itt mi
1176 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[8]
1177 ; CHECK-BE-NEXT:    strbmi r1, [r0, #8]
1178 ; CHECK-BE-NEXT:    lsls r1, r2, #22
1179 ; CHECK-BE-NEXT:    itt mi
1180 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[9]
1181 ; CHECK-BE-NEXT:    strbmi r1, [r0, #9]
1182 ; CHECK-BE-NEXT:    lsls r1, r2, #21
1183 ; CHECK-BE-NEXT:    itt mi
1184 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[10]
1185 ; CHECK-BE-NEXT:    strbmi r1, [r0, #10]
1186 ; CHECK-BE-NEXT:    lsls r1, r2, #20
1187 ; CHECK-BE-NEXT:    itt mi
1188 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[11]
1189 ; CHECK-BE-NEXT:    strbmi r1, [r0, #11]
1190 ; CHECK-BE-NEXT:    lsls r1, r2, #19
1191 ; CHECK-BE-NEXT:    itt mi
1192 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[12]
1193 ; CHECK-BE-NEXT:    strbmi r1, [r0, #12]
1194 ; CHECK-BE-NEXT:    lsls r1, r2, #18
1195 ; CHECK-BE-NEXT:    itt mi
1196 ; CHECK-BE-NEXT:    vmovmi.u8 r1, q0[13]
1197 ; CHECK-BE-NEXT:    strbmi r1, [r0, #13]
1198 ; CHECK-BE-NEXT:    adds r1, r0, #4
1199 ; CHECK-BE-NEXT:    lsls r3, r2, #17
1200 ; CHECK-BE-NEXT:    itt mi
1201 ; CHECK-BE-NEXT:    vmovmi.u8 r3, q0[14]
1202 ; CHECK-BE-NEXT:    strbmi r3, [r0, #14]
1203 ; CHECK-BE-NEXT:    lsls r2, r2, #16
1204 ; CHECK-BE-NEXT:    itt mi
1205 ; CHECK-BE-NEXT:    vmovmi.u8 r2, q0[15]
1206 ; CHECK-BE-NEXT:    strbmi r2, [r0, #15]
1207 ; CHECK-BE-NEXT:    mov r0, r1
1208 ; CHECK-BE-NEXT:    mov sp, r4
1209 ; CHECK-BE-NEXT:    pop {r4, r6, r7, pc}
1210 entry:
1211   %z = getelementptr inbounds i8, i8* %y, i32 4
1212   %0 = bitcast i8* %x to <16 x i8>*
1213   %1 = load <16 x i8>, <16 x i8>* %0, align 4
1214   %2 = bitcast i8* %y to <16 x i8>*
1215   %c = icmp sgt <16 x i8> %a, zeroinitializer
1216   call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %1, <16 x i8>* %2, i32 1, <16 x i1> %c)
1217   ret i8* %z
1221 define arm_aapcs_vfpcc void @masked_v4f32(<4 x float> *%dest, <4 x float> %a, <4 x i32> %b) {
1222 ; CHECK-LE-LABEL: masked_v4f32:
1223 ; CHECK-LE:       @ %bb.0: @ %entry
1224 ; CHECK-LE-NEXT:    .pad #4
1225 ; CHECK-LE-NEXT:    sub sp, #4
1226 ; CHECK-LE-NEXT:    mov r1, sp
1227 ; CHECK-LE-NEXT:    vcmp.i32 ne, q1, zr
1228 ; CHECK-LE-NEXT:    vstr p0, [r1]
1229 ; CHECK-LE-NEXT:    ldrb.w r1, [sp]
1230 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1231 ; CHECK-LE-NEXT:    it ne
1232 ; CHECK-LE-NEXT:    vstrne s0, [r0]
1233 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1234 ; CHECK-LE-NEXT:    it mi
1235 ; CHECK-LE-NEXT:    vstrmi s1, [r0, #4]
1236 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1237 ; CHECK-LE-NEXT:    it mi
1238 ; CHECK-LE-NEXT:    vstrmi s2, [r0, #8]
1239 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1240 ; CHECK-LE-NEXT:    it mi
1241 ; CHECK-LE-NEXT:    vstrmi s3, [r0, #12]
1242 ; CHECK-LE-NEXT:    add sp, #4
1243 ; CHECK-LE-NEXT:    bx lr
1245 ; CHECK-BE-LABEL: masked_v4f32:
1246 ; CHECK-BE:       @ %bb.0: @ %entry
1247 ; CHECK-BE-NEXT:    .pad #4
1248 ; CHECK-BE-NEXT:    sub sp, #4
1249 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
1250 ; CHECK-BE-NEXT:    mov r1, sp
1251 ; CHECK-BE-NEXT:    vcmp.i32 ne, q2, zr
1252 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1253 ; CHECK-BE-NEXT:    vstr p0, [r1]
1254 ; CHECK-BE-NEXT:    ldrb.w r1, [sp]
1255 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1256 ; CHECK-BE-NEXT:    it ne
1257 ; CHECK-BE-NEXT:    vstrne s4, [r0]
1258 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1259 ; CHECK-BE-NEXT:    it mi
1260 ; CHECK-BE-NEXT:    vstrmi s5, [r0, #4]
1261 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1262 ; CHECK-BE-NEXT:    it mi
1263 ; CHECK-BE-NEXT:    vstrmi s6, [r0, #8]
1264 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1265 ; CHECK-BE-NEXT:    it mi
1266 ; CHECK-BE-NEXT:    vstrmi s7, [r0, #12]
1267 ; CHECK-BE-NEXT:    add sp, #4
1268 ; CHECK-BE-NEXT:    bx lr
1269 entry:
1270   %c = icmp ugt <4 x i32> %b, zeroinitializer
1271   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %a, <4 x float>* %dest, i32 4, <4 x i1> %c)
1272   ret void
1275 define arm_aapcs_vfpcc void @masked_v4f32_align1(<4 x float> *%dest, <4 x float> %a, <4 x i32> %b) {
1276 ; CHECK-LE-LABEL: masked_v4f32_align1:
1277 ; CHECK-LE:       @ %bb.0: @ %entry
1278 ; CHECK-LE-NEXT:    .pad #20
1279 ; CHECK-LE-NEXT:    sub sp, #20
1280 ; CHECK-LE-NEXT:    add r1, sp, #16
1281 ; CHECK-LE-NEXT:    vcmp.i32 ne, q1, zr
1282 ; CHECK-LE-NEXT:    vstr p0, [r1]
1283 ; CHECK-LE-NEXT:    ldrb.w r1, [sp, #16]
1284 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1285 ; CHECK-LE-NEXT:    ittt ne
1286 ; CHECK-LE-NEXT:    vstrne s0, [sp, #12]
1287 ; CHECK-LE-NEXT:    ldrne r2, [sp, #12]
1288 ; CHECK-LE-NEXT:    strne r2, [r0]
1289 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1290 ; CHECK-LE-NEXT:    ittt mi
1291 ; CHECK-LE-NEXT:    vstrmi s1, [sp, #8]
1292 ; CHECK-LE-NEXT:    ldrmi r2, [sp, #8]
1293 ; CHECK-LE-NEXT:    strmi r2, [r0, #4]
1294 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1295 ; CHECK-LE-NEXT:    ittt mi
1296 ; CHECK-LE-NEXT:    vstrmi s2, [sp, #4]
1297 ; CHECK-LE-NEXT:    ldrmi r2, [sp, #4]
1298 ; CHECK-LE-NEXT:    strmi r2, [r0, #8]
1299 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1300 ; CHECK-LE-NEXT:    ittt mi
1301 ; CHECK-LE-NEXT:    vstrmi s3, [sp]
1302 ; CHECK-LE-NEXT:    ldrmi r1, [sp]
1303 ; CHECK-LE-NEXT:    strmi r1, [r0, #12]
1304 ; CHECK-LE-NEXT:    add sp, #20
1305 ; CHECK-LE-NEXT:    bx lr
1307 ; CHECK-BE-LABEL: masked_v4f32_align1:
1308 ; CHECK-BE:       @ %bb.0: @ %entry
1309 ; CHECK-BE-NEXT:    .pad #20
1310 ; CHECK-BE-NEXT:    sub sp, #20
1311 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
1312 ; CHECK-BE-NEXT:    add r1, sp, #16
1313 ; CHECK-BE-NEXT:    vcmp.i32 ne, q2, zr
1314 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1315 ; CHECK-BE-NEXT:    vstr p0, [r1]
1316 ; CHECK-BE-NEXT:    ldrb.w r1, [sp, #16]
1317 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1318 ; CHECK-BE-NEXT:    ittt ne
1319 ; CHECK-BE-NEXT:    vstrne s4, [sp, #12]
1320 ; CHECK-BE-NEXT:    ldrne r2, [sp, #12]
1321 ; CHECK-BE-NEXT:    strne r2, [r0]
1322 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1323 ; CHECK-BE-NEXT:    ittt mi
1324 ; CHECK-BE-NEXT:    vstrmi s5, [sp, #8]
1325 ; CHECK-BE-NEXT:    ldrmi r2, [sp, #8]
1326 ; CHECK-BE-NEXT:    strmi r2, [r0, #4]
1327 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1328 ; CHECK-BE-NEXT:    ittt mi
1329 ; CHECK-BE-NEXT:    vstrmi s6, [sp, #4]
1330 ; CHECK-BE-NEXT:    ldrmi r2, [sp, #4]
1331 ; CHECK-BE-NEXT:    strmi r2, [r0, #8]
1332 ; CHECK-BE-NEXT:    lsls r1, r1, #28
1333 ; CHECK-BE-NEXT:    ittt mi
1334 ; CHECK-BE-NEXT:    vstrmi s7, [sp]
1335 ; CHECK-BE-NEXT:    ldrmi r1, [sp]
1336 ; CHECK-BE-NEXT:    strmi r1, [r0, #12]
1337 ; CHECK-BE-NEXT:    add sp, #20
1338 ; CHECK-BE-NEXT:    bx lr
1339 entry:
1340   %c = icmp ugt <4 x i32> %b, zeroinitializer
1341   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %a, <4 x float>* %dest, i32 1, <4 x i1> %c)
1342   ret void
1345 define i8* @masked_v4f32_pre(i8* %y, i8* %x, <4 x i32> %a) {
1346 ; CHECK-LE-LABEL: masked_v4f32_pre:
1347 ; CHECK-LE:       @ %bb.0: @ %entry
1348 ; CHECK-LE-NEXT:    .pad #8
1349 ; CHECK-LE-NEXT:    sub sp, #8
1350 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
1351 ; CHECK-LE-NEXT:    adds r0, #4
1352 ; CHECK-LE-NEXT:    vmov d0, r2, r3
1353 ; CHECK-LE-NEXT:    add r2, sp, #4
1354 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
1355 ; CHECK-LE-NEXT:    vstr p0, [r2]
1356 ; CHECK-LE-NEXT:    ldrb.w r2, [sp, #4]
1357 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1358 ; CHECK-LE-NEXT:    lsls r1, r2, #31
1359 ; CHECK-LE-NEXT:    it ne
1360 ; CHECK-LE-NEXT:    vstrne s0, [r0]
1361 ; CHECK-LE-NEXT:    lsls r1, r2, #30
1362 ; CHECK-LE-NEXT:    it mi
1363 ; CHECK-LE-NEXT:    vstrmi s1, [r0, #4]
1364 ; CHECK-LE-NEXT:    lsls r1, r2, #29
1365 ; CHECK-LE-NEXT:    it mi
1366 ; CHECK-LE-NEXT:    vstrmi s2, [r0, #8]
1367 ; CHECK-LE-NEXT:    lsls r1, r2, #28
1368 ; CHECK-LE-NEXT:    it mi
1369 ; CHECK-LE-NEXT:    vstrmi s3, [r0, #12]
1370 ; CHECK-LE-NEXT:    add sp, #8
1371 ; CHECK-LE-NEXT:    bx lr
1373 ; CHECK-BE-LABEL: masked_v4f32_pre:
1374 ; CHECK-BE:       @ %bb.0: @ %entry
1375 ; CHECK-BE-NEXT:    .pad #8
1376 ; CHECK-BE-NEXT:    sub sp, #8
1377 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
1378 ; CHECK-BE-NEXT:    adds r0, #4
1379 ; CHECK-BE-NEXT:    vmov d0, r3, r2
1380 ; CHECK-BE-NEXT:    add r2, sp, #4
1381 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1382 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
1383 ; CHECK-BE-NEXT:    vstr p0, [r2]
1384 ; CHECK-BE-NEXT:    ldrb.w r2, [sp, #4]
1385 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1386 ; CHECK-BE-NEXT:    lsls r1, r2, #31
1387 ; CHECK-BE-NEXT:    it ne
1388 ; CHECK-BE-NEXT:    vstrne s0, [r0]
1389 ; CHECK-BE-NEXT:    lsls r1, r2, #30
1390 ; CHECK-BE-NEXT:    it mi
1391 ; CHECK-BE-NEXT:    vstrmi s1, [r0, #4]
1392 ; CHECK-BE-NEXT:    lsls r1, r2, #29
1393 ; CHECK-BE-NEXT:    it mi
1394 ; CHECK-BE-NEXT:    vstrmi s2, [r0, #8]
1395 ; CHECK-BE-NEXT:    lsls r1, r2, #28
1396 ; CHECK-BE-NEXT:    it mi
1397 ; CHECK-BE-NEXT:    vstrmi s3, [r0, #12]
1398 ; CHECK-BE-NEXT:    add sp, #8
1399 ; CHECK-BE-NEXT:    bx lr
1400 entry:
1401   %z = getelementptr inbounds i8, i8* %y, i32 4
1402   %0 = bitcast i8* %x to <4 x float>*
1403   %1 = load <4 x float>, <4 x float>* %0, align 4
1404   %2 = bitcast i8* %z to <4 x float>*
1405   %c = icmp sgt <4 x i32> %a, zeroinitializer
1406   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %1, <4 x float>* %2, i32 4, <4 x i1> %c)
1407   ret i8* %z
1410 define i8* @masked_v4f32_post(i8* %y, i8* %x, <4 x i32> %a) {
1411 ; CHECK-LE-LABEL: masked_v4f32_post:
1412 ; CHECK-LE:       @ %bb.0: @ %entry
1413 ; CHECK-LE-NEXT:    .pad #8
1414 ; CHECK-LE-NEXT:    sub sp, #8
1415 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
1416 ; CHECK-LE-NEXT:    vmov d0, r2, r3
1417 ; CHECK-LE-NEXT:    add r2, sp, #4
1418 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
1419 ; CHECK-LE-NEXT:    vstr p0, [r2]
1420 ; CHECK-LE-NEXT:    ldrb.w r2, [sp, #4]
1421 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1422 ; CHECK-LE-NEXT:    lsls r1, r2, #31
1423 ; CHECK-LE-NEXT:    it ne
1424 ; CHECK-LE-NEXT:    vstrne s0, [r0]
1425 ; CHECK-LE-NEXT:    lsls r1, r2, #30
1426 ; CHECK-LE-NEXT:    it mi
1427 ; CHECK-LE-NEXT:    vstrmi s1, [r0, #4]
1428 ; CHECK-LE-NEXT:    adds r1, r0, #4
1429 ; CHECK-LE-NEXT:    lsls r3, r2, #29
1430 ; CHECK-LE-NEXT:    it mi
1431 ; CHECK-LE-NEXT:    vstrmi s2, [r0, #8]
1432 ; CHECK-LE-NEXT:    lsls r2, r2, #28
1433 ; CHECK-LE-NEXT:    it mi
1434 ; CHECK-LE-NEXT:    vstrmi s3, [r0, #12]
1435 ; CHECK-LE-NEXT:    mov r0, r1
1436 ; CHECK-LE-NEXT:    add sp, #8
1437 ; CHECK-LE-NEXT:    bx lr
1439 ; CHECK-BE-LABEL: masked_v4f32_post:
1440 ; CHECK-BE:       @ %bb.0: @ %entry
1441 ; CHECK-BE-NEXT:    .pad #8
1442 ; CHECK-BE-NEXT:    sub sp, #8
1443 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
1444 ; CHECK-BE-NEXT:    vmov d0, r3, r2
1445 ; CHECK-BE-NEXT:    add r2, sp, #4
1446 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1447 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
1448 ; CHECK-BE-NEXT:    vstr p0, [r2]
1449 ; CHECK-BE-NEXT:    ldrb.w r2, [sp, #4]
1450 ; CHECK-BE-NEXT:    vldrw.u32 q0, [r1]
1451 ; CHECK-BE-NEXT:    lsls r1, r2, #31
1452 ; CHECK-BE-NEXT:    it ne
1453 ; CHECK-BE-NEXT:    vstrne s0, [r0]
1454 ; CHECK-BE-NEXT:    lsls r1, r2, #30
1455 ; CHECK-BE-NEXT:    it mi
1456 ; CHECK-BE-NEXT:    vstrmi s1, [r0, #4]
1457 ; CHECK-BE-NEXT:    adds r1, r0, #4
1458 ; CHECK-BE-NEXT:    lsls r3, r2, #29
1459 ; CHECK-BE-NEXT:    it mi
1460 ; CHECK-BE-NEXT:    vstrmi s2, [r0, #8]
1461 ; CHECK-BE-NEXT:    lsls r2, r2, #28
1462 ; CHECK-BE-NEXT:    it mi
1463 ; CHECK-BE-NEXT:    vstrmi s3, [r0, #12]
1464 ; CHECK-BE-NEXT:    mov r0, r1
1465 ; CHECK-BE-NEXT:    add sp, #8
1466 ; CHECK-BE-NEXT:    bx lr
1467 entry:
1468   %z = getelementptr inbounds i8, i8* %y, i32 4
1469   %0 = bitcast i8* %x to <4 x float>*
1470   %1 = load <4 x float>, <4 x float>* %0, align 4
1471   %2 = bitcast i8* %y to <4 x float>*
1472   %c = icmp sgt <4 x i32> %a, zeroinitializer
1473   call void @llvm.masked.store.v4f32.p0v4f32(<4 x float> %1, <4 x float>* %2, i32 4, <4 x i1> %c)
1474   ret i8* %z
1478 define arm_aapcs_vfpcc void @masked_v8f16(<8 x half> *%dest, <8 x half> %a, <8 x i16> %b) {
1479 ; CHECK-LE-LABEL: masked_v8f16:
1480 ; CHECK-LE:       @ %bb.0: @ %entry
1481 ; CHECK-LE-NEXT:    .pad #8
1482 ; CHECK-LE-NEXT:    sub sp, #8
1483 ; CHECK-LE-NEXT:    mov r1, sp
1484 ; CHECK-LE-NEXT:    vcmp.i16 ne, q1, zr
1485 ; CHECK-LE-NEXT:    vstr p0, [r1]
1486 ; CHECK-LE-NEXT:    ldrb.w r1, [sp]
1487 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1488 ; CHECK-LE-NEXT:    bne .LBB15_9
1489 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1490 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1491 ; CHECK-LE-NEXT:    bmi .LBB15_10
1492 ; CHECK-LE-NEXT:  .LBB15_2: @ %else2
1493 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1494 ; CHECK-LE-NEXT:    bmi .LBB15_11
1495 ; CHECK-LE-NEXT:  .LBB15_3: @ %else4
1496 ; CHECK-LE-NEXT:    lsls r2, r1, #28
1497 ; CHECK-LE-NEXT:    bmi .LBB15_12
1498 ; CHECK-LE-NEXT:  .LBB15_4: @ %else6
1499 ; CHECK-LE-NEXT:    lsls r2, r1, #27
1500 ; CHECK-LE-NEXT:    bmi .LBB15_13
1501 ; CHECK-LE-NEXT:  .LBB15_5: @ %else8
1502 ; CHECK-LE-NEXT:    lsls r2, r1, #26
1503 ; CHECK-LE-NEXT:    bmi .LBB15_14
1504 ; CHECK-LE-NEXT:  .LBB15_6: @ %else10
1505 ; CHECK-LE-NEXT:    lsls r2, r1, #25
1506 ; CHECK-LE-NEXT:    bmi .LBB15_15
1507 ; CHECK-LE-NEXT:  .LBB15_7: @ %else12
1508 ; CHECK-LE-NEXT:    lsls r1, r1, #24
1509 ; CHECK-LE-NEXT:    bmi .LBB15_16
1510 ; CHECK-LE-NEXT:  .LBB15_8: @ %else14
1511 ; CHECK-LE-NEXT:    add sp, #8
1512 ; CHECK-LE-NEXT:    bx lr
1513 ; CHECK-LE-NEXT:  .LBB15_9: @ %cond.store
1514 ; CHECK-LE-NEXT:    vstr.16 s0, [r0]
1515 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1516 ; CHECK-LE-NEXT:    bpl .LBB15_2
1517 ; CHECK-LE-NEXT:  .LBB15_10: @ %cond.store1
1518 ; CHECK-LE-NEXT:    vmovx.f16 s4, s0
1519 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #2]
1520 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1521 ; CHECK-LE-NEXT:    bpl .LBB15_3
1522 ; CHECK-LE-NEXT:  .LBB15_11: @ %cond.store3
1523 ; CHECK-LE-NEXT:    vstr.16 s1, [r0, #4]
1524 ; CHECK-LE-NEXT:    lsls r2, r1, #28
1525 ; CHECK-LE-NEXT:    bpl .LBB15_4
1526 ; CHECK-LE-NEXT:  .LBB15_12: @ %cond.store5
1527 ; CHECK-LE-NEXT:    vmovx.f16 s4, s1
1528 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #6]
1529 ; CHECK-LE-NEXT:    lsls r2, r1, #27
1530 ; CHECK-LE-NEXT:    bpl .LBB15_5
1531 ; CHECK-LE-NEXT:  .LBB15_13: @ %cond.store7
1532 ; CHECK-LE-NEXT:    vstr.16 s2, [r0, #8]
1533 ; CHECK-LE-NEXT:    lsls r2, r1, #26
1534 ; CHECK-LE-NEXT:    bpl .LBB15_6
1535 ; CHECK-LE-NEXT:  .LBB15_14: @ %cond.store9
1536 ; CHECK-LE-NEXT:    vmovx.f16 s4, s2
1537 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #10]
1538 ; CHECK-LE-NEXT:    lsls r2, r1, #25
1539 ; CHECK-LE-NEXT:    bpl .LBB15_7
1540 ; CHECK-LE-NEXT:  .LBB15_15: @ %cond.store11
1541 ; CHECK-LE-NEXT:    vstr.16 s3, [r0, #12]
1542 ; CHECK-LE-NEXT:    lsls r1, r1, #24
1543 ; CHECK-LE-NEXT:    bpl .LBB15_8
1544 ; CHECK-LE-NEXT:  .LBB15_16: @ %cond.store13
1545 ; CHECK-LE-NEXT:    vmovx.f16 s0, s3
1546 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #14]
1547 ; CHECK-LE-NEXT:    add sp, #8
1548 ; CHECK-LE-NEXT:    bx lr
1550 ; CHECK-BE-LABEL: masked_v8f16:
1551 ; CHECK-BE:       @ %bb.0: @ %entry
1552 ; CHECK-BE-NEXT:    .pad #8
1553 ; CHECK-BE-NEXT:    sub sp, #8
1554 ; CHECK-BE-NEXT:    vrev64.16 q2, q1
1555 ; CHECK-BE-NEXT:    mov r1, sp
1556 ; CHECK-BE-NEXT:    vcmp.i16 ne, q2, zr
1557 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
1558 ; CHECK-BE-NEXT:    vstr p0, [r1]
1559 ; CHECK-BE-NEXT:    ldrb.w r1, [sp]
1560 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1561 ; CHECK-BE-NEXT:    bne .LBB15_9
1562 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1563 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1564 ; CHECK-BE-NEXT:    bmi .LBB15_10
1565 ; CHECK-BE-NEXT:  .LBB15_2: @ %else2
1566 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1567 ; CHECK-BE-NEXT:    bmi .LBB15_11
1568 ; CHECK-BE-NEXT:  .LBB15_3: @ %else4
1569 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1570 ; CHECK-BE-NEXT:    bmi .LBB15_12
1571 ; CHECK-BE-NEXT:  .LBB15_4: @ %else6
1572 ; CHECK-BE-NEXT:    lsls r2, r1, #27
1573 ; CHECK-BE-NEXT:    bmi .LBB15_13
1574 ; CHECK-BE-NEXT:  .LBB15_5: @ %else8
1575 ; CHECK-BE-NEXT:    lsls r2, r1, #26
1576 ; CHECK-BE-NEXT:    bmi .LBB15_14
1577 ; CHECK-BE-NEXT:  .LBB15_6: @ %else10
1578 ; CHECK-BE-NEXT:    lsls r2, r1, #25
1579 ; CHECK-BE-NEXT:    bmi .LBB15_15
1580 ; CHECK-BE-NEXT:  .LBB15_7: @ %else12
1581 ; CHECK-BE-NEXT:    lsls r1, r1, #24
1582 ; CHECK-BE-NEXT:    bmi .LBB15_16
1583 ; CHECK-BE-NEXT:  .LBB15_8: @ %else14
1584 ; CHECK-BE-NEXT:    add sp, #8
1585 ; CHECK-BE-NEXT:    bx lr
1586 ; CHECK-BE-NEXT:  .LBB15_9: @ %cond.store
1587 ; CHECK-BE-NEXT:    vstr.16 s4, [r0]
1588 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1589 ; CHECK-BE-NEXT:    bpl .LBB15_2
1590 ; CHECK-BE-NEXT:  .LBB15_10: @ %cond.store1
1591 ; CHECK-BE-NEXT:    vmovx.f16 s0, s4
1592 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #2]
1593 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1594 ; CHECK-BE-NEXT:    bpl .LBB15_3
1595 ; CHECK-BE-NEXT:  .LBB15_11: @ %cond.store3
1596 ; CHECK-BE-NEXT:    vstr.16 s5, [r0, #4]
1597 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1598 ; CHECK-BE-NEXT:    bpl .LBB15_4
1599 ; CHECK-BE-NEXT:  .LBB15_12: @ %cond.store5
1600 ; CHECK-BE-NEXT:    vmovx.f16 s0, s5
1601 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #6]
1602 ; CHECK-BE-NEXT:    lsls r2, r1, #27
1603 ; CHECK-BE-NEXT:    bpl .LBB15_5
1604 ; CHECK-BE-NEXT:  .LBB15_13: @ %cond.store7
1605 ; CHECK-BE-NEXT:    vstr.16 s6, [r0, #8]
1606 ; CHECK-BE-NEXT:    lsls r2, r1, #26
1607 ; CHECK-BE-NEXT:    bpl .LBB15_6
1608 ; CHECK-BE-NEXT:  .LBB15_14: @ %cond.store9
1609 ; CHECK-BE-NEXT:    vmovx.f16 s0, s6
1610 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #10]
1611 ; CHECK-BE-NEXT:    lsls r2, r1, #25
1612 ; CHECK-BE-NEXT:    bpl .LBB15_7
1613 ; CHECK-BE-NEXT:  .LBB15_15: @ %cond.store11
1614 ; CHECK-BE-NEXT:    vstr.16 s7, [r0, #12]
1615 ; CHECK-BE-NEXT:    lsls r1, r1, #24
1616 ; CHECK-BE-NEXT:    bpl .LBB15_8
1617 ; CHECK-BE-NEXT:  .LBB15_16: @ %cond.store13
1618 ; CHECK-BE-NEXT:    vmovx.f16 s0, s7
1619 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #14]
1620 ; CHECK-BE-NEXT:    add sp, #8
1621 ; CHECK-BE-NEXT:    bx lr
1622 entry:
1623   %c = icmp ugt <8 x i16> %b, zeroinitializer
1624   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %a, <8 x half>* %dest, i32 2, <8 x i1> %c)
1625   ret void
1628 define arm_aapcs_vfpcc void @masked_v8f16_align1(<8 x half> *%dest, <8 x half> %a, <8 x i16> %b) {
1629 ; CHECK-LE-LABEL: masked_v8f16_align1:
1630 ; CHECK-LE:       @ %bb.0: @ %entry
1631 ; CHECK-LE-NEXT:    .pad #40
1632 ; CHECK-LE-NEXT:    sub sp, #40
1633 ; CHECK-LE-NEXT:    add r1, sp, #32
1634 ; CHECK-LE-NEXT:    vcmp.i16 ne, q1, zr
1635 ; CHECK-LE-NEXT:    vstr p0, [r1]
1636 ; CHECK-LE-NEXT:    ldrb.w r1, [sp, #32]
1637 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1638 ; CHECK-LE-NEXT:    bne .LBB16_9
1639 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1640 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1641 ; CHECK-LE-NEXT:    bmi .LBB16_10
1642 ; CHECK-LE-NEXT:  .LBB16_2: @ %else2
1643 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1644 ; CHECK-LE-NEXT:    bmi .LBB16_11
1645 ; CHECK-LE-NEXT:  .LBB16_3: @ %else4
1646 ; CHECK-LE-NEXT:    lsls r2, r1, #28
1647 ; CHECK-LE-NEXT:    bmi .LBB16_12
1648 ; CHECK-LE-NEXT:  .LBB16_4: @ %else6
1649 ; CHECK-LE-NEXT:    lsls r2, r1, #27
1650 ; CHECK-LE-NEXT:    bmi .LBB16_13
1651 ; CHECK-LE-NEXT:  .LBB16_5: @ %else8
1652 ; CHECK-LE-NEXT:    lsls r2, r1, #26
1653 ; CHECK-LE-NEXT:    bmi .LBB16_14
1654 ; CHECK-LE-NEXT:  .LBB16_6: @ %else10
1655 ; CHECK-LE-NEXT:    lsls r2, r1, #25
1656 ; CHECK-LE-NEXT:    bmi .LBB16_15
1657 ; CHECK-LE-NEXT:  .LBB16_7: @ %else12
1658 ; CHECK-LE-NEXT:    lsls r1, r1, #24
1659 ; CHECK-LE-NEXT:    bmi .LBB16_16
1660 ; CHECK-LE-NEXT:  .LBB16_8: @ %else14
1661 ; CHECK-LE-NEXT:    add sp, #40
1662 ; CHECK-LE-NEXT:    bx lr
1663 ; CHECK-LE-NEXT:  .LBB16_9: @ %cond.store
1664 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #28]
1665 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #28]
1666 ; CHECK-LE-NEXT:    strh r2, [r0]
1667 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1668 ; CHECK-LE-NEXT:    bpl .LBB16_2
1669 ; CHECK-LE-NEXT:  .LBB16_10: @ %cond.store1
1670 ; CHECK-LE-NEXT:    vmovx.f16 s4, s0
1671 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #24]
1672 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #24]
1673 ; CHECK-LE-NEXT:    strh r2, [r0, #2]
1674 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1675 ; CHECK-LE-NEXT:    bpl .LBB16_3
1676 ; CHECK-LE-NEXT:  .LBB16_11: @ %cond.store3
1677 ; CHECK-LE-NEXT:    vstr.16 s1, [sp, #20]
1678 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #20]
1679 ; CHECK-LE-NEXT:    strh r2, [r0, #4]
1680 ; CHECK-LE-NEXT:    lsls r2, r1, #28
1681 ; CHECK-LE-NEXT:    bpl .LBB16_4
1682 ; CHECK-LE-NEXT:  .LBB16_12: @ %cond.store5
1683 ; CHECK-LE-NEXT:    vmovx.f16 s4, s1
1684 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #16]
1685 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #16]
1686 ; CHECK-LE-NEXT:    strh r2, [r0, #6]
1687 ; CHECK-LE-NEXT:    lsls r2, r1, #27
1688 ; CHECK-LE-NEXT:    bpl .LBB16_5
1689 ; CHECK-LE-NEXT:  .LBB16_13: @ %cond.store7
1690 ; CHECK-LE-NEXT:    vstr.16 s2, [sp, #12]
1691 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #12]
1692 ; CHECK-LE-NEXT:    strh r2, [r0, #8]
1693 ; CHECK-LE-NEXT:    lsls r2, r1, #26
1694 ; CHECK-LE-NEXT:    bpl .LBB16_6
1695 ; CHECK-LE-NEXT:  .LBB16_14: @ %cond.store9
1696 ; CHECK-LE-NEXT:    vmovx.f16 s4, s2
1697 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #8]
1698 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #8]
1699 ; CHECK-LE-NEXT:    strh r2, [r0, #10]
1700 ; CHECK-LE-NEXT:    lsls r2, r1, #25
1701 ; CHECK-LE-NEXT:    bpl .LBB16_7
1702 ; CHECK-LE-NEXT:  .LBB16_15: @ %cond.store11
1703 ; CHECK-LE-NEXT:    vstr.16 s3, [sp, #4]
1704 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #4]
1705 ; CHECK-LE-NEXT:    strh r2, [r0, #12]
1706 ; CHECK-LE-NEXT:    lsls r1, r1, #24
1707 ; CHECK-LE-NEXT:    bpl .LBB16_8
1708 ; CHECK-LE-NEXT:  .LBB16_16: @ %cond.store13
1709 ; CHECK-LE-NEXT:    vmovx.f16 s0, s3
1710 ; CHECK-LE-NEXT:    vstr.16 s0, [sp]
1711 ; CHECK-LE-NEXT:    ldrh.w r1, [sp]
1712 ; CHECK-LE-NEXT:    strh r1, [r0, #14]
1713 ; CHECK-LE-NEXT:    add sp, #40
1714 ; CHECK-LE-NEXT:    bx lr
1716 ; CHECK-BE-LABEL: masked_v8f16_align1:
1717 ; CHECK-BE:       @ %bb.0: @ %entry
1718 ; CHECK-BE-NEXT:    .pad #40
1719 ; CHECK-BE-NEXT:    sub sp, #40
1720 ; CHECK-BE-NEXT:    vrev64.16 q2, q1
1721 ; CHECK-BE-NEXT:    add r1, sp, #32
1722 ; CHECK-BE-NEXT:    vcmp.i16 ne, q2, zr
1723 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
1724 ; CHECK-BE-NEXT:    vstr p0, [r1]
1725 ; CHECK-BE-NEXT:    ldrb.w r1, [sp, #32]
1726 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1727 ; CHECK-BE-NEXT:    bne .LBB16_9
1728 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1729 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1730 ; CHECK-BE-NEXT:    bmi .LBB16_10
1731 ; CHECK-BE-NEXT:  .LBB16_2: @ %else2
1732 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1733 ; CHECK-BE-NEXT:    bmi .LBB16_11
1734 ; CHECK-BE-NEXT:  .LBB16_3: @ %else4
1735 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1736 ; CHECK-BE-NEXT:    bmi .LBB16_12
1737 ; CHECK-BE-NEXT:  .LBB16_4: @ %else6
1738 ; CHECK-BE-NEXT:    lsls r2, r1, #27
1739 ; CHECK-BE-NEXT:    bmi .LBB16_13
1740 ; CHECK-BE-NEXT:  .LBB16_5: @ %else8
1741 ; CHECK-BE-NEXT:    lsls r2, r1, #26
1742 ; CHECK-BE-NEXT:    bmi .LBB16_14
1743 ; CHECK-BE-NEXT:  .LBB16_6: @ %else10
1744 ; CHECK-BE-NEXT:    lsls r2, r1, #25
1745 ; CHECK-BE-NEXT:    bmi .LBB16_15
1746 ; CHECK-BE-NEXT:  .LBB16_7: @ %else12
1747 ; CHECK-BE-NEXT:    lsls r1, r1, #24
1748 ; CHECK-BE-NEXT:    bmi .LBB16_16
1749 ; CHECK-BE-NEXT:  .LBB16_8: @ %else14
1750 ; CHECK-BE-NEXT:    add sp, #40
1751 ; CHECK-BE-NEXT:    bx lr
1752 ; CHECK-BE-NEXT:  .LBB16_9: @ %cond.store
1753 ; CHECK-BE-NEXT:    vstr.16 s4, [sp, #28]
1754 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #28]
1755 ; CHECK-BE-NEXT:    strh r2, [r0]
1756 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1757 ; CHECK-BE-NEXT:    bpl .LBB16_2
1758 ; CHECK-BE-NEXT:  .LBB16_10: @ %cond.store1
1759 ; CHECK-BE-NEXT:    vmovx.f16 s0, s4
1760 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #24]
1761 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #24]
1762 ; CHECK-BE-NEXT:    strh r2, [r0, #2]
1763 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1764 ; CHECK-BE-NEXT:    bpl .LBB16_3
1765 ; CHECK-BE-NEXT:  .LBB16_11: @ %cond.store3
1766 ; CHECK-BE-NEXT:    vstr.16 s5, [sp, #20]
1767 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #20]
1768 ; CHECK-BE-NEXT:    strh r2, [r0, #4]
1769 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1770 ; CHECK-BE-NEXT:    bpl .LBB16_4
1771 ; CHECK-BE-NEXT:  .LBB16_12: @ %cond.store5
1772 ; CHECK-BE-NEXT:    vmovx.f16 s0, s5
1773 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #16]
1774 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #16]
1775 ; CHECK-BE-NEXT:    strh r2, [r0, #6]
1776 ; CHECK-BE-NEXT:    lsls r2, r1, #27
1777 ; CHECK-BE-NEXT:    bpl .LBB16_5
1778 ; CHECK-BE-NEXT:  .LBB16_13: @ %cond.store7
1779 ; CHECK-BE-NEXT:    vstr.16 s6, [sp, #12]
1780 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #12]
1781 ; CHECK-BE-NEXT:    strh r2, [r0, #8]
1782 ; CHECK-BE-NEXT:    lsls r2, r1, #26
1783 ; CHECK-BE-NEXT:    bpl .LBB16_6
1784 ; CHECK-BE-NEXT:  .LBB16_14: @ %cond.store9
1785 ; CHECK-BE-NEXT:    vmovx.f16 s0, s6
1786 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #8]
1787 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #8]
1788 ; CHECK-BE-NEXT:    strh r2, [r0, #10]
1789 ; CHECK-BE-NEXT:    lsls r2, r1, #25
1790 ; CHECK-BE-NEXT:    bpl .LBB16_7
1791 ; CHECK-BE-NEXT:  .LBB16_15: @ %cond.store11
1792 ; CHECK-BE-NEXT:    vstr.16 s7, [sp, #4]
1793 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #4]
1794 ; CHECK-BE-NEXT:    strh r2, [r0, #12]
1795 ; CHECK-BE-NEXT:    lsls r1, r1, #24
1796 ; CHECK-BE-NEXT:    bpl .LBB16_8
1797 ; CHECK-BE-NEXT:  .LBB16_16: @ %cond.store13
1798 ; CHECK-BE-NEXT:    vmovx.f16 s0, s7
1799 ; CHECK-BE-NEXT:    vstr.16 s0, [sp]
1800 ; CHECK-BE-NEXT:    ldrh.w r1, [sp]
1801 ; CHECK-BE-NEXT:    strh r1, [r0, #14]
1802 ; CHECK-BE-NEXT:    add sp, #40
1803 ; CHECK-BE-NEXT:    bx lr
1804 entry:
1805   %c = icmp ugt <8 x i16> %b, zeroinitializer
1806   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %a, <8 x half>* %dest, i32 1, <8 x i1> %c)
1807   ret void
1810 define i8* @masked_v8f16_pre(i8* %y, i8* %x, <8 x i16> %a) {
1811 ; CHECK-LE-LABEL: masked_v8f16_pre:
1812 ; CHECK-LE:       @ %bb.0: @ %entry
1813 ; CHECK-LE-NEXT:    .pad #8
1814 ; CHECK-LE-NEXT:    sub sp, #8
1815 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
1816 ; CHECK-LE-NEXT:    adds r0, #4
1817 ; CHECK-LE-NEXT:    vmov d0, r2, r3
1818 ; CHECK-LE-NEXT:    mov r2, sp
1819 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
1820 ; CHECK-LE-NEXT:    vstr p0, [r2]
1821 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1822 ; CHECK-LE-NEXT:    ldrb.w r1, [sp]
1823 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1824 ; CHECK-LE-NEXT:    bne .LBB17_9
1825 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1826 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1827 ; CHECK-LE-NEXT:    bmi .LBB17_10
1828 ; CHECK-LE-NEXT:  .LBB17_2: @ %else2
1829 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1830 ; CHECK-LE-NEXT:    bmi .LBB17_11
1831 ; CHECK-LE-NEXT:  .LBB17_3: @ %else4
1832 ; CHECK-LE-NEXT:    lsls r2, r1, #28
1833 ; CHECK-LE-NEXT:    bmi .LBB17_12
1834 ; CHECK-LE-NEXT:  .LBB17_4: @ %else6
1835 ; CHECK-LE-NEXT:    lsls r2, r1, #27
1836 ; CHECK-LE-NEXT:    bmi .LBB17_13
1837 ; CHECK-LE-NEXT:  .LBB17_5: @ %else8
1838 ; CHECK-LE-NEXT:    lsls r2, r1, #26
1839 ; CHECK-LE-NEXT:    bmi .LBB17_14
1840 ; CHECK-LE-NEXT:  .LBB17_6: @ %else10
1841 ; CHECK-LE-NEXT:    lsls r2, r1, #25
1842 ; CHECK-LE-NEXT:    bmi .LBB17_15
1843 ; CHECK-LE-NEXT:  .LBB17_7: @ %else12
1844 ; CHECK-LE-NEXT:    lsls r1, r1, #24
1845 ; CHECK-LE-NEXT:    bmi .LBB17_16
1846 ; CHECK-LE-NEXT:  .LBB17_8: @ %else14
1847 ; CHECK-LE-NEXT:    add sp, #8
1848 ; CHECK-LE-NEXT:    bx lr
1849 ; CHECK-LE-NEXT:  .LBB17_9: @ %cond.store
1850 ; CHECK-LE-NEXT:    vstr.16 s0, [r0]
1851 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1852 ; CHECK-LE-NEXT:    bpl .LBB17_2
1853 ; CHECK-LE-NEXT:  .LBB17_10: @ %cond.store1
1854 ; CHECK-LE-NEXT:    vmovx.f16 s4, s0
1855 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #2]
1856 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1857 ; CHECK-LE-NEXT:    bpl .LBB17_3
1858 ; CHECK-LE-NEXT:  .LBB17_11: @ %cond.store3
1859 ; CHECK-LE-NEXT:    vstr.16 s1, [r0, #4]
1860 ; CHECK-LE-NEXT:    lsls r2, r1, #28
1861 ; CHECK-LE-NEXT:    bpl .LBB17_4
1862 ; CHECK-LE-NEXT:  .LBB17_12: @ %cond.store5
1863 ; CHECK-LE-NEXT:    vmovx.f16 s4, s1
1864 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #6]
1865 ; CHECK-LE-NEXT:    lsls r2, r1, #27
1866 ; CHECK-LE-NEXT:    bpl .LBB17_5
1867 ; CHECK-LE-NEXT:  .LBB17_13: @ %cond.store7
1868 ; CHECK-LE-NEXT:    vstr.16 s2, [r0, #8]
1869 ; CHECK-LE-NEXT:    lsls r2, r1, #26
1870 ; CHECK-LE-NEXT:    bpl .LBB17_6
1871 ; CHECK-LE-NEXT:  .LBB17_14: @ %cond.store9
1872 ; CHECK-LE-NEXT:    vmovx.f16 s4, s2
1873 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #10]
1874 ; CHECK-LE-NEXT:    lsls r2, r1, #25
1875 ; CHECK-LE-NEXT:    bpl .LBB17_7
1876 ; CHECK-LE-NEXT:  .LBB17_15: @ %cond.store11
1877 ; CHECK-LE-NEXT:    vstr.16 s3, [r0, #12]
1878 ; CHECK-LE-NEXT:    lsls r1, r1, #24
1879 ; CHECK-LE-NEXT:    bpl .LBB17_8
1880 ; CHECK-LE-NEXT:  .LBB17_16: @ %cond.store13
1881 ; CHECK-LE-NEXT:    vmovx.f16 s0, s3
1882 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #14]
1883 ; CHECK-LE-NEXT:    add sp, #8
1884 ; CHECK-LE-NEXT:    bx lr
1886 ; CHECK-BE-LABEL: masked_v8f16_pre:
1887 ; CHECK-BE:       @ %bb.0: @ %entry
1888 ; CHECK-BE-NEXT:    .pad #8
1889 ; CHECK-BE-NEXT:    sub sp, #8
1890 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
1891 ; CHECK-BE-NEXT:    adds r0, #4
1892 ; CHECK-BE-NEXT:    vmov d0, r3, r2
1893 ; CHECK-BE-NEXT:    mov r2, sp
1894 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
1895 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
1896 ; CHECK-BE-NEXT:    vstr p0, [r2]
1897 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
1898 ; CHECK-BE-NEXT:    ldrb.w r1, [sp]
1899 ; CHECK-BE-NEXT:    lsls r2, r1, #31
1900 ; CHECK-BE-NEXT:    bne .LBB17_9
1901 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1902 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1903 ; CHECK-BE-NEXT:    bmi .LBB17_10
1904 ; CHECK-BE-NEXT:  .LBB17_2: @ %else2
1905 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1906 ; CHECK-BE-NEXT:    bmi .LBB17_11
1907 ; CHECK-BE-NEXT:  .LBB17_3: @ %else4
1908 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1909 ; CHECK-BE-NEXT:    bmi .LBB17_12
1910 ; CHECK-BE-NEXT:  .LBB17_4: @ %else6
1911 ; CHECK-BE-NEXT:    lsls r2, r1, #27
1912 ; CHECK-BE-NEXT:    bmi .LBB17_13
1913 ; CHECK-BE-NEXT:  .LBB17_5: @ %else8
1914 ; CHECK-BE-NEXT:    lsls r2, r1, #26
1915 ; CHECK-BE-NEXT:    bmi .LBB17_14
1916 ; CHECK-BE-NEXT:  .LBB17_6: @ %else10
1917 ; CHECK-BE-NEXT:    lsls r2, r1, #25
1918 ; CHECK-BE-NEXT:    bmi .LBB17_15
1919 ; CHECK-BE-NEXT:  .LBB17_7: @ %else12
1920 ; CHECK-BE-NEXT:    lsls r1, r1, #24
1921 ; CHECK-BE-NEXT:    bmi .LBB17_16
1922 ; CHECK-BE-NEXT:  .LBB17_8: @ %else14
1923 ; CHECK-BE-NEXT:    add sp, #8
1924 ; CHECK-BE-NEXT:    bx lr
1925 ; CHECK-BE-NEXT:  .LBB17_9: @ %cond.store
1926 ; CHECK-BE-NEXT:    vstr.16 s0, [r0]
1927 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1928 ; CHECK-BE-NEXT:    bpl .LBB17_2
1929 ; CHECK-BE-NEXT:  .LBB17_10: @ %cond.store1
1930 ; CHECK-BE-NEXT:    vmovx.f16 s4, s0
1931 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #2]
1932 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1933 ; CHECK-BE-NEXT:    bpl .LBB17_3
1934 ; CHECK-BE-NEXT:  .LBB17_11: @ %cond.store3
1935 ; CHECK-BE-NEXT:    vstr.16 s1, [r0, #4]
1936 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1937 ; CHECK-BE-NEXT:    bpl .LBB17_4
1938 ; CHECK-BE-NEXT:  .LBB17_12: @ %cond.store5
1939 ; CHECK-BE-NEXT:    vmovx.f16 s4, s1
1940 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #6]
1941 ; CHECK-BE-NEXT:    lsls r2, r1, #27
1942 ; CHECK-BE-NEXT:    bpl .LBB17_5
1943 ; CHECK-BE-NEXT:  .LBB17_13: @ %cond.store7
1944 ; CHECK-BE-NEXT:    vstr.16 s2, [r0, #8]
1945 ; CHECK-BE-NEXT:    lsls r2, r1, #26
1946 ; CHECK-BE-NEXT:    bpl .LBB17_6
1947 ; CHECK-BE-NEXT:  .LBB17_14: @ %cond.store9
1948 ; CHECK-BE-NEXT:    vmovx.f16 s4, s2
1949 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #10]
1950 ; CHECK-BE-NEXT:    lsls r2, r1, #25
1951 ; CHECK-BE-NEXT:    bpl .LBB17_7
1952 ; CHECK-BE-NEXT:  .LBB17_15: @ %cond.store11
1953 ; CHECK-BE-NEXT:    vstr.16 s3, [r0, #12]
1954 ; CHECK-BE-NEXT:    lsls r1, r1, #24
1955 ; CHECK-BE-NEXT:    bpl .LBB17_8
1956 ; CHECK-BE-NEXT:  .LBB17_16: @ %cond.store13
1957 ; CHECK-BE-NEXT:    vmovx.f16 s0, s3
1958 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #14]
1959 ; CHECK-BE-NEXT:    add sp, #8
1960 ; CHECK-BE-NEXT:    bx lr
1961 entry:
1962   %z = getelementptr inbounds i8, i8* %y, i32 4
1963   %0 = bitcast i8* %x to <8 x half>*
1964   %1 = load <8 x half>, <8 x half>* %0, align 4
1965   %2 = bitcast i8* %z to <8 x half>*
1966   %c = icmp sgt <8 x i16> %a, zeroinitializer
1967   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %1, <8 x half>* %2, i32 2, <8 x i1> %c)
1968   ret i8* %z
1971 define i8* @masked_v8f16_post(i8* %y, i8* %x, <8 x i16> %a) {
1972 ; CHECK-LE-LABEL: masked_v8f16_post:
1973 ; CHECK-LE:       @ %bb.0: @ %entry
1974 ; CHECK-LE-NEXT:    .pad #8
1975 ; CHECK-LE-NEXT:    sub sp, #8
1976 ; CHECK-LE-NEXT:    vldr d1, [sp, #8]
1977 ; CHECK-LE-NEXT:    vmov d0, r2, r3
1978 ; CHECK-LE-NEXT:    mov r2, sp
1979 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
1980 ; CHECK-LE-NEXT:    vstr p0, [r2]
1981 ; CHECK-LE-NEXT:    ldrb.w r2, [sp]
1982 ; CHECK-LE-NEXT:    vldrw.u32 q0, [r1]
1983 ; CHECK-LE-NEXT:    lsls r1, r2, #31
1984 ; CHECK-LE-NEXT:    bne .LBB18_12
1985 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1986 ; CHECK-LE-NEXT:    lsls r1, r2, #30
1987 ; CHECK-LE-NEXT:    bmi .LBB18_13
1988 ; CHECK-LE-NEXT:  .LBB18_2: @ %else2
1989 ; CHECK-LE-NEXT:    lsls r1, r2, #29
1990 ; CHECK-LE-NEXT:    bmi .LBB18_14
1991 ; CHECK-LE-NEXT:  .LBB18_3: @ %else4
1992 ; CHECK-LE-NEXT:    lsls r1, r2, #28
1993 ; CHECK-LE-NEXT:    bmi .LBB18_15
1994 ; CHECK-LE-NEXT:  .LBB18_4: @ %else6
1995 ; CHECK-LE-NEXT:    lsls r1, r2, #27
1996 ; CHECK-LE-NEXT:    bmi .LBB18_16
1997 ; CHECK-LE-NEXT:  .LBB18_5: @ %else8
1998 ; CHECK-LE-NEXT:    lsls r1, r2, #26
1999 ; CHECK-LE-NEXT:    bpl .LBB18_7
2000 ; CHECK-LE-NEXT:  .LBB18_6: @ %cond.store9
2001 ; CHECK-LE-NEXT:    vmovx.f16 s4, s2
2002 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #10]
2003 ; CHECK-LE-NEXT:  .LBB18_7: @ %else10
2004 ; CHECK-LE-NEXT:    adds r1, r0, #4
2005 ; CHECK-LE-NEXT:    lsls r3, r2, #25
2006 ; CHECK-LE-NEXT:    bpl .LBB18_9
2007 ; CHECK-LE-NEXT:  @ %bb.8: @ %cond.store11
2008 ; CHECK-LE-NEXT:    vstr.16 s3, [r0, #12]
2009 ; CHECK-LE-NEXT:  .LBB18_9: @ %else12
2010 ; CHECK-LE-NEXT:    lsls r2, r2, #24
2011 ; CHECK-LE-NEXT:    bpl .LBB18_11
2012 ; CHECK-LE-NEXT:  @ %bb.10: @ %cond.store13
2013 ; CHECK-LE-NEXT:    vmovx.f16 s0, s3
2014 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #14]
2015 ; CHECK-LE-NEXT:  .LBB18_11: @ %else14
2016 ; CHECK-LE-NEXT:    mov r0, r1
2017 ; CHECK-LE-NEXT:    add sp, #8
2018 ; CHECK-LE-NEXT:    bx lr
2019 ; CHECK-LE-NEXT:  .LBB18_12: @ %cond.store
2020 ; CHECK-LE-NEXT:    vstr.16 s0, [r0]
2021 ; CHECK-LE-NEXT:    lsls r1, r2, #30
2022 ; CHECK-LE-NEXT:    bpl .LBB18_2
2023 ; CHECK-LE-NEXT:  .LBB18_13: @ %cond.store1
2024 ; CHECK-LE-NEXT:    vmovx.f16 s4, s0
2025 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #2]
2026 ; CHECK-LE-NEXT:    lsls r1, r2, #29
2027 ; CHECK-LE-NEXT:    bpl .LBB18_3
2028 ; CHECK-LE-NEXT:  .LBB18_14: @ %cond.store3
2029 ; CHECK-LE-NEXT:    vstr.16 s1, [r0, #4]
2030 ; CHECK-LE-NEXT:    lsls r1, r2, #28
2031 ; CHECK-LE-NEXT:    bpl .LBB18_4
2032 ; CHECK-LE-NEXT:  .LBB18_15: @ %cond.store5
2033 ; CHECK-LE-NEXT:    vmovx.f16 s4, s1
2034 ; CHECK-LE-NEXT:    vstr.16 s4, [r0, #6]
2035 ; CHECK-LE-NEXT:    lsls r1, r2, #27
2036 ; CHECK-LE-NEXT:    bpl .LBB18_5
2037 ; CHECK-LE-NEXT:  .LBB18_16: @ %cond.store7
2038 ; CHECK-LE-NEXT:    vstr.16 s2, [r0, #8]
2039 ; CHECK-LE-NEXT:    lsls r1, r2, #26
2040 ; CHECK-LE-NEXT:    bmi .LBB18_6
2041 ; CHECK-LE-NEXT:    b .LBB18_7
2043 ; CHECK-BE-LABEL: masked_v8f16_post:
2044 ; CHECK-BE:       @ %bb.0: @ %entry
2045 ; CHECK-BE-NEXT:    .pad #8
2046 ; CHECK-BE-NEXT:    sub sp, #8
2047 ; CHECK-BE-NEXT:    vldr d1, [sp, #8]
2048 ; CHECK-BE-NEXT:    vmov d0, r3, r2
2049 ; CHECK-BE-NEXT:    mov r2, sp
2050 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
2051 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
2052 ; CHECK-BE-NEXT:    vstr p0, [r2]
2053 ; CHECK-BE-NEXT:    ldrb.w r2, [sp]
2054 ; CHECK-BE-NEXT:    vldrh.u16 q0, [r1]
2055 ; CHECK-BE-NEXT:    lsls r1, r2, #31
2056 ; CHECK-BE-NEXT:    bne .LBB18_12
2057 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
2058 ; CHECK-BE-NEXT:    lsls r1, r2, #30
2059 ; CHECK-BE-NEXT:    bmi .LBB18_13
2060 ; CHECK-BE-NEXT:  .LBB18_2: @ %else2
2061 ; CHECK-BE-NEXT:    lsls r1, r2, #29
2062 ; CHECK-BE-NEXT:    bmi .LBB18_14
2063 ; CHECK-BE-NEXT:  .LBB18_3: @ %else4
2064 ; CHECK-BE-NEXT:    lsls r1, r2, #28
2065 ; CHECK-BE-NEXT:    bmi .LBB18_15
2066 ; CHECK-BE-NEXT:  .LBB18_4: @ %else6
2067 ; CHECK-BE-NEXT:    lsls r1, r2, #27
2068 ; CHECK-BE-NEXT:    bmi .LBB18_16
2069 ; CHECK-BE-NEXT:  .LBB18_5: @ %else8
2070 ; CHECK-BE-NEXT:    lsls r1, r2, #26
2071 ; CHECK-BE-NEXT:    bpl .LBB18_7
2072 ; CHECK-BE-NEXT:  .LBB18_6: @ %cond.store9
2073 ; CHECK-BE-NEXT:    vmovx.f16 s4, s2
2074 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #10]
2075 ; CHECK-BE-NEXT:  .LBB18_7: @ %else10
2076 ; CHECK-BE-NEXT:    adds r1, r0, #4
2077 ; CHECK-BE-NEXT:    lsls r3, r2, #25
2078 ; CHECK-BE-NEXT:    bpl .LBB18_9
2079 ; CHECK-BE-NEXT:  @ %bb.8: @ %cond.store11
2080 ; CHECK-BE-NEXT:    vstr.16 s3, [r0, #12]
2081 ; CHECK-BE-NEXT:  .LBB18_9: @ %else12
2082 ; CHECK-BE-NEXT:    lsls r2, r2, #24
2083 ; CHECK-BE-NEXT:    bpl .LBB18_11
2084 ; CHECK-BE-NEXT:  @ %bb.10: @ %cond.store13
2085 ; CHECK-BE-NEXT:    vmovx.f16 s0, s3
2086 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #14]
2087 ; CHECK-BE-NEXT:  .LBB18_11: @ %else14
2088 ; CHECK-BE-NEXT:    mov r0, r1
2089 ; CHECK-BE-NEXT:    add sp, #8
2090 ; CHECK-BE-NEXT:    bx lr
2091 ; CHECK-BE-NEXT:  .LBB18_12: @ %cond.store
2092 ; CHECK-BE-NEXT:    vstr.16 s0, [r0]
2093 ; CHECK-BE-NEXT:    lsls r1, r2, #30
2094 ; CHECK-BE-NEXT:    bpl .LBB18_2
2095 ; CHECK-BE-NEXT:  .LBB18_13: @ %cond.store1
2096 ; CHECK-BE-NEXT:    vmovx.f16 s4, s0
2097 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #2]
2098 ; CHECK-BE-NEXT:    lsls r1, r2, #29
2099 ; CHECK-BE-NEXT:    bpl .LBB18_3
2100 ; CHECK-BE-NEXT:  .LBB18_14: @ %cond.store3
2101 ; CHECK-BE-NEXT:    vstr.16 s1, [r0, #4]
2102 ; CHECK-BE-NEXT:    lsls r1, r2, #28
2103 ; CHECK-BE-NEXT:    bpl .LBB18_4
2104 ; CHECK-BE-NEXT:  .LBB18_15: @ %cond.store5
2105 ; CHECK-BE-NEXT:    vmovx.f16 s4, s1
2106 ; CHECK-BE-NEXT:    vstr.16 s4, [r0, #6]
2107 ; CHECK-BE-NEXT:    lsls r1, r2, #27
2108 ; CHECK-BE-NEXT:    bpl .LBB18_5
2109 ; CHECK-BE-NEXT:  .LBB18_16: @ %cond.store7
2110 ; CHECK-BE-NEXT:    vstr.16 s2, [r0, #8]
2111 ; CHECK-BE-NEXT:    lsls r1, r2, #26
2112 ; CHECK-BE-NEXT:    bmi .LBB18_6
2113 ; CHECK-BE-NEXT:    b .LBB18_7
2114 entry:
2115   %z = getelementptr inbounds i8, i8* %y, i32 4
2116   %0 = bitcast i8* %x to <8 x half>*
2117   %1 = load <8 x half>, <8 x half>* %0, align 4
2118   %2 = bitcast i8* %y to <8 x half>*
2119   %c = icmp sgt <8 x i16> %a, zeroinitializer
2120   call void @llvm.masked.store.v8f16.p0v8f16(<8 x half> %1, <8 x half>* %2, i32 2, <8 x i1> %c)
2121   ret i8* %z
2125 define arm_aapcs_vfpcc void @masked_v2i64(<2 x i64> *%dest, <2 x i64> %a) {
2126 ; CHECK-LE-LABEL: masked_v2i64:
2127 ; CHECK-LE:       @ %bb.0: @ %entry
2128 ; CHECK-LE-NEXT:    .pad #4
2129 ; CHECK-LE-NEXT:    sub sp, #4
2130 ; CHECK-LE-NEXT:    vmov r2, s0
2131 ; CHECK-LE-NEXT:    movs r3, #0
2132 ; CHECK-LE-NEXT:    vmov r1, s1
2133 ; CHECK-LE-NEXT:    vmov r12, s3
2134 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
2135 ; CHECK-LE-NEXT:    vmov r2, s2
2136 ; CHECK-LE-NEXT:    sbcs.w r1, r3, r1
2137 ; CHECK-LE-NEXT:    mov.w r1, #0
2138 ; CHECK-LE-NEXT:    it lt
2139 ; CHECK-LE-NEXT:    movlt r1, #1
2140 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
2141 ; CHECK-LE-NEXT:    sbcs.w r2, r3, r12
2142 ; CHECK-LE-NEXT:    it lt
2143 ; CHECK-LE-NEXT:    movlt r3, #1
2144 ; CHECK-LE-NEXT:    cmp r3, #0
2145 ; CHECK-LE-NEXT:    it ne
2146 ; CHECK-LE-NEXT:    mvnne r3, #1
2147 ; CHECK-LE-NEXT:    bfi r3, r1, #0, #1
2148 ; CHECK-LE-NEXT:    and r1, r3, #3
2149 ; CHECK-LE-NEXT:    lsls r2, r3, #31
2150 ; CHECK-LE-NEXT:    ittt ne
2151 ; CHECK-LE-NEXT:    vmovne r2, s1
2152 ; CHECK-LE-NEXT:    vmovne r3, s0
2153 ; CHECK-LE-NEXT:    strdne r3, r2, [r0]
2154 ; CHECK-LE-NEXT:    lsls r1, r1, #30
2155 ; CHECK-LE-NEXT:    ittt mi
2156 ; CHECK-LE-NEXT:    vmovmi r1, s3
2157 ; CHECK-LE-NEXT:    vmovmi r2, s2
2158 ; CHECK-LE-NEXT:    strdmi r2, r1, [r0, #8]
2159 ; CHECK-LE-NEXT:    add sp, #4
2160 ; CHECK-LE-NEXT:    bx lr
2162 ; CHECK-BE-LABEL: masked_v2i64:
2163 ; CHECK-BE:       @ %bb.0: @ %entry
2164 ; CHECK-BE-NEXT:    .pad #4
2165 ; CHECK-BE-NEXT:    sub sp, #4
2166 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
2167 ; CHECK-BE-NEXT:    movs r3, #0
2168 ; CHECK-BE-NEXT:    vmov r2, s7
2169 ; CHECK-BE-NEXT:    vmov r1, s6
2170 ; CHECK-BE-NEXT:    vmov r12, s4
2171 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
2172 ; CHECK-BE-NEXT:    vmov r2, s5
2173 ; CHECK-BE-NEXT:    sbcs.w r1, r3, r1
2174 ; CHECK-BE-NEXT:    mov.w r1, #0
2175 ; CHECK-BE-NEXT:    it lt
2176 ; CHECK-BE-NEXT:    movlt r1, #1
2177 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
2178 ; CHECK-BE-NEXT:    sbcs.w r2, r3, r12
2179 ; CHECK-BE-NEXT:    it lt
2180 ; CHECK-BE-NEXT:    movlt r3, #1
2181 ; CHECK-BE-NEXT:    cmp r3, #0
2182 ; CHECK-BE-NEXT:    it ne
2183 ; CHECK-BE-NEXT:    mvnne r3, #1
2184 ; CHECK-BE-NEXT:    bfi r3, r1, #0, #1
2185 ; CHECK-BE-NEXT:    and r1, r3, #3
2186 ; CHECK-BE-NEXT:    lsls r2, r3, #31
2187 ; CHECK-BE-NEXT:    bne .LBB19_3
2188 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
2189 ; CHECK-BE-NEXT:    lsls r1, r1, #30
2190 ; CHECK-BE-NEXT:    bmi .LBB19_4
2191 ; CHECK-BE-NEXT:  .LBB19_2: @ %else2
2192 ; CHECK-BE-NEXT:    add sp, #4
2193 ; CHECK-BE-NEXT:    bx lr
2194 ; CHECK-BE-NEXT:  .LBB19_3: @ %cond.store
2195 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
2196 ; CHECK-BE-NEXT:    vmov r2, s5
2197 ; CHECK-BE-NEXT:    vmov r3, s4
2198 ; CHECK-BE-NEXT:    strd r3, r2, [r0]
2199 ; CHECK-BE-NEXT:    lsls r1, r1, #30
2200 ; CHECK-BE-NEXT:    bpl .LBB19_2
2201 ; CHECK-BE-NEXT:  .LBB19_4: @ %cond.store1
2202 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
2203 ; CHECK-BE-NEXT:    vmov r1, s7
2204 ; CHECK-BE-NEXT:    vmov r2, s6
2205 ; CHECK-BE-NEXT:    strd r2, r1, [r0, #8]
2206 ; CHECK-BE-NEXT:    add sp, #4
2207 ; CHECK-BE-NEXT:    bx lr
2208 entry:
2209   %c = icmp sgt <2 x i64> %a, zeroinitializer
2210   call void @llvm.masked.store.v2i64.p0v2i64(<2 x i64> %a, <2 x i64>* %dest, i32 8, <2 x i1> %c)
2211   ret void
2214 define arm_aapcs_vfpcc void @masked_v2f64(<2 x double> *%dest, <2 x double> %a, <2 x i64> %b) {
2215 ; CHECK-LE-LABEL: masked_v2f64:
2216 ; CHECK-LE:       @ %bb.0: @ %entry
2217 ; CHECK-LE-NEXT:    .pad #4
2218 ; CHECK-LE-NEXT:    sub sp, #4
2219 ; CHECK-LE-NEXT:    vmov r2, s4
2220 ; CHECK-LE-NEXT:    movs r3, #0
2221 ; CHECK-LE-NEXT:    vmov r1, s5
2222 ; CHECK-LE-NEXT:    vmov r12, s7
2223 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
2224 ; CHECK-LE-NEXT:    vmov r2, s6
2225 ; CHECK-LE-NEXT:    sbcs.w r1, r3, r1
2226 ; CHECK-LE-NEXT:    mov.w r1, #0
2227 ; CHECK-LE-NEXT:    it lt
2228 ; CHECK-LE-NEXT:    movlt r1, #1
2229 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
2230 ; CHECK-LE-NEXT:    sbcs.w r2, r3, r12
2231 ; CHECK-LE-NEXT:    it lt
2232 ; CHECK-LE-NEXT:    movlt r3, #1
2233 ; CHECK-LE-NEXT:    cmp r3, #0
2234 ; CHECK-LE-NEXT:    it ne
2235 ; CHECK-LE-NEXT:    mvnne r3, #1
2236 ; CHECK-LE-NEXT:    bfi r3, r1, #0, #1
2237 ; CHECK-LE-NEXT:    and r1, r3, #3
2238 ; CHECK-LE-NEXT:    lsls r2, r3, #31
2239 ; CHECK-LE-NEXT:    it ne
2240 ; CHECK-LE-NEXT:    vstrne d0, [r0]
2241 ; CHECK-LE-NEXT:    lsls r1, r1, #30
2242 ; CHECK-LE-NEXT:    it mi
2243 ; CHECK-LE-NEXT:    vstrmi d1, [r0, #8]
2244 ; CHECK-LE-NEXT:    add sp, #4
2245 ; CHECK-LE-NEXT:    bx lr
2247 ; CHECK-BE-LABEL: masked_v2f64:
2248 ; CHECK-BE:       @ %bb.0: @ %entry
2249 ; CHECK-BE-NEXT:    .pad #4
2250 ; CHECK-BE-NEXT:    sub sp, #4
2251 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
2252 ; CHECK-BE-NEXT:    movs r3, #0
2253 ; CHECK-BE-NEXT:    vmov r2, s11
2254 ; CHECK-BE-NEXT:    vmov r1, s10
2255 ; CHECK-BE-NEXT:    vmov r12, s8
2256 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
2257 ; CHECK-BE-NEXT:    vmov r2, s9
2258 ; CHECK-BE-NEXT:    sbcs.w r1, r3, r1
2259 ; CHECK-BE-NEXT:    mov.w r1, #0
2260 ; CHECK-BE-NEXT:    it lt
2261 ; CHECK-BE-NEXT:    movlt r1, #1
2262 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
2263 ; CHECK-BE-NEXT:    sbcs.w r2, r3, r12
2264 ; CHECK-BE-NEXT:    it lt
2265 ; CHECK-BE-NEXT:    movlt r3, #1
2266 ; CHECK-BE-NEXT:    cmp r3, #0
2267 ; CHECK-BE-NEXT:    it ne
2268 ; CHECK-BE-NEXT:    mvnne r3, #1
2269 ; CHECK-BE-NEXT:    bfi r3, r1, #0, #1
2270 ; CHECK-BE-NEXT:    and r1, r3, #3
2271 ; CHECK-BE-NEXT:    lsls r2, r3, #31
2272 ; CHECK-BE-NEXT:    it ne
2273 ; CHECK-BE-NEXT:    vstrne d0, [r0]
2274 ; CHECK-BE-NEXT:    lsls r1, r1, #30
2275 ; CHECK-BE-NEXT:    it mi
2276 ; CHECK-BE-NEXT:    vstrmi d1, [r0, #8]
2277 ; CHECK-BE-NEXT:    add sp, #4
2278 ; CHECK-BE-NEXT:    bx lr
2279 entry:
2280   %c = icmp sgt <2 x i64> %b, zeroinitializer
2281   call void @llvm.masked.store.v2f64.p0v2f64(<2 x double> %a, <2 x double>* %dest, i32 8, <2 x i1> %c)
2282   ret void
2286 declare void @llvm.masked.store.v4i32.p0v4i32(<4 x i32>, <4 x i32>*, i32, <4 x i1>)
2287 declare void @llvm.masked.store.v8i16.p0v8i16(<8 x i16>, <8 x i16>*, i32, <8 x i1>)
2288 declare void @llvm.masked.store.v16i8.p0v16i8(<16 x i8>, <16 x i8>*, i32, <16 x i1>)
2289 declare void @llvm.masked.store.v4f32.p0v4f32(<4 x float>, <4 x float>*, i32, <4 x i1>)
2290 declare void @llvm.masked.store.v8f16.p0v8f16(<8 x half>, <8 x half>*, i32, <8 x i1>)
2291 declare void @llvm.masked.store.v2i64.p0v2i64(<2 x i64>, <2 x i64>*, i32, <2 x i1>)
2292 declare void @llvm.masked.store.v2f64.p0v2f64(<2 x double>, <2 x double>*, i32, <2 x i1>)