xref: /llvm-project/llvm/test/CodeGen/RISCV/xtheadmemidx.ll (revision 9122c5235ec85ce0c0ad337e862b006e7b349d84)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -mtriple=riscv32 -mattr=+d -mattr=+xtheadmemidx -mattr=+m -verify-machineinstrs < %s \
3; RUN:   | FileCheck %s -check-prefix=RV32XTHEADMEMIDX
4; RUN: llc -mtriple=riscv64 -mattr=+d -mattr=+xtheadmemidx -mattr=+m -verify-machineinstrs < %s \
5; RUN:   | FileCheck %s -check-prefix=RV64XTHEADMEMIDX
6
7define ptr @lbia(ptr %base, ptr %addr.2, i8 %a) {
8; RV32XTHEADMEMIDX-LABEL: lbia:
9; RV32XTHEADMEMIDX:       # %bb.0:
10; RV32XTHEADMEMIDX-NEXT:    th.lbia a3, (a0), -1, 0
11; RV32XTHEADMEMIDX-NEXT:    add a2, a3, a2
12; RV32XTHEADMEMIDX-NEXT:    sb a2, 0(a1)
13; RV32XTHEADMEMIDX-NEXT:    ret
14;
15; RV64XTHEADMEMIDX-LABEL: lbia:
16; RV64XTHEADMEMIDX:       # %bb.0:
17; RV64XTHEADMEMIDX-NEXT:    th.lbia a3, (a0), -1, 0
18; RV64XTHEADMEMIDX-NEXT:    add a2, a3, a2
19; RV64XTHEADMEMIDX-NEXT:    sb a2, 0(a1)
20; RV64XTHEADMEMIDX-NEXT:    ret
21  %addr = getelementptr i8, ptr %base, i8 0
22  %ld = load i8, ptr %addr
23  %addr.1 = getelementptr i8, ptr %base, i8 -1
24  %res = add i8 %ld, %a
25  store i8 %res, ptr %addr.2
26  ret ptr %addr.1
27}
28
29define ptr @lbib(ptr %base, i8 %a) {
30; RV32XTHEADMEMIDX-LABEL: lbib:
31; RV32XTHEADMEMIDX:       # %bb.0:
32; RV32XTHEADMEMIDX-NEXT:    th.lbib a2, (a0), 1, 0
33; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
34; RV32XTHEADMEMIDX-NEXT:    sb a1, 1(a0)
35; RV32XTHEADMEMIDX-NEXT:    ret
36;
37; RV64XTHEADMEMIDX-LABEL: lbib:
38; RV64XTHEADMEMIDX:       # %bb.0:
39; RV64XTHEADMEMIDX-NEXT:    th.lbib a2, (a0), 1, 0
40; RV64XTHEADMEMIDX-NEXT:    add a1, a2, a1
41; RV64XTHEADMEMIDX-NEXT:    sb a1, 1(a0)
42; RV64XTHEADMEMIDX-NEXT:    ret
43  %addr = getelementptr i8, ptr %base, i8 1
44  %ld = load i8, ptr %addr
45  %addr.1 = getelementptr i8, ptr %base, i8 2
46  %res = add i8 %ld, %a
47  store i8 %res, ptr %addr.1
48  ret ptr %addr
49}
50
51define ptr @lbuia(ptr %base, ptr %addr.2, i64 %a) {
52; RV32XTHEADMEMIDX-LABEL: lbuia:
53; RV32XTHEADMEMIDX:       # %bb.0:
54; RV32XTHEADMEMIDX-NEXT:    th.lbuia a4, (a0), -1, 0
55; RV32XTHEADMEMIDX-NEXT:    add a2, a4, a2
56; RV32XTHEADMEMIDX-NEXT:    sltu a4, a2, a4
57; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a4
58; RV32XTHEADMEMIDX-NEXT:    sw a2, 0(a1)
59; RV32XTHEADMEMIDX-NEXT:    sw a3, 4(a1)
60; RV32XTHEADMEMIDX-NEXT:    ret
61;
62; RV64XTHEADMEMIDX-LABEL: lbuia:
63; RV64XTHEADMEMIDX:       # %bb.0:
64; RV64XTHEADMEMIDX-NEXT:    th.lbuia a3, (a0), -1, 0
65; RV64XTHEADMEMIDX-NEXT:    add a2, a3, a2
66; RV64XTHEADMEMIDX-NEXT:    sd a2, 0(a1)
67; RV64XTHEADMEMIDX-NEXT:    ret
68  %addr = getelementptr i8, ptr %base, i8 0
69  %ld = load i8, ptr %addr
70  %zext = zext i8 %ld to i64
71  %addr.1 = getelementptr i8, ptr %base, i8 -1
72  %res = add i64 %zext, %a
73  store i64 %res, ptr %addr.2
74  ret ptr %addr.1
75}
76
77define ptr @lbuib(ptr %base, i64 %a, ptr %addr.1) {
78; RV32XTHEADMEMIDX-LABEL: lbuib:
79; RV32XTHEADMEMIDX:       # %bb.0:
80; RV32XTHEADMEMIDX-NEXT:    th.lbuib a4, (a0), 1, 0
81; RV32XTHEADMEMIDX-NEXT:    add a1, a4, a1
82; RV32XTHEADMEMIDX-NEXT:    sltu a4, a1, a4
83; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a4
84; RV32XTHEADMEMIDX-NEXT:    sw a1, 0(a3)
85; RV32XTHEADMEMIDX-NEXT:    sw a2, 4(a3)
86; RV32XTHEADMEMIDX-NEXT:    ret
87;
88; RV64XTHEADMEMIDX-LABEL: lbuib:
89; RV64XTHEADMEMIDX:       # %bb.0:
90; RV64XTHEADMEMIDX-NEXT:    th.lbuib a3, (a0), 1, 0
91; RV64XTHEADMEMIDX-NEXT:    add a1, a3, a1
92; RV64XTHEADMEMIDX-NEXT:    sd a1, 0(a2)
93; RV64XTHEADMEMIDX-NEXT:    ret
94  %addr = getelementptr i8, ptr %base, i8 1
95  %ld = load i8, ptr %addr
96  %zext = zext i8 %ld to i64
97  %res = add i64 %zext, %a
98  store i64 %res, ptr %addr.1
99  ret ptr %addr
100}
101
102define ptr @lhia(ptr %base, ptr %addr.2, i16 %a) {
103; RV32XTHEADMEMIDX-LABEL: lhia:
104; RV32XTHEADMEMIDX:       # %bb.0:
105; RV32XTHEADMEMIDX-NEXT:    th.lhia a3, (a0), -16, 1
106; RV32XTHEADMEMIDX-NEXT:    add a2, a3, a2
107; RV32XTHEADMEMIDX-NEXT:    sh a2, 0(a1)
108; RV32XTHEADMEMIDX-NEXT:    ret
109;
110; RV64XTHEADMEMIDX-LABEL: lhia:
111; RV64XTHEADMEMIDX:       # %bb.0:
112; RV64XTHEADMEMIDX-NEXT:    th.lhia a3, (a0), -16, 1
113; RV64XTHEADMEMIDX-NEXT:    add a2, a3, a2
114; RV64XTHEADMEMIDX-NEXT:    sh a2, 0(a1)
115; RV64XTHEADMEMIDX-NEXT:    ret
116  %addr = getelementptr i16, ptr %base, i16 0
117  %ld = load i16, ptr %addr
118  %addr.1 = getelementptr i16, ptr %base, i16 -16
119  %res = add i16 %ld, %a
120  store i16 %res, ptr %addr.2
121  ret ptr %addr.1
122}
123
124define ptr @lhib(ptr %base, i16 %a) {
125; RV32XTHEADMEMIDX-LABEL: lhib:
126; RV32XTHEADMEMIDX:       # %bb.0:
127; RV32XTHEADMEMIDX-NEXT:    th.lhib a2, (a0), 2, 0
128; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
129; RV32XTHEADMEMIDX-NEXT:    sh a1, 2(a0)
130; RV32XTHEADMEMIDX-NEXT:    ret
131;
132; RV64XTHEADMEMIDX-LABEL: lhib:
133; RV64XTHEADMEMIDX:       # %bb.0:
134; RV64XTHEADMEMIDX-NEXT:    th.lhib a2, (a0), 2, 0
135; RV64XTHEADMEMIDX-NEXT:    add a1, a2, a1
136; RV64XTHEADMEMIDX-NEXT:    sh a1, 2(a0)
137; RV64XTHEADMEMIDX-NEXT:    ret
138  %addr = getelementptr i16, ptr %base, i16 1
139  %ld = load i16, ptr %addr
140  %addr.1 = getelementptr i16, ptr %base, i16 2
141  %res = add i16 %ld, %a
142  store i16 %res, ptr %addr.1
143  ret ptr %addr
144}
145
146define ptr @lhuia(ptr %base, ptr %addr.2, i64 %a) {
147; RV32XTHEADMEMIDX-LABEL: lhuia:
148; RV32XTHEADMEMIDX:       # %bb.0:
149; RV32XTHEADMEMIDX-NEXT:    th.lhuia a4, (a0), -16, 1
150; RV32XTHEADMEMIDX-NEXT:    add a2, a4, a2
151; RV32XTHEADMEMIDX-NEXT:    sltu a4, a2, a4
152; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a4
153; RV32XTHEADMEMIDX-NEXT:    sw a2, 0(a1)
154; RV32XTHEADMEMIDX-NEXT:    sw a3, 4(a1)
155; RV32XTHEADMEMIDX-NEXT:    ret
156;
157; RV64XTHEADMEMIDX-LABEL: lhuia:
158; RV64XTHEADMEMIDX:       # %bb.0:
159; RV64XTHEADMEMIDX-NEXT:    th.lhuia a3, (a0), -16, 1
160; RV64XTHEADMEMIDX-NEXT:    add a2, a3, a2
161; RV64XTHEADMEMIDX-NEXT:    sd a2, 0(a1)
162; RV64XTHEADMEMIDX-NEXT:    ret
163  %addr = getelementptr i16, ptr %base, i16 0
164  %ld = load i16, ptr %addr
165  %zext = zext i16 %ld to i64
166  %addr.1 = getelementptr i16, ptr %base, i16 -16
167  %res = add i64 %zext, %a
168  store i64 %res, ptr %addr.2
169  ret ptr %addr.1
170}
171
172define ptr @lhuib(ptr %base, i64 %a, ptr %addr.1) {
173; RV32XTHEADMEMIDX-LABEL: lhuib:
174; RV32XTHEADMEMIDX:       # %bb.0:
175; RV32XTHEADMEMIDX-NEXT:    th.lhuib a4, (a0), 2, 0
176; RV32XTHEADMEMIDX-NEXT:    add a1, a4, a1
177; RV32XTHEADMEMIDX-NEXT:    sltu a4, a1, a4
178; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a4
179; RV32XTHEADMEMIDX-NEXT:    sw a1, 0(a3)
180; RV32XTHEADMEMIDX-NEXT:    sw a2, 4(a3)
181; RV32XTHEADMEMIDX-NEXT:    ret
182;
183; RV64XTHEADMEMIDX-LABEL: lhuib:
184; RV64XTHEADMEMIDX:       # %bb.0:
185; RV64XTHEADMEMIDX-NEXT:    th.lhuib a3, (a0), 2, 0
186; RV64XTHEADMEMIDX-NEXT:    add a1, a3, a1
187; RV64XTHEADMEMIDX-NEXT:    sd a1, 0(a2)
188; RV64XTHEADMEMIDX-NEXT:    ret
189  %addr = getelementptr i16, ptr %base, i16 1
190  %ld = load i16, ptr %addr
191  %zext = zext i16 %ld to i64
192  %res = add i64 %zext, %a
193  store i64 %res, ptr %addr.1
194  ret ptr %addr
195}
196
197define ptr @lwia(ptr %base, ptr %addr.2, i32 %a) {
198; RV32XTHEADMEMIDX-LABEL: lwia:
199; RV32XTHEADMEMIDX:       # %bb.0:
200; RV32XTHEADMEMIDX-NEXT:    th.lwia a3, (a0), -16, 2
201; RV32XTHEADMEMIDX-NEXT:    add a2, a3, a2
202; RV32XTHEADMEMIDX-NEXT:    sw a2, 0(a1)
203; RV32XTHEADMEMIDX-NEXT:    ret
204;
205; RV64XTHEADMEMIDX-LABEL: lwia:
206; RV64XTHEADMEMIDX:       # %bb.0:
207; RV64XTHEADMEMIDX-NEXT:    th.lwia a3, (a0), -16, 2
208; RV64XTHEADMEMIDX-NEXT:    add a2, a3, a2
209; RV64XTHEADMEMIDX-NEXT:    sw a2, 0(a1)
210; RV64XTHEADMEMIDX-NEXT:    ret
211  %addr = getelementptr i32, ptr %base, i32 0
212  %ld = load i32, ptr %addr
213  %addr.1 = getelementptr i32, ptr %base, i32 -16
214  %res = add i32 %ld, %a
215  store i32 %res, ptr %addr.2
216  ret ptr %addr.1
217}
218
219define ptr @lwib(ptr %base, i32 %a) {
220; RV32XTHEADMEMIDX-LABEL: lwib:
221; RV32XTHEADMEMIDX:       # %bb.0:
222; RV32XTHEADMEMIDX-NEXT:    th.lwib a2, (a0), 4, 0
223; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
224; RV32XTHEADMEMIDX-NEXT:    sw a1, 4(a0)
225; RV32XTHEADMEMIDX-NEXT:    ret
226;
227; RV64XTHEADMEMIDX-LABEL: lwib:
228; RV64XTHEADMEMIDX:       # %bb.0:
229; RV64XTHEADMEMIDX-NEXT:    th.lwib a2, (a0), 4, 0
230; RV64XTHEADMEMIDX-NEXT:    add a1, a2, a1
231; RV64XTHEADMEMIDX-NEXT:    sw a1, 4(a0)
232; RV64XTHEADMEMIDX-NEXT:    ret
233  %addr = getelementptr i32, ptr %base, i32 1
234  %ld = load i32, ptr %addr
235  %addr.1 = getelementptr i32, ptr %base, i32 2
236  %res = add i32 %ld, %a
237  store i32 %res, ptr %addr.1
238  ret ptr %addr
239}
240
241define ptr @lwuia(ptr %base, ptr %addr.2, i64 %a) {
242; RV32XTHEADMEMIDX-LABEL: lwuia:
243; RV32XTHEADMEMIDX:       # %bb.0:
244; RV32XTHEADMEMIDX-NEXT:    th.lwia a4, (a0), -16, 2
245; RV32XTHEADMEMIDX-NEXT:    add a2, a4, a2
246; RV32XTHEADMEMIDX-NEXT:    sltu a4, a2, a4
247; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a4
248; RV32XTHEADMEMIDX-NEXT:    sw a2, 0(a1)
249; RV32XTHEADMEMIDX-NEXT:    sw a3, 4(a1)
250; RV32XTHEADMEMIDX-NEXT:    ret
251;
252; RV64XTHEADMEMIDX-LABEL: lwuia:
253; RV64XTHEADMEMIDX:       # %bb.0:
254; RV64XTHEADMEMIDX-NEXT:    th.lwuia a3, (a0), -16, 2
255; RV64XTHEADMEMIDX-NEXT:    add a2, a3, a2
256; RV64XTHEADMEMIDX-NEXT:    sd a2, 0(a1)
257; RV64XTHEADMEMIDX-NEXT:    ret
258  %addr = getelementptr i32, ptr %base, i32 0
259  %ld = load i32, ptr %addr
260  %zext = zext i32 %ld to i64
261  %addr.1 = getelementptr i32, ptr %base, i32 -16
262  %res = add i64 %zext, %a
263  store i64 %res, ptr %addr.2
264  ret ptr %addr.1
265}
266
267define ptr @lwuib(ptr %base, i64 %a, ptr %addr.1) {
268; RV32XTHEADMEMIDX-LABEL: lwuib:
269; RV32XTHEADMEMIDX:       # %bb.0:
270; RV32XTHEADMEMIDX-NEXT:    th.lwib a4, (a0), 4, 0
271; RV32XTHEADMEMIDX-NEXT:    add a1, a4, a1
272; RV32XTHEADMEMIDX-NEXT:    sltu a4, a1, a4
273; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a4
274; RV32XTHEADMEMIDX-NEXT:    sw a1, 0(a3)
275; RV32XTHEADMEMIDX-NEXT:    sw a2, 4(a3)
276; RV32XTHEADMEMIDX-NEXT:    ret
277;
278; RV64XTHEADMEMIDX-LABEL: lwuib:
279; RV64XTHEADMEMIDX:       # %bb.0:
280; RV64XTHEADMEMIDX-NEXT:    th.lwuib a3, (a0), 4, 0
281; RV64XTHEADMEMIDX-NEXT:    add a1, a3, a1
282; RV64XTHEADMEMIDX-NEXT:    sd a1, 0(a2)
283; RV64XTHEADMEMIDX-NEXT:    ret
284  %addr = getelementptr i32, ptr %base, i32 1
285  %ld = load i32, ptr %addr
286  %zext = zext i32 %ld to i64
287  %res = add i64 %zext, %a
288  store i64 %res, ptr %addr.1
289  ret ptr %addr
290}
291
292define ptr @ldia(ptr %base, ptr %addr.2, i64 %a) {
293; RV32XTHEADMEMIDX-LABEL: ldia:
294; RV32XTHEADMEMIDX:       # %bb.0:
295; RV32XTHEADMEMIDX-NEXT:    lw a4, 4(a0)
296; RV32XTHEADMEMIDX-NEXT:    lw a5, 0(a0)
297; RV32XTHEADMEMIDX-NEXT:    addi a0, a0, -128
298; RV32XTHEADMEMIDX-NEXT:    add a3, a4, a3
299; RV32XTHEADMEMIDX-NEXT:    add a2, a5, a2
300; RV32XTHEADMEMIDX-NEXT:    sltu a4, a2, a5
301; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a4
302; RV32XTHEADMEMIDX-NEXT:    sw a2, 0(a1)
303; RV32XTHEADMEMIDX-NEXT:    sw a3, 4(a1)
304; RV32XTHEADMEMIDX-NEXT:    ret
305;
306; RV64XTHEADMEMIDX-LABEL: ldia:
307; RV64XTHEADMEMIDX:       # %bb.0:
308; RV64XTHEADMEMIDX-NEXT:    th.ldia a3, (a0), -16, 3
309; RV64XTHEADMEMIDX-NEXT:    add a2, a3, a2
310; RV64XTHEADMEMIDX-NEXT:    sd a2, 0(a1)
311; RV64XTHEADMEMIDX-NEXT:    ret
312  %addr = getelementptr i64, ptr %base, i64 0
313  %ld = load i64, ptr %addr
314  %addr.1 = getelementptr i64, ptr %base, i64 -16
315  %res = add i64 %ld, %a
316  store i64 %res, ptr %addr.2
317  ret ptr %addr.1
318}
319
320define ptr @ldib(ptr %base, i64 %a) {
321; RV32XTHEADMEMIDX-LABEL: ldib:
322; RV32XTHEADMEMIDX:       # %bb.0:
323; RV32XTHEADMEMIDX-NEXT:    th.lwib a3, (a0), 8, 0
324; RV32XTHEADMEMIDX-NEXT:    lw a4, 4(a0)
325; RV32XTHEADMEMIDX-NEXT:    add a1, a3, a1
326; RV32XTHEADMEMIDX-NEXT:    sltu a3, a1, a3
327; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a3
328; RV32XTHEADMEMIDX-NEXT:    add a2, a4, a2
329; RV32XTHEADMEMIDX-NEXT:    sw a1, 8(a0)
330; RV32XTHEADMEMIDX-NEXT:    sw a2, 12(a0)
331; RV32XTHEADMEMIDX-NEXT:    ret
332;
333; RV64XTHEADMEMIDX-LABEL: ldib:
334; RV64XTHEADMEMIDX:       # %bb.0:
335; RV64XTHEADMEMIDX-NEXT:    th.ldib a2, (a0), 8, 0
336; RV64XTHEADMEMIDX-NEXT:    add a1, a2, a1
337; RV64XTHEADMEMIDX-NEXT:    sd a1, 8(a0)
338; RV64XTHEADMEMIDX-NEXT:    ret
339  %addr = getelementptr i64, ptr %base, i64 1
340  %ld = load i64, ptr %addr
341  %addr.1 = getelementptr i64, ptr %base, i64 2
342  %res = add i64 %ld, %a
343  store i64 %res, ptr %addr.1
344  ret ptr %addr
345}
346
347define ptr @sbia(ptr %base, i8 %a, i8 %b) {
348; RV32XTHEADMEMIDX-LABEL: sbia:
349; RV32XTHEADMEMIDX:       # %bb.0:
350; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
351; RV32XTHEADMEMIDX-NEXT:    th.sbia a1, (a0), 1, 0
352; RV32XTHEADMEMIDX-NEXT:    ret
353;
354; RV64XTHEADMEMIDX-LABEL: sbia:
355; RV64XTHEADMEMIDX:       # %bb.0:
356; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
357; RV64XTHEADMEMIDX-NEXT:    th.sbia a1, (a0), 1, 0
358; RV64XTHEADMEMIDX-NEXT:    ret
359  %addr.1 = getelementptr i8, ptr %base, i8 1
360  %res = add i8 %a, %b
361  store i8 %res, ptr %base
362  ret ptr %addr.1
363}
364
365define ptr @sbib(ptr %base, i8 %a, i8 %b) {
366; RV32XTHEADMEMIDX-LABEL: sbib:
367; RV32XTHEADMEMIDX:       # %bb.0:
368; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
369; RV32XTHEADMEMIDX-NEXT:    th.sbib a1, (a0), 1, 0
370; RV32XTHEADMEMIDX-NEXT:    ret
371;
372; RV64XTHEADMEMIDX-LABEL: sbib:
373; RV64XTHEADMEMIDX:       # %bb.0:
374; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
375; RV64XTHEADMEMIDX-NEXT:    th.sbib a1, (a0), 1, 0
376; RV64XTHEADMEMIDX-NEXT:    ret
377  %addr.1 = getelementptr i8, ptr %base, i8 1
378  %res = add i8 %a, %b
379  store i8 %res, ptr %addr.1
380  ret ptr %addr.1
381}
382
383define ptr @shia(ptr %base, i16 %a, i16 %b) {
384; RV32XTHEADMEMIDX-LABEL: shia:
385; RV32XTHEADMEMIDX:       # %bb.0:
386; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
387; RV32XTHEADMEMIDX-NEXT:    th.shia a1, (a0), -9, 1
388; RV32XTHEADMEMIDX-NEXT:    ret
389;
390; RV64XTHEADMEMIDX-LABEL: shia:
391; RV64XTHEADMEMIDX:       # %bb.0:
392; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
393; RV64XTHEADMEMIDX-NEXT:    th.shia a1, (a0), -9, 1
394; RV64XTHEADMEMIDX-NEXT:    ret
395  %addr.1 = getelementptr i16, ptr %base, i16 -9
396  %res = add i16 %a, %b
397  store i16 %res, ptr %base
398  ret ptr %addr.1
399}
400
401define ptr @shib(ptr %base, i16 %a, i16 %b) {
402; RV32XTHEADMEMIDX-LABEL: shib:
403; RV32XTHEADMEMIDX:       # %bb.0:
404; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
405; RV32XTHEADMEMIDX-NEXT:    th.shib a1, (a0), 2, 0
406; RV32XTHEADMEMIDX-NEXT:    ret
407;
408; RV64XTHEADMEMIDX-LABEL: shib:
409; RV64XTHEADMEMIDX:       # %bb.0:
410; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
411; RV64XTHEADMEMIDX-NEXT:    th.shib a1, (a0), 2, 0
412; RV64XTHEADMEMIDX-NEXT:    ret
413  %addr.1 = getelementptr i16, ptr %base, i16 1
414  %res = add i16 %a, %b
415  store i16 %res, ptr %addr.1
416  ret ptr %addr.1
417}
418
419define ptr @swia(ptr %base, i32 %a, i32 %b) {
420; RV32XTHEADMEMIDX-LABEL: swia:
421; RV32XTHEADMEMIDX:       # %bb.0:
422; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
423; RV32XTHEADMEMIDX-NEXT:    th.swia a1, (a0), 8, 2
424; RV32XTHEADMEMIDX-NEXT:    ret
425;
426; RV64XTHEADMEMIDX-LABEL: swia:
427; RV64XTHEADMEMIDX:       # %bb.0:
428; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
429; RV64XTHEADMEMIDX-NEXT:    th.swia a1, (a0), 8, 2
430; RV64XTHEADMEMIDX-NEXT:    ret
431  %addr.1 = getelementptr i32, ptr %base, i32 8
432  %res = add i32 %a, %b
433  store i32 %res, ptr %base
434  ret ptr %addr.1
435}
436
437define ptr @swib(ptr %base, i32 %a, i32 %b) {
438; RV32XTHEADMEMIDX-LABEL: swib:
439; RV32XTHEADMEMIDX:       # %bb.0:
440; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
441; RV32XTHEADMEMIDX-NEXT:    th.swib a1, (a0), -13, 3
442; RV32XTHEADMEMIDX-NEXT:    ret
443;
444; RV64XTHEADMEMIDX-LABEL: swib:
445; RV64XTHEADMEMIDX:       # %bb.0:
446; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
447; RV64XTHEADMEMIDX-NEXT:    th.swib a1, (a0), -13, 3
448; RV64XTHEADMEMIDX-NEXT:    ret
449  %addr.1 = getelementptr i32, ptr %base, i32 -26
450  %res = add i32 %a, %b
451  store i32 %res, ptr %addr.1
452  ret ptr %addr.1
453}
454
455define ptr @sdia(ptr %base, i64 %a, i64 %b) {
456; RV32XTHEADMEMIDX-LABEL: sdia:
457; RV32XTHEADMEMIDX:       # %bb.0:
458; RV32XTHEADMEMIDX-NEXT:    addi a5, a0, 64
459; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a4
460; RV32XTHEADMEMIDX-NEXT:    add a3, a1, a3
461; RV32XTHEADMEMIDX-NEXT:    sltu a1, a3, a1
462; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
463; RV32XTHEADMEMIDX-NEXT:    sw a3, 0(a0)
464; RV32XTHEADMEMIDX-NEXT:    sw a1, 4(a0)
465; RV32XTHEADMEMIDX-NEXT:    mv a0, a5
466; RV32XTHEADMEMIDX-NEXT:    ret
467;
468; RV64XTHEADMEMIDX-LABEL: sdia:
469; RV64XTHEADMEMIDX:       # %bb.0:
470; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
471; RV64XTHEADMEMIDX-NEXT:    th.sdia a1, (a0), 8, 3
472; RV64XTHEADMEMIDX-NEXT:    ret
473  %addr.1 = getelementptr i64, ptr %base, i64 8
474  %res = add i64 %a, %b
475  store i64 %res, ptr %base
476  ret ptr %addr.1
477}
478
479define ptr @sdib(ptr %base, i64 %a, i64 %b) {
480; RV32XTHEADMEMIDX-LABEL: sdib:
481; RV32XTHEADMEMIDX:       # %bb.0:
482; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a4
483; RV32XTHEADMEMIDX-NEXT:    add a3, a1, a3
484; RV32XTHEADMEMIDX-NEXT:    sltu a1, a3, a1
485; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
486; RV32XTHEADMEMIDX-NEXT:    th.swib a3, (a0), 8, 0
487; RV32XTHEADMEMIDX-NEXT:    sw a1, 4(a0)
488; RV32XTHEADMEMIDX-NEXT:    ret
489;
490; RV64XTHEADMEMIDX-LABEL: sdib:
491; RV64XTHEADMEMIDX:       # %bb.0:
492; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
493; RV64XTHEADMEMIDX-NEXT:    th.sdib a1, (a0), 8, 0
494; RV64XTHEADMEMIDX-NEXT:    ret
495  %addr.1 = getelementptr i64, ptr %base, i64 1
496  %res = add i64 %a, %b
497  store i64 %res, ptr %addr.1
498  ret ptr %addr.1
499}
500
501define i8 @lrb_anyext(ptr %a, i64 %b) {
502; RV32XTHEADMEMIDX-LABEL: lrb_anyext:
503; RV32XTHEADMEMIDX:       # %bb.0:
504; RV32XTHEADMEMIDX-NEXT:    th.lrb a0, a0, a1, 0
505; RV32XTHEADMEMIDX-NEXT:    ret
506;
507; RV64XTHEADMEMIDX-LABEL: lrb_anyext:
508; RV64XTHEADMEMIDX:       # %bb.0:
509; RV64XTHEADMEMIDX-NEXT:    th.lrb a0, a0, a1, 0
510; RV64XTHEADMEMIDX-NEXT:    ret
511  %1 = getelementptr i8, ptr %a, i64 %b
512  %2 = load i8, ptr %1, align 1
513  ret i8 %2
514}
515
516define i64 @lrb(ptr %a, i64 %b) {
517; RV32XTHEADMEMIDX-LABEL: lrb:
518; RV32XTHEADMEMIDX:       # %bb.0:
519; RV32XTHEADMEMIDX-NEXT:    th.lrb a1, a0, a1, 0
520; RV32XTHEADMEMIDX-NEXT:    srai a2, a1, 31
521; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
522; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
523; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
524; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
525; RV32XTHEADMEMIDX-NEXT:    ret
526;
527; RV64XTHEADMEMIDX-LABEL: lrb:
528; RV64XTHEADMEMIDX:       # %bb.0:
529; RV64XTHEADMEMIDX-NEXT:    th.lrb a0, a0, a1, 0
530; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
531; RV64XTHEADMEMIDX-NEXT:    ret
532  %1 = getelementptr i8, ptr %a, i64 %b
533  %2 = load i8, ptr %1, align 1
534  %3 = sext i8 %2 to i64
535  %4 = add i64 %3, %3
536  ret i64 %4
537}
538
539define i8 @lurb_anyext(ptr %a, i32 %b) {
540; RV32XTHEADMEMIDX-LABEL: lurb_anyext:
541; RV32XTHEADMEMIDX:       # %bb.0:
542; RV32XTHEADMEMIDX-NEXT:    th.lrb a0, a0, a1, 0
543; RV32XTHEADMEMIDX-NEXT:    ret
544;
545; RV64XTHEADMEMIDX-LABEL: lurb_anyext:
546; RV64XTHEADMEMIDX:       # %bb.0:
547; RV64XTHEADMEMIDX-NEXT:    th.lurb a0, a0, a1, 0
548; RV64XTHEADMEMIDX-NEXT:    ret
549  %1 = zext i32 %b to i64
550  %2 = getelementptr i8, ptr %a, i64 %1
551  %3 = load i8, ptr %2, align 1
552  ret i8 %3
553}
554
555define i64 @lurb(ptr %a, i32 %b) {
556; RV32XTHEADMEMIDX-LABEL: lurb:
557; RV32XTHEADMEMIDX:       # %bb.0:
558; RV32XTHEADMEMIDX-NEXT:    th.lrb a1, a0, a1, 0
559; RV32XTHEADMEMIDX-NEXT:    srai a2, a1, 31
560; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
561; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
562; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
563; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
564; RV32XTHEADMEMIDX-NEXT:    ret
565;
566; RV64XTHEADMEMIDX-LABEL: lurb:
567; RV64XTHEADMEMIDX:       # %bb.0:
568; RV64XTHEADMEMIDX-NEXT:    th.lurb a0, a0, a1, 0
569; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
570; RV64XTHEADMEMIDX-NEXT:    ret
571  %1 = zext i32 %b to i64
572  %2 = getelementptr i8, ptr %a, i64 %1
573  %3 = load i8, ptr %2, align 1
574  %4 = sext i8 %3 to i64
575  %5 = add i64 %4, %4
576  ret i64 %5
577}
578
579define i64 @lrbu(ptr %a, i64 %b) {
580; RV32XTHEADMEMIDX-LABEL: lrbu:
581; RV32XTHEADMEMIDX:       # %bb.0:
582; RV32XTHEADMEMIDX-NEXT:    th.lrbu a1, a0, a1, 0
583; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
584; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
585; RV32XTHEADMEMIDX-NEXT:    ret
586;
587; RV64XTHEADMEMIDX-LABEL: lrbu:
588; RV64XTHEADMEMIDX:       # %bb.0:
589; RV64XTHEADMEMIDX-NEXT:    th.lrbu a0, a0, a1, 0
590; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
591; RV64XTHEADMEMIDX-NEXT:    ret
592  %1 = getelementptr i8, ptr %a, i64 %b
593  %2 = load i8, ptr %1, align 1
594  %3 = zext i8 %2 to i64
595  %4 = add i64 %3, %3
596  ret i64 %4
597}
598
599define i64 @lurbu(ptr %a, i32 %b) {
600; RV32XTHEADMEMIDX-LABEL: lurbu:
601; RV32XTHEADMEMIDX:       # %bb.0:
602; RV32XTHEADMEMIDX-NEXT:    th.lrbu a1, a0, a1, 0
603; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
604; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
605; RV32XTHEADMEMIDX-NEXT:    ret
606;
607; RV64XTHEADMEMIDX-LABEL: lurbu:
608; RV64XTHEADMEMIDX:       # %bb.0:
609; RV64XTHEADMEMIDX-NEXT:    th.lurbu a0, a0, a1, 0
610; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
611; RV64XTHEADMEMIDX-NEXT:    ret
612  %1 = zext i32 %b to i64
613  %2 = getelementptr i8, ptr %a, i64 %1
614  %3 = load i8, ptr %2, align 1
615  %4 = zext i8 %3 to i64
616  %5 = add i64 %4, %4
617  ret i64 %5
618}
619
620define i16 @lrh_anyext(ptr %a, i64 %b) {
621; RV32XTHEADMEMIDX-LABEL: lrh_anyext:
622; RV32XTHEADMEMIDX:       # %bb.0:
623; RV32XTHEADMEMIDX-NEXT:    th.lrh a0, a0, a1, 1
624; RV32XTHEADMEMIDX-NEXT:    ret
625;
626; RV64XTHEADMEMIDX-LABEL: lrh_anyext:
627; RV64XTHEADMEMIDX:       # %bb.0:
628; RV64XTHEADMEMIDX-NEXT:    th.lrh a0, a0, a1, 1
629; RV64XTHEADMEMIDX-NEXT:    ret
630  %1 = getelementptr i16, ptr %a, i64 %b
631  %2 = load i16, ptr %1, align 2
632  ret i16 %2
633}
634
635define i64 @lrh(ptr %a, i64 %b) {
636; RV32XTHEADMEMIDX-LABEL: lrh:
637; RV32XTHEADMEMIDX:       # %bb.0:
638; RV32XTHEADMEMIDX-NEXT:    th.lrh a1, a0, a1, 1
639; RV32XTHEADMEMIDX-NEXT:    srai a2, a1, 31
640; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
641; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
642; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
643; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
644; RV32XTHEADMEMIDX-NEXT:    ret
645;
646; RV64XTHEADMEMIDX-LABEL: lrh:
647; RV64XTHEADMEMIDX:       # %bb.0:
648; RV64XTHEADMEMIDX-NEXT:    th.lrh a0, a0, a1, 1
649; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
650; RV64XTHEADMEMIDX-NEXT:    ret
651  %1 = getelementptr i16, ptr %a, i64 %b
652  %2 = load i16, ptr %1, align 2
653  %3 = sext i16 %2 to i64
654  %4 = add i64 %3, %3
655  ret i64 %4
656}
657
658define i16 @lurh_anyext(ptr %a, i32 %b) {
659; RV32XTHEADMEMIDX-LABEL: lurh_anyext:
660; RV32XTHEADMEMIDX:       # %bb.0:
661; RV32XTHEADMEMIDX-NEXT:    th.lrh a0, a0, a1, 1
662; RV32XTHEADMEMIDX-NEXT:    ret
663;
664; RV64XTHEADMEMIDX-LABEL: lurh_anyext:
665; RV64XTHEADMEMIDX:       # %bb.0:
666; RV64XTHEADMEMIDX-NEXT:    th.lurh a0, a0, a1, 1
667; RV64XTHEADMEMIDX-NEXT:    ret
668  %1 = zext i32 %b to i64
669  %2 = getelementptr i16, ptr %a, i64 %1
670  %3 = load i16, ptr %2, align 2
671  ret i16 %3
672}
673
674define i64 @lurh(ptr %a, i32 %b) {
675; RV32XTHEADMEMIDX-LABEL: lurh:
676; RV32XTHEADMEMIDX:       # %bb.0:
677; RV32XTHEADMEMIDX-NEXT:    th.lrh a1, a0, a1, 1
678; RV32XTHEADMEMIDX-NEXT:    srai a2, a1, 31
679; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
680; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
681; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
682; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
683; RV32XTHEADMEMIDX-NEXT:    ret
684;
685; RV64XTHEADMEMIDX-LABEL: lurh:
686; RV64XTHEADMEMIDX:       # %bb.0:
687; RV64XTHEADMEMIDX-NEXT:    th.lurh a0, a0, a1, 1
688; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
689; RV64XTHEADMEMIDX-NEXT:    ret
690  %1 = zext i32 %b to i64
691  %2 = getelementptr i16, ptr %a, i64 %1
692  %3 = load i16, ptr %2, align 2
693  %4 = sext i16 %3 to i64
694  %5 = add i64 %4, %4
695  ret i64 %5
696}
697
698define i64 @lrhu(ptr %a, i64 %b) {
699; RV32XTHEADMEMIDX-LABEL: lrhu:
700; RV32XTHEADMEMIDX:       # %bb.0:
701; RV32XTHEADMEMIDX-NEXT:    th.lrhu a1, a0, a1, 1
702; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
703; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
704; RV32XTHEADMEMIDX-NEXT:    ret
705;
706; RV64XTHEADMEMIDX-LABEL: lrhu:
707; RV64XTHEADMEMIDX:       # %bb.0:
708; RV64XTHEADMEMIDX-NEXT:    th.lrhu a0, a0, a1, 1
709; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
710; RV64XTHEADMEMIDX-NEXT:    ret
711  %1 = getelementptr i16, ptr %a, i64 %b
712  %2 = load i16, ptr %1, align 2
713  %3 = zext i16 %2 to i64
714  %4 = add i64 %3, %3
715  ret i64 %4
716}
717
718define i64 @lurhu(ptr %a, i32 %b) {
719; RV32XTHEADMEMIDX-LABEL: lurhu:
720; RV32XTHEADMEMIDX:       # %bb.0:
721; RV32XTHEADMEMIDX-NEXT:    th.lrhu a1, a0, a1, 1
722; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
723; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
724; RV32XTHEADMEMIDX-NEXT:    ret
725;
726; RV64XTHEADMEMIDX-LABEL: lurhu:
727; RV64XTHEADMEMIDX:       # %bb.0:
728; RV64XTHEADMEMIDX-NEXT:    th.lurhu a0, a0, a1, 1
729; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
730; RV64XTHEADMEMIDX-NEXT:    ret
731  %1 = zext i32 %b to i64
732  %2 = getelementptr i16, ptr %a, i64 %1
733  %3 = load i16, ptr %2, align 2
734  %4 = zext i16 %3 to i64
735  %5 = add i64 %4, %4
736  ret i64 %5
737}
738
739define i32 @lrw_anyext(ptr %a, i64 %b) {
740; RV32XTHEADMEMIDX-LABEL: lrw_anyext:
741; RV32XTHEADMEMIDX:       # %bb.0:
742; RV32XTHEADMEMIDX-NEXT:    th.lrw a0, a0, a1, 2
743; RV32XTHEADMEMIDX-NEXT:    ret
744;
745; RV64XTHEADMEMIDX-LABEL: lrw_anyext:
746; RV64XTHEADMEMIDX:       # %bb.0:
747; RV64XTHEADMEMIDX-NEXT:    th.lrw a0, a0, a1, 2
748; RV64XTHEADMEMIDX-NEXT:    ret
749  %1 = getelementptr i32, ptr %a, i64 %b
750  %2 = load i32, ptr %1, align 4
751  ret i32 %2
752}
753
754define i64 @lrw(ptr %a, i64 %b) {
755; RV32XTHEADMEMIDX-LABEL: lrw:
756; RV32XTHEADMEMIDX:       # %bb.0:
757; RV32XTHEADMEMIDX-NEXT:    th.lrw a1, a0, a1, 2
758; RV32XTHEADMEMIDX-NEXT:    srai a2, a1, 31
759; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
760; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
761; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
762; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
763; RV32XTHEADMEMIDX-NEXT:    ret
764;
765; RV64XTHEADMEMIDX-LABEL: lrw:
766; RV64XTHEADMEMIDX:       # %bb.0:
767; RV64XTHEADMEMIDX-NEXT:    th.lrw a0, a0, a1, 2
768; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
769; RV64XTHEADMEMIDX-NEXT:    ret
770  %1 = getelementptr i32, ptr %a, i64 %b
771  %2 = load i32, ptr %1, align 4
772  %3 = sext i32 %2 to i64
773  %4 = add i64 %3, %3
774  ret i64 %4
775}
776
777define i32 @lurw_anyext(ptr %a, i32 %b) {
778; RV32XTHEADMEMIDX-LABEL: lurw_anyext:
779; RV32XTHEADMEMIDX:       # %bb.0:
780; RV32XTHEADMEMIDX-NEXT:    th.lrw a0, a0, a1, 2
781; RV32XTHEADMEMIDX-NEXT:    ret
782;
783; RV64XTHEADMEMIDX-LABEL: lurw_anyext:
784; RV64XTHEADMEMIDX:       # %bb.0:
785; RV64XTHEADMEMIDX-NEXT:    th.lurw a0, a0, a1, 2
786; RV64XTHEADMEMIDX-NEXT:    ret
787  %1 = zext i32 %b to i64
788  %2 = getelementptr i32, ptr %a, i64 %1
789  %3 = load i32, ptr %2, align 4
790  ret i32 %3
791}
792
793define i64 @lurw(ptr %a, i32 %b) {
794; RV32XTHEADMEMIDX-LABEL: lurw:
795; RV32XTHEADMEMIDX:       # %bb.0:
796; RV32XTHEADMEMIDX-NEXT:    th.lrw a1, a0, a1, 2
797; RV32XTHEADMEMIDX-NEXT:    srai a2, a1, 31
798; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
799; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
800; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
801; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
802; RV32XTHEADMEMIDX-NEXT:    ret
803;
804; RV64XTHEADMEMIDX-LABEL: lurw:
805; RV64XTHEADMEMIDX:       # %bb.0:
806; RV64XTHEADMEMIDX-NEXT:    th.lurw a0, a0, a1, 2
807; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
808; RV64XTHEADMEMIDX-NEXT:    ret
809  %1 = zext i32 %b to i64
810  %2 = getelementptr i32, ptr %a, i64 %1
811  %3 = load i32, ptr %2, align 4
812  %4 = sext i32 %3 to i64
813  %5 = add i64 %4, %4
814  ret i64 %5
815}
816
817define i64 @lrwu(ptr %a, i64 %b) {
818; RV32XTHEADMEMIDX-LABEL: lrwu:
819; RV32XTHEADMEMIDX:       # %bb.0:
820; RV32XTHEADMEMIDX-NEXT:    th.lrw a1, a0, a1, 2
821; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
822; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
823; RV32XTHEADMEMIDX-NEXT:    ret
824;
825; RV64XTHEADMEMIDX-LABEL: lrwu:
826; RV64XTHEADMEMIDX:       # %bb.0:
827; RV64XTHEADMEMIDX-NEXT:    th.lrwu a0, a0, a1, 2
828; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
829; RV64XTHEADMEMIDX-NEXT:    ret
830  %1 = getelementptr i32, ptr %a, i64 %b
831  %2 = load i32, ptr %1, align 4
832  %3 = zext i32 %2 to i64
833  %4 = add i64 %3, %3
834  ret i64 %4
835}
836
837define i64 @lurwu(ptr %a, i32 %b) {
838; RV32XTHEADMEMIDX-LABEL: lurwu:
839; RV32XTHEADMEMIDX:       # %bb.0:
840; RV32XTHEADMEMIDX-NEXT:    th.lrw a1, a0, a1, 2
841; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
842; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
843; RV32XTHEADMEMIDX-NEXT:    ret
844;
845; RV64XTHEADMEMIDX-LABEL: lurwu:
846; RV64XTHEADMEMIDX:       # %bb.0:
847; RV64XTHEADMEMIDX-NEXT:    th.lurwu a0, a0, a1, 2
848; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
849; RV64XTHEADMEMIDX-NEXT:    ret
850  %1 = zext i32 %b to i64
851  %2 = getelementptr i32, ptr %a, i64 %1
852  %3 = load i32, ptr %2, align 4
853  %4 = zext i32 %3 to i64
854  %5 = add i64 %4, %4
855  ret i64 %5
856}
857
858define i64 @lrd(ptr %a, i64 %b) {
859; RV32XTHEADMEMIDX-LABEL: lrd:
860; RV32XTHEADMEMIDX:       # %bb.0:
861; RV32XTHEADMEMIDX-NEXT:    slli a2, a1, 3
862; RV32XTHEADMEMIDX-NEXT:    th.lrw a1, a0, a1, 3
863; RV32XTHEADMEMIDX-NEXT:    add a0, a0, a2
864; RV32XTHEADMEMIDX-NEXT:    lw a2, 4(a0)
865; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
866; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
867; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
868; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
869; RV32XTHEADMEMIDX-NEXT:    ret
870;
871; RV64XTHEADMEMIDX-LABEL: lrd:
872; RV64XTHEADMEMIDX:       # %bb.0:
873; RV64XTHEADMEMIDX-NEXT:    th.lrd a0, a0, a1, 3
874; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
875; RV64XTHEADMEMIDX-NEXT:    ret
876  %1 = getelementptr i64, ptr %a, i64 %b
877  %2 = load i64, ptr %1, align 8
878  %3 = add i64 %2, %2
879  ret i64 %3
880}
881
882define i64 @lrd_2(ptr %a, i64 %b) {
883; RV32XTHEADMEMIDX-LABEL: lrd_2:
884; RV32XTHEADMEMIDX:       # %bb.0:
885; RV32XTHEADMEMIDX-NEXT:    addi a2, a0, 96
886; RV32XTHEADMEMIDX-NEXT:    th.lrw a2, a2, a1, 3
887; RV32XTHEADMEMIDX-NEXT:    addi a0, a0, 100
888; RV32XTHEADMEMIDX-NEXT:    th.lrw a1, a0, a1, 3
889; RV32XTHEADMEMIDX-NEXT:    add a0, a2, a2
890; RV32XTHEADMEMIDX-NEXT:    sltu a2, a0, a2
891; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a1
892; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
893; RV32XTHEADMEMIDX-NEXT:    ret
894;
895; RV64XTHEADMEMIDX-LABEL: lrd_2:
896; RV64XTHEADMEMIDX:       # %bb.0:
897; RV64XTHEADMEMIDX-NEXT:    addi a0, a0, 96
898; RV64XTHEADMEMIDX-NEXT:    th.lrd a0, a0, a1, 3
899; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
900; RV64XTHEADMEMIDX-NEXT:    ret
901  %1 = add i64 %b, 12
902  %2 = getelementptr i64, ptr %a, i64 %1
903  %3 = load i64, ptr %2, align 8
904  %4 = add i64 %3, %3
905  ret i64 %4
906}
907
908define i64 @lurd(ptr %a, i32 %b) {
909; RV32XTHEADMEMIDX-LABEL: lurd:
910; RV32XTHEADMEMIDX:       # %bb.0:
911; RV32XTHEADMEMIDX-NEXT:    slli a2, a1, 3
912; RV32XTHEADMEMIDX-NEXT:    th.lrw a1, a0, a1, 3
913; RV32XTHEADMEMIDX-NEXT:    add a0, a0, a2
914; RV32XTHEADMEMIDX-NEXT:    lw a2, 4(a0)
915; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a1
916; RV32XTHEADMEMIDX-NEXT:    sltu a1, a0, a1
917; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
918; RV32XTHEADMEMIDX-NEXT:    add a1, a2, a1
919; RV32XTHEADMEMIDX-NEXT:    ret
920;
921; RV64XTHEADMEMIDX-LABEL: lurd:
922; RV64XTHEADMEMIDX:       # %bb.0:
923; RV64XTHEADMEMIDX-NEXT:    th.lurd a0, a0, a1, 3
924; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a0
925; RV64XTHEADMEMIDX-NEXT:    ret
926  %1 = zext i32 %b to i64
927  %2 = getelementptr i64, ptr %a, i64 %1
928  %3 = load i64, ptr %2, align 8
929  %4 = add i64 %3, %3
930  ret i64 %4
931}
932
933define void @srb(ptr %a, i64 %b, i8 %c) {
934; RV32XTHEADMEMIDX-LABEL: srb:
935; RV32XTHEADMEMIDX:       # %bb.0:
936; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a3
937; RV32XTHEADMEMIDX-NEXT:    th.srb a3, a0, a1, 0
938; RV32XTHEADMEMIDX-NEXT:    ret
939;
940; RV64XTHEADMEMIDX-LABEL: srb:
941; RV64XTHEADMEMIDX:       # %bb.0:
942; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
943; RV64XTHEADMEMIDX-NEXT:    th.srb a2, a0, a1, 0
944; RV64XTHEADMEMIDX-NEXT:    ret
945  %1 = add i8 %c, %c
946  %2 = getelementptr i8, ptr %a, i64 %b
947  store i8 %1, ptr %2, align 1
948  ret void
949}
950
951define void @surb(ptr %a, i32 %b, i8 %c) {
952; RV32XTHEADMEMIDX-LABEL: surb:
953; RV32XTHEADMEMIDX:       # %bb.0:
954; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
955; RV32XTHEADMEMIDX-NEXT:    th.srb a2, a0, a1, 0
956; RV32XTHEADMEMIDX-NEXT:    ret
957;
958; RV64XTHEADMEMIDX-LABEL: surb:
959; RV64XTHEADMEMIDX:       # %bb.0:
960; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
961; RV64XTHEADMEMIDX-NEXT:    th.surb a2, a0, a1, 0
962; RV64XTHEADMEMIDX-NEXT:    ret
963  %1 = zext i32 %b to i64
964  %2 = add i8 %c, %c
965  %3 = getelementptr i8, ptr %a, i64 %1
966  store i8 %2, ptr %3, align 1
967  ret void
968}
969
970define void @srh(ptr %a, i64 %b, i16 %c) {
971; RV32XTHEADMEMIDX-LABEL: srh:
972; RV32XTHEADMEMIDX:       # %bb.0:
973; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a3
974; RV32XTHEADMEMIDX-NEXT:    th.srh a3, a0, a1, 1
975; RV32XTHEADMEMIDX-NEXT:    ret
976;
977; RV64XTHEADMEMIDX-LABEL: srh:
978; RV64XTHEADMEMIDX:       # %bb.0:
979; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
980; RV64XTHEADMEMIDX-NEXT:    th.srh a2, a0, a1, 1
981; RV64XTHEADMEMIDX-NEXT:    ret
982  %1 = add i16 %c, %c
983  %2 = getelementptr i16, ptr %a, i64 %b
984  store i16 %1, ptr %2, align 2
985  ret void
986}
987
988define void @surh(ptr %a, i32 %b, i16 %c) {
989; RV32XTHEADMEMIDX-LABEL: surh:
990; RV32XTHEADMEMIDX:       # %bb.0:
991; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
992; RV32XTHEADMEMIDX-NEXT:    th.srh a2, a0, a1, 1
993; RV32XTHEADMEMIDX-NEXT:    ret
994;
995; RV64XTHEADMEMIDX-LABEL: surh:
996; RV64XTHEADMEMIDX:       # %bb.0:
997; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
998; RV64XTHEADMEMIDX-NEXT:    th.surh a2, a0, a1, 1
999; RV64XTHEADMEMIDX-NEXT:    ret
1000  %1 = zext i32 %b to i64
1001  %2 = add i16 %c, %c
1002  %3 = getelementptr i16, ptr %a, i64 %1
1003  store i16 %2, ptr %3, align 2
1004  ret void
1005}
1006
1007define void @srw(ptr %a, i64 %b, i32 %c) {
1008; RV32XTHEADMEMIDX-LABEL: srw:
1009; RV32XTHEADMEMIDX:       # %bb.0:
1010; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a3
1011; RV32XTHEADMEMIDX-NEXT:    th.srw a3, a0, a1, 2
1012; RV32XTHEADMEMIDX-NEXT:    ret
1013;
1014; RV64XTHEADMEMIDX-LABEL: srw:
1015; RV64XTHEADMEMIDX:       # %bb.0:
1016; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
1017; RV64XTHEADMEMIDX-NEXT:    th.srw a2, a0, a1, 2
1018; RV64XTHEADMEMIDX-NEXT:    ret
1019  %1 = add i32 %c, %c
1020  %2 = getelementptr i32, ptr %a, i64 %b
1021  store i32 %1, ptr %2, align 4
1022  ret void
1023}
1024
1025define void @surw(ptr %a, i32 %b, i32 %c) {
1026; RV32XTHEADMEMIDX-LABEL: surw:
1027; RV32XTHEADMEMIDX:       # %bb.0:
1028; RV32XTHEADMEMIDX-NEXT:    add a2, a2, a2
1029; RV32XTHEADMEMIDX-NEXT:    th.srw a2, a0, a1, 2
1030; RV32XTHEADMEMIDX-NEXT:    ret
1031;
1032; RV64XTHEADMEMIDX-LABEL: surw:
1033; RV64XTHEADMEMIDX:       # %bb.0:
1034; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
1035; RV64XTHEADMEMIDX-NEXT:    th.surw a2, a0, a1, 2
1036; RV64XTHEADMEMIDX-NEXT:    ret
1037  %1 = zext i32 %b to i64
1038  %2 = add i32 %c, %c
1039  %3 = getelementptr i32, ptr %a, i64 %1
1040  store i32 %2, ptr %3, align 4
1041  ret void
1042}
1043
1044define void @srd(ptr %a, i64 %b, i64 %c) {
1045; RV32XTHEADMEMIDX-LABEL: srd:
1046; RV32XTHEADMEMIDX:       # %bb.0:
1047; RV32XTHEADMEMIDX-NEXT:    add a2, a3, a3
1048; RV32XTHEADMEMIDX-NEXT:    add a4, a4, a4
1049; RV32XTHEADMEMIDX-NEXT:    sltu a3, a2, a3
1050; RV32XTHEADMEMIDX-NEXT:    add a3, a4, a3
1051; RV32XTHEADMEMIDX-NEXT:    slli a4, a1, 3
1052; RV32XTHEADMEMIDX-NEXT:    add a4, a0, a4
1053; RV32XTHEADMEMIDX-NEXT:    th.srw a2, a0, a1, 3
1054; RV32XTHEADMEMIDX-NEXT:    sw a3, 4(a4)
1055; RV32XTHEADMEMIDX-NEXT:    ret
1056;
1057; RV64XTHEADMEMIDX-LABEL: srd:
1058; RV64XTHEADMEMIDX:       # %bb.0:
1059; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
1060; RV64XTHEADMEMIDX-NEXT:    th.srd a2, a0, a1, 3
1061; RV64XTHEADMEMIDX-NEXT:    ret
1062  %1 = add i64 %c, %c
1063  %2 = getelementptr i64, ptr %a, i64 %b
1064  store i64 %1, ptr %2, align 8
1065  ret void
1066}
1067
1068define void @surd(ptr %a, i32 %b, i64 %c) {
1069; RV32XTHEADMEMIDX-LABEL: surd:
1070; RV32XTHEADMEMIDX:       # %bb.0:
1071; RV32XTHEADMEMIDX-NEXT:    add a4, a2, a2
1072; RV32XTHEADMEMIDX-NEXT:    add a3, a3, a3
1073; RV32XTHEADMEMIDX-NEXT:    sltu a2, a4, a2
1074; RV32XTHEADMEMIDX-NEXT:    add a2, a3, a2
1075; RV32XTHEADMEMIDX-NEXT:    slli a3, a1, 3
1076; RV32XTHEADMEMIDX-NEXT:    add a3, a0, a3
1077; RV32XTHEADMEMIDX-NEXT:    th.srw a4, a0, a1, 3
1078; RV32XTHEADMEMIDX-NEXT:    sw a2, 4(a3)
1079; RV32XTHEADMEMIDX-NEXT:    ret
1080;
1081; RV64XTHEADMEMIDX-LABEL: surd:
1082; RV64XTHEADMEMIDX:       # %bb.0:
1083; RV64XTHEADMEMIDX-NEXT:    add a2, a2, a2
1084; RV64XTHEADMEMIDX-NEXT:    th.surd a2, a0, a1, 3
1085; RV64XTHEADMEMIDX-NEXT:    ret
1086  %1 = zext i32 %b to i64
1087  %2 = add i64 %c, %c
1088  %3 = getelementptr i64, ptr %a, i64 %1
1089  store i64 %2, ptr %3, align 8
1090  ret void
1091}
1092
1093define ptr @test_simm5(ptr %base, i32 %a, i32 %b) {
1094; RV32XTHEADMEMIDX-LABEL: test_simm5:
1095; RV32XTHEADMEMIDX:       # %bb.0:
1096; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a2
1097; RV32XTHEADMEMIDX-NEXT:    th.swia a1, (a0), -12, 2
1098; RV32XTHEADMEMIDX-NEXT:    ret
1099;
1100; RV64XTHEADMEMIDX-LABEL: test_simm5:
1101; RV64XTHEADMEMIDX:       # %bb.0:
1102; RV64XTHEADMEMIDX-NEXT:    add a1, a1, a2
1103; RV64XTHEADMEMIDX-NEXT:    th.swia a1, (a0), -12, 2
1104; RV64XTHEADMEMIDX-NEXT:    ret
1105  %addr.1 = getelementptr i32, ptr %base, i32 -12
1106  %res = add i32 %a, %b
1107  store i32 %res, ptr %base
1108  ret ptr %addr.1
1109}
1110
1111define i64 @lrd_large_shift(ptr %a, i64 %b) {
1112; RV32XTHEADMEMIDX-LABEL: lrd_large_shift:
1113; RV32XTHEADMEMIDX:       # %bb.0:
1114; RV32XTHEADMEMIDX-NEXT:    slli a1, a1, 5
1115; RV32XTHEADMEMIDX-NEXT:    add a1, a1, a0
1116; RV32XTHEADMEMIDX-NEXT:    lw a0, 384(a1)
1117; RV32XTHEADMEMIDX-NEXT:    lw a1, 388(a1)
1118; RV32XTHEADMEMIDX-NEXT:    ret
1119;
1120; RV64XTHEADMEMIDX-LABEL: lrd_large_shift:
1121; RV64XTHEADMEMIDX:       # %bb.0:
1122; RV64XTHEADMEMIDX-NEXT:    slli a1, a1, 5
1123; RV64XTHEADMEMIDX-NEXT:    add a0, a1, a0
1124; RV64XTHEADMEMIDX-NEXT:    ld a0, 384(a0)
1125; RV64XTHEADMEMIDX-NEXT:    ret
1126  %1 = add i64 %b, 12
1127  %2 = shl i64 %1, 2
1128  %3 = getelementptr i64, ptr %a, i64 %2
1129  %4 = load i64, ptr %3, align 8
1130  ret i64 %4
1131}
1132
1133define i64 @lrd_large_offset(ptr %a, i64 %b) {
1134; RV32XTHEADMEMIDX-LABEL: lrd_large_offset:
1135; RV32XTHEADMEMIDX:       # %bb.0:
1136; RV32XTHEADMEMIDX-NEXT:    slli a1, a1, 3
1137; RV32XTHEADMEMIDX-NEXT:    add a0, a1, a0
1138; RV32XTHEADMEMIDX-NEXT:    lui a1, 23
1139; RV32XTHEADMEMIDX-NEXT:    addi a1, a1, 1792
1140; RV32XTHEADMEMIDX-NEXT:    add a1, a0, a1
1141; RV32XTHEADMEMIDX-NEXT:    lw a0, 0(a1)
1142; RV32XTHEADMEMIDX-NEXT:    lw a1, 4(a1)
1143; RV32XTHEADMEMIDX-NEXT:    ret
1144;
1145; RV64XTHEADMEMIDX-LABEL: lrd_large_offset:
1146; RV64XTHEADMEMIDX:       # %bb.0:
1147; RV64XTHEADMEMIDX-NEXT:    slli a1, a1, 3
1148; RV64XTHEADMEMIDX-NEXT:    add a0, a1, a0
1149; RV64XTHEADMEMIDX-NEXT:    lui a1, 23
1150; RV64XTHEADMEMIDX-NEXT:    add a0, a0, a1
1151; RV64XTHEADMEMIDX-NEXT:    ld a0, 1792(a0)
1152; RV64XTHEADMEMIDX-NEXT:    ret
1153  %1 = add i64 %b, 12000
1154  %2 = getelementptr i64, ptr %a, i64 %1
1155  %3 = load i64, ptr %2, align 8
1156  ret i64 %3
1157}
1158