1; Test memset in cases where the set value is a constant other than 0 and -1.
2;
3; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
4
5declare void @llvm.memset.p0i8.i32(i8 *nocapture, i8, i32, i1) nounwind
6declare void @llvm.memset.p0i8.i64(i8 *nocapture, i8, i64, 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 128, i32 0, 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 128, i64 0, 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), 128
30; CHECK: br %r14
31  call void @llvm.memset.p0i8.i32(i8* %dest, i8 128, 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), 128
39; CHECK: br %r14
40  call void @llvm.memset.p0i8.i64(i8* %dest, i8 128, i64 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), -32640
48; CHECK: br %r14
49  call void @llvm.memset.p0i8.i32(i8* %dest, i8 128, i32 2, 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), -32640
57; CHECK: br %r14
58  call void @llvm.memset.p0i8.i64(i8* %dest, i8 128, i64 2, 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), -32640
66; CHECK-DAG: mvi 2(%r2), 128
67; CHECK: br %r14
68  call void @llvm.memset.p0i8.i32(i8* %dest, i8 128, i32 3, 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), -32640
76; CHECK-DAG: mvi 2(%r2), 128
77; CHECK: br %r14
78  call void @llvm.memset.p0i8.i64(i8* %dest, i8 128, i64 3, i1 false)
79  ret void
80}
81
82; 4 bytes, i32 version.
83define void @f9(i8* %dest) {
84; CHECK-LABEL: f9:
85; CHECK: iilf [[REG:%r[0-5]]], 2155905152
86; CHECK: st [[REG]], 0(%r2)
87; CHECK: br %r14
88  call void @llvm.memset.p0i8.i32(i8* %dest, i8 128, i32 4, i1 false)
89  ret void
90}
91
92; 4 bytes, i64 version.
93define void @f10(i8* %dest) {
94; CHECK-LABEL: f10:
95; CHECK: iilf [[REG:%r[0-5]]], 2155905152
96; CHECK: st [[REG]], 0(%r2)
97; CHECK: br %r14
98  call void @llvm.memset.p0i8.i64(i8* %dest, i8 128, i64 4, i1 false)
99  ret void
100}
101
102; 5 bytes, i32 version.
103define void @f11(i8* %dest) {
104; CHECK-LABEL: f11:
105; CHECK: mvi 0(%r2), 128
106; CHECK: mvc 1(4,%r2), 0(%r2)
107; CHECK: br %r14
108  call void @llvm.memset.p0i8.i32(i8* %dest, i8 128, i32 5, i1 false)
109  ret void
110}
111
112; 5 bytes, i64 version.
113define void @f12(i8* %dest) {
114; CHECK-LABEL: f12:
115; CHECK: mvi 0(%r2), 128
116; CHECK: mvc 1(4,%r2), 0(%r2)
117; CHECK: br %r14
118  call void @llvm.memset.p0i8.i64(i8* %dest, i8 128, i64 5, i1 false)
119  ret void
120}
121
122; 257 bytes, i32 version.
123define void @f13(i8* %dest) {
124; CHECK-LABEL: f13:
125; CHECK: mvi 0(%r2), 128
126; CHECK: mvc 1(256,%r2), 0(%r2)
127; CHECK: br %r14
128  call void @llvm.memset.p0i8.i32(i8* %dest, i8 128, i32 257, i1 false)
129  ret void
130}
131
132; 257 bytes, i64 version.
133define void @f14(i8* %dest) {
134; CHECK-LABEL: f14:
135; CHECK: mvi 0(%r2), 128
136; CHECK: mvc 1(256,%r2), 0(%r2)
137; CHECK: br %r14
138  call void @llvm.memset.p0i8.i64(i8* %dest, i8 128, i64 257, i1 false)
139  ret void
140}
141
142; 258 bytes, i32 version.  We need two MVCs.
143define void @f15(i8* %dest) {
144; CHECK-LABEL: f15:
145; CHECK: mvi 0(%r2), 128
146; CHECK: mvc 1(256,%r2), 0(%r2)
147; CHECK: mvc 257(1,%r2), 256(%r2)
148; CHECK: br %r14
149  call void @llvm.memset.p0i8.i32(i8* %dest, i8 128, i32 258, i1 false)
150  ret void
151}
152
153; 258 bytes, i64 version.
154define void @f16(i8* %dest) {
155; CHECK-LABEL: f16:
156; CHECK: mvi 0(%r2), 128
157; CHECK: mvc 1(256,%r2), 0(%r2)
158; CHECK: mvc 257(1,%r2), 256(%r2)
159; CHECK: br %r14
160  call void @llvm.memset.p0i8.i64(i8* %dest, i8 128, i64 258, i1 false)
161  ret void
162}
163