1; Test memsets that set all bits.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5declare void @llvm.memset.p0i8.i32(i8 *nocapture, i8, i32, i32, i1) nounwind
6declare void @llvm.memset.p0i8.i64(i8 *nocapture, i8, i64, i32, i1) nounwind
7
8; No bytes, i32 version.
9define void @f1(i8 *%dest) {
10; CHECK-LABEL: f1:
11; CHECK-NOT: %r2
12; CHECK: br %r14
13  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 0, i32 1, i1 false)
14  ret void
15}
16
17; No bytes, i64 version.
18define void @f2(i8 *%dest) {
19; CHECK-LABEL: f2:
20; CHECK-NOT: %r2
21; CHECK: br %r14
22  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 0, i32 1, i1 false)
23  ret void
24}
25
26; 1 byte, i32 version.
27define void @f3(i8 *%dest) {
28; CHECK-LABEL: f3:
29; CHECK: mvi 0(%r2), 255
30; CHECK: br %r14
31  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 1, i32 1, i1 false)
32  ret void
33}
34
35; 1 byte, i64 version.
36define void @f4(i8 *%dest) {
37; CHECK-LABEL: f4:
38; CHECK: mvi 0(%r2), 255
39; CHECK: br %r14
40  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 1, i32 1, i1 false)
41  ret void
42}
43
44; 2 bytes, i32 version.
45define void @f5(i8 *%dest) {
46; CHECK-LABEL: f5:
47; CHECK: mvhhi 0(%r2), -1
48; CHECK: br %r14
49  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 2, i32 1, i1 false)
50  ret void
51}
52
53; 2 bytes, i64 version.
54define void @f6(i8 *%dest) {
55; CHECK-LABEL: f6:
56; CHECK: mvhhi 0(%r2), -1
57; CHECK: br %r14
58  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 2, i32 1, i1 false)
59  ret void
60}
61
62; 3 bytes, i32 version.
63define void @f7(i8 *%dest) {
64; CHECK-LABEL: f7:
65; CHECK-DAG: mvhhi 0(%r2), -1
66; CHECK-DAG: mvi 2(%r2), 255
67; CHECK: br %r14
68  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 3, i32 1, i1 false)
69  ret void
70}
71
72; 3 bytes, i64 version.
73define void @f8(i8 *%dest) {
74; CHECK-LABEL: f8:
75; CHECK-DAG: mvhhi 0(%r2), -1
76; CHECK-DAG: mvi 2(%r2), 255
77; CHECK: br %r14
78  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 3, i32 1, i1 false)
79  ret void
80}
81
82; 4 bytes, i32 version.
83define void @f9(i8 *%dest) {
84; CHECK-LABEL: f9:
85; CHECK: mvhi 0(%r2), -1
86; CHECK: br %r14
87  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 4, i32 1, i1 false)
88  ret void
89}
90
91; 4 bytes, i64 version.
92define void @f10(i8 *%dest) {
93; CHECK-LABEL: f10:
94; CHECK: mvhi 0(%r2), -1
95; CHECK: br %r14
96  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 4, i32 1, i1 false)
97  ret void
98}
99
100; 5 bytes, i32 version.
101define void @f11(i8 *%dest) {
102; CHECK-LABEL: f11:
103; CHECK-DAG: mvhi 0(%r2), -1
104; CHECK-DAG: mvi 4(%r2), 255
105; CHECK: br %r14
106  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 5, i32 1, i1 false)
107  ret void
108}
109
110; 5 bytes, i64 version.
111define void @f12(i8 *%dest) {
112; CHECK-LABEL: f12:
113; CHECK-DAG: mvhi 0(%r2), -1
114; CHECK-DAG: mvi 4(%r2), 255
115; CHECK: br %r14
116  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 5, i32 1, i1 false)
117  ret void
118}
119
120; 6 bytes, i32 version.
121define void @f13(i8 *%dest) {
122; CHECK-LABEL: f13:
123; CHECK-DAG: mvhi 0(%r2), -1
124; CHECK-DAG: mvhhi 4(%r2), -1
125; CHECK: br %r14
126  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 6, i32 1, i1 false)
127  ret void
128}
129
130; 6 bytes, i64 version.
131define void @f14(i8 *%dest) {
132; CHECK-LABEL: f14:
133; CHECK-DAG: mvhi 0(%r2), -1
134; CHECK-DAG: mvhhi 4(%r2), -1
135; CHECK: br %r14
136  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 6, i32 1, i1 false)
137  ret void
138}
139
140; 7 bytes, i32 version.
141define void @f15(i8 *%dest) {
142; CHECK-LABEL: f15:
143; CHECK: mvi 0(%r2), 255
144; CHECK: mvc 1(6,%r2), 0(%r2)
145; CHECK: br %r14
146  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 7, i32 1, i1 false)
147  ret void
148}
149
150; 7 bytes, i64 version.
151define void @f16(i8 *%dest) {
152; CHECK-LABEL: f16:
153; CHECK: mvi 0(%r2), 255
154; CHECK: mvc 1(6,%r2), 0(%r2)
155; CHECK: br %r14
156  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 7, i32 1, i1 false)
157  ret void
158}
159
160; 8 bytes, i32 version.
161define void @f17(i8 *%dest) {
162; CHECK-LABEL: f17:
163; CHECK: mvghi 0(%r2), -1
164; CHECK: br %r14
165  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 8, i32 1, i1 false)
166  ret void
167}
168
169; 8 bytes, i64 version.
170define void @f18(i8 *%dest) {
171; CHECK-LABEL: f18:
172; CHECK: mvghi 0(%r2), -1
173; CHECK: br %r14
174  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 8, i32 1, i1 false)
175  ret void
176}
177
178; 9 bytes, i32 version.
179define void @f19(i8 *%dest) {
180; CHECK-LABEL: f19:
181; CHECK-DAG: mvghi 0(%r2), -1
182; CHECK-DAG: mvi 8(%r2), 255
183; CHECK: br %r14
184  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 9, i32 1, i1 false)
185  ret void
186}
187
188; 9 bytes, i64 version.
189define void @f20(i8 *%dest) {
190; CHECK-LABEL: f20:
191; CHECK-DAG: mvghi 0(%r2), -1
192; CHECK-DAG: mvi 8(%r2), 255
193; CHECK: br %r14
194  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 9, i32 1, i1 false)
195  ret void
196}
197
198; 10 bytes, i32 version.
199define void @f21(i8 *%dest) {
200; CHECK-LABEL: f21:
201; CHECK-DAG: mvghi 0(%r2), -1
202; CHECK-DAG: mvhhi 8(%r2), -1
203; CHECK: br %r14
204  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 10, i32 1, i1 false)
205  ret void
206}
207
208; 10 bytes, i64 version.
209define void @f22(i8 *%dest) {
210; CHECK-LABEL: f22:
211; CHECK-DAG: mvghi 0(%r2), -1
212; CHECK-DAG: mvhhi 8(%r2), -1
213; CHECK: br %r14
214  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 10, i32 1, i1 false)
215  ret void
216}
217
218; 11 bytes, i32 version.
219define void @f23(i8 *%dest) {
220; CHECK-LABEL: f23:
221; CHECK: mvi 0(%r2), 255
222; CHECK: mvc 1(10,%r2), 0(%r2)
223; CHECK: br %r14
224  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 11, i32 1, i1 false)
225  ret void
226}
227
228; 11 bytes, i64 version.
229define void @f24(i8 *%dest) {
230; CHECK-LABEL: f24:
231; CHECK: mvi 0(%r2), 255
232; CHECK: mvc 1(10,%r2), 0(%r2)
233; CHECK: br %r14
234  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 11, i32 1, i1 false)
235  ret void
236}
237
238; 12 bytes, i32 version.
239define void @f25(i8 *%dest) {
240; CHECK-LABEL: f25:
241; CHECK-DAG: mvghi 0(%r2), -1
242; CHECK-DAG: mvhi 8(%r2), -1
243; CHECK: br %r14
244  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 12, i32 1, i1 false)
245  ret void
246}
247
248; 12 bytes, i64 version.
249define void @f26(i8 *%dest) {
250; CHECK-LABEL: f26:
251; CHECK-DAG: mvghi 0(%r2), -1
252; CHECK-DAG: mvhi 8(%r2), -1
253; CHECK: br %r14
254  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 12, i32 1, i1 false)
255  ret void
256}
257
258; 13 bytes, i32 version.
259define void @f27(i8 *%dest) {
260; CHECK-LABEL: f27:
261; CHECK: mvi 0(%r2), 255
262; CHECK: mvc 1(12,%r2), 0(%r2)
263; CHECK: br %r14
264  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 13, i32 1, i1 false)
265  ret void
266}
267
268; 13 bytes, i64 version.
269define void @f28(i8 *%dest) {
270; CHECK-LABEL: f28:
271; CHECK: mvi 0(%r2), 255
272; CHECK: mvc 1(12,%r2), 0(%r2)
273; CHECK: br %r14
274  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 13, i32 1, i1 false)
275  ret void
276}
277
278; 14 bytes, i32 version.
279define void @f29(i8 *%dest) {
280; CHECK-LABEL: f29:
281; CHECK: mvi 0(%r2), 255
282; CHECK: mvc 1(13,%r2), 0(%r2)
283; CHECK: br %r14
284  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 14, i32 1, i1 false)
285  ret void
286}
287
288; 14 bytes, i64 version.
289define void @f30(i8 *%dest) {
290; CHECK-LABEL: f30:
291; CHECK: mvi 0(%r2), 255
292; CHECK: mvc 1(13,%r2), 0(%r2)
293; CHECK: br %r14
294  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 14, i32 1, i1 false)
295  ret void
296}
297
298; 15 bytes, i32 version.
299define void @f31(i8 *%dest) {
300; CHECK-LABEL: f31:
301; CHECK: mvi 0(%r2), 255
302; CHECK: mvc 1(14,%r2), 0(%r2)
303; CHECK: br %r14
304  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 15, i32 1, i1 false)
305  ret void
306}
307
308; 15 bytes, i64 version.
309define void @f32(i8 *%dest) {
310; CHECK-LABEL: f32:
311; CHECK: mvi 0(%r2), 255
312; CHECK: mvc 1(14,%r2), 0(%r2)
313; CHECK: br %r14
314  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 15, i32 1, i1 false)
315  ret void
316}
317
318; 16 bytes, i32 version.
319define void @f33(i8 *%dest) {
320; CHECK-LABEL: f33:
321; CHECK-DAG: mvghi 0(%r2), -1
322; CHECK-DAG: mvghi 8(%r2), -1
323; CHECK: br %r14
324  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 16, i32 1, i1 false)
325  ret void
326}
327
328; 16 bytes, i64 version.
329define void @f34(i8 *%dest) {
330; CHECK-LABEL: f34:
331; CHECK-DAG: mvghi 0(%r2), -1
332; CHECK-DAG: mvghi 8(%r2), -1
333; CHECK: br %r14
334  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 16, i32 1, i1 false)
335  ret void
336}
337
338; 17 bytes, i32 version.
339define void @f35(i8 *%dest) {
340; CHECK-LABEL: f35:
341; CHECK: mvi 0(%r2), 255
342; CHECK: mvc 1(16,%r2), 0(%r2)
343; CHECK: br %r14
344  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 17, i32 1, i1 false)
345  ret void
346}
347
348; 17 bytes, i64 version.
349define void @f36(i8 *%dest) {
350; CHECK-LABEL: f36:
351; CHECK: mvi 0(%r2), 255
352; CHECK: mvc 1(16,%r2), 0(%r2)
353; CHECK: br %r14
354  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 17, i32 1, i1 false)
355  ret void
356}
357
358; 257 bytes, i32 version.
359define void @f37(i8 *%dest) {
360; CHECK-LABEL: f37:
361; CHECK: mvi 0(%r2), 255
362; CHECK: mvc 1(256,%r2), 0(%r2)
363; CHECK: br %r14
364  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 257, i32 1, i1 false)
365  ret void
366}
367
368; 257 bytes, i64 version.
369define void @f38(i8 *%dest) {
370; CHECK-LABEL: f38:
371; CHECK: mvi 0(%r2), 255
372; CHECK: mvc 1(256,%r2), 0(%r2)
373; CHECK: br %r14
374  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 257, i32 1, i1 false)
375  ret void
376}
377
378; 258 bytes, i32 version.  We need two MVCs.
379define void @f39(i8 *%dest) {
380; CHECK-LABEL: f39:
381; CHECK: mvi 0(%r2), 255
382; CHECK: mvc 1(256,%r2), 0(%r2)
383; CHECK: mvc 257(1,%r2), 256(%r2)
384; CHECK: br %r14
385  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 -1, i32 258, i32 1, i1 false)
386  ret void
387}
388
389; 258 bytes, i64 version.
390define void @f40(i8 *%dest) {
391; CHECK-LABEL: f40:
392; CHECK: mvi 0(%r2), 255
393; CHECK: mvc 1(256,%r2), 0(%r2)
394; CHECK: mvc 257(1,%r2), 256(%r2)
395; CHECK: br %r14
396  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 -1, i64 258, i32 1, i1 false)
397  ret void
398}
399