xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/arm64-indexed-memory.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=arm64 -aarch64-redzone | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workerdefine void @store64(i64** nocapture %out, i64 %index, i64 %spacing) nounwind noinline ssp {
4*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store64:
5*9880d681SAndroid Build Coastguard Worker; CHECK: str x{{[0-9+]}}, [x{{[0-9+]}}], #8
6*9880d681SAndroid Build Coastguard Worker; CHECK: ret
7*9880d681SAndroid Build Coastguard Worker  %tmp = load i64*, i64** %out, align 8
8*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i64, i64* %tmp, i64 1
9*9880d681SAndroid Build Coastguard Worker  store i64 %spacing, i64* %tmp, align 4
10*9880d681SAndroid Build Coastguard Worker  store i64* %incdec.ptr, i64** %out, align 8
11*9880d681SAndroid Build Coastguard Worker  ret void
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine void @store32(i32** nocapture %out, i32 %index, i32 %spacing) nounwind noinline ssp {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store32:
16*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9+]}}, [x{{[0-9+]}}], #4
17*9880d681SAndroid Build Coastguard Worker; CHECK: ret
18*9880d681SAndroid Build Coastguard Worker  %tmp = load i32*, i32** %out, align 8
19*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %tmp, i64 1
20*9880d681SAndroid Build Coastguard Worker  store i32 %spacing, i32* %tmp, align 4
21*9880d681SAndroid Build Coastguard Worker  store i32* %incdec.ptr, i32** %out, align 8
22*9880d681SAndroid Build Coastguard Worker  ret void
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine void @store16(i16** nocapture %out, i16 %index, i16 %spacing) nounwind noinline ssp {
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store16:
27*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9+]}}, [x{{[0-9+]}}], #2
28*9880d681SAndroid Build Coastguard Worker; CHECK: ret
29*9880d681SAndroid Build Coastguard Worker  %tmp = load i16*, i16** %out, align 8
30*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i16, i16* %tmp, i64 1
31*9880d681SAndroid Build Coastguard Worker  store i16 %spacing, i16* %tmp, align 4
32*9880d681SAndroid Build Coastguard Worker  store i16* %incdec.ptr, i16** %out, align 8
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine void @store8(i8** nocapture %out, i8 %index, i8 %spacing) nounwind noinline ssp {
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store8:
38*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9+]}}, [x{{[0-9+]}}], #1
39*9880d681SAndroid Build Coastguard Worker; CHECK: ret
40*9880d681SAndroid Build Coastguard Worker  %tmp = load i8*, i8** %out, align 8
41*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i8, i8* %tmp, i64 1
42*9880d681SAndroid Build Coastguard Worker  store i8 %spacing, i8* %tmp, align 4
43*9880d681SAndroid Build Coastguard Worker  store i8* %incdec.ptr, i8** %out, align 8
44*9880d681SAndroid Build Coastguard Worker  ret void
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine void @truncst64to32(i32** nocapture %out, i32 %index, i64 %spacing) nounwind noinline ssp {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: truncst64to32:
49*9880d681SAndroid Build Coastguard Worker; CHECK: str w{{[0-9+]}}, [x{{[0-9+]}}], #4
50*9880d681SAndroid Build Coastguard Worker; CHECK: ret
51*9880d681SAndroid Build Coastguard Worker  %tmp = load i32*, i32** %out, align 8
52*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i32, i32* %tmp, i64 1
53*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %spacing to i32
54*9880d681SAndroid Build Coastguard Worker  store i32 %trunc, i32* %tmp, align 4
55*9880d681SAndroid Build Coastguard Worker  store i32* %incdec.ptr, i32** %out, align 8
56*9880d681SAndroid Build Coastguard Worker  ret void
57*9880d681SAndroid Build Coastguard Worker}
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Workerdefine void @truncst64to16(i16** nocapture %out, i16 %index, i64 %spacing) nounwind noinline ssp {
60*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: truncst64to16:
61*9880d681SAndroid Build Coastguard Worker; CHECK: strh w{{[0-9+]}}, [x{{[0-9+]}}], #2
62*9880d681SAndroid Build Coastguard Worker; CHECK: ret
63*9880d681SAndroid Build Coastguard Worker  %tmp = load i16*, i16** %out, align 8
64*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i16, i16* %tmp, i64 1
65*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %spacing to i16
66*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16* %tmp, align 4
67*9880d681SAndroid Build Coastguard Worker  store i16* %incdec.ptr, i16** %out, align 8
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Workerdefine void @truncst64to8(i8** nocapture %out, i8 %index, i64 %spacing) nounwind noinline ssp {
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: truncst64to8:
73*9880d681SAndroid Build Coastguard Worker; CHECK: strb w{{[0-9+]}}, [x{{[0-9+]}}], #1
74*9880d681SAndroid Build Coastguard Worker; CHECK: ret
75*9880d681SAndroid Build Coastguard Worker  %tmp = load i8*, i8** %out, align 8
76*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds i8, i8* %tmp, i64 1
77*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %spacing to i8
78*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8* %tmp, align 4
79*9880d681SAndroid Build Coastguard Worker  store i8* %incdec.ptr, i8** %out, align 8
80*9880d681SAndroid Build Coastguard Worker  ret void
81*9880d681SAndroid Build Coastguard Worker}
82*9880d681SAndroid Build Coastguard Worker
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerdefine void @storef16(half** %out, half %index, half %spacing) nounwind {
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: storef16:
86*9880d681SAndroid Build Coastguard Worker; CHECK: str h{{[0-9+]}}, [x{{[0-9+]}}], #2
87*9880d681SAndroid Build Coastguard Worker; CHECK: ret
88*9880d681SAndroid Build Coastguard Worker  %tmp = load half*, half** %out, align 2
89*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds half, half* %tmp, i64 1
90*9880d681SAndroid Build Coastguard Worker  store half %spacing, half* %tmp, align 2
91*9880d681SAndroid Build Coastguard Worker  store half* %incdec.ptr, half** %out, align 2
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Workerdefine void @storef32(float** nocapture %out, float %index, float %spacing) nounwind noinline ssp {
96*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: storef32:
97*9880d681SAndroid Build Coastguard Worker; CHECK: str s{{[0-9+]}}, [x{{[0-9+]}}], #4
98*9880d681SAndroid Build Coastguard Worker; CHECK: ret
99*9880d681SAndroid Build Coastguard Worker  %tmp = load float*, float** %out, align 8
100*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds float, float* %tmp, i64 1
101*9880d681SAndroid Build Coastguard Worker  store float %spacing, float* %tmp, align 4
102*9880d681SAndroid Build Coastguard Worker  store float* %incdec.ptr, float** %out, align 8
103*9880d681SAndroid Build Coastguard Worker  ret void
104*9880d681SAndroid Build Coastguard Worker}
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerdefine void @storef64(double** nocapture %out, double %index, double %spacing) nounwind noinline ssp {
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: storef64:
108*9880d681SAndroid Build Coastguard Worker; CHECK: str d{{[0-9+]}}, [x{{[0-9+]}}], #8
109*9880d681SAndroid Build Coastguard Worker; CHECK: ret
110*9880d681SAndroid Build Coastguard Worker  %tmp = load double*, double** %out, align 8
111*9880d681SAndroid Build Coastguard Worker  %incdec.ptr = getelementptr inbounds double, double* %tmp, i64 1
112*9880d681SAndroid Build Coastguard Worker  store double %spacing, double* %tmp, align 4
113*9880d681SAndroid Build Coastguard Worker  store double* %incdec.ptr, double** %out, align 8
114*9880d681SAndroid Build Coastguard Worker  ret void
115*9880d681SAndroid Build Coastguard Worker}
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine double * @pref64(double** nocapture %out, double %spacing) nounwind noinline ssp {
118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pref64:
119*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str     d0, [x0, #32]!
121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
122*9880d681SAndroid Build Coastguard Worker  %tmp = load double*, double** %out, align 8
123*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds double, double* %tmp, i64 4
124*9880d681SAndroid Build Coastguard Worker  store double %spacing, double* %ptr, align 4
125*9880d681SAndroid Build Coastguard Worker  ret double *%ptr
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Workerdefine float * @pref32(float** nocapture %out, float %spacing) nounwind noinline ssp {
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pref32:
130*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str     s0, [x0, #12]!
132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
133*9880d681SAndroid Build Coastguard Worker  %tmp = load float*, float** %out, align 8
134*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds float, float* %tmp, i64 3
135*9880d681SAndroid Build Coastguard Worker  store float %spacing, float* %ptr, align 4
136*9880d681SAndroid Build Coastguard Worker  ret float *%ptr
137*9880d681SAndroid Build Coastguard Worker}
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine half* @pref16(half** %out, half %spacing) nounwind {
140*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pref16:
141*9880d681SAndroid Build Coastguard Worker; CHECK: ldr x0, [x0]
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str h0, [x0, #6]!
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
144*9880d681SAndroid Build Coastguard Worker  %tmp = load half*, half** %out, align 2
145*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds half, half* %tmp, i64 3
146*9880d681SAndroid Build Coastguard Worker  store half %spacing, half* %ptr, align 2
147*9880d681SAndroid Build Coastguard Worker  ret half *%ptr
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerdefine i64 * @pre64(i64** nocapture %out, i64 %spacing) nounwind noinline ssp {
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre64:
152*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
153*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str     x1, [x0, #16]!
154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
155*9880d681SAndroid Build Coastguard Worker  %tmp = load i64*, i64** %out, align 8
156*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i64, i64* %tmp, i64 2
157*9880d681SAndroid Build Coastguard Worker  store i64 %spacing, i64* %ptr, align 4
158*9880d681SAndroid Build Coastguard Worker  ret i64 *%ptr
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdefine i32 * @pre32(i32** nocapture %out, i32 %spacing) nounwind noinline ssp {
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre32:
163*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str     w1, [x0, #8]!
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
166*9880d681SAndroid Build Coastguard Worker  %tmp = load i32*, i32** %out, align 8
167*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i32, i32* %tmp, i64 2
168*9880d681SAndroid Build Coastguard Worker  store i32 %spacing, i32* %ptr, align 4
169*9880d681SAndroid Build Coastguard Worker  ret i32 *%ptr
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine i16 * @pre16(i16** nocapture %out, i16 %spacing) nounwind noinline ssp {
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre16:
174*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strh    w1, [x0, #4]!
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
177*9880d681SAndroid Build Coastguard Worker  %tmp = load i16*, i16** %out, align 8
178*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i16, i16* %tmp, i64 2
179*9880d681SAndroid Build Coastguard Worker  store i16 %spacing, i16* %ptr, align 4
180*9880d681SAndroid Build Coastguard Worker  ret i16 *%ptr
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerdefine i8 * @pre8(i8** nocapture %out, i8 %spacing) nounwind noinline ssp {
184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pre8:
185*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb    w1, [x0, #2]!
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
188*9880d681SAndroid Build Coastguard Worker  %tmp = load i8*, i8** %out, align 8
189*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i8, i8* %tmp, i64 2
190*9880d681SAndroid Build Coastguard Worker  store i8 %spacing, i8* %ptr, align 4
191*9880d681SAndroid Build Coastguard Worker  ret i8 *%ptr
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine i32 * @pretrunc64to32(i32** nocapture %out, i64 %spacing) nounwind noinline ssp {
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pretrunc64to32:
196*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: str     w1, [x0, #8]!
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
199*9880d681SAndroid Build Coastguard Worker  %tmp = load i32*, i32** %out, align 8
200*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i32, i32* %tmp, i64 2
201*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %spacing to i32
202*9880d681SAndroid Build Coastguard Worker  store i32 %trunc, i32* %ptr, align 4
203*9880d681SAndroid Build Coastguard Worker  ret i32 *%ptr
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Workerdefine i16 * @pretrunc64to16(i16** nocapture %out, i64 %spacing) nounwind noinline ssp {
207*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pretrunc64to16:
208*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
209*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strh    w1, [x0, #4]!
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
211*9880d681SAndroid Build Coastguard Worker  %tmp = load i16*, i16** %out, align 8
212*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i16, i16* %tmp, i64 2
213*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %spacing to i16
214*9880d681SAndroid Build Coastguard Worker  store i16 %trunc, i16* %ptr, align 4
215*9880d681SAndroid Build Coastguard Worker  ret i16 *%ptr
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Workerdefine i8 * @pretrunc64to8(i8** nocapture %out, i64 %spacing) nounwind noinline ssp {
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: pretrunc64to8:
220*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x0, [x0]
221*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: strb    w1, [x0, #2]!
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
223*9880d681SAndroid Build Coastguard Worker  %tmp = load i8*, i8** %out, align 8
224*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i8, i8* %tmp, i64 2
225*9880d681SAndroid Build Coastguard Worker  %trunc = trunc i64 %spacing to i8
226*9880d681SAndroid Build Coastguard Worker  store i8 %trunc, i8* %ptr, align 4
227*9880d681SAndroid Build Coastguard Worker  ret i8 *%ptr
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker;-----
231*9880d681SAndroid Build Coastguard Worker; Pre-indexed loads
232*9880d681SAndroid Build Coastguard Worker;-----
233*9880d681SAndroid Build Coastguard Workerdefine double* @preidxf64(double* %src, double* %out) {
234*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidxf64:
235*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     d0, [x0, #8]!
236*9880d681SAndroid Build Coastguard Worker; CHECK: str     d0, [x1]
237*9880d681SAndroid Build Coastguard Worker; CHECK: ret
238*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds double, double* %src, i64 1
239*9880d681SAndroid Build Coastguard Worker  %tmp = load double, double* %ptr, align 4
240*9880d681SAndroid Build Coastguard Worker  store double %tmp, double* %out, align 4
241*9880d681SAndroid Build Coastguard Worker  ret double* %ptr
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerdefine float* @preidxf32(float* %src, float* %out) {
245*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidxf32:
246*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     s0, [x0, #4]!
247*9880d681SAndroid Build Coastguard Worker; CHECK: str     s0, [x1]
248*9880d681SAndroid Build Coastguard Worker; CHECK: ret
249*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds float, float* %src, i64 1
250*9880d681SAndroid Build Coastguard Worker  %tmp = load float, float* %ptr, align 4
251*9880d681SAndroid Build Coastguard Worker  store float %tmp, float* %out, align 4
252*9880d681SAndroid Build Coastguard Worker  ret float* %ptr
253*9880d681SAndroid Build Coastguard Worker}
254*9880d681SAndroid Build Coastguard Worker
255*9880d681SAndroid Build Coastguard Workerdefine half* @preidxf16(half* %src, half* %out) {
256*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidxf16:
257*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     h0, [x0, #2]!
258*9880d681SAndroid Build Coastguard Worker; CHECK: str     h0, [x1]
259*9880d681SAndroid Build Coastguard Worker; CHECK: ret
260*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds half, half* %src, i64 1
261*9880d681SAndroid Build Coastguard Worker  %tmp = load half, half* %ptr, align 2
262*9880d681SAndroid Build Coastguard Worker  store half %tmp, half* %out, align 2
263*9880d681SAndroid Build Coastguard Worker  ret half* %ptr
264*9880d681SAndroid Build Coastguard Worker}
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerdefine i64* @preidx64(i64* %src, i64* %out) {
267*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: preidx64:
268*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     x[[REG:[0-9]+]], [x0, #8]!
269*9880d681SAndroid Build Coastguard Worker; CHECK: str     x[[REG]], [x1]
270*9880d681SAndroid Build Coastguard Worker; CHECK: ret
271*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i64, i64* %src, i64 1
272*9880d681SAndroid Build Coastguard Worker  %tmp = load i64, i64* %ptr, align 4
273*9880d681SAndroid Build Coastguard Worker  store i64 %tmp, i64* %out, align 4
274*9880d681SAndroid Build Coastguard Worker  ret i64* %ptr
275*9880d681SAndroid Build Coastguard Worker}
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Workerdefine i32* @preidx32(i32* %src, i32* %out) {
278*9880d681SAndroid Build Coastguard Worker; CHECK: ldr     w[[REG:[0-9]+]], [x0, #4]!
279*9880d681SAndroid Build Coastguard Worker; CHECK: str     w[[REG]], [x1]
280*9880d681SAndroid Build Coastguard Worker; CHECK: ret
281*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i32, i32* %src, i64 1
282*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %ptr, align 4
283*9880d681SAndroid Build Coastguard Worker  store i32 %tmp, i32* %out, align 4
284*9880d681SAndroid Build Coastguard Worker  ret i32* %ptr
285*9880d681SAndroid Build Coastguard Worker}
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16zext32(i16* %src, i32* %out) {
288*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh    w[[REG:[0-9]+]], [x0, #2]!
289*9880d681SAndroid Build Coastguard Worker; CHECK: str     w[[REG]], [x1]
290*9880d681SAndroid Build Coastguard Worker; CHECK: ret
291*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i16, i16* %src, i64 1
292*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %ptr, align 4
293*9880d681SAndroid Build Coastguard Worker  %ext = zext i16 %tmp to i32
294*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32* %out, align 4
295*9880d681SAndroid Build Coastguard Worker  ret i16* %ptr
296*9880d681SAndroid Build Coastguard Worker}
297*9880d681SAndroid Build Coastguard Worker
298*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16zext64(i16* %src, i64* %out) {
299*9880d681SAndroid Build Coastguard Worker; CHECK: ldrh    w[[REG:[0-9]+]], [x0, #2]!
300*9880d681SAndroid Build Coastguard Worker; CHECK: str     x[[REG]], [x1]
301*9880d681SAndroid Build Coastguard Worker; CHECK: ret
302*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i16, i16* %src, i64 1
303*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %ptr, align 4
304*9880d681SAndroid Build Coastguard Worker  %ext = zext i16 %tmp to i64
305*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64* %out, align 4
306*9880d681SAndroid Build Coastguard Worker  ret i16* %ptr
307*9880d681SAndroid Build Coastguard Worker}
308*9880d681SAndroid Build Coastguard Worker
309*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8zext32(i8* %src, i32* %out) {
310*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb    w[[REG:[0-9]+]], [x0, #1]!
311*9880d681SAndroid Build Coastguard Worker; CHECK: str     w[[REG]], [x1]
312*9880d681SAndroid Build Coastguard Worker; CHECK: ret
313*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i8, i8* %src, i64 1
314*9880d681SAndroid Build Coastguard Worker  %tmp = load i8, i8* %ptr, align 4
315*9880d681SAndroid Build Coastguard Worker  %ext = zext i8 %tmp to i32
316*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32* %out, align 4
317*9880d681SAndroid Build Coastguard Worker  ret i8* %ptr
318*9880d681SAndroid Build Coastguard Worker}
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8zext64(i8* %src, i64* %out) {
321*9880d681SAndroid Build Coastguard Worker; CHECK: ldrb    w[[REG:[0-9]+]], [x0, #1]!
322*9880d681SAndroid Build Coastguard Worker; CHECK: str     x[[REG]], [x1]
323*9880d681SAndroid Build Coastguard Worker; CHECK: ret
324*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i8, i8* %src, i64 1
325*9880d681SAndroid Build Coastguard Worker  %tmp = load i8, i8* %ptr, align 4
326*9880d681SAndroid Build Coastguard Worker  %ext = zext i8 %tmp to i64
327*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64* %out, align 4
328*9880d681SAndroid Build Coastguard Worker  ret i8* %ptr
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Workerdefine i32* @preidx32sext64(i32* %src, i64* %out) {
332*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsw   x[[REG:[0-9]+]], [x0, #4]!
333*9880d681SAndroid Build Coastguard Worker; CHECK: str     x[[REG]], [x1]
334*9880d681SAndroid Build Coastguard Worker; CHECK: ret
335*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i32, i32* %src, i64 1
336*9880d681SAndroid Build Coastguard Worker  %tmp = load i32, i32* %ptr, align 4
337*9880d681SAndroid Build Coastguard Worker  %ext = sext i32 %tmp to i64
338*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64* %out, align 8
339*9880d681SAndroid Build Coastguard Worker  ret i32* %ptr
340*9880d681SAndroid Build Coastguard Worker}
341*9880d681SAndroid Build Coastguard Worker
342*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16sext32(i16* %src, i32* %out) {
343*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsh   w[[REG:[0-9]+]], [x0, #2]!
344*9880d681SAndroid Build Coastguard Worker; CHECK: str     w[[REG]], [x1]
345*9880d681SAndroid Build Coastguard Worker; CHECK: ret
346*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i16, i16* %src, i64 1
347*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %ptr, align 4
348*9880d681SAndroid Build Coastguard Worker  %ext = sext i16 %tmp to i32
349*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32* %out, align 4
350*9880d681SAndroid Build Coastguard Worker  ret i16* %ptr
351*9880d681SAndroid Build Coastguard Worker}
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerdefine i16* @preidx16sext64(i16* %src, i64* %out) {
354*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsh   x[[REG:[0-9]+]], [x0, #2]!
355*9880d681SAndroid Build Coastguard Worker; CHECK: str     x[[REG]], [x1]
356*9880d681SAndroid Build Coastguard Worker; CHECK: ret
357*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i16, i16* %src, i64 1
358*9880d681SAndroid Build Coastguard Worker  %tmp = load i16, i16* %ptr, align 4
359*9880d681SAndroid Build Coastguard Worker  %ext = sext i16 %tmp to i64
360*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64* %out, align 4
361*9880d681SAndroid Build Coastguard Worker  ret i16* %ptr
362*9880d681SAndroid Build Coastguard Worker}
363*9880d681SAndroid Build Coastguard Worker
364*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8sext32(i8* %src, i32* %out) {
365*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb   w[[REG:[0-9]+]], [x0, #1]!
366*9880d681SAndroid Build Coastguard Worker; CHECK: str     w[[REG]], [x1]
367*9880d681SAndroid Build Coastguard Worker; CHECK: ret
368*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i8, i8* %src, i64 1
369*9880d681SAndroid Build Coastguard Worker  %tmp = load i8, i8* %ptr, align 4
370*9880d681SAndroid Build Coastguard Worker  %ext = sext i8 %tmp to i32
371*9880d681SAndroid Build Coastguard Worker  store i32 %ext, i32* %out, align 4
372*9880d681SAndroid Build Coastguard Worker  ret i8* %ptr
373*9880d681SAndroid Build Coastguard Worker}
374*9880d681SAndroid Build Coastguard Worker
375*9880d681SAndroid Build Coastguard Workerdefine i8* @preidx8sext64(i8* %src, i64* %out) {
376*9880d681SAndroid Build Coastguard Worker; CHECK: ldrsb   x[[REG:[0-9]+]], [x0, #1]!
377*9880d681SAndroid Build Coastguard Worker; CHECK: str     x[[REG]], [x1]
378*9880d681SAndroid Build Coastguard Worker; CHECK: ret
379*9880d681SAndroid Build Coastguard Worker  %ptr = getelementptr inbounds i8, i8* %src, i64 1
380*9880d681SAndroid Build Coastguard Worker  %tmp = load i8, i8* %ptr, align 4
381*9880d681SAndroid Build Coastguard Worker  %ext = sext i8 %tmp to i64
382*9880d681SAndroid Build Coastguard Worker  store i64 %ext, i64* %out, align 4
383*9880d681SAndroid Build Coastguard Worker  ret i8* %ptr
384*9880d681SAndroid Build Coastguard Worker}
385*9880d681SAndroid Build Coastguard Worker
386*9880d681SAndroid Build Coastguard Worker; This test checks if illegal post-index is generated
387*9880d681SAndroid Build Coastguard Worker
388*9880d681SAndroid Build Coastguard Workerdefine i64* @postidx_clobber(i64* %addr) nounwind noinline ssp {
389*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: postidx_clobber:
390*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: str     x0, [x0], #8
391*9880d681SAndroid Build Coastguard Worker; ret
392*9880d681SAndroid Build Coastguard Worker %paddr = bitcast i64* %addr to i64**
393*9880d681SAndroid Build Coastguard Worker store i64* %addr, i64** %paddr
394*9880d681SAndroid Build Coastguard Worker %newaddr = getelementptr i64, i64* %addr, i32 1
395*9880d681SAndroid Build Coastguard Worker ret i64* %newaddr
396*9880d681SAndroid Build Coastguard Worker}
397