xref: /llvm-project/llvm/test/CodeGen/SystemZ/memset-08.ll (revision a1710eb3cd5823c5d14899112ca3086acbdbe9cb)
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
3;
4; Test memsets of small constant lengths, that should not be done with MVC.
5
6declare void @llvm.memset.p0.i64(ptr nocapture writeonly, i8, i64, i1 immarg)
7
8define 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
16}
17
18define 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
28}
29
30define 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
40}
41
42define 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
52}
53
54define 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
64}
65
66define 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
76}
77
78define 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
88}
89
90define 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
100}
101
102define 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
112}
113
114define 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
124}
125
126define 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
136}
137
138define 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
148}
149
150define 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
160}
161
162define 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
172}
173
174define 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
184}
185
186define 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
196}
197
198define 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
206}
207
208;; Immediate value
209
210define 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
218}
219
220define 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
229}
230
231define 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
238}
239
240define 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
249}
250
251define 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
260}
261
262define 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
271}
272
273define 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
282}
283
284define 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
293}
294
295define 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
304}
305
306define 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
315}
316
317define 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
326}
327
328define 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
335}
336
337define 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
346}
347
348define 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
357}
358
359define 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
368}
369
370define 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
379}
380
381define 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
390}
391
392define 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
401}
402
403define 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
410}
411
412define 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
420}
421