xref: /llvm-project/llvm/test/CodeGen/RISCV/xcvmem.ll (revision 2afea7296812b7e12c6ec683e6858bd4cbe8dd8d)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -O3 -mtriple=riscv32 -mattr=+xcvmem -verify-machineinstrs < %s \
3; RUN:   | FileCheck %s --check-prefixes=CHECK
4
5define <2 x i32> @lb_ri_inc(i8* %a) {
6; CHECK-LABEL: lb_ri_inc:
7; CHECK:       # %bb.0:
8; CHECK-NEXT:    cv.lb a1, (a0), 42
9; CHECK-NEXT:    ret
10  %1 = load i8, i8* %a
11  %2 = sext i8 %1 to i32
12  %3 = getelementptr i8, i8* %a, i32 42
13  %4 = ptrtoint i8* %3 to i32
14  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
15  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
16  ret <2 x i32> %6
17}
18
19define <2 x i32> @lb_rr_inc(i8* %a, i32 %b) {
20; CHECK-LABEL: lb_rr_inc:
21; CHECK:       # %bb.0:
22; CHECK-NEXT:    cv.lb a1, (a0), a1
23; CHECK-NEXT:    ret
24  %1 = load i8, i8* %a
25  %2 = sext i8 %1 to i32
26  %3 = getelementptr i8, i8* %a, i32 %b
27  %4 = ptrtoint i8* %3 to i32
28  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
29  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
30  ret <2 x i32> %6
31}
32
33define i32 @lb_rr(i8* %a, i32 %b) {
34; CHECK-LABEL: lb_rr:
35; CHECK:       # %bb.0:
36; CHECK-NEXT:    cv.lb a0, a1(a0)
37; CHECK-NEXT:    ret
38  %1 = getelementptr i8, i8* %a, i32 %b
39  %2 = load i8, i8* %1
40  %3 = sext i8 %2 to i32
41  ret i32 %3
42}
43
44define <2 x i32> @lbu_ri_inc(i8* %a) {
45; CHECK-LABEL: lbu_ri_inc:
46; CHECK:       # %bb.0:
47; CHECK-NEXT:    cv.lbu a1, (a0), 42
48; CHECK-NEXT:    ret
49  %1 = load i8, i8* %a
50  %2 = zext i8 %1 to i32
51  %3 = getelementptr i8, i8* %a, i32 42
52  %4 = ptrtoint i8* %3 to i32
53  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
54  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
55  ret <2 x i32> %6
56}
57
58define <2 x i32> @lbu_rr_inc(i8* %a, i32 %b) {
59; CHECK-LABEL: lbu_rr_inc:
60; CHECK:       # %bb.0:
61; CHECK-NEXT:    cv.lbu a1, (a0), a1
62; CHECK-NEXT:    ret
63  %1 = load i8, i8* %a
64  %2 = zext i8 %1 to i32
65  %3 = getelementptr i8, i8* %a, i32 %b
66  %4 = ptrtoint i8* %3 to i32
67  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
68  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
69  ret <2 x i32> %6
70}
71
72define i32 @lbu_rr(i8* %a, i32 %b) {
73; CHECK-LABEL: lbu_rr:
74; CHECK:       # %bb.0:
75; CHECK-NEXT:    cv.lbu a0, a1(a0)
76; CHECK-NEXT:    ret
77  %1 = getelementptr i8, i8* %a, i32 %b
78  %2 = load i8, i8* %1
79  %3 = zext i8 %2 to i32
80  ret i32 %3
81}
82
83define <2 x i32> @lh_ri_inc(i16* %a) {
84; CHECK-LABEL: lh_ri_inc:
85; CHECK:       # %bb.0:
86; CHECK-NEXT:    cv.lh a1, (a0), 84
87; CHECK-NEXT:    ret
88  %1 = load i16, i16* %a
89  %2 = sext i16 %1 to i32
90  %3 = getelementptr i16, i16* %a, i32 42
91  %4 = ptrtoint i16* %3 to i32
92  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
93  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
94  ret <2 x i32> %6
95}
96
97define <2 x i32> @lh_rr_inc(i16* %a, i32 %b) {
98; CHECK-LABEL: lh_rr_inc:
99; CHECK:       # %bb.0:
100; CHECK-NEXT:    slli a1, a1, 1
101; CHECK-NEXT:    cv.lh a1, (a0), a1
102; CHECK-NEXT:    ret
103  %1 = load i16, i16* %a
104  %2 = sext i16 %1 to i32
105  %3 = getelementptr i16, i16* %a, i32 %b
106  %4 = ptrtoint i16* %3 to i32
107  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
108  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
109  ret <2 x i32> %6
110}
111
112define i32 @lh_rr(i16* %a, i32 %b) {
113; CHECK-LABEL: lh_rr:
114; CHECK:       # %bb.0:
115; CHECK-NEXT:    slli a1, a1, 1
116; CHECK-NEXT:    cv.lh a0, a1(a0)
117; CHECK-NEXT:    ret
118  %1 = getelementptr i16, i16* %a, i32 %b
119  %2 = load i16, i16* %1
120  %3 = sext i16 %2 to i32
121  ret i32 %3
122}
123
124define <2 x i32> @lhu_ri_inc(i16* %a) {
125; CHECK-LABEL: lhu_ri_inc:
126; CHECK:       # %bb.0:
127; CHECK-NEXT:    cv.lhu a1, (a0), 84
128; CHECK-NEXT:    ret
129  %1 = load i16, i16* %a
130  %2 = zext i16 %1 to i32
131  %3 = getelementptr i16, i16* %a, i32 42
132  %4 = ptrtoint i16* %3 to i32
133  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
134  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
135  ret <2 x i32> %6
136}
137
138define <2 x i32> @lhu_rr_inc(i16* %a, i32 %b) {
139; CHECK-LABEL: lhu_rr_inc:
140; CHECK:       # %bb.0:
141; CHECK-NEXT:    slli a1, a1, 1
142; CHECK-NEXT:    cv.lhu a1, (a0), a1
143; CHECK-NEXT:    ret
144  %1 = load i16, i16* %a
145  %2 = zext i16 %1 to i32
146  %3 = getelementptr i16, i16* %a, i32 %b
147  %4 = ptrtoint i16* %3 to i32
148  %5 = insertelement <2 x i32> undef, i32 %4, i32 0
149  %6 = insertelement <2 x i32> %5, i32 %2, i32 1
150  ret <2 x i32> %6
151}
152
153define i32 @lhu_rr(i16* %a, i32 %b) {
154; CHECK-LABEL: lhu_rr:
155; CHECK:       # %bb.0:
156; CHECK-NEXT:    slli a1, a1, 1
157; CHECK-NEXT:    cv.lhu a0, a1(a0)
158; CHECK-NEXT:    ret
159  %1 = getelementptr i16, i16* %a, i32 %b
160  %2 = load i16, i16* %1
161  %3 = zext i16 %2 to i32
162  ret i32 %3
163}
164
165define <2 x i32> @lw_ri_inc(i32* %a) {
166; CHECK-LABEL: lw_ri_inc:
167; CHECK:       # %bb.0:
168; CHECK-NEXT:    cv.lw a1, (a0), 168
169; CHECK-NEXT:    ret
170  %1 = load i32, i32* %a
171  %2 = getelementptr i32, i32* %a, i32 42
172  %3 = ptrtoint i32* %2 to i32
173  %4 = insertelement <2 x i32> undef, i32 %3, i32 0
174  %5 = insertelement <2 x i32> %4, i32 %1, i32 1
175  ret <2 x i32> %5
176}
177
178define <2 x i32> @lw_rr_inc(i32* %a, i32 %b) {
179; CHECK-LABEL: lw_rr_inc:
180; CHECK:       # %bb.0:
181; CHECK-NEXT:    slli a1, a1, 2
182; CHECK-NEXT:    cv.lw a1, (a0), a1
183; CHECK-NEXT:    ret
184  %1 = load i32, i32* %a
185  %2 = getelementptr i32, i32* %a, i32 %b
186  %3 = ptrtoint i32* %2 to i32
187  %4 = insertelement <2 x i32> undef, i32 %3, i32 0
188  %5 = insertelement <2 x i32> %4, i32 %1, i32 1
189  ret <2 x i32> %5
190}
191
192define i32 @lw_rr(i32* %a, i32 %b) {
193; CHECK-LABEL: lw_rr:
194; CHECK:       # %bb.0:
195; CHECK-NEXT:    slli a1, a1, 2
196; CHECK-NEXT:    cv.lw a0, a1(a0)
197; CHECK-NEXT:    ret
198  %1 = getelementptr i32, i32* %a, i32 %b
199  %2 = load i32, i32* %1
200  ret i32 %2
201}
202
203define i8* @sb_ri_inc(i8* %a, i8 %b) {
204; CHECK-LABEL: sb_ri_inc:
205; CHECK:       # %bb.0:
206; CHECK-NEXT:    cv.sb a1, (a0), 42
207; CHECK-NEXT:    ret
208  store i8 %b, i8* %a
209  %1 = getelementptr i8, i8* %a, i32 42
210  ret i8* %1
211}
212
213define i8* @sb_rr_inc(i8* %a, i8 %b, i32 %c) {
214; CHECK-LABEL: sb_rr_inc:
215; CHECK:       # %bb.0:
216; CHECK-NEXT:    cv.sb a1, (a0), a2
217; CHECK-NEXT:    ret
218  store i8 %b, i8* %a
219  %1 = getelementptr i8, i8* %a, i32 %c
220  ret i8* %1
221}
222
223define void @sb_rr(i8* %a, i8 %b, i32 %c) {
224; CHECK-LABEL: sb_rr:
225; CHECK:       # %bb.0:
226; CHECK-NEXT:    cv.sb a1, a2(a0)
227; CHECK-NEXT:    ret
228  %1 = getelementptr i8, i8* %a, i32 %c
229  store i8 %b, i8* %1
230  ret void
231}
232
233define i16* @sh_ri_inc(i16* %a, i16 %b) {
234; CHECK-LABEL: sh_ri_inc:
235; CHECK:       # %bb.0:
236; CHECK-NEXT:    cv.sh a1, (a0), 84
237; CHECK-NEXT:    ret
238  store i16 %b, i16* %a
239  %1 = getelementptr i16, i16* %a, i32 42
240  ret i16* %1
241}
242
243define i16* @sh_rr_inc(i16* %a, i16 %b, i32 %c) {
244; CHECK-LABEL: sh_rr_inc:
245; CHECK:       # %bb.0:
246; CHECK-NEXT:    slli a2, a2, 1
247; CHECK-NEXT:    cv.sh a1, (a0), a2
248; CHECK-NEXT:    ret
249  store i16 %b, i16* %a
250  %1 = getelementptr i16, i16* %a, i32 %c
251  ret i16* %1
252}
253
254define void @sh_rr(i16* %a, i16 %b, i32 %c) {
255; CHECK-LABEL: sh_rr:
256; CHECK:       # %bb.0:
257; CHECK-NEXT:    slli a2, a2, 1
258; CHECK-NEXT:    cv.sh a1, a2(a0)
259; CHECK-NEXT:    ret
260  %1 = getelementptr i16, i16* %a, i32 %c
261  store i16 %b, i16* %1
262  ret void
263}
264
265define i32* @sw_ri_inc(i32* %a, i32 %b) {
266; CHECK-LABEL: sw_ri_inc:
267; CHECK:       # %bb.0:
268; CHECK-NEXT:    cv.sw a1, (a0), 168
269; CHECK-NEXT:    ret
270  store i32 %b, i32* %a
271  %1 = getelementptr i32, i32* %a, i32 42
272  ret i32* %1
273}
274
275define i32* @sw_rr_inc(i32* %a, i32 %b, i32 %c) {
276; CHECK-LABEL: sw_rr_inc:
277; CHECK:       # %bb.0:
278; CHECK-NEXT:    slli a2, a2, 2
279; CHECK-NEXT:    cv.sw a1, (a0), a2
280; CHECK-NEXT:    ret
281  store i32 %b, i32* %a
282  %1 = getelementptr i32, i32* %a, i32 %c
283  ret i32* %1
284}
285
286define void @sw_rr(i32* %a, i32 %b, i32 %c) {
287; CHECK-LABEL: sw_rr:
288; CHECK:       # %bb.0:
289; CHECK-NEXT:    slli a2, a2, 2
290; CHECK-NEXT:    cv.sw a1, a2(a0)
291; CHECK-NEXT:    ret
292  %1 = getelementptr i32, i32* %a, i32 %c
293  store i32 %b, i32* %1
294  ret void
295}
296