[X86] combineTargetShuffle - commute VPERMV3 shuffles so any load is on the RHS
[llvm-project.git] / llvm / test / CodeGen / SystemZ / memset-08.ll
blob931230983368036bbedd499ec0ae992edb7d0c1d
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mcpu=z15 %s -mtriple=s390x-linux-gnu -o - | FileCheck %s
4 ; Test memsets of small constant lengths, that should not be done with MVC.
6 declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
8 define void @reg17(ptr %Dst, i8 %val) {
9 ; CHECK-LABEL: reg17:
10 ; CHECK:       # %bb.0:
11 ; CHECK-NEXT:    stc %r3, 0(%r2)
12 ; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
13 ; CHECK-NEXT:    br %r14
14   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 17, i1 false)
15   ret void
18 define void @reg18(ptr %Dst, i8 %val) {
19 ; CHECK-LABEL: reg18:
20 ; CHECK:       # %bb.0:
21 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
22 ; CHECK-NEXT:    vrepb %v0, %v0, 7
23 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
24 ; CHECK-NEXT:    vsteh %v0, 16(%r2), 0
25 ; CHECK-NEXT:    br %r14
26   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 18, i1 false)
27   ret void
30 define void @reg19(ptr %Dst, i8 %val) {
31 ; CHECK-LABEL: reg19:
32 ; CHECK:       # %bb.0:
33 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
34 ; CHECK-NEXT:    vrepb %v0, %v0, 7
35 ; CHECK-NEXT:    vstef %v0, 15(%r2), 0
36 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
37 ; CHECK-NEXT:    br %r14
38   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 19, i1 false)
39   ret void
42 define void @reg20(ptr %Dst, i8 %val) {
43 ; CHECK-LABEL: reg20:
44 ; CHECK:       # %bb.0:
45 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
46 ; CHECK-NEXT:    vrepb %v0, %v0, 7
47 ; CHECK-NEXT:    vstef %v0, 16(%r2), 0
48 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
49 ; CHECK-NEXT:    br %r14
50   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 20, i1 false)
51   ret void
54 define void @reg21(ptr %Dst, i8 %val) {
55 ; CHECK-LABEL: reg21:
56 ; CHECK:       # %bb.0:
57 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
58 ; CHECK-NEXT:    vrepb %v0, %v0, 7
59 ; CHECK-NEXT:    vsteg %v0, 13(%r2), 0
60 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
61 ; CHECK-NEXT:    br %r14
62   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 21, i1 false)
63   ret void
66 define void @reg22(ptr %Dst, i8 %val) {
67 ; CHECK-LABEL: reg22:
68 ; CHECK:       # %bb.0:
69 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
70 ; CHECK-NEXT:    vrepb %v0, %v0, 7
71 ; CHECK-NEXT:    vsteg %v0, 14(%r2), 0
72 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
73 ; CHECK-NEXT:    br %r14
74   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 22, i1 false)
75   ret void
78 define void @reg23(ptr %Dst, i8 %val) {
79 ; CHECK-LABEL: reg23:
80 ; CHECK:       # %bb.0:
81 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
82 ; CHECK-NEXT:    vrepb %v0, %v0, 7
83 ; CHECK-NEXT:    vsteg %v0, 15(%r2), 0
84 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
85 ; CHECK-NEXT:    br %r14
86   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 23, i1 false)
87   ret void
90 define void @reg24(ptr %Dst, i8 %val) {
91 ; CHECK-LABEL: reg24:
92 ; CHECK:       # %bb.0:
93 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
94 ; CHECK-NEXT:    vrepb %v0, %v0, 7
95 ; CHECK-NEXT:    vsteg %v0, 16(%r2), 0
96 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
97 ; CHECK-NEXT:    br %r14
98   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 24, i1 false)
99   ret void
102 define void @reg25(ptr %Dst, i8 %val) {
103 ; CHECK-LABEL: reg25:
104 ; CHECK:       # %bb.0:
105 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
106 ; CHECK-NEXT:    vrepb %v0, %v0, 7
107 ; CHECK-NEXT:    vst %v0, 9(%r2)
108 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
109 ; CHECK-NEXT:    br %r14
110   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 25, i1 false)
111   ret void
114 define void @reg26(ptr %Dst, i8 %val) {
115 ; CHECK-LABEL: reg26:
116 ; CHECK:       # %bb.0:
117 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
118 ; CHECK-NEXT:    vrepb %v0, %v0, 7
119 ; CHECK-NEXT:    vst %v0, 10(%r2)
120 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
121 ; CHECK-NEXT:    br %r14
122   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 26, i1 false)
123   ret void
126 define void @reg27(ptr %Dst, i8 %val) {
127 ; CHECK-LABEL: reg27:
128 ; CHECK:       # %bb.0:
129 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
130 ; CHECK-NEXT:    vrepb %v0, %v0, 7
131 ; CHECK-NEXT:    vst %v0, 11(%r2)
132 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
133 ; CHECK-NEXT:    br %r14
134   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 27, i1 false)
135   ret void
138 define void @reg28(ptr %Dst, i8 %val) {
139 ; CHECK-LABEL: reg28:
140 ; CHECK:       # %bb.0:
141 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
142 ; CHECK-NEXT:    vrepb %v0, %v0, 7
143 ; CHECK-NEXT:    vst %v0, 12(%r2)
144 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
145 ; CHECK-NEXT:    br %r14
146   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 28, i1 false)
147   ret void
150 define void @reg29(ptr %Dst, i8 %val) {
151 ; CHECK-LABEL: reg29:
152 ; CHECK:       # %bb.0:
153 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
154 ; CHECK-NEXT:    vrepb %v0, %v0, 7
155 ; CHECK-NEXT:    vst %v0, 13(%r2)
156 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
157 ; CHECK-NEXT:    br %r14
158   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 29, i1 false)
159   ret void
162 define void @reg30(ptr %Dst, i8 %val) {
163 ; CHECK-LABEL: reg30:
164 ; CHECK:       # %bb.0:
165 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
166 ; CHECK-NEXT:    vrepb %v0, %v0, 7
167 ; CHECK-NEXT:    vst %v0, 14(%r2)
168 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
169 ; CHECK-NEXT:    br %r14
170   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 30, i1 false)
171   ret void
174 define void @reg31(ptr %Dst, i8 %val) {
175 ; CHECK-LABEL: reg31:
176 ; CHECK:       # %bb.0:
177 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
178 ; CHECK-NEXT:    vrepb %v0, %v0, 7
179 ; CHECK-NEXT:    vst %v0, 15(%r2)
180 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
181 ; CHECK-NEXT:    br %r14
182   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 31, i1 false)
183   ret void
186 define void @reg32(ptr %Dst, i8 %val) {
187 ; CHECK-LABEL: reg32:
188 ; CHECK:       # %bb.0:
189 ; CHECK-NEXT:    vlvgp %v0, %r3, %r3
190 ; CHECK-NEXT:    vrepb %v0, %v0, 7
191 ; CHECK-NEXT:    vst %v0, 16(%r2), 4
192 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
193 ; CHECK-NEXT:    br %r14
194   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 32, i1 false)
195   ret void
198 define void @reg33(ptr %Dst, i8 %val) {
199 ; CHECK-LABEL: reg33:
200 ; CHECK:       # %bb.0:
201 ; CHECK-NEXT:    stc %r3, 0(%r2)
202 ; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
203 ; CHECK-NEXT:    br %r14
204   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 %val, i64 33, i1 false)
205   ret void
208 ;; Immediate value
210 define void @imm17(ptr %Dst) {
211 ; CHECK-LABEL: imm17:
212 ; CHECK:       # %bb.0:
213 ; CHECK-NEXT:    mvi 0(%r2), 1
214 ; CHECK-NEXT:    mvc 1(16,%r2), 0(%r2)
215 ; CHECK-NEXT:    br %r14
216   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 17, i1 false)
217   ret void
220 define void @imm18(ptr %Dst) {
221 ; CHECK-LABEL: imm18:
222 ; CHECK:       # %bb.0:
223 ; CHECK-NEXT:    vgbm %v0, 65535
224 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
225 ; CHECK-NEXT:    mvhhi 16(%r2), -1
226 ; CHECK-NEXT:    br %r14
227   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 18, i1 false)
228   ret void
231 define void @zero18(ptr %Dst) {
232 ; CHECK-LABEL: zero18:
233 ; CHECK:       # %bb.0:
234 ; CHECK-NEXT:    xc 0(18,%r2), 0(%r2)
235 ; CHECK-NEXT:    br %r14
236   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 18, i1 false)
237   ret void
240 define void @imm19(ptr %Dst) {
241 ; CHECK-LABEL: imm19:
242 ; CHECK:       # %bb.0:
243 ; CHECK-NEXT:    vrepib %v0, 1
244 ; CHECK-NEXT:    vstef %v0, 15(%r2), 0
245 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
246 ; CHECK-NEXT:    br %r14
247   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 19, i1 false)
248   ret void
251 define void @imm20(ptr %Dst) {
252 ; CHECK-LABEL: imm20:
253 ; CHECK:       # %bb.0:
254 ; CHECK-NEXT:    vgbm %v0, 65535
255 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
256 ; CHECK-NEXT:    mvhi 16(%r2), -1
257 ; CHECK-NEXT:    br %r14
258   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 20, i1 false)
259   ret void
262 define void @imm21(ptr %Dst) {
263 ; CHECK-LABEL: imm21:
264 ; CHECK:       # %bb.0:
265 ; CHECK-NEXT:    vrepib %v0, 1
266 ; CHECK-NEXT:    vsteg %v0, 13(%r2), 0
267 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
268 ; CHECK-NEXT:    br %r14
269   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 21, i1 false)
270   ret void
273 define void @imm22(ptr %Dst) {
274 ; CHECK-LABEL: imm22:
275 ; CHECK:       # %bb.0:
276 ; CHECK-NEXT:    vgbm %v0, 65535
277 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
278 ; CHECK-NEXT:    mvghi 14(%r2), -1
279 ; CHECK-NEXT:    br %r14
280   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 22, i1 false)
281   ret void
284 define void @imm23(ptr %Dst) {
285 ; CHECK-LABEL: imm23:
286 ; CHECK:       # %bb.0:
287 ; CHECK-NEXT:    vrepib %v0, 1
288 ; CHECK-NEXT:    vsteg %v0, 15(%r2), 0
289 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
290 ; CHECK-NEXT:    br %r14
291   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 23, i1 false)
292   ret void
295 define void @imm24(ptr %Dst) {
296 ; CHECK-LABEL: imm24:
297 ; CHECK:       # %bb.0:
298 ; CHECK-NEXT:    vgbm %v0, 65535
299 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
300 ; CHECK-NEXT:    mvghi 16(%r2), -1
301 ; CHECK-NEXT:    br %r14
302   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 24, i1 false)
303   ret void
306 define void @imm25(ptr %Dst) {
307 ; CHECK-LABEL: imm25:
308 ; CHECK:       # %bb.0:
309 ; CHECK-NEXT:    vrepib %v0, 1
310 ; CHECK-NEXT:    vst %v0, 9(%r2)
311 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
312 ; CHECK-NEXT:    br %r14
313   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 25, i1 false)
314   ret void
317 define void @imm26(ptr %Dst) {
318 ; CHECK-LABEL: imm26:
319 ; CHECK:       # %bb.0:
320 ; CHECK-NEXT:    vgbm %v0, 65535
321 ; CHECK-NEXT:    vst %v0, 10(%r2)
322 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
323 ; CHECK-NEXT:    br %r14
324   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 26, i1 false)
325   ret void
328 define void @zero26(ptr %Dst) {
329 ; CHECK-LABEL: zero26:
330 ; CHECK:       # %bb.0:
331 ; CHECK-NEXT:    xc 0(26,%r2), 0(%r2)
332 ; CHECK-NEXT:    br %r14
333   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 26, i1 false)
334   ret void
337 define void @imm27(ptr %Dst) {
338 ; CHECK-LABEL: imm27:
339 ; CHECK:       # %bb.0:
340 ; CHECK-NEXT:    vrepib %v0, 1
341 ; CHECK-NEXT:    vst %v0, 11(%r2)
342 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
343 ; CHECK-NEXT:    br %r14
344   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 27, i1 false)
345   ret void
348 define void @imm28(ptr %Dst) {
349 ; CHECK-LABEL: imm28:
350 ; CHECK:       # %bb.0:
351 ; CHECK-NEXT:    vgbm %v0, 65535
352 ; CHECK-NEXT:    vst %v0, 12(%r2)
353 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
354 ; CHECK-NEXT:    br %r14
355   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 28, i1 false)
356   ret void
359 define void @imm29(ptr %Dst) {
360 ; CHECK-LABEL: imm29:
361 ; CHECK:       # %bb.0:
362 ; CHECK-NEXT:    vrepib %v0, 1
363 ; CHECK-NEXT:    vst %v0, 13(%r2)
364 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
365 ; CHECK-NEXT:    br %r14
366   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 29, i1 false)
367   ret void
370 define void @imm30(ptr %Dst) {
371 ; CHECK-LABEL: imm30:
372 ; CHECK:       # %bb.0:
373 ; CHECK-NEXT:    vgbm %v0, 65535
374 ; CHECK-NEXT:    vst %v0, 14(%r2)
375 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
376 ; CHECK-NEXT:    br %r14
377   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 30, i1 false)
378   ret void
381 define void @imm31(ptr %Dst) {
382 ; CHECK-LABEL: imm31:
383 ; CHECK:       # %bb.0:
384 ; CHECK-NEXT:    vrepib %v0, 1
385 ; CHECK-NEXT:    vst %v0, 15(%r2)
386 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
387 ; CHECK-NEXT:    br %r14
388   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 31, i1 false)
389   ret void
392 define void @imm32(ptr %Dst) {
393 ; CHECK-LABEL: imm32:
394 ; CHECK:       # %bb.0:
395 ; CHECK-NEXT:    vgbm %v0, 65535
396 ; CHECK-NEXT:    vst %v0, 16(%r2), 4
397 ; CHECK-NEXT:    vst %v0, 0(%r2), 4
398 ; CHECK-NEXT:    br %r14
399   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 -1, i64 32, i1 false)
400   ret void
403 define void @zero32(ptr %Dst) {
404 ; CHECK-LABEL: zero32:
405 ; CHECK:       # %bb.0:
406 ; CHECK-NEXT:    xc 0(32,%r2), 0(%r2)
407 ; CHECK-NEXT:    br %r14
408   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 0, i64 32, i1 false)
409   ret void
412 define void @imm33(ptr %Dst) {
413 ; CHECK-LABEL: imm33:
414 ; CHECK:       # %bb.0:
415 ; CHECK-NEXT:    mvi 0(%r2), 1
416 ; CHECK-NEXT:    mvc 1(32,%r2), 0(%r2)
417 ; CHECK-NEXT:    br %r14
418   call void @llvm.memset.p0.i64(ptr align 16 %Dst, i8 1, i64 33, i1 false)
419   ret void