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
4 ; Test memcpys of small constant lengths that should not be done with MVC.
6 declare void @llvm.memcpy.p0.p0.i64(ptr nocapture, ptr nocapture, i64, i1) nounwind
8 define void @fun16(ptr %Src, ptr %Dst, i8 %val) {
11 ; CHECK-NEXT: mvc 0(16,%r3), 0(%r2)
13 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 16, i1 false)
17 define void @fun17(ptr %Src, ptr %Dst, i8 %val) {
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
25 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 17, i1 false)
29 define void @fun18(ptr %Src, ptr %Dst, i8 %val) {
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
37 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 18, i1 false)
41 define void @fun19(ptr %Src, ptr %Dst, i8 %val) {
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
49 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 19, i1 false)
53 define void @fun20(ptr %Src, ptr %Dst, i8 %val) {
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
61 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 20, i1 false)
65 define void @fun21(ptr %Src, ptr %Dst, i8 %val) {
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
73 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 21, i1 false)
77 define void @fun22(ptr %Src, ptr %Dst, i8 %val) {
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
85 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 22, i1 false)
89 define void @fun23(ptr %Src, ptr %Dst, i8 %val) {
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
97 call void @llvm.memcpy.p0.p0.i64(ptr align 16 %Dst, ptr align 16 %Src, i64 23, i1 false)
101 define void @fun24(ptr %Src, ptr %Dst, i8 %val) {
102 ; CHECK-LABEL: fun24:
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)
113 define void @fun25(ptr %Src, ptr %Dst, i8 %val) {
114 ; CHECK-LABEL: fun25:
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)
125 define void @fun26(ptr %Src, ptr %Dst, i8 %val) {
126 ; CHECK-LABEL: fun26:
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)
137 define void @fun27(ptr %Src, ptr %Dst, i8 %val) {
138 ; CHECK-LABEL: fun27:
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)
149 define void @fun28(ptr %Src, ptr %Dst, i8 %val) {
150 ; CHECK-LABEL: fun28:
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)
161 define void @fun29(ptr %Src, ptr %Dst, i8 %val) {
162 ; CHECK-LABEL: fun29:
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)
173 define void @fun30(ptr %Src, ptr %Dst, i8 %val) {
174 ; CHECK-LABEL: fun30:
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)
185 define void @fun31(ptr %Src, ptr %Dst, i8 %val) {
186 ; CHECK-LABEL: fun31:
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)
197 define void @fun32(ptr %Src, ptr %Dst, i8 %val) {
198 ; CHECK-LABEL: fun32:
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)
209 define void @fun33(ptr %Src, ptr %Dst, i8 %val) {
210 ; CHECK-LABEL: fun33:
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)