1; Test memsets that clear 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 0, 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 0, 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), 0
30; CHECK: br %r14
31  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, 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), 0
39; CHECK: br %r14
40  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, 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), 0
48; CHECK: br %r14
49  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, 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), 0
57; CHECK: br %r14
58  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, 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), 0
66; CHECK-DAG: mvi 2(%r2), 0
67; CHECK: br %r14
68  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, 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), 0
76; CHECK-DAG: mvi 2(%r2), 0
77; CHECK: br %r14
78  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, 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), 0
86; CHECK: br %r14
87  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, 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), 0
95; CHECK: br %r14
96  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, 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), 0
104; CHECK-DAG: mvi 4(%r2), 0
105; CHECK: br %r14
106  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, 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), 0
114; CHECK-DAG: mvi 4(%r2), 0
115; CHECK: br %r14
116  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, 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), 0
124; CHECK-DAG: mvhhi 4(%r2), 0
125; CHECK: br %r14
126  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, 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), 0
134; CHECK-DAG: mvhhi 4(%r2), 0
135; CHECK: br %r14
136  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, 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: xc 0(7,%r2), 0(%r2)
144; CHECK: br %r14
145  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 7, i32 1, i1 false)
146  ret void
147}
148
149; 7 bytes, i64 version.
150define void @f16(i8 *%dest) {
151; CHECK-LABEL: f16:
152; CHECK: xc 0(7,%r2), 0(%r2)
153; CHECK: br %r14
154  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 7, i32 1, i1 false)
155  ret void
156}
157
158; 8 bytes, i32 version.
159define void @f17(i8 *%dest) {
160; CHECK-LABEL: f17:
161; CHECK: mvghi 0(%r2), 0
162; CHECK: br %r14
163  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 8, i32 1, i1 false)
164  ret void
165}
166
167; 8 bytes, i64 version.
168define void @f18(i8 *%dest) {
169; CHECK-LABEL: f18:
170; CHECK: mvghi 0(%r2), 0
171; CHECK: br %r14
172  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 8, i32 1, i1 false)
173  ret void
174}
175
176; 9 bytes, i32 version.
177define void @f19(i8 *%dest) {
178; CHECK-LABEL: f19:
179; CHECK-DAG: mvghi 0(%r2), 0
180; CHECK-DAG: mvi 8(%r2), 0
181; CHECK: br %r14
182  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 9, i32 1, i1 false)
183  ret void
184}
185
186; 9 bytes, i64 version.
187define void @f20(i8 *%dest) {
188; CHECK-LABEL: f20:
189; CHECK-DAG: mvghi 0(%r2), 0
190; CHECK-DAG: mvi 8(%r2), 0
191; CHECK: br %r14
192  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 9, i32 1, i1 false)
193  ret void
194}
195
196; 10 bytes, i32 version.
197define void @f21(i8 *%dest) {
198; CHECK-LABEL: f21:
199; CHECK-DAG: mvghi 0(%r2), 0
200; CHECK-DAG: mvhhi 8(%r2), 0
201; CHECK: br %r14
202  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 10, i32 1, i1 false)
203  ret void
204}
205
206; 10 bytes, i64 version.
207define void @f22(i8 *%dest) {
208; CHECK-LABEL: f22:
209; CHECK-DAG: mvghi 0(%r2), 0
210; CHECK-DAG: mvhhi 8(%r2), 0
211; CHECK: br %r14
212  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 10, i32 1, i1 false)
213  ret void
214}
215
216; 11 bytes, i32 version.
217define void @f23(i8 *%dest) {
218; CHECK-LABEL: f23:
219; CHECK: xc 0(11,%r2), 0(%r2)
220; CHECK: br %r14
221  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 11, i32 1, i1 false)
222  ret void
223}
224
225; 11 bytes, i64 version.
226define void @f24(i8 *%dest) {
227; CHECK-LABEL: f24:
228; CHECK: xc 0(11,%r2), 0(%r2)
229; CHECK: br %r14
230  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 11, i32 1, i1 false)
231  ret void
232}
233
234; 12 bytes, i32 version.
235define void @f25(i8 *%dest) {
236; CHECK-LABEL: f25:
237; CHECK-DAG: mvghi 0(%r2), 0
238; CHECK-DAG: mvhi 8(%r2), 0
239; CHECK: br %r14
240  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 12, i32 1, i1 false)
241  ret void
242}
243
244; 12 bytes, i64 version.
245define void @f26(i8 *%dest) {
246; CHECK-LABEL: f26:
247; CHECK-DAG: mvghi 0(%r2), 0
248; CHECK-DAG: mvhi 8(%r2), 0
249; CHECK: br %r14
250  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 12, i32 1, i1 false)
251  ret void
252}
253
254; 13 bytes, i32 version.
255define void @f27(i8 *%dest) {
256; CHECK-LABEL: f27:
257; CHECK: xc 0(13,%r2), 0(%r2)
258; CHECK: br %r14
259  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 13, i32 1, i1 false)
260  ret void
261}
262
263; 13 bytes, i64 version.
264define void @f28(i8 *%dest) {
265; CHECK-LABEL: f28:
266; CHECK: xc 0(13,%r2), 0(%r2)
267; CHECK: br %r14
268  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 13, i32 1, i1 false)
269  ret void
270}
271
272; 14 bytes, i32 version.
273define void @f29(i8 *%dest) {
274; CHECK-LABEL: f29:
275; CHECK: xc 0(14,%r2), 0(%r2)
276; CHECK: br %r14
277  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 14, i32 1, i1 false)
278  ret void
279}
280
281; 14 bytes, i64 version.
282define void @f30(i8 *%dest) {
283; CHECK-LABEL: f30:
284; CHECK: xc 0(14,%r2), 0(%r2)
285; CHECK: br %r14
286  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 14, i32 1, i1 false)
287  ret void
288}
289
290; 15 bytes, i32 version.
291define void @f31(i8 *%dest) {
292; CHECK-LABEL: f31:
293; CHECK: xc 0(15,%r2), 0(%r2)
294; CHECK: br %r14
295  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 15, i32 1, i1 false)
296  ret void
297}
298
299; 15 bytes, i64 version.
300define void @f32(i8 *%dest) {
301; CHECK-LABEL: f32:
302; CHECK: xc 0(15,%r2), 0(%r2)
303; CHECK: br %r14
304  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 15, i32 1, i1 false)
305  ret void
306}
307
308; 16 bytes, i32 version.
309define void @f33(i8 *%dest) {
310; CHECK-LABEL: f33:
311; CHECK-DAG: mvghi 0(%r2), 0
312; CHECK-DAG: mvghi 8(%r2), 0
313; CHECK: br %r14
314  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 16, i32 1, i1 false)
315  ret void
316}
317
318; 16 bytes, i64 version.
319define void @f34(i8 *%dest) {
320; CHECK-LABEL: f34:
321; CHECK-DAG: mvghi 0(%r2), 0
322; CHECK-DAG: mvghi 8(%r2), 0
323; CHECK: br %r14
324  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 16, i32 1, i1 false)
325  ret void
326}
327
328; 17 bytes, i32 version.
329define void @f35(i8 *%dest) {
330; CHECK-LABEL: f35:
331; CHECK: xc 0(17,%r2), 0(%r2)
332; CHECK: br %r14
333  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 17, i32 1, i1 false)
334  ret void
335}
336
337; 17 bytes, i64 version.
338define void @f36(i8 *%dest) {
339; CHECK-LABEL: f36:
340; CHECK: xc 0(17,%r2), 0(%r2)
341; CHECK: br %r14
342  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 17, i32 1, i1 false)
343  ret void
344}
345
346; 256 bytes, i32 version.
347define void @f37(i8 *%dest) {
348; CHECK-LABEL: f37:
349; CHECK: xc 0(256,%r2), 0(%r2)
350; CHECK: br %r14
351  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 256, i32 1, i1 false)
352  ret void
353}
354
355; 256 bytes, i64 version.
356define void @f38(i8 *%dest) {
357; CHECK-LABEL: f38:
358; CHECK: xc 0(256,%r2), 0(%r2)
359; CHECK: br %r14
360  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 256, i32 1, i1 false)
361  ret void
362}
363
364; 257 bytes, i32 version.  We need two MVCs.
365define void @f39(i8 *%dest) {
366; CHECK-LABEL: f39:
367; CHECK: xc 0(256,%r2), 0(%r2)
368; CHECK: xc 256(1,%r2), 256(%r2)
369; CHECK: br %r14
370  call void @llvm.memset.p0i8.i32(i8 *%dest, i8 0, i32 257, i32 1, i1 false)
371  ret void
372}
373
374; 257 bytes, i64 version.
375define void @f40(i8 *%dest) {
376; CHECK-LABEL: f40:
377; CHECK: xc 0(256,%r2), 0(%r2)
378; CHECK: xc 256(1,%r2), 256(%r2)
379; CHECK: br %r14
380  call void @llvm.memset.p0i8.i64(i8 *%dest, i8 0, i64 257, i32 1, i1 false)
381  ret void
382}
383