xref: /llvm-project/llvm/test/CodeGen/SystemZ/memcpy-03.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 | FileCheck %s
3;
4; Test memcpys of small constant lengths that should not be done with MVC.
5
6declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
7
8define void @fun16(ptr %Src, ptr %Dst, i8 %val) {
9; CHECK-LABEL: fun16:
10; CHECK:       # %bb.0:
11; CHECK-NEXT:    mvc 0(16,%r3), 0(%r2)
12; CHECK-NEXT:    br %r14
13  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 16, i1 false)
14  ret void
15}
16
17define void @fun17(ptr %Src, ptr %Dst, i8 %val) {
18; CHECK-LABEL: fun17:
19; CHECK:       # %bb.0:
20; CHECK-NEXT:    lb %r0, 16(%r2)
21; CHECK-NEXT:    stc %r0, 16(%r3)
22; CHECK-NEXT:    vl %v0, 0(%r2), 4
23; CHECK-NEXT:    vst %v0, 0(%r3), 4
24; CHECK-NEXT:    br %r14
25  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 17, i1 false)
26  ret void
27}
28
29define void @fun18(ptr %Src, ptr %Dst, i8 %val) {
30; CHECK-LABEL: fun18:
31; CHECK:       # %bb.0:
32; CHECK-NEXT:    lh %r0, 16(%r2)
33; CHECK-NEXT:    sth %r0, 16(%r3)
34; CHECK-NEXT:    vl %v0, 0(%r2), 4
35; CHECK-NEXT:    vst %v0, 0(%r3), 4
36; CHECK-NEXT:    br %r14
37  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 18, i1 false)
38  ret void
39}
40
41define void @fun19(ptr %Src, ptr %Dst, i8 %val) {
42; CHECK-LABEL: fun19:
43; CHECK:       # %bb.0:
44; CHECK-NEXT:    l %r0, 15(%r2)
45; CHECK-NEXT:    st %r0, 15(%r3)
46; CHECK-NEXT:    vl %v0, 0(%r2), 4
47; CHECK-NEXT:    vst %v0, 0(%r3), 4
48; CHECK-NEXT:    br %r14
49  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 19, i1 false)
50  ret void
51}
52
53define void @fun20(ptr %Src, ptr %Dst, i8 %val) {
54; CHECK-LABEL: fun20:
55; CHECK:       # %bb.0:
56; CHECK-NEXT:    l %r0, 16(%r2)
57; CHECK-NEXT:    st %r0, 16(%r3)
58; CHECK-NEXT:    vl %v0, 0(%r2), 4
59; CHECK-NEXT:    vst %v0, 0(%r3), 4
60; CHECK-NEXT:    br %r14
61  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 20, i1 false)
62  ret void
63}
64
65define void @fun21(ptr %Src, ptr %Dst, i8 %val) {
66; CHECK-LABEL: fun21:
67; CHECK:       # %bb.0:
68; CHECK-NEXT:    lg %r0, 13(%r2)
69; CHECK-NEXT:    stg %r0, 13(%r3)
70; CHECK-NEXT:    vl %v0, 0(%r2), 4
71; CHECK-NEXT:    vst %v0, 0(%r3), 4
72; CHECK-NEXT:    br %r14
73  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 21, i1 false)
74  ret void
75}
76
77define void @fun22(ptr %Src, ptr %Dst, i8 %val) {
78; CHECK-LABEL: fun22:
79; CHECK:       # %bb.0:
80; CHECK-NEXT:    lg %r0, 14(%r2)
81; CHECK-NEXT:    stg %r0, 14(%r3)
82; CHECK-NEXT:    vl %v0, 0(%r2), 4
83; CHECK-NEXT:    vst %v0, 0(%r3), 4
84; CHECK-NEXT:    br %r14
85  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 22, i1 false)
86  ret void
87}
88
89define void @fun23(ptr %Src, ptr %Dst, i8 %val) {
90; CHECK-LABEL: fun23:
91; CHECK:       # %bb.0:
92; CHECK-NEXT:    lg %r0, 15(%r2)
93; CHECK-NEXT:    stg %r0, 15(%r3)
94; CHECK-NEXT:    vl %v0, 0(%r2), 4
95; CHECK-NEXT:    vst %v0, 0(%r3), 4
96; CHECK-NEXT:    br %r14
97  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 23, i1 false)
98  ret void
99}
100
101define void @fun24(ptr %Src, ptr %Dst, i8 %val) {
102; CHECK-LABEL: fun24:
103; CHECK:       # %bb.0:
104; CHECK-NEXT:    lg %r0, 16(%r2)
105; CHECK-NEXT:    stg %r0, 16(%r3)
106; CHECK-NEXT:    vl %v0, 0(%r2), 4
107; CHECK-NEXT:    vst %v0, 0(%r3), 4
108; CHECK-NEXT:    br %r14
109  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 24, i1 false)
110  ret void
111}
112
113define void @fun25(ptr %Src, ptr %Dst, i8 %val) {
114; CHECK-LABEL: fun25:
115; CHECK:       # %bb.0:
116; CHECK-NEXT:    vl %v0, 9(%r2)
117; CHECK-NEXT:    vst %v0, 9(%r3)
118; CHECK-NEXT:    vl %v0, 0(%r2), 4
119; CHECK-NEXT:    vst %v0, 0(%r3), 4
120; CHECK-NEXT:    br %r14
121  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 25, i1 false)
122  ret void
123}
124
125define void @fun26(ptr %Src, ptr %Dst, i8 %val) {
126; CHECK-LABEL: fun26:
127; CHECK:       # %bb.0:
128; CHECK-NEXT:    vl %v0, 10(%r2)
129; CHECK-NEXT:    vst %v0, 10(%r3)
130; CHECK-NEXT:    vl %v0, 0(%r2), 4
131; CHECK-NEXT:    vst %v0, 0(%r3), 4
132; CHECK-NEXT:    br %r14
133  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 26, i1 false)
134  ret void
135}
136
137define void @fun27(ptr %Src, ptr %Dst, i8 %val) {
138; CHECK-LABEL: fun27:
139; CHECK:       # %bb.0:
140; CHECK-NEXT:    vl %v0, 11(%r2)
141; CHECK-NEXT:    vst %v0, 11(%r3)
142; CHECK-NEXT:    vl %v0, 0(%r2), 4
143; CHECK-NEXT:    vst %v0, 0(%r3), 4
144; CHECK-NEXT:    br %r14
145  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 27, i1 false)
146  ret void
147}
148
149define void @fun28(ptr %Src, ptr %Dst, i8 %val) {
150; CHECK-LABEL: fun28:
151; CHECK:       # %bb.0:
152; CHECK-NEXT:    vl %v0, 12(%r2)
153; CHECK-NEXT:    vst %v0, 12(%r3)
154; CHECK-NEXT:    vl %v0, 0(%r2), 4
155; CHECK-NEXT:    vst %v0, 0(%r3), 4
156; CHECK-NEXT:    br %r14
157  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 28, i1 false)
158  ret void
159}
160
161define void @fun29(ptr %Src, ptr %Dst, i8 %val) {
162; CHECK-LABEL: fun29:
163; CHECK:       # %bb.0:
164; CHECK-NEXT:    vl %v0, 13(%r2)
165; CHECK-NEXT:    vst %v0, 13(%r3)
166; CHECK-NEXT:    vl %v0, 0(%r2), 4
167; CHECK-NEXT:    vst %v0, 0(%r3), 4
168; CHECK-NEXT:    br %r14
169  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 29, i1 false)
170  ret void
171}
172
173define void @fun30(ptr %Src, ptr %Dst, i8 %val) {
174; CHECK-LABEL: fun30:
175; CHECK:       # %bb.0:
176; CHECK-NEXT:    vl %v0, 14(%r2)
177; CHECK-NEXT:    vst %v0, 14(%r3)
178; CHECK-NEXT:    vl %v0, 0(%r2), 4
179; CHECK-NEXT:    vst %v0, 0(%r3), 4
180; CHECK-NEXT:    br %r14
181  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 30, i1 false)
182  ret void
183}
184
185define void @fun31(ptr %Src, ptr %Dst, i8 %val) {
186; CHECK-LABEL: fun31:
187; CHECK:       # %bb.0:
188; CHECK-NEXT:    vl %v0, 15(%r2)
189; CHECK-NEXT:    vst %v0, 15(%r3)
190; CHECK-NEXT:    vl %v0, 0(%r2), 4
191; CHECK-NEXT:    vst %v0, 0(%r3), 4
192; CHECK-NEXT:    br %r14
193  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 31, i1 false)
194  ret void
195}
196
197define void @fun32(ptr %Src, ptr %Dst, i8 %val) {
198; CHECK-LABEL: fun32:
199; CHECK:       # %bb.0:
200; CHECK-NEXT:    vl %v0, 16(%r2), 4
201; CHECK-NEXT:    vst %v0, 16(%r3), 4
202; CHECK-NEXT:    vl %v0, 0(%r2), 4
203; CHECK-NEXT:    vst %v0, 0(%r3), 4
204; CHECK-NEXT:    br %r14
205  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 32, i1 false)
206  ret void
207}
208
209define void @fun33(ptr %Src, ptr %Dst, i8 %val) {
210; CHECK-LABEL: fun33:
211; CHECK:       # %bb.0:
212; CHECK-NEXT:    mvc 0(33,%r3), 0(%r2)
213; CHECK-NEXT:    br %r14
214  call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 33, i1 false)
215  ret void
216}
217
218