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