[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / Thumb2 / mve-masked-store.ll
blob9012fada2bee242568b54df60833a3f5400b9b1c
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve,+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-LE
3 ; RUN: llc -mtriple=thumbebv8.1m.main-none-none-eabi -mattr=+mve,+fullfp16 -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-BE
5 define arm_aapcs_vfpcc void @masked_v4i32(ptr %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.p0(<4 x i32> %a, ptr %dest, i32 4, <4 x i1> %c)
21   ret void
24 define arm_aapcs_vfpcc void @masked_v4i32_align1(ptr %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:    ubfx r1, r2, #12, #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, #8, #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, #4, #1
78 ; CHECK-BE-NEXT:    and r2, r2, #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, #28
84 ; CHECK-BE-NEXT:    itt mi
85 ; CHECK-BE-NEXT:    vmovmi r2, s4
86 ; CHECK-BE-NEXT:    strmi r2, [r0]
87 ; CHECK-BE-NEXT:    lsls r2, r1, #29
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, #30
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, #31
96 ; CHECK-BE-NEXT:    itt ne
97 ; CHECK-BE-NEXT:    vmovne r1, s7
98 ; CHECK-BE-NEXT:    strne 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.p0(<4 x i32> %a, ptr %dest, i32 1, <4 x i1> %c)
104   ret void
107 define ptr @masked_v4i32_pre(ptr %y, ptr %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:    vmov d0, r2, r3
112 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
113 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
114 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0, #4]!
115 ; CHECK-LE-NEXT:    bx lr
117 ; CHECK-BE-LABEL: masked_v4i32_pre:
118 ; CHECK-BE:       @ %bb.0: @ %entry
119 ; CHECK-BE-NEXT:    vldr d1, [sp]
120 ; CHECK-BE-NEXT:    vmov d0, r3, r2
121 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
122 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
123 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
124 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0, #4]!
125 ; CHECK-BE-NEXT:    bx lr
126 entry:
127   %z = getelementptr inbounds i8, ptr %y, i32 4
128   %0 = load <4 x i32>, ptr %x, align 4
129   %c = icmp sgt <4 x i32> %a, zeroinitializer
130   call void @llvm.masked.store.v4i32.p0(<4 x i32> %0, ptr %z, i32 4, <4 x i1> %c)
131   ret ptr %z
134 define ptr @masked_v4i32_post(ptr %y, ptr %x, <4 x i32> %a) {
135 ; CHECK-LE-LABEL: masked_v4i32_post:
136 ; CHECK-LE:       @ %bb.0: @ %entry
137 ; CHECK-LE-NEXT:    vldr d1, [sp]
138 ; CHECK-LE-NEXT:    vmov d0, r2, r3
139 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
140 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
141 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0], #4
142 ; CHECK-LE-NEXT:    bx lr
144 ; CHECK-BE-LABEL: masked_v4i32_post:
145 ; CHECK-BE:       @ %bb.0: @ %entry
146 ; CHECK-BE-NEXT:    vldr d1, [sp]
147 ; CHECK-BE-NEXT:    vmov d0, r3, r2
148 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
149 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
150 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
151 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0], #4
152 ; CHECK-BE-NEXT:    bx lr
153 entry:
154   %z = getelementptr inbounds i8, ptr %y, i32 4
155   %0 = load <4 x i32>, ptr %x, align 4
156   %c = icmp sgt <4 x i32> %a, zeroinitializer
157   call void @llvm.masked.store.v4i32.p0(<4 x i32> %0, ptr %y, i32 4, <4 x i1> %c)
158   ret ptr %z
162 define arm_aapcs_vfpcc void @masked_v8i16(ptr %dest, <8 x i16> %a) {
163 ; CHECK-LE-LABEL: masked_v8i16:
164 ; CHECK-LE:       @ %bb.0: @ %entry
165 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
166 ; CHECK-LE-NEXT:    vstrht.16 q0, [r0]
167 ; CHECK-LE-NEXT:    bx lr
169 ; CHECK-BE-LABEL: masked_v8i16:
170 ; CHECK-BE:       @ %bb.0: @ %entry
171 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
172 ; CHECK-BE-NEXT:    vpt.s16 gt, q1, zr
173 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0]
174 ; CHECK-BE-NEXT:    bx lr
175 entry:
176   %c = icmp sgt <8 x i16> %a, zeroinitializer
177   call void @llvm.masked.store.v8i16.p0(<8 x i16> %a, ptr %dest, i32 2, <8 x i1> %c)
178   ret void
181 define arm_aapcs_vfpcc void @masked_v8i16_align1(ptr %dest, <8 x i16> %a) {
182 ; CHECK-LE-LABEL: masked_v8i16_align1:
183 ; CHECK-LE:       @ %bb.0: @ %entry
184 ; CHECK-LE-NEXT:    .pad #4
185 ; CHECK-LE-NEXT:    sub sp, #4
186 ; CHECK-LE-NEXT:    vcmp.s16 gt, q0, zr
187 ; CHECK-LE-NEXT:    vmrs r1, p0
188 ; CHECK-LE-NEXT:    and r2, r1, #1
189 ; CHECK-LE-NEXT:    rsbs r3, r2, #0
190 ; CHECK-LE-NEXT:    movs r2, #0
191 ; CHECK-LE-NEXT:    bfi r2, r3, #0, #1
192 ; CHECK-LE-NEXT:    ubfx r3, r1, #2, #1
193 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
194 ; CHECK-LE-NEXT:    bfi r2, r3, #1, #1
195 ; CHECK-LE-NEXT:    ubfx r3, r1, #4, #1
196 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
197 ; CHECK-LE-NEXT:    bfi r2, r3, #2, #1
198 ; CHECK-LE-NEXT:    ubfx r3, r1, #6, #1
199 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
200 ; CHECK-LE-NEXT:    bfi r2, r3, #3, #1
201 ; CHECK-LE-NEXT:    ubfx r3, r1, #8, #1
202 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
203 ; CHECK-LE-NEXT:    bfi r2, r3, #4, #1
204 ; CHECK-LE-NEXT:    ubfx r3, r1, #10, #1
205 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
206 ; CHECK-LE-NEXT:    bfi r2, r3, #5, #1
207 ; CHECK-LE-NEXT:    ubfx r3, r1, #12, #1
208 ; CHECK-LE-NEXT:    ubfx r1, r1, #14, #1
209 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
210 ; CHECK-LE-NEXT:    bfi r2, r3, #6, #1
211 ; CHECK-LE-NEXT:    rsbs r1, r1, #0
212 ; CHECK-LE-NEXT:    bfi r2, r1, #7, #1
213 ; CHECK-LE-NEXT:    uxtb r1, r2
214 ; CHECK-LE-NEXT:    lsls r2, r2, #31
215 ; CHECK-LE-NEXT:    itt ne
216 ; CHECK-LE-NEXT:    vmovne.u16 r2, q0[0]
217 ; CHECK-LE-NEXT:    strhne r2, [r0]
218 ; CHECK-LE-NEXT:    lsls r2, r1, #30
219 ; CHECK-LE-NEXT:    itt mi
220 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[1]
221 ; CHECK-LE-NEXT:    strhmi r2, [r0, #2]
222 ; CHECK-LE-NEXT:    lsls r2, r1, #29
223 ; CHECK-LE-NEXT:    itt mi
224 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[2]
225 ; CHECK-LE-NEXT:    strhmi r2, [r0, #4]
226 ; CHECK-LE-NEXT:    lsls r2, r1, #28
227 ; CHECK-LE-NEXT:    itt mi
228 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[3]
229 ; CHECK-LE-NEXT:    strhmi r2, [r0, #6]
230 ; CHECK-LE-NEXT:    lsls r2, r1, #27
231 ; CHECK-LE-NEXT:    itt mi
232 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[4]
233 ; CHECK-LE-NEXT:    strhmi r2, [r0, #8]
234 ; CHECK-LE-NEXT:    lsls r2, r1, #26
235 ; CHECK-LE-NEXT:    itt mi
236 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[5]
237 ; CHECK-LE-NEXT:    strhmi r2, [r0, #10]
238 ; CHECK-LE-NEXT:    lsls r2, r1, #25
239 ; CHECK-LE-NEXT:    itt mi
240 ; CHECK-LE-NEXT:    vmovmi.u16 r2, q0[6]
241 ; CHECK-LE-NEXT:    strhmi r2, [r0, #12]
242 ; CHECK-LE-NEXT:    lsls r1, r1, #24
243 ; CHECK-LE-NEXT:    itt mi
244 ; CHECK-LE-NEXT:    vmovmi.u16 r1, q0[7]
245 ; CHECK-LE-NEXT:    strhmi r1, [r0, #14]
246 ; CHECK-LE-NEXT:    add sp, #4
247 ; CHECK-LE-NEXT:    bx lr
249 ; CHECK-BE-LABEL: masked_v8i16_align1:
250 ; CHECK-BE:       @ %bb.0: @ %entry
251 ; CHECK-BE-NEXT:    .pad #4
252 ; CHECK-BE-NEXT:    sub sp, #4
253 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
254 ; CHECK-BE-NEXT:    vcmp.s16 gt, q1, zr
255 ; CHECK-BE-NEXT:    vmrs r1, p0
256 ; CHECK-BE-NEXT:    ubfx r2, r1, #14, #1
257 ; CHECK-BE-NEXT:    rsbs r3, r2, #0
258 ; CHECK-BE-NEXT:    movs r2, #0
259 ; CHECK-BE-NEXT:    bfi r2, r3, #0, #1
260 ; CHECK-BE-NEXT:    ubfx r3, r1, #12, #1
261 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
262 ; CHECK-BE-NEXT:    bfi r2, r3, #1, #1
263 ; CHECK-BE-NEXT:    ubfx r3, r1, #10, #1
264 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
265 ; CHECK-BE-NEXT:    bfi r2, r3, #2, #1
266 ; CHECK-BE-NEXT:    ubfx r3, r1, #8, #1
267 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
268 ; CHECK-BE-NEXT:    bfi r2, r3, #3, #1
269 ; CHECK-BE-NEXT:    ubfx r3, r1, #6, #1
270 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
271 ; CHECK-BE-NEXT:    bfi r2, r3, #4, #1
272 ; CHECK-BE-NEXT:    ubfx r3, r1, #4, #1
273 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
274 ; CHECK-BE-NEXT:    bfi r2, r3, #5, #1
275 ; CHECK-BE-NEXT:    ubfx r3, r1, #2, #1
276 ; CHECK-BE-NEXT:    and r1, r1, #1
277 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
278 ; CHECK-BE-NEXT:    bfi r2, r3, #6, #1
279 ; CHECK-BE-NEXT:    rsbs r1, r1, #0
280 ; CHECK-BE-NEXT:    bfi r2, r1, #7, #1
281 ; CHECK-BE-NEXT:    uxtb r1, r2
282 ; CHECK-BE-NEXT:    lsls r2, r2, #24
283 ; CHECK-BE-NEXT:    itt mi
284 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[0]
285 ; CHECK-BE-NEXT:    strhmi r2, [r0]
286 ; CHECK-BE-NEXT:    lsls r2, r1, #25
287 ; CHECK-BE-NEXT:    itt mi
288 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[1]
289 ; CHECK-BE-NEXT:    strhmi r2, [r0, #2]
290 ; CHECK-BE-NEXT:    lsls r2, r1, #26
291 ; CHECK-BE-NEXT:    itt mi
292 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[2]
293 ; CHECK-BE-NEXT:    strhmi r2, [r0, #4]
294 ; CHECK-BE-NEXT:    lsls r2, r1, #27
295 ; CHECK-BE-NEXT:    itt mi
296 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[3]
297 ; CHECK-BE-NEXT:    strhmi r2, [r0, #6]
298 ; CHECK-BE-NEXT:    lsls r2, r1, #28
299 ; CHECK-BE-NEXT:    itt mi
300 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[4]
301 ; CHECK-BE-NEXT:    strhmi r2, [r0, #8]
302 ; CHECK-BE-NEXT:    lsls r2, r1, #29
303 ; CHECK-BE-NEXT:    itt mi
304 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[5]
305 ; CHECK-BE-NEXT:    strhmi r2, [r0, #10]
306 ; CHECK-BE-NEXT:    lsls r2, r1, #30
307 ; CHECK-BE-NEXT:    itt mi
308 ; CHECK-BE-NEXT:    vmovmi.u16 r2, q1[6]
309 ; CHECK-BE-NEXT:    strhmi r2, [r0, #12]
310 ; CHECK-BE-NEXT:    lsls r1, r1, #31
311 ; CHECK-BE-NEXT:    itt ne
312 ; CHECK-BE-NEXT:    vmovne.u16 r1, q1[7]
313 ; CHECK-BE-NEXT:    strhne r1, [r0, #14]
314 ; CHECK-BE-NEXT:    add sp, #4
315 ; CHECK-BE-NEXT:    bx lr
316 entry:
317   %c = icmp sgt <8 x i16> %a, zeroinitializer
318   call void @llvm.masked.store.v8i16.p0(<8 x i16> %a, ptr %dest, i32 1, <8 x i1> %c)
319   ret void
322 define ptr @masked_v8i16_pre(ptr %y, ptr %x, <8 x i16> %a) {
323 ; CHECK-LE-LABEL: masked_v8i16_pre:
324 ; CHECK-LE:       @ %bb.0: @ %entry
325 ; CHECK-LE-NEXT:    vldr d1, [sp]
326 ; CHECK-LE-NEXT:    vmov d0, r2, r3
327 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
328 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
329 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0, #4]!
330 ; CHECK-LE-NEXT:    bx lr
332 ; CHECK-BE-LABEL: masked_v8i16_pre:
333 ; CHECK-BE:       @ %bb.0: @ %entry
334 ; CHECK-BE-NEXT:    vldr d1, [sp]
335 ; CHECK-BE-NEXT:    vmov d0, r3, r2
336 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
337 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
338 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
339 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0, #4]!
340 ; CHECK-BE-NEXT:    bx lr
341 entry:
342   %z = getelementptr inbounds i8, ptr %y, i32 4
343   %0 = load <8 x i16>, ptr %x, align 4
344   %c = icmp sgt <8 x i16> %a, zeroinitializer
345   call void @llvm.masked.store.v8i16.p0(<8 x i16> %0, ptr %z, i32 2, <8 x i1> %c)
346   ret ptr %z
349 define ptr @masked_v8i16_post(ptr %y, ptr %x, <8 x i16> %a) {
350 ; CHECK-LE-LABEL: masked_v8i16_post:
351 ; CHECK-LE:       @ %bb.0: @ %entry
352 ; CHECK-LE-NEXT:    vldr d1, [sp]
353 ; CHECK-LE-NEXT:    vmov d0, r2, r3
354 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
355 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
356 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0], #4
357 ; CHECK-LE-NEXT:    bx lr
359 ; CHECK-BE-LABEL: masked_v8i16_post:
360 ; CHECK-BE:       @ %bb.0: @ %entry
361 ; CHECK-BE-NEXT:    vldr d1, [sp]
362 ; CHECK-BE-NEXT:    vmov d0, r3, r2
363 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
364 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
365 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
366 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0], #4
367 ; CHECK-BE-NEXT:    bx lr
368 entry:
369   %z = getelementptr inbounds i8, ptr %y, i32 4
370   %0 = load <8 x i16>, ptr %x, align 4
371   %c = icmp sgt <8 x i16> %a, zeroinitializer
372   call void @llvm.masked.store.v8i16.p0(<8 x i16> %0, ptr %y, i32 2, <8 x i1> %c)
373   ret ptr %z
377 define arm_aapcs_vfpcc void @masked_v16i8(ptr %dest, <16 x i8> %a) {
378 ; CHECK-LE-LABEL: masked_v16i8:
379 ; CHECK-LE:       @ %bb.0: @ %entry
380 ; CHECK-LE-NEXT:    vpt.s8 gt, q0, zr
381 ; CHECK-LE-NEXT:    vstrbt.8 q0, [r0]
382 ; CHECK-LE-NEXT:    bx lr
384 ; CHECK-BE-LABEL: masked_v16i8:
385 ; CHECK-BE:       @ %bb.0: @ %entry
386 ; CHECK-BE-NEXT:    vrev64.8 q1, q0
387 ; CHECK-BE-NEXT:    vpt.s8 gt, q1, zr
388 ; CHECK-BE-NEXT:    vstrbt.8 q1, [r0]
389 ; CHECK-BE-NEXT:    bx lr
390 entry:
391   %c = icmp sgt <16 x i8> %a, zeroinitializer
392   call void @llvm.masked.store.v16i8.p0(<16 x i8> %a, ptr %dest, i32 1, <16 x i1> %c)
393   ret void
396 define ptr @masked_v16i8_pre(ptr %y, ptr %x, <16 x i8> %a) {
397 ; CHECK-LE-LABEL: masked_v16i8_pre:
398 ; CHECK-LE:       @ %bb.0: @ %entry
399 ; CHECK-LE-NEXT:    vldr d1, [sp]
400 ; CHECK-LE-NEXT:    vmov d0, r2, r3
401 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
402 ; CHECK-LE-NEXT:    vpt.s8 gt, q0, zr
403 ; CHECK-LE-NEXT:    vstrbt.8 q1, [r0, #4]!
404 ; CHECK-LE-NEXT:    bx lr
406 ; CHECK-BE-LABEL: masked_v16i8_pre:
407 ; CHECK-BE:       @ %bb.0: @ %entry
408 ; CHECK-BE-NEXT:    vldr d1, [sp]
409 ; CHECK-BE-NEXT:    vmov d0, r3, r2
410 ; CHECK-BE-NEXT:    vldrb.u8 q1, [r1]
411 ; CHECK-BE-NEXT:    vrev64.8 q2, q0
412 ; CHECK-BE-NEXT:    vpt.s8 gt, q2, zr
413 ; CHECK-BE-NEXT:    vstrbt.8 q1, [r0, #4]!
414 ; CHECK-BE-NEXT:    bx lr
415 entry:
416   %z = getelementptr inbounds i8, ptr %y, i32 4
417   %0 = load <16 x i8>, ptr %x, align 4
418   %c = icmp sgt <16 x i8> %a, zeroinitializer
419   call void @llvm.masked.store.v16i8.p0(<16 x i8> %0, ptr %z, i32 1, <16 x i1> %c)
420   ret ptr %z
423 define ptr @masked_v16i8_post(ptr %y, ptr %x, <16 x i8> %a) {
424 ; CHECK-LE-LABEL: masked_v16i8_post:
425 ; CHECK-LE:       @ %bb.0: @ %entry
426 ; CHECK-LE-NEXT:    vldr d1, [sp]
427 ; CHECK-LE-NEXT:    vmov d0, r2, r3
428 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
429 ; CHECK-LE-NEXT:    vpt.s8 gt, q0, zr
430 ; CHECK-LE-NEXT:    vstrbt.8 q1, [r0], #4
431 ; CHECK-LE-NEXT:    bx lr
433 ; CHECK-BE-LABEL: masked_v16i8_post:
434 ; CHECK-BE:       @ %bb.0: @ %entry
435 ; CHECK-BE-NEXT:    vldr d1, [sp]
436 ; CHECK-BE-NEXT:    vmov d0, r3, r2
437 ; CHECK-BE-NEXT:    vldrb.u8 q1, [r1]
438 ; CHECK-BE-NEXT:    vrev64.8 q2, q0
439 ; CHECK-BE-NEXT:    vpt.s8 gt, q2, zr
440 ; CHECK-BE-NEXT:    vstrbt.8 q1, [r0], #4
441 ; CHECK-BE-NEXT:    bx lr
442 entry:
443   %z = getelementptr inbounds i8, ptr %y, i32 4
444   %0 = load <16 x i8>, ptr %x, align 4
445   %c = icmp sgt <16 x i8> %a, zeroinitializer
446   call void @llvm.masked.store.v16i8.p0(<16 x i8> %0, ptr %y, i32 1, <16 x i1> %c)
447   ret ptr %z
451 define arm_aapcs_vfpcc void @masked_v4f32(ptr %dest, <4 x float> %a, <4 x i32> %b) {
452 ; CHECK-LE-LABEL: masked_v4f32:
453 ; CHECK-LE:       @ %bb.0: @ %entry
454 ; CHECK-LE-NEXT:    vpt.i32 ne, q1, zr
455 ; CHECK-LE-NEXT:    vstrwt.32 q0, [r0]
456 ; CHECK-LE-NEXT:    bx lr
458 ; CHECK-BE-LABEL: masked_v4f32:
459 ; CHECK-BE:       @ %bb.0: @ %entry
460 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
461 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
462 ; CHECK-BE-NEXT:    vpt.i32 ne, q2, zr
463 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0]
464 ; CHECK-BE-NEXT:    bx lr
465 entry:
466   %c = icmp ugt <4 x i32> %b, zeroinitializer
467   call void @llvm.masked.store.v4f32.p0(<4 x float> %a, ptr %dest, i32 4, <4 x i1> %c)
468   ret void
471 define arm_aapcs_vfpcc void @masked_v4f32_align1(ptr %dest, <4 x float> %a, <4 x i32> %b) {
472 ; CHECK-LE-LABEL: masked_v4f32_align1:
473 ; CHECK-LE:       @ %bb.0: @ %entry
474 ; CHECK-LE-NEXT:    .pad #4
475 ; CHECK-LE-NEXT:    sub sp, #4
476 ; CHECK-LE-NEXT:    vcmp.i32 ne, q1, zr
477 ; CHECK-LE-NEXT:    movs r1, #0
478 ; CHECK-LE-NEXT:    vmrs r2, p0
479 ; CHECK-LE-NEXT:    and r3, r2, #1
480 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
481 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
482 ; CHECK-LE-NEXT:    ubfx r3, r2, #4, #1
483 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
484 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
485 ; CHECK-LE-NEXT:    ubfx r3, r2, #8, #1
486 ; CHECK-LE-NEXT:    ubfx r2, r2, #12, #1
487 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
488 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
489 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
490 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
491 ; CHECK-LE-NEXT:    lsls r2, r1, #31
492 ; CHECK-LE-NEXT:    itt ne
493 ; CHECK-LE-NEXT:    vmovne r2, s0
494 ; CHECK-LE-NEXT:    strne r2, [r0]
495 ; CHECK-LE-NEXT:    lsls r2, r1, #30
496 ; CHECK-LE-NEXT:    itt mi
497 ; CHECK-LE-NEXT:    vmovmi r2, s1
498 ; CHECK-LE-NEXT:    strmi r2, [r0, #4]
499 ; CHECK-LE-NEXT:    lsls r2, r1, #29
500 ; CHECK-LE-NEXT:    itt mi
501 ; CHECK-LE-NEXT:    vmovmi r2, s2
502 ; CHECK-LE-NEXT:    strmi r2, [r0, #8]
503 ; CHECK-LE-NEXT:    lsls r1, r1, #28
504 ; CHECK-LE-NEXT:    itt mi
505 ; CHECK-LE-NEXT:    vmovmi r1, s3
506 ; CHECK-LE-NEXT:    strmi r1, [r0, #12]
507 ; CHECK-LE-NEXT:    add sp, #4
508 ; CHECK-LE-NEXT:    bx lr
510 ; CHECK-BE-LABEL: masked_v4f32_align1:
511 ; CHECK-BE:       @ %bb.0: @ %entry
512 ; CHECK-BE-NEXT:    .pad #4
513 ; CHECK-BE-NEXT:    sub sp, #4
514 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
515 ; CHECK-BE-NEXT:    movs r1, #0
516 ; CHECK-BE-NEXT:    vcmp.i32 ne, q2, zr
517 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
518 ; CHECK-BE-NEXT:    vmrs r2, p0
519 ; CHECK-BE-NEXT:    ubfx r3, r2, #12, #1
520 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
521 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
522 ; CHECK-BE-NEXT:    ubfx r3, r2, #8, #1
523 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
524 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
525 ; CHECK-BE-NEXT:    ubfx r3, r2, #4, #1
526 ; CHECK-BE-NEXT:    and r2, r2, #1
527 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
528 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
529 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
530 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
531 ; CHECK-BE-NEXT:    lsls r2, r1, #28
532 ; CHECK-BE-NEXT:    itt mi
533 ; CHECK-BE-NEXT:    vmovmi r2, s4
534 ; CHECK-BE-NEXT:    strmi r2, [r0]
535 ; CHECK-BE-NEXT:    lsls r2, r1, #29
536 ; CHECK-BE-NEXT:    itt mi
537 ; CHECK-BE-NEXT:    vmovmi r2, s5
538 ; CHECK-BE-NEXT:    strmi r2, [r0, #4]
539 ; CHECK-BE-NEXT:    lsls r2, r1, #30
540 ; CHECK-BE-NEXT:    itt mi
541 ; CHECK-BE-NEXT:    vmovmi r2, s6
542 ; CHECK-BE-NEXT:    strmi r2, [r0, #8]
543 ; CHECK-BE-NEXT:    lsls r1, r1, #31
544 ; CHECK-BE-NEXT:    itt ne
545 ; CHECK-BE-NEXT:    vmovne r1, s7
546 ; CHECK-BE-NEXT:    strne r1, [r0, #12]
547 ; CHECK-BE-NEXT:    add sp, #4
548 ; CHECK-BE-NEXT:    bx lr
549 entry:
550   %c = icmp ugt <4 x i32> %b, zeroinitializer
551   call void @llvm.masked.store.v4f32.p0(<4 x float> %a, ptr %dest, i32 1, <4 x i1> %c)
552   ret void
555 define ptr @masked_v4f32_pre(ptr %y, ptr %x, <4 x i32> %a) {
556 ; CHECK-LE-LABEL: masked_v4f32_pre:
557 ; CHECK-LE:       @ %bb.0: @ %entry
558 ; CHECK-LE-NEXT:    vldr d1, [sp]
559 ; CHECK-LE-NEXT:    vmov d0, r2, r3
560 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
561 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
562 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0, #4]!
563 ; CHECK-LE-NEXT:    bx lr
565 ; CHECK-BE-LABEL: masked_v4f32_pre:
566 ; CHECK-BE:       @ %bb.0: @ %entry
567 ; CHECK-BE-NEXT:    vldr d1, [sp]
568 ; CHECK-BE-NEXT:    vmov d0, r3, r2
569 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
570 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
571 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
572 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0, #4]!
573 ; CHECK-BE-NEXT:    bx lr
574 entry:
575   %z = getelementptr inbounds i8, ptr %y, i32 4
576   %0 = load <4 x float>, ptr %x, align 4
577   %c = icmp sgt <4 x i32> %a, zeroinitializer
578   call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %z, i32 4, <4 x i1> %c)
579   ret ptr %z
582 define ptr @masked_v4f32_post(ptr %y, ptr %x, <4 x i32> %a) {
583 ; CHECK-LE-LABEL: masked_v4f32_post:
584 ; CHECK-LE:       @ %bb.0: @ %entry
585 ; CHECK-LE-NEXT:    vldr d1, [sp]
586 ; CHECK-LE-NEXT:    vmov d0, r2, r3
587 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
588 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
589 ; CHECK-LE-NEXT:    vstrwt.32 q1, [r0], #4
590 ; CHECK-LE-NEXT:    bx lr
592 ; CHECK-BE-LABEL: masked_v4f32_post:
593 ; CHECK-BE:       @ %bb.0: @ %entry
594 ; CHECK-BE-NEXT:    vldr d1, [sp]
595 ; CHECK-BE-NEXT:    vmov d0, r3, r2
596 ; CHECK-BE-NEXT:    vldrw.u32 q1, [r1]
597 ; CHECK-BE-NEXT:    vrev64.32 q2, q0
598 ; CHECK-BE-NEXT:    vpt.s32 gt, q2, zr
599 ; CHECK-BE-NEXT:    vstrwt.32 q1, [r0], #4
600 ; CHECK-BE-NEXT:    bx lr
601 entry:
602   %z = getelementptr inbounds i8, ptr %y, i32 4
603   %0 = load <4 x float>, ptr %x, align 4
604   %c = icmp sgt <4 x i32> %a, zeroinitializer
605   call void @llvm.masked.store.v4f32.p0(<4 x float> %0, ptr %y, i32 4, <4 x i1> %c)
606   ret ptr %z
610 define arm_aapcs_vfpcc void @masked_v8f16(ptr %dest, <8 x half> %a, <8 x i16> %b) {
611 ; CHECK-LE-LABEL: masked_v8f16:
612 ; CHECK-LE:       @ %bb.0: @ %entry
613 ; CHECK-LE-NEXT:    vpt.i16 ne, q1, zr
614 ; CHECK-LE-NEXT:    vstrht.16 q0, [r0]
615 ; CHECK-LE-NEXT:    bx lr
617 ; CHECK-BE-LABEL: masked_v8f16:
618 ; CHECK-BE:       @ %bb.0: @ %entry
619 ; CHECK-BE-NEXT:    vrev64.16 q2, q1
620 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
621 ; CHECK-BE-NEXT:    vpt.i16 ne, q2, zr
622 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0]
623 ; CHECK-BE-NEXT:    bx lr
624 entry:
625   %c = icmp ugt <8 x i16> %b, zeroinitializer
626   call void @llvm.masked.store.v8f16.p0(<8 x half> %a, ptr %dest, i32 2, <8 x i1> %c)
627   ret void
630 define arm_aapcs_vfpcc void @masked_v8f16_align1(ptr %dest, <8 x half> %a, <8 x i16> %b) {
631 ; CHECK-LE-LABEL: masked_v8f16_align1:
632 ; CHECK-LE:       @ %bb.0: @ %entry
633 ; CHECK-LE-NEXT:    .pad #36
634 ; CHECK-LE-NEXT:    sub sp, #36
635 ; CHECK-LE-NEXT:    vcmp.i16 ne, q1, zr
636 ; CHECK-LE-NEXT:    movs r2, #0
637 ; CHECK-LE-NEXT:    vmrs r1, p0
638 ; CHECK-LE-NEXT:    and r3, r1, #1
639 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
640 ; CHECK-LE-NEXT:    bfi r2, r3, #0, #1
641 ; CHECK-LE-NEXT:    ubfx r3, r1, #2, #1
642 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
643 ; CHECK-LE-NEXT:    bfi r2, r3, #1, #1
644 ; CHECK-LE-NEXT:    ubfx r3, r1, #4, #1
645 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
646 ; CHECK-LE-NEXT:    bfi r2, r3, #2, #1
647 ; CHECK-LE-NEXT:    ubfx r3, r1, #6, #1
648 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
649 ; CHECK-LE-NEXT:    bfi r2, r3, #3, #1
650 ; CHECK-LE-NEXT:    ubfx r3, r1, #8, #1
651 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
652 ; CHECK-LE-NEXT:    bfi r2, r3, #4, #1
653 ; CHECK-LE-NEXT:    ubfx r3, r1, #10, #1
654 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
655 ; CHECK-LE-NEXT:    bfi r2, r3, #5, #1
656 ; CHECK-LE-NEXT:    ubfx r3, r1, #12, #1
657 ; CHECK-LE-NEXT:    ubfx r1, r1, #14, #1
658 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
659 ; CHECK-LE-NEXT:    bfi r2, r3, #6, #1
660 ; CHECK-LE-NEXT:    rsbs r1, r1, #0
661 ; CHECK-LE-NEXT:    bfi r2, r1, #7, #1
662 ; CHECK-LE-NEXT:    uxtb r1, r2
663 ; CHECK-LE-NEXT:    lsls r2, r2, #31
664 ; CHECK-LE-NEXT:    bne .LBB16_9
665 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
666 ; CHECK-LE-NEXT:    lsls r2, r1, #30
667 ; CHECK-LE-NEXT:    bmi .LBB16_10
668 ; CHECK-LE-NEXT:  .LBB16_2: @ %else2
669 ; CHECK-LE-NEXT:    lsls r2, r1, #29
670 ; CHECK-LE-NEXT:    bmi .LBB16_11
671 ; CHECK-LE-NEXT:  .LBB16_3: @ %else4
672 ; CHECK-LE-NEXT:    lsls r2, r1, #28
673 ; CHECK-LE-NEXT:    bmi .LBB16_12
674 ; CHECK-LE-NEXT:  .LBB16_4: @ %else6
675 ; CHECK-LE-NEXT:    lsls r2, r1, #27
676 ; CHECK-LE-NEXT:    bmi .LBB16_13
677 ; CHECK-LE-NEXT:  .LBB16_5: @ %else8
678 ; CHECK-LE-NEXT:    lsls r2, r1, #26
679 ; CHECK-LE-NEXT:    bmi .LBB16_14
680 ; CHECK-LE-NEXT:  .LBB16_6: @ %else10
681 ; CHECK-LE-NEXT:    lsls r2, r1, #25
682 ; CHECK-LE-NEXT:    bmi .LBB16_15
683 ; CHECK-LE-NEXT:  .LBB16_7: @ %else12
684 ; CHECK-LE-NEXT:    lsls r1, r1, #24
685 ; CHECK-LE-NEXT:    bmi .LBB16_16
686 ; CHECK-LE-NEXT:  .LBB16_8: @ %else14
687 ; CHECK-LE-NEXT:    add sp, #36
688 ; CHECK-LE-NEXT:    bx lr
689 ; CHECK-LE-NEXT:  .LBB16_9: @ %cond.store
690 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #28]
691 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #28]
692 ; CHECK-LE-NEXT:    strh r2, [r0]
693 ; CHECK-LE-NEXT:    lsls r2, r1, #30
694 ; CHECK-LE-NEXT:    bpl .LBB16_2
695 ; CHECK-LE-NEXT:  .LBB16_10: @ %cond.store1
696 ; CHECK-LE-NEXT:    vmovx.f16 s0, s0
697 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #24]
698 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #24]
699 ; CHECK-LE-NEXT:    strh r2, [r0, #2]
700 ; CHECK-LE-NEXT:    lsls r2, r1, #29
701 ; CHECK-LE-NEXT:    bpl .LBB16_3
702 ; CHECK-LE-NEXT:  .LBB16_11: @ %cond.store3
703 ; CHECK-LE-NEXT:    vstr.16 s1, [sp, #20]
704 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #20]
705 ; CHECK-LE-NEXT:    strh r2, [r0, #4]
706 ; CHECK-LE-NEXT:    lsls r2, r1, #28
707 ; CHECK-LE-NEXT:    bpl .LBB16_4
708 ; CHECK-LE-NEXT:  .LBB16_12: @ %cond.store5
709 ; CHECK-LE-NEXT:    vmovx.f16 s0, s1
710 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #16]
711 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #16]
712 ; CHECK-LE-NEXT:    strh r2, [r0, #6]
713 ; CHECK-LE-NEXT:    lsls r2, r1, #27
714 ; CHECK-LE-NEXT:    bpl .LBB16_5
715 ; CHECK-LE-NEXT:  .LBB16_13: @ %cond.store7
716 ; CHECK-LE-NEXT:    vstr.16 s2, [sp, #12]
717 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #12]
718 ; CHECK-LE-NEXT:    strh r2, [r0, #8]
719 ; CHECK-LE-NEXT:    lsls r2, r1, #26
720 ; CHECK-LE-NEXT:    bpl .LBB16_6
721 ; CHECK-LE-NEXT:  .LBB16_14: @ %cond.store9
722 ; CHECK-LE-NEXT:    vmovx.f16 s0, s2
723 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #8]
724 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #8]
725 ; CHECK-LE-NEXT:    strh r2, [r0, #10]
726 ; CHECK-LE-NEXT:    lsls r2, r1, #25
727 ; CHECK-LE-NEXT:    bpl .LBB16_7
728 ; CHECK-LE-NEXT:  .LBB16_15: @ %cond.store11
729 ; CHECK-LE-NEXT:    vstr.16 s3, [sp, #4]
730 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #4]
731 ; CHECK-LE-NEXT:    strh r2, [r0, #12]
732 ; CHECK-LE-NEXT:    lsls r1, r1, #24
733 ; CHECK-LE-NEXT:    bpl .LBB16_8
734 ; CHECK-LE-NEXT:  .LBB16_16: @ %cond.store13
735 ; CHECK-LE-NEXT:    vmovx.f16 s0, s3
736 ; CHECK-LE-NEXT:    vstr.16 s0, [sp]
737 ; CHECK-LE-NEXT:    ldrh.w r1, [sp]
738 ; CHECK-LE-NEXT:    strh r1, [r0, #14]
739 ; CHECK-LE-NEXT:    add sp, #36
740 ; CHECK-LE-NEXT:    bx lr
742 ; CHECK-BE-LABEL: masked_v8f16_align1:
743 ; CHECK-BE:       @ %bb.0: @ %entry
744 ; CHECK-BE-NEXT:    .pad #36
745 ; CHECK-BE-NEXT:    sub sp, #36
746 ; CHECK-BE-NEXT:    vrev64.16 q2, q1
747 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
748 ; CHECK-BE-NEXT:    vcmp.i16 ne, q2, zr
749 ; CHECK-BE-NEXT:    vmrs r1, p0
750 ; CHECK-BE-NEXT:    ubfx r2, r1, #14, #1
751 ; CHECK-BE-NEXT:    rsbs r3, r2, #0
752 ; CHECK-BE-NEXT:    movs r2, #0
753 ; CHECK-BE-NEXT:    bfi r2, r3, #0, #1
754 ; CHECK-BE-NEXT:    ubfx r3, r1, #12, #1
755 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
756 ; CHECK-BE-NEXT:    bfi r2, r3, #1, #1
757 ; CHECK-BE-NEXT:    ubfx r3, r1, #10, #1
758 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
759 ; CHECK-BE-NEXT:    bfi r2, r3, #2, #1
760 ; CHECK-BE-NEXT:    ubfx r3, r1, #8, #1
761 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
762 ; CHECK-BE-NEXT:    bfi r2, r3, #3, #1
763 ; CHECK-BE-NEXT:    ubfx r3, r1, #6, #1
764 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
765 ; CHECK-BE-NEXT:    bfi r2, r3, #4, #1
766 ; CHECK-BE-NEXT:    ubfx r3, r1, #4, #1
767 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
768 ; CHECK-BE-NEXT:    bfi r2, r3, #5, #1
769 ; CHECK-BE-NEXT:    ubfx r3, r1, #2, #1
770 ; CHECK-BE-NEXT:    and r1, r1, #1
771 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
772 ; CHECK-BE-NEXT:    bfi r2, r3, #6, #1
773 ; CHECK-BE-NEXT:    rsbs r1, r1, #0
774 ; CHECK-BE-NEXT:    bfi r2, r1, #7, #1
775 ; CHECK-BE-NEXT:    uxtb r1, r2
776 ; CHECK-BE-NEXT:    lsls r2, r2, #24
777 ; CHECK-BE-NEXT:    bmi .LBB16_9
778 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
779 ; CHECK-BE-NEXT:    lsls r2, r1, #25
780 ; CHECK-BE-NEXT:    bmi .LBB16_10
781 ; CHECK-BE-NEXT:  .LBB16_2: @ %else2
782 ; CHECK-BE-NEXT:    lsls r2, r1, #26
783 ; CHECK-BE-NEXT:    bmi .LBB16_11
784 ; CHECK-BE-NEXT:  .LBB16_3: @ %else4
785 ; CHECK-BE-NEXT:    lsls r2, r1, #27
786 ; CHECK-BE-NEXT:    bmi .LBB16_12
787 ; CHECK-BE-NEXT:  .LBB16_4: @ %else6
788 ; CHECK-BE-NEXT:    lsls r2, r1, #28
789 ; CHECK-BE-NEXT:    bmi .LBB16_13
790 ; CHECK-BE-NEXT:  .LBB16_5: @ %else8
791 ; CHECK-BE-NEXT:    lsls r2, r1, #29
792 ; CHECK-BE-NEXT:    bmi .LBB16_14
793 ; CHECK-BE-NEXT:  .LBB16_6: @ %else10
794 ; CHECK-BE-NEXT:    lsls r2, r1, #30
795 ; CHECK-BE-NEXT:    bmi .LBB16_15
796 ; CHECK-BE-NEXT:  .LBB16_7: @ %else12
797 ; CHECK-BE-NEXT:    lsls r1, r1, #31
798 ; CHECK-BE-NEXT:    bne .LBB16_16
799 ; CHECK-BE-NEXT:  .LBB16_8: @ %else14
800 ; CHECK-BE-NEXT:    add sp, #36
801 ; CHECK-BE-NEXT:    bx lr
802 ; CHECK-BE-NEXT:  .LBB16_9: @ %cond.store
803 ; CHECK-BE-NEXT:    vstr.16 s4, [sp, #28]
804 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #28]
805 ; CHECK-BE-NEXT:    strh r2, [r0]
806 ; CHECK-BE-NEXT:    lsls r2, r1, #25
807 ; CHECK-BE-NEXT:    bpl .LBB16_2
808 ; CHECK-BE-NEXT:  .LBB16_10: @ %cond.store1
809 ; CHECK-BE-NEXT:    vmovx.f16 s0, s4
810 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #24]
811 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #24]
812 ; CHECK-BE-NEXT:    strh r2, [r0, #2]
813 ; CHECK-BE-NEXT:    lsls r2, r1, #26
814 ; CHECK-BE-NEXT:    bpl .LBB16_3
815 ; CHECK-BE-NEXT:  .LBB16_11: @ %cond.store3
816 ; CHECK-BE-NEXT:    vstr.16 s5, [sp, #20]
817 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #20]
818 ; CHECK-BE-NEXT:    strh r2, [r0, #4]
819 ; CHECK-BE-NEXT:    lsls r2, r1, #27
820 ; CHECK-BE-NEXT:    bpl .LBB16_4
821 ; CHECK-BE-NEXT:  .LBB16_12: @ %cond.store5
822 ; CHECK-BE-NEXT:    vmovx.f16 s0, s5
823 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #16]
824 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #16]
825 ; CHECK-BE-NEXT:    strh r2, [r0, #6]
826 ; CHECK-BE-NEXT:    lsls r2, r1, #28
827 ; CHECK-BE-NEXT:    bpl .LBB16_5
828 ; CHECK-BE-NEXT:  .LBB16_13: @ %cond.store7
829 ; CHECK-BE-NEXT:    vstr.16 s6, [sp, #12]
830 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #12]
831 ; CHECK-BE-NEXT:    strh r2, [r0, #8]
832 ; CHECK-BE-NEXT:    lsls r2, r1, #29
833 ; CHECK-BE-NEXT:    bpl .LBB16_6
834 ; CHECK-BE-NEXT:  .LBB16_14: @ %cond.store9
835 ; CHECK-BE-NEXT:    vmovx.f16 s0, s6
836 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #8]
837 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #8]
838 ; CHECK-BE-NEXT:    strh r2, [r0, #10]
839 ; CHECK-BE-NEXT:    lsls r2, r1, #30
840 ; CHECK-BE-NEXT:    bpl .LBB16_7
841 ; CHECK-BE-NEXT:  .LBB16_15: @ %cond.store11
842 ; CHECK-BE-NEXT:    vstr.16 s7, [sp, #4]
843 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #4]
844 ; CHECK-BE-NEXT:    strh r2, [r0, #12]
845 ; CHECK-BE-NEXT:    lsls r1, r1, #31
846 ; CHECK-BE-NEXT:    beq .LBB16_8
847 ; CHECK-BE-NEXT:  .LBB16_16: @ %cond.store13
848 ; CHECK-BE-NEXT:    vmovx.f16 s0, s7
849 ; CHECK-BE-NEXT:    vstr.16 s0, [sp]
850 ; CHECK-BE-NEXT:    ldrh.w r1, [sp]
851 ; CHECK-BE-NEXT:    strh r1, [r0, #14]
852 ; CHECK-BE-NEXT:    add sp, #36
853 ; CHECK-BE-NEXT:    bx lr
854 entry:
855   %c = icmp ugt <8 x i16> %b, zeroinitializer
856   call void @llvm.masked.store.v8f16.p0(<8 x half> %a, ptr %dest, i32 1, <8 x i1> %c)
857   ret void
860 define ptr @masked_v8f16_pre(ptr %y, ptr %x, <8 x i16> %a) {
861 ; CHECK-LE-LABEL: masked_v8f16_pre:
862 ; CHECK-LE:       @ %bb.0: @ %entry
863 ; CHECK-LE-NEXT:    vldr d1, [sp]
864 ; CHECK-LE-NEXT:    vmov d0, r2, r3
865 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
866 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
867 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0, #4]!
868 ; CHECK-LE-NEXT:    bx lr
870 ; CHECK-BE-LABEL: masked_v8f16_pre:
871 ; CHECK-BE:       @ %bb.0: @ %entry
872 ; CHECK-BE-NEXT:    vldr d1, [sp]
873 ; CHECK-BE-NEXT:    vmov d0, r3, r2
874 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
875 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
876 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
877 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0, #4]!
878 ; CHECK-BE-NEXT:    bx lr
879 entry:
880   %z = getelementptr inbounds i8, ptr %y, i32 4
881   %0 = load <8 x half>, ptr %x, align 4
882   %c = icmp sgt <8 x i16> %a, zeroinitializer
883   call void @llvm.masked.store.v8f16.p0(<8 x half> %0, ptr %z, i32 2, <8 x i1> %c)
884   ret ptr %z
887 define ptr @masked_v8f16_post(ptr %y, ptr %x, <8 x i16> %a) {
888 ; CHECK-LE-LABEL: masked_v8f16_post:
889 ; CHECK-LE:       @ %bb.0: @ %entry
890 ; CHECK-LE-NEXT:    vldr d1, [sp]
891 ; CHECK-LE-NEXT:    vmov d0, r2, r3
892 ; CHECK-LE-NEXT:    vldrw.u32 q1, [r1]
893 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
894 ; CHECK-LE-NEXT:    vstrht.16 q1, [r0], #4
895 ; CHECK-LE-NEXT:    bx lr
897 ; CHECK-BE-LABEL: masked_v8f16_post:
898 ; CHECK-BE:       @ %bb.0: @ %entry
899 ; CHECK-BE-NEXT:    vldr d1, [sp]
900 ; CHECK-BE-NEXT:    vmov d0, r3, r2
901 ; CHECK-BE-NEXT:    vldrh.u16 q1, [r1]
902 ; CHECK-BE-NEXT:    vrev64.16 q2, q0
903 ; CHECK-BE-NEXT:    vpt.s16 gt, q2, zr
904 ; CHECK-BE-NEXT:    vstrht.16 q1, [r0], #4
905 ; CHECK-BE-NEXT:    bx lr
906 entry:
907   %z = getelementptr inbounds i8, ptr %y, i32 4
908   %0 = load <8 x half>, ptr %x, align 4
909   %c = icmp sgt <8 x i16> %a, zeroinitializer
910   call void @llvm.masked.store.v8f16.p0(<8 x half> %0, ptr %y, i32 2, <8 x i1> %c)
911   ret ptr %z
915 define arm_aapcs_vfpcc void @masked_v2i64(ptr %dest, <2 x i64> %a) {
916 ; CHECK-LE-LABEL: masked_v2i64:
917 ; CHECK-LE:       @ %bb.0: @ %entry
918 ; CHECK-LE-NEXT:    .save {r7, lr}
919 ; CHECK-LE-NEXT:    push {r7, lr}
920 ; CHECK-LE-NEXT:    .pad #4
921 ; CHECK-LE-NEXT:    sub sp, #4
922 ; CHECK-LE-NEXT:    vmov r2, r3, d0
923 ; CHECK-LE-NEXT:    movs r1, #0
924 ; CHECK-LE-NEXT:    vmov r12, lr, d1
925 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
926 ; CHECK-LE-NEXT:    sbcs.w r2, r1, r3
927 ; CHECK-LE-NEXT:    csetm r2, lt
928 ; CHECK-LE-NEXT:    rsbs.w r3, r12, #0
929 ; CHECK-LE-NEXT:    sbcs.w r3, r1, lr
930 ; CHECK-LE-NEXT:    bfi r1, r2, #0, #1
931 ; CHECK-LE-NEXT:    csetm r2, lt
932 ; CHECK-LE-NEXT:    bfi r1, r2, #1, #1
933 ; CHECK-LE-NEXT:    lsls r2, r1, #31
934 ; CHECK-LE-NEXT:    it ne
935 ; CHECK-LE-NEXT:    vstrne d0, [r0]
936 ; CHECK-LE-NEXT:    lsls r1, r1, #30
937 ; CHECK-LE-NEXT:    it mi
938 ; CHECK-LE-NEXT:    vstrmi d1, [r0, #8]
939 ; CHECK-LE-NEXT:    add sp, #4
940 ; CHECK-LE-NEXT:    pop {r7, pc}
942 ; CHECK-BE-LABEL: masked_v2i64:
943 ; CHECK-BE:       @ %bb.0: @ %entry
944 ; CHECK-BE-NEXT:    .save {r7, lr}
945 ; CHECK-BE-NEXT:    push {r7, lr}
946 ; CHECK-BE-NEXT:    .pad #4
947 ; CHECK-BE-NEXT:    sub sp, #4
948 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
949 ; CHECK-BE-NEXT:    movs r1, #0
950 ; CHECK-BE-NEXT:    vmov r2, r3, d3
951 ; CHECK-BE-NEXT:    vmov r12, lr, d2
952 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
953 ; CHECK-BE-NEXT:    sbcs.w r2, r1, r2
954 ; CHECK-BE-NEXT:    csetm r2, lt
955 ; CHECK-BE-NEXT:    rsbs.w r3, lr, #0
956 ; CHECK-BE-NEXT:    sbcs.w r3, r1, r12
957 ; CHECK-BE-NEXT:    bfi r1, r2, #0, #1
958 ; CHECK-BE-NEXT:    csetm r2, lt
959 ; CHECK-BE-NEXT:    bfi r1, r2, #1, #1
960 ; CHECK-BE-NEXT:    lsls r2, r1, #30
961 ; CHECK-BE-NEXT:    it mi
962 ; CHECK-BE-NEXT:    vstrmi d0, [r0]
963 ; CHECK-BE-NEXT:    lsls r1, r1, #31
964 ; CHECK-BE-NEXT:    it ne
965 ; CHECK-BE-NEXT:    vstrne d1, [r0, #8]
966 ; CHECK-BE-NEXT:    add sp, #4
967 ; CHECK-BE-NEXT:    pop {r7, pc}
968 entry:
969   %c = icmp sgt <2 x i64> %a, zeroinitializer
970   call void @llvm.masked.store.v2i64.p0(<2 x i64> %a, ptr %dest, i32 8, <2 x i1> %c)
971   ret void
974 define arm_aapcs_vfpcc void @masked_v2f64(ptr %dest, <2 x double> %a, <2 x i64> %b) {
975 ; CHECK-LE-LABEL: masked_v2f64:
976 ; CHECK-LE:       @ %bb.0: @ %entry
977 ; CHECK-LE-NEXT:    .save {r7, lr}
978 ; CHECK-LE-NEXT:    push {r7, lr}
979 ; CHECK-LE-NEXT:    .pad #4
980 ; CHECK-LE-NEXT:    sub sp, #4
981 ; CHECK-LE-NEXT:    vmov r2, r3, d2
982 ; CHECK-LE-NEXT:    movs r1, #0
983 ; CHECK-LE-NEXT:    vmov r12, lr, d3
984 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
985 ; CHECK-LE-NEXT:    sbcs.w r2, r1, r3
986 ; CHECK-LE-NEXT:    csetm r2, lt
987 ; CHECK-LE-NEXT:    rsbs.w r3, r12, #0
988 ; CHECK-LE-NEXT:    sbcs.w r3, r1, lr
989 ; CHECK-LE-NEXT:    bfi r1, r2, #0, #1
990 ; CHECK-LE-NEXT:    csetm r2, lt
991 ; CHECK-LE-NEXT:    bfi r1, r2, #1, #1
992 ; CHECK-LE-NEXT:    lsls r2, r1, #31
993 ; CHECK-LE-NEXT:    it ne
994 ; CHECK-LE-NEXT:    vstrne d0, [r0]
995 ; CHECK-LE-NEXT:    lsls r1, r1, #30
996 ; CHECK-LE-NEXT:    it mi
997 ; CHECK-LE-NEXT:    vstrmi d1, [r0, #8]
998 ; CHECK-LE-NEXT:    add sp, #4
999 ; CHECK-LE-NEXT:    pop {r7, pc}
1001 ; CHECK-BE-LABEL: masked_v2f64:
1002 ; CHECK-BE:       @ %bb.0: @ %entry
1003 ; CHECK-BE-NEXT:    .save {r7, lr}
1004 ; CHECK-BE-NEXT:    push {r7, lr}
1005 ; CHECK-BE-NEXT:    .pad #4
1006 ; CHECK-BE-NEXT:    sub sp, #4
1007 ; CHECK-BE-NEXT:    vrev64.32 q2, q1
1008 ; CHECK-BE-NEXT:    movs r1, #0
1009 ; CHECK-BE-NEXT:    vmov r2, r3, d5
1010 ; CHECK-BE-NEXT:    vmov r12, lr, d4
1011 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1012 ; CHECK-BE-NEXT:    sbcs.w r2, r1, r2
1013 ; CHECK-BE-NEXT:    csetm r2, lt
1014 ; CHECK-BE-NEXT:    rsbs.w r3, lr, #0
1015 ; CHECK-BE-NEXT:    sbcs.w r3, r1, r12
1016 ; CHECK-BE-NEXT:    bfi r1, r2, #0, #1
1017 ; CHECK-BE-NEXT:    csetm r2, lt
1018 ; CHECK-BE-NEXT:    bfi r1, r2, #1, #1
1019 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1020 ; CHECK-BE-NEXT:    it mi
1021 ; CHECK-BE-NEXT:    vstrmi d0, [r0]
1022 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1023 ; CHECK-BE-NEXT:    it ne
1024 ; CHECK-BE-NEXT:    vstrne d1, [r0, #8]
1025 ; CHECK-BE-NEXT:    add sp, #4
1026 ; CHECK-BE-NEXT:    pop {r7, pc}
1027 entry:
1028   %c = icmp sgt <2 x i64> %b, zeroinitializer
1029   call void @llvm.masked.store.v2f64.p0(<2 x double> %a, ptr %dest, i32 8, <2 x i1> %c)
1030   ret void
1033 define arm_aapcs_vfpcc void @masked_v4i16(ptr %dest, <4 x i32> %a) {
1034 ; CHECK-LE-LABEL: masked_v4i16:
1035 ; CHECK-LE:       @ %bb.0: @ %entry
1036 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
1037 ; CHECK-LE-NEXT:    vstrht.32 q0, [r0]
1038 ; CHECK-LE-NEXT:    bx lr
1040 ; CHECK-BE-LABEL: masked_v4i16:
1041 ; CHECK-BE:       @ %bb.0: @ %entry
1042 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1043 ; CHECK-BE-NEXT:    vpt.s32 gt, q1, zr
1044 ; CHECK-BE-NEXT:    vstrht.32 q1, [r0]
1045 ; CHECK-BE-NEXT:    bx lr
1046 entry:
1047   %c = icmp sgt <4 x i32> %a, zeroinitializer
1048   %trunc = trunc <4 x i32> %a to <4 x i16>
1049   call void @llvm.masked.store.v4i16.p0(<4 x i16> %trunc, ptr %dest, i32 2, <4 x i1> %c)
1050   ret void
1053 define arm_aapcs_vfpcc void @masked_v4i8(ptr %dest, <4 x i32> %a) {
1054 ; CHECK-LE-LABEL: masked_v4i8:
1055 ; CHECK-LE:       @ %bb.0: @ %entry
1056 ; CHECK-LE-NEXT:    vpt.s32 gt, q0, zr
1057 ; CHECK-LE-NEXT:    vstrbt.32 q0, [r0]
1058 ; CHECK-LE-NEXT:    bx lr
1060 ; CHECK-BE-LABEL: masked_v4i8:
1061 ; CHECK-BE:       @ %bb.0: @ %entry
1062 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1063 ; CHECK-BE-NEXT:    vpt.s32 gt, q1, zr
1064 ; CHECK-BE-NEXT:    vstrbt.32 q1, [r0]
1065 ; CHECK-BE-NEXT:    bx lr
1066 entry:
1067   %c = icmp sgt <4 x i32> %a, zeroinitializer
1068   %trunc = trunc <4 x i32> %a to <4 x i8>
1069   call void @llvm.masked.store.v4i8.p0(<4 x i8> %trunc, ptr %dest, i32 1, <4 x i1> %c)
1070   ret void
1073 define arm_aapcs_vfpcc void @masked_v8i8(ptr %dest, <8 x i16> %a) {
1074 ; CHECK-LE-LABEL: masked_v8i8:
1075 ; CHECK-LE:       @ %bb.0: @ %entry
1076 ; CHECK-LE-NEXT:    vpt.s16 gt, q0, zr
1077 ; CHECK-LE-NEXT:    vstrbt.16 q0, [r0]
1078 ; CHECK-LE-NEXT:    bx lr
1080 ; CHECK-BE-LABEL: masked_v8i8:
1081 ; CHECK-BE:       @ %bb.0: @ %entry
1082 ; CHECK-BE-NEXT:    vrev64.16 q1, q0
1083 ; CHECK-BE-NEXT:    vpt.s16 gt, q1, zr
1084 ; CHECK-BE-NEXT:    vstrbt.16 q1, [r0]
1085 ; CHECK-BE-NEXT:    bx lr
1086 entry:
1087   %c = icmp sgt <8 x i16> %a, zeroinitializer
1088   %trunc = trunc <8 x i16> %a to <8 x i8>
1089   call void @llvm.masked.store.v8i8.p0(<8 x i8> %trunc, ptr %dest, i32 1, <8 x i1> %c)
1090   ret void
1093 define arm_aapcs_vfpcc void @masked_v4i16_align1(ptr %dest, <4 x i32> %a) {
1094 ; CHECK-LE-LABEL: masked_v4i16_align1:
1095 ; CHECK-LE:       @ %bb.0: @ %entry
1096 ; CHECK-LE-NEXT:    .pad #4
1097 ; CHECK-LE-NEXT:    sub sp, #4
1098 ; CHECK-LE-NEXT:    vcmp.s32 gt, q0, zr
1099 ; CHECK-LE-NEXT:    vmrs r2, p0
1100 ; CHECK-LE-NEXT:    and r1, r2, #1
1101 ; CHECK-LE-NEXT:    rsbs r3, r1, #0
1102 ; CHECK-LE-NEXT:    movs r1, #0
1103 ; CHECK-LE-NEXT:    bfi r1, r3, #0, #1
1104 ; CHECK-LE-NEXT:    ubfx r3, r2, #4, #1
1105 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
1106 ; CHECK-LE-NEXT:    bfi r1, r3, #1, #1
1107 ; CHECK-LE-NEXT:    ubfx r3, r2, #8, #1
1108 ; CHECK-LE-NEXT:    ubfx r2, r2, #12, #1
1109 ; CHECK-LE-NEXT:    rsbs r3, r3, #0
1110 ; CHECK-LE-NEXT:    bfi r1, r3, #2, #1
1111 ; CHECK-LE-NEXT:    rsbs r2, r2, #0
1112 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1113 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1114 ; CHECK-LE-NEXT:    itt ne
1115 ; CHECK-LE-NEXT:    vmovne r2, s0
1116 ; CHECK-LE-NEXT:    strhne r2, [r0]
1117 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1118 ; CHECK-LE-NEXT:    itt mi
1119 ; CHECK-LE-NEXT:    vmovmi r2, s1
1120 ; CHECK-LE-NEXT:    strhmi r2, [r0, #2]
1121 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1122 ; CHECK-LE-NEXT:    itt mi
1123 ; CHECK-LE-NEXT:    vmovmi r2, s2
1124 ; CHECK-LE-NEXT:    strhmi r2, [r0, #4]
1125 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1126 ; CHECK-LE-NEXT:    itt mi
1127 ; CHECK-LE-NEXT:    vmovmi r1, s3
1128 ; CHECK-LE-NEXT:    strhmi r1, [r0, #6]
1129 ; CHECK-LE-NEXT:    add sp, #4
1130 ; CHECK-LE-NEXT:    bx lr
1132 ; CHECK-BE-LABEL: masked_v4i16_align1:
1133 ; CHECK-BE:       @ %bb.0: @ %entry
1134 ; CHECK-BE-NEXT:    .pad #4
1135 ; CHECK-BE-NEXT:    sub sp, #4
1136 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1137 ; CHECK-BE-NEXT:    vcmp.s32 gt, q1, zr
1138 ; CHECK-BE-NEXT:    vmrs r2, p0
1139 ; CHECK-BE-NEXT:    ubfx r1, r2, #12, #1
1140 ; CHECK-BE-NEXT:    rsbs r3, r1, #0
1141 ; CHECK-BE-NEXT:    movs r1, #0
1142 ; CHECK-BE-NEXT:    bfi r1, r3, #0, #1
1143 ; CHECK-BE-NEXT:    ubfx r3, r2, #8, #1
1144 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1145 ; CHECK-BE-NEXT:    bfi r1, r3, #1, #1
1146 ; CHECK-BE-NEXT:    ubfx r3, r2, #4, #1
1147 ; CHECK-BE-NEXT:    and r2, r2, #1
1148 ; CHECK-BE-NEXT:    rsbs r3, r3, #0
1149 ; CHECK-BE-NEXT:    bfi r1, r3, #2, #1
1150 ; CHECK-BE-NEXT:    rsbs r2, r2, #0
1151 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1152 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1153 ; CHECK-BE-NEXT:    itt mi
1154 ; CHECK-BE-NEXT:    vmovmi r2, s4
1155 ; CHECK-BE-NEXT:    strhmi r2, [r0]
1156 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1157 ; CHECK-BE-NEXT:    itt mi
1158 ; CHECK-BE-NEXT:    vmovmi r2, s5
1159 ; CHECK-BE-NEXT:    strhmi r2, [r0, #2]
1160 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1161 ; CHECK-BE-NEXT:    itt mi
1162 ; CHECK-BE-NEXT:    vmovmi r2, s6
1163 ; CHECK-BE-NEXT:    strhmi r2, [r0, #4]
1164 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1165 ; CHECK-BE-NEXT:    itt ne
1166 ; CHECK-BE-NEXT:    vmovne r1, s7
1167 ; CHECK-BE-NEXT:    strhne r1, [r0, #6]
1168 ; CHECK-BE-NEXT:    add sp, #4
1169 ; CHECK-BE-NEXT:    bx lr
1170 entry:
1171   %c = icmp sgt <4 x i32> %a, zeroinitializer
1172   %trunc = trunc <4 x i32> %a to <4 x i16>
1173   call void @llvm.masked.store.v4i16.p0(<4 x i16> %trunc, ptr %dest, i32 1, <4 x i1> %c)
1174   ret void
1177 define arm_aapcs_vfpcc void @masked_v4f16_align4(ptr %dest, <4 x float> %a) {
1178 ; CHECK-LE-LABEL: masked_v4f16_align4:
1179 ; CHECK-LE:       @ %bb.0: @ %entry
1180 ; CHECK-LE-NEXT:    .pad #4
1181 ; CHECK-LE-NEXT:    sub sp, #4
1182 ; CHECK-LE-NEXT:    vcmp.f32 s0, #0
1183 ; CHECK-LE-NEXT:    movs r1, #0
1184 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1185 ; CHECK-LE-NEXT:    vcmp.f32 s1, #0
1186 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s0
1187 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s5, s2
1188 ; CHECK-LE-NEXT:    vcvtt.f16.f32 s4, s1
1189 ; CHECK-LE-NEXT:    vcvtt.f16.f32 s5, s3
1190 ; CHECK-LE-NEXT:    csetm r2, gt
1191 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1192 ; CHECK-LE-NEXT:    vcmp.f32 s2, #0
1193 ; CHECK-LE-NEXT:    bfi r1, r2, #0, #1
1194 ; CHECK-LE-NEXT:    csetm r2, gt
1195 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1196 ; CHECK-LE-NEXT:    vcmp.f32 s3, #0
1197 ; CHECK-LE-NEXT:    bfi r1, r2, #1, #1
1198 ; CHECK-LE-NEXT:    csetm r2, gt
1199 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1200 ; CHECK-LE-NEXT:    bfi r1, r2, #2, #1
1201 ; CHECK-LE-NEXT:    csetm r2, gt
1202 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1203 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1204 ; CHECK-LE-NEXT:    bne .LBB25_5
1205 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1206 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1207 ; CHECK-LE-NEXT:    bmi .LBB25_6
1208 ; CHECK-LE-NEXT:  .LBB25_2: @ %else2
1209 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1210 ; CHECK-LE-NEXT:    bmi .LBB25_7
1211 ; CHECK-LE-NEXT:  .LBB25_3: @ %else4
1212 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1213 ; CHECK-LE-NEXT:    bmi .LBB25_8
1214 ; CHECK-LE-NEXT:  .LBB25_4: @ %else6
1215 ; CHECK-LE-NEXT:    add sp, #4
1216 ; CHECK-LE-NEXT:    bx lr
1217 ; CHECK-LE-NEXT:  .LBB25_5: @ %cond.store
1218 ; CHECK-LE-NEXT:    vstr.16 s4, [r0]
1219 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1220 ; CHECK-LE-NEXT:    bpl .LBB25_2
1221 ; CHECK-LE-NEXT:  .LBB25_6: @ %cond.store1
1222 ; CHECK-LE-NEXT:    vmovx.f16 s0, s4
1223 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #2]
1224 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1225 ; CHECK-LE-NEXT:    bpl .LBB25_3
1226 ; CHECK-LE-NEXT:  .LBB25_7: @ %cond.store3
1227 ; CHECK-LE-NEXT:    vstr.16 s5, [r0, #4]
1228 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1229 ; CHECK-LE-NEXT:    bpl .LBB25_4
1230 ; CHECK-LE-NEXT:  .LBB25_8: @ %cond.store5
1231 ; CHECK-LE-NEXT:    vmovx.f16 s0, s5
1232 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #6]
1233 ; CHECK-LE-NEXT:    add sp, #4
1234 ; CHECK-LE-NEXT:    bx lr
1236 ; CHECK-BE-LABEL: masked_v4f16_align4:
1237 ; CHECK-BE:       @ %bb.0: @ %entry
1238 ; CHECK-BE-NEXT:    .pad #4
1239 ; CHECK-BE-NEXT:    sub sp, #4
1240 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1241 ; CHECK-BE-NEXT:    movs r1, #0
1242 ; CHECK-BE-NEXT:    vcmp.f32 s7, #0
1243 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s4
1244 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1245 ; CHECK-BE-NEXT:    vcmp.f32 s6, #0
1246 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s1, s6
1247 ; CHECK-BE-NEXT:    vcvtt.f16.f32 s0, s5
1248 ; CHECK-BE-NEXT:    vcvtt.f16.f32 s1, s7
1249 ; CHECK-BE-NEXT:    csetm r2, gt
1250 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1251 ; CHECK-BE-NEXT:    vcmp.f32 s5, #0
1252 ; CHECK-BE-NEXT:    bfi r1, r2, #0, #1
1253 ; CHECK-BE-NEXT:    csetm r2, gt
1254 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1255 ; CHECK-BE-NEXT:    vcmp.f32 s4, #0
1256 ; CHECK-BE-NEXT:    bfi r1, r2, #1, #1
1257 ; CHECK-BE-NEXT:    csetm r2, gt
1258 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1259 ; CHECK-BE-NEXT:    bfi r1, r2, #2, #1
1260 ; CHECK-BE-NEXT:    csetm r2, gt
1261 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1262 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1263 ; CHECK-BE-NEXT:    bmi .LBB25_5
1264 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1265 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1266 ; CHECK-BE-NEXT:    bmi .LBB25_6
1267 ; CHECK-BE-NEXT:  .LBB25_2: @ %else2
1268 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1269 ; CHECK-BE-NEXT:    bmi .LBB25_7
1270 ; CHECK-BE-NEXT:  .LBB25_3: @ %else4
1271 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1272 ; CHECK-BE-NEXT:    bne .LBB25_8
1273 ; CHECK-BE-NEXT:  .LBB25_4: @ %else6
1274 ; CHECK-BE-NEXT:    add sp, #4
1275 ; CHECK-BE-NEXT:    bx lr
1276 ; CHECK-BE-NEXT:  .LBB25_5: @ %cond.store
1277 ; CHECK-BE-NEXT:    vstr.16 s0, [r0]
1278 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1279 ; CHECK-BE-NEXT:    bpl .LBB25_2
1280 ; CHECK-BE-NEXT:  .LBB25_6: @ %cond.store1
1281 ; CHECK-BE-NEXT:    vmovx.f16 s0, s0
1282 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #2]
1283 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1284 ; CHECK-BE-NEXT:    bpl .LBB25_3
1285 ; CHECK-BE-NEXT:  .LBB25_7: @ %cond.store3
1286 ; CHECK-BE-NEXT:    vstr.16 s1, [r0, #4]
1287 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1288 ; CHECK-BE-NEXT:    beq .LBB25_4
1289 ; CHECK-BE-NEXT:  .LBB25_8: @ %cond.store5
1290 ; CHECK-BE-NEXT:    vmovx.f16 s0, s1
1291 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #6]
1292 ; CHECK-BE-NEXT:    add sp, #4
1293 ; CHECK-BE-NEXT:    bx lr
1294 entry:
1295   %c = fcmp ogt <4 x float> %a, zeroinitializer
1296   %trunc = fptrunc <4 x float> %a to <4 x half>
1297   call void @llvm.masked.store.v4f16.p0(<4 x half> %trunc, ptr %dest, i32 4, <4 x i1> %c)
1298   ret void
1301 define arm_aapcs_vfpcc void @masked_v4f16_align2(ptr %dest, <4 x float> %a) {
1302 ; CHECK-LE-LABEL: masked_v4f16_align2:
1303 ; CHECK-LE:       @ %bb.0: @ %entry
1304 ; CHECK-LE-NEXT:    .pad #4
1305 ; CHECK-LE-NEXT:    sub sp, #4
1306 ; CHECK-LE-NEXT:    vcmp.f32 s0, #0
1307 ; CHECK-LE-NEXT:    movs r1, #0
1308 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1309 ; CHECK-LE-NEXT:    vcmp.f32 s1, #0
1310 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s0
1311 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s5, s2
1312 ; CHECK-LE-NEXT:    vcvtt.f16.f32 s4, s1
1313 ; CHECK-LE-NEXT:    vcvtt.f16.f32 s5, s3
1314 ; CHECK-LE-NEXT:    csetm r2, gt
1315 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1316 ; CHECK-LE-NEXT:    vcmp.f32 s2, #0
1317 ; CHECK-LE-NEXT:    bfi r1, r2, #0, #1
1318 ; CHECK-LE-NEXT:    csetm r2, gt
1319 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1320 ; CHECK-LE-NEXT:    vcmp.f32 s3, #0
1321 ; CHECK-LE-NEXT:    bfi r1, r2, #1, #1
1322 ; CHECK-LE-NEXT:    csetm r2, gt
1323 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1324 ; CHECK-LE-NEXT:    bfi r1, r2, #2, #1
1325 ; CHECK-LE-NEXT:    csetm r2, gt
1326 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1327 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1328 ; CHECK-LE-NEXT:    bne .LBB26_5
1329 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1330 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1331 ; CHECK-LE-NEXT:    bmi .LBB26_6
1332 ; CHECK-LE-NEXT:  .LBB26_2: @ %else2
1333 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1334 ; CHECK-LE-NEXT:    bmi .LBB26_7
1335 ; CHECK-LE-NEXT:  .LBB26_3: @ %else4
1336 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1337 ; CHECK-LE-NEXT:    bmi .LBB26_8
1338 ; CHECK-LE-NEXT:  .LBB26_4: @ %else6
1339 ; CHECK-LE-NEXT:    add sp, #4
1340 ; CHECK-LE-NEXT:    bx lr
1341 ; CHECK-LE-NEXT:  .LBB26_5: @ %cond.store
1342 ; CHECK-LE-NEXT:    vstr.16 s4, [r0]
1343 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1344 ; CHECK-LE-NEXT:    bpl .LBB26_2
1345 ; CHECK-LE-NEXT:  .LBB26_6: @ %cond.store1
1346 ; CHECK-LE-NEXT:    vmovx.f16 s0, s4
1347 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #2]
1348 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1349 ; CHECK-LE-NEXT:    bpl .LBB26_3
1350 ; CHECK-LE-NEXT:  .LBB26_7: @ %cond.store3
1351 ; CHECK-LE-NEXT:    vstr.16 s5, [r0, #4]
1352 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1353 ; CHECK-LE-NEXT:    bpl .LBB26_4
1354 ; CHECK-LE-NEXT:  .LBB26_8: @ %cond.store5
1355 ; CHECK-LE-NEXT:    vmovx.f16 s0, s5
1356 ; CHECK-LE-NEXT:    vstr.16 s0, [r0, #6]
1357 ; CHECK-LE-NEXT:    add sp, #4
1358 ; CHECK-LE-NEXT:    bx lr
1360 ; CHECK-BE-LABEL: masked_v4f16_align2:
1361 ; CHECK-BE:       @ %bb.0: @ %entry
1362 ; CHECK-BE-NEXT:    .pad #4
1363 ; CHECK-BE-NEXT:    sub sp, #4
1364 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1365 ; CHECK-BE-NEXT:    movs r1, #0
1366 ; CHECK-BE-NEXT:    vcmp.f32 s7, #0
1367 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s4
1368 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1369 ; CHECK-BE-NEXT:    vcmp.f32 s6, #0
1370 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s1, s6
1371 ; CHECK-BE-NEXT:    vcvtt.f16.f32 s0, s5
1372 ; CHECK-BE-NEXT:    vcvtt.f16.f32 s1, s7
1373 ; CHECK-BE-NEXT:    csetm r2, gt
1374 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1375 ; CHECK-BE-NEXT:    vcmp.f32 s5, #0
1376 ; CHECK-BE-NEXT:    bfi r1, r2, #0, #1
1377 ; CHECK-BE-NEXT:    csetm r2, gt
1378 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1379 ; CHECK-BE-NEXT:    vcmp.f32 s4, #0
1380 ; CHECK-BE-NEXT:    bfi r1, r2, #1, #1
1381 ; CHECK-BE-NEXT:    csetm r2, gt
1382 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1383 ; CHECK-BE-NEXT:    bfi r1, r2, #2, #1
1384 ; CHECK-BE-NEXT:    csetm r2, gt
1385 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1386 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1387 ; CHECK-BE-NEXT:    bmi .LBB26_5
1388 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1389 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1390 ; CHECK-BE-NEXT:    bmi .LBB26_6
1391 ; CHECK-BE-NEXT:  .LBB26_2: @ %else2
1392 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1393 ; CHECK-BE-NEXT:    bmi .LBB26_7
1394 ; CHECK-BE-NEXT:  .LBB26_3: @ %else4
1395 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1396 ; CHECK-BE-NEXT:    bne .LBB26_8
1397 ; CHECK-BE-NEXT:  .LBB26_4: @ %else6
1398 ; CHECK-BE-NEXT:    add sp, #4
1399 ; CHECK-BE-NEXT:    bx lr
1400 ; CHECK-BE-NEXT:  .LBB26_5: @ %cond.store
1401 ; CHECK-BE-NEXT:    vstr.16 s0, [r0]
1402 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1403 ; CHECK-BE-NEXT:    bpl .LBB26_2
1404 ; CHECK-BE-NEXT:  .LBB26_6: @ %cond.store1
1405 ; CHECK-BE-NEXT:    vmovx.f16 s0, s0
1406 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #2]
1407 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1408 ; CHECK-BE-NEXT:    bpl .LBB26_3
1409 ; CHECK-BE-NEXT:  .LBB26_7: @ %cond.store3
1410 ; CHECK-BE-NEXT:    vstr.16 s1, [r0, #4]
1411 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1412 ; CHECK-BE-NEXT:    beq .LBB26_4
1413 ; CHECK-BE-NEXT:  .LBB26_8: @ %cond.store5
1414 ; CHECK-BE-NEXT:    vmovx.f16 s0, s1
1415 ; CHECK-BE-NEXT:    vstr.16 s0, [r0, #6]
1416 ; CHECK-BE-NEXT:    add sp, #4
1417 ; CHECK-BE-NEXT:    bx lr
1418 entry:
1419   %c = fcmp ogt <4 x float> %a, zeroinitializer
1420   %trunc = fptrunc <4 x float> %a to <4 x half>
1421   call void @llvm.masked.store.v4f16.p0(<4 x half> %trunc, ptr %dest, i32 2, <4 x i1> %c)
1422   ret void
1425 define arm_aapcs_vfpcc void @masked_v4f16_align1(ptr %dest, <4 x float> %a) {
1426 ; CHECK-LE-LABEL: masked_v4f16_align1:
1427 ; CHECK-LE:       @ %bb.0: @ %entry
1428 ; CHECK-LE-NEXT:    .pad #20
1429 ; CHECK-LE-NEXT:    sub sp, #20
1430 ; CHECK-LE-NEXT:    vcmp.f32 s0, #0
1431 ; CHECK-LE-NEXT:    movs r1, #0
1432 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1433 ; CHECK-LE-NEXT:    vcmp.f32 s1, #0
1434 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s4, s0
1435 ; CHECK-LE-NEXT:    vcvtb.f16.f32 s5, s2
1436 ; CHECK-LE-NEXT:    vcvtt.f16.f32 s4, s1
1437 ; CHECK-LE-NEXT:    vcvtt.f16.f32 s5, s3
1438 ; CHECK-LE-NEXT:    csetm r2, gt
1439 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1440 ; CHECK-LE-NEXT:    vcmp.f32 s2, #0
1441 ; CHECK-LE-NEXT:    bfi r1, r2, #0, #1
1442 ; CHECK-LE-NEXT:    csetm r2, gt
1443 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1444 ; CHECK-LE-NEXT:    vcmp.f32 s3, #0
1445 ; CHECK-LE-NEXT:    bfi r1, r2, #1, #1
1446 ; CHECK-LE-NEXT:    csetm r2, gt
1447 ; CHECK-LE-NEXT:    vmrs APSR_nzcv, fpscr
1448 ; CHECK-LE-NEXT:    bfi r1, r2, #2, #1
1449 ; CHECK-LE-NEXT:    csetm r2, gt
1450 ; CHECK-LE-NEXT:    bfi r1, r2, #3, #1
1451 ; CHECK-LE-NEXT:    lsls r2, r1, #31
1452 ; CHECK-LE-NEXT:    bne .LBB27_5
1453 ; CHECK-LE-NEXT:  @ %bb.1: @ %else
1454 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1455 ; CHECK-LE-NEXT:    bmi .LBB27_6
1456 ; CHECK-LE-NEXT:  .LBB27_2: @ %else2
1457 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1458 ; CHECK-LE-NEXT:    bmi .LBB27_7
1459 ; CHECK-LE-NEXT:  .LBB27_3: @ %else4
1460 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1461 ; CHECK-LE-NEXT:    bmi .LBB27_8
1462 ; CHECK-LE-NEXT:  .LBB27_4: @ %else6
1463 ; CHECK-LE-NEXT:    add sp, #20
1464 ; CHECK-LE-NEXT:    bx lr
1465 ; CHECK-LE-NEXT:  .LBB27_5: @ %cond.store
1466 ; CHECK-LE-NEXT:    vstr.16 s4, [sp, #12]
1467 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #12]
1468 ; CHECK-LE-NEXT:    strh r2, [r0]
1469 ; CHECK-LE-NEXT:    lsls r2, r1, #30
1470 ; CHECK-LE-NEXT:    bpl .LBB27_2
1471 ; CHECK-LE-NEXT:  .LBB27_6: @ %cond.store1
1472 ; CHECK-LE-NEXT:    vmovx.f16 s0, s4
1473 ; CHECK-LE-NEXT:    vstr.16 s0, [sp, #8]
1474 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #8]
1475 ; CHECK-LE-NEXT:    strh r2, [r0, #2]
1476 ; CHECK-LE-NEXT:    lsls r2, r1, #29
1477 ; CHECK-LE-NEXT:    bpl .LBB27_3
1478 ; CHECK-LE-NEXT:  .LBB27_7: @ %cond.store3
1479 ; CHECK-LE-NEXT:    vstr.16 s5, [sp, #4]
1480 ; CHECK-LE-NEXT:    ldrh.w r2, [sp, #4]
1481 ; CHECK-LE-NEXT:    strh r2, [r0, #4]
1482 ; CHECK-LE-NEXT:    lsls r1, r1, #28
1483 ; CHECK-LE-NEXT:    bpl .LBB27_4
1484 ; CHECK-LE-NEXT:  .LBB27_8: @ %cond.store5
1485 ; CHECK-LE-NEXT:    vmovx.f16 s0, s5
1486 ; CHECK-LE-NEXT:    vstr.16 s0, [sp]
1487 ; CHECK-LE-NEXT:    ldrh.w r1, [sp]
1488 ; CHECK-LE-NEXT:    strh r1, [r0, #6]
1489 ; CHECK-LE-NEXT:    add sp, #20
1490 ; CHECK-LE-NEXT:    bx lr
1492 ; CHECK-BE-LABEL: masked_v4f16_align1:
1493 ; CHECK-BE:       @ %bb.0: @ %entry
1494 ; CHECK-BE-NEXT:    .pad #20
1495 ; CHECK-BE-NEXT:    sub sp, #20
1496 ; CHECK-BE-NEXT:    vrev64.32 q1, q0
1497 ; CHECK-BE-NEXT:    movs r1, #0
1498 ; CHECK-BE-NEXT:    vcmp.f32 s7, #0
1499 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s0, s4
1500 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1501 ; CHECK-BE-NEXT:    vcmp.f32 s6, #0
1502 ; CHECK-BE-NEXT:    vcvtb.f16.f32 s1, s6
1503 ; CHECK-BE-NEXT:    vcvtt.f16.f32 s0, s5
1504 ; CHECK-BE-NEXT:    vcvtt.f16.f32 s1, s7
1505 ; CHECK-BE-NEXT:    csetm r2, gt
1506 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1507 ; CHECK-BE-NEXT:    vcmp.f32 s5, #0
1508 ; CHECK-BE-NEXT:    bfi r1, r2, #0, #1
1509 ; CHECK-BE-NEXT:    csetm r2, gt
1510 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1511 ; CHECK-BE-NEXT:    vcmp.f32 s4, #0
1512 ; CHECK-BE-NEXT:    bfi r1, r2, #1, #1
1513 ; CHECK-BE-NEXT:    csetm r2, gt
1514 ; CHECK-BE-NEXT:    vmrs APSR_nzcv, fpscr
1515 ; CHECK-BE-NEXT:    bfi r1, r2, #2, #1
1516 ; CHECK-BE-NEXT:    csetm r2, gt
1517 ; CHECK-BE-NEXT:    bfi r1, r2, #3, #1
1518 ; CHECK-BE-NEXT:    lsls r2, r1, #28
1519 ; CHECK-BE-NEXT:    bmi .LBB27_5
1520 ; CHECK-BE-NEXT:  @ %bb.1: @ %else
1521 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1522 ; CHECK-BE-NEXT:    bmi .LBB27_6
1523 ; CHECK-BE-NEXT:  .LBB27_2: @ %else2
1524 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1525 ; CHECK-BE-NEXT:    bmi .LBB27_7
1526 ; CHECK-BE-NEXT:  .LBB27_3: @ %else4
1527 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1528 ; CHECK-BE-NEXT:    bne .LBB27_8
1529 ; CHECK-BE-NEXT:  .LBB27_4: @ %else6
1530 ; CHECK-BE-NEXT:    add sp, #20
1531 ; CHECK-BE-NEXT:    bx lr
1532 ; CHECK-BE-NEXT:  .LBB27_5: @ %cond.store
1533 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #12]
1534 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #12]
1535 ; CHECK-BE-NEXT:    strh r2, [r0]
1536 ; CHECK-BE-NEXT:    lsls r2, r1, #29
1537 ; CHECK-BE-NEXT:    bpl .LBB27_2
1538 ; CHECK-BE-NEXT:  .LBB27_6: @ %cond.store1
1539 ; CHECK-BE-NEXT:    vmovx.f16 s0, s0
1540 ; CHECK-BE-NEXT:    vstr.16 s0, [sp, #8]
1541 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #8]
1542 ; CHECK-BE-NEXT:    strh r2, [r0, #2]
1543 ; CHECK-BE-NEXT:    lsls r2, r1, #30
1544 ; CHECK-BE-NEXT:    bpl .LBB27_3
1545 ; CHECK-BE-NEXT:  .LBB27_7: @ %cond.store3
1546 ; CHECK-BE-NEXT:    vstr.16 s1, [sp, #4]
1547 ; CHECK-BE-NEXT:    ldrh.w r2, [sp, #4]
1548 ; CHECK-BE-NEXT:    strh r2, [r0, #4]
1549 ; CHECK-BE-NEXT:    lsls r1, r1, #31
1550 ; CHECK-BE-NEXT:    beq .LBB27_4
1551 ; CHECK-BE-NEXT:  .LBB27_8: @ %cond.store5
1552 ; CHECK-BE-NEXT:    vmovx.f16 s0, s1
1553 ; CHECK-BE-NEXT:    vstr.16 s0, [sp]
1554 ; CHECK-BE-NEXT:    ldrh.w r1, [sp]
1555 ; CHECK-BE-NEXT:    strh r1, [r0, #6]
1556 ; CHECK-BE-NEXT:    add sp, #20
1557 ; CHECK-BE-NEXT:    bx lr
1558 entry:
1559   %c = fcmp ogt <4 x float> %a, zeroinitializer
1560   %trunc = fptrunc <4 x float> %a to <4 x half>
1561   call void @llvm.masked.store.v4f16.p0(<4 x half> %trunc, ptr %dest, i32 1, <4 x i1> %c)
1562   ret void
1565 declare void @llvm.masked.store.v4i8.p0(<4 x i8>, ptr, i32, <4 x i1>)
1566 declare void @llvm.masked.store.v8i8.p0(<8 x i8>, ptr, i32, <8 x i1>)
1567 declare void @llvm.masked.store.v4i16.p0(<4 x i16>, ptr, i32, <4 x i1>)
1568 declare void @llvm.masked.store.v4i32.p0(<4 x i32>, ptr, i32, <4 x i1>)
1569 declare void @llvm.masked.store.v8i16.p0(<8 x i16>, ptr, i32, <8 x i1>)
1570 declare void @llvm.masked.store.v16i8.p0(<16 x i8>, ptr, i32, <16 x i1>)
1571 declare void @llvm.masked.store.v4f32.p0(<4 x float>, ptr, i32, <4 x i1>)
1572 declare void @llvm.masked.store.v4f16.p0(<4 x half>, ptr, i32, <4 x i1>)
1573 declare void @llvm.masked.store.v8f16.p0(<8 x half>, ptr, i32, <8 x i1>)
1574 declare void @llvm.masked.store.v2i64.p0(<2 x i64>, ptr, i32, <2 x i1>)
1575 declare void @llvm.masked.store.v2f64.p0(<2 x double>, ptr, i32, <2 x i1>)