[X86] combineTargetShuffle - commute VPERMV3 shuffles so any load is on the RHS
[llvm-project.git] / llvm / test / CodeGen / SystemZ / memcpy-03.ll
blobc703aef27532270c0b62a31017be75fc4682dd17
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) {
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
17 define 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
29 define 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
41 define 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
53 define 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
65 define 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
77 define 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
89 define 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
101 define 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
113 define 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
125 define 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
137 define 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
149 define 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
161 define 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
173 define 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
185 define 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
197 define 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
209 define 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