xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/fast-isel-addressing-modes.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin                             -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK --check-prefix=SDAG
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s --check-prefix=CHECK --check-prefix=FAST
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker; Load / Store Base Register only
5*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @load_breg_i1(i1* %a) {
6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_i1
7*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrb {{w[0-9]+}}, [x0]
8*9880d681SAndroid Build Coastguard Worker  %1 = load i1, i1* %a
9*9880d681SAndroid Build Coastguard Worker  ret i1 %1
10*9880d681SAndroid Build Coastguard Worker}
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @load_breg_i8(i8* %a) {
13*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_i8
14*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrb {{w[0-9]+}}, [x0]
15*9880d681SAndroid Build Coastguard Worker  %1 = load i8, i8* %a
16*9880d681SAndroid Build Coastguard Worker  ret i8 %1
17*9880d681SAndroid Build Coastguard Worker}
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @load_breg_i16(i16* %a) {
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_i16
21*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrh {{w[0-9]+}}, [x0]
22*9880d681SAndroid Build Coastguard Worker  %1 = load i16, i16* %a
23*9880d681SAndroid Build Coastguard Worker  ret i16 %1
24*9880d681SAndroid Build Coastguard Worker}
25*9880d681SAndroid Build Coastguard Worker
26*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_i32(i32* %a) {
27*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_i32
28*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x0]
29*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %a
30*9880d681SAndroid Build Coastguard Worker  ret i32 %1
31*9880d681SAndroid Build Coastguard Worker}
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_i64(i64* %a) {
34*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_i64
35*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x0]
36*9880d681SAndroid Build Coastguard Worker  %1 = load i64, i64* %a
37*9880d681SAndroid Build Coastguard Worker  ret i64 %1
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerdefine float @load_breg_f32(float* %a) {
41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_f32
42*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{s[0-9]+}}, [x0]
43*9880d681SAndroid Build Coastguard Worker  %1 = load float, float* %a
44*9880d681SAndroid Build Coastguard Worker  ret float %1
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine double @load_breg_f64(double* %a) {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_f64
49*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{d[0-9]+}}, [x0]
50*9880d681SAndroid Build Coastguard Worker  %1 = load double, double* %a
51*9880d681SAndroid Build Coastguard Worker  ret double %1
52*9880d681SAndroid Build Coastguard Worker}
53*9880d681SAndroid Build Coastguard Worker
54*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_i1(i1* %a) {
55*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_i1
56*9880d681SAndroid Build Coastguard Worker; CHECK:       strb wzr, [x0]
57*9880d681SAndroid Build Coastguard Worker  store i1 0, i1* %a
58*9880d681SAndroid Build Coastguard Worker  ret void
59*9880d681SAndroid Build Coastguard Worker}
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_i1_2(i1* %a) {
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_i1_2
63*9880d681SAndroid Build Coastguard Worker; CHECK:       strb {{w[0-9]+}}, [x0]
64*9880d681SAndroid Build Coastguard Worker  store i1 true, i1* %a
65*9880d681SAndroid Build Coastguard Worker  ret void
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_i8(i8* %a) {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_i8
70*9880d681SAndroid Build Coastguard Worker; CHECK:       strb wzr, [x0]
71*9880d681SAndroid Build Coastguard Worker  store i8 0, i8* %a
72*9880d681SAndroid Build Coastguard Worker  ret void
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_i16(i16* %a) {
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_i16
77*9880d681SAndroid Build Coastguard Worker; CHECK:       strh wzr, [x0]
78*9880d681SAndroid Build Coastguard Worker  store i16 0, i16* %a
79*9880d681SAndroid Build Coastguard Worker  ret void
80*9880d681SAndroid Build Coastguard Worker}
81*9880d681SAndroid Build Coastguard Worker
82*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_i32(i32* %a) {
83*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_i32
84*9880d681SAndroid Build Coastguard Worker; CHECK:       str wzr, [x0]
85*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %a
86*9880d681SAndroid Build Coastguard Worker  ret void
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_i64(i64* %a) {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_i64
91*9880d681SAndroid Build Coastguard Worker; CHECK:       str xzr, [x0]
92*9880d681SAndroid Build Coastguard Worker  store i64 0, i64* %a
93*9880d681SAndroid Build Coastguard Worker  ret void
94*9880d681SAndroid Build Coastguard Worker}
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_f32(float* %a) {
97*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_f32
98*9880d681SAndroid Build Coastguard Worker; CHECK:       str wzr, [x0]
99*9880d681SAndroid Build Coastguard Worker  store float 0.0, float* %a
100*9880d681SAndroid Build Coastguard Worker  ret void
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_f64(double* %a) {
104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_f64
105*9880d681SAndroid Build Coastguard Worker; CHECK:       str xzr, [x0]
106*9880d681SAndroid Build Coastguard Worker  store double 0.0, double* %a
107*9880d681SAndroid Build Coastguard Worker  ret void
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; Load Immediate
111*9880d681SAndroid Build Coastguard Workerdefine i32 @load_immoff_1() {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_immoff_1
113*9880d681SAndroid Build Coastguard Worker; CHECK:       orr {{w|x}}[[REG:[0-9]+]], {{wzr|xzr}}, #0x80
114*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, {{\[}}x[[REG]]{{\]}}
115*9880d681SAndroid Build Coastguard Worker  %1 = inttoptr i64 128 to i32*
116*9880d681SAndroid Build Coastguard Worker  %2 = load i32, i32* %1
117*9880d681SAndroid Build Coastguard Worker  ret i32 %2
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; Load / Store Base Register + Immediate Offset
121*9880d681SAndroid Build Coastguard Worker; Max supported negative offset
122*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_immoff_1(i64 %a) {
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_immoff_1
124*9880d681SAndroid Build Coastguard Worker; CHECK:       ldur {{w[0-9]+}}, [x0, #-256]
125*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, -256
126*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
127*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
128*9880d681SAndroid Build Coastguard Worker  ret i32 %3
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; Min not-supported negative offset
132*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_immoff_2(i64 %a) {
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_immoff_2
134*9880d681SAndroid Build Coastguard Worker; CHECK:       sub [[REG:x[0-9]+]], x0, #257
135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
136*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, -257
137*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
138*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
139*9880d681SAndroid Build Coastguard Worker  ret i32 %3
140*9880d681SAndroid Build Coastguard Worker}
141*9880d681SAndroid Build Coastguard Worker
142*9880d681SAndroid Build Coastguard Worker; Max supported unscaled offset
143*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_immoff_3(i64 %a) {
144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_immoff_3
145*9880d681SAndroid Build Coastguard Worker; CHECK:       ldur {{w[0-9]+}}, [x0, #255]
146*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 255
147*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
148*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
149*9880d681SAndroid Build Coastguard Worker  ret i32 %3
150*9880d681SAndroid Build Coastguard Worker}
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Worker; Min un-supported unscaled offset
153*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_immoff_4(i64 %a) {
154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_immoff_4
155*9880d681SAndroid Build Coastguard Worker; CHECK:       add [[REG:x[0-9]+]], x0, #257
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
157*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 257
158*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
159*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
160*9880d681SAndroid Build Coastguard Worker  ret i32 %3
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; Max supported scaled offset
164*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_immoff_5(i64 %a) {
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_immoff_5
166*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x0, #16380]
167*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 16380
168*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
169*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
170*9880d681SAndroid Build Coastguard Worker  ret i32 %3
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; Min un-supported scaled offset
174*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_immoff_6(i64 %a) {
175*9880d681SAndroid Build Coastguard Worker; SDAG-LABEL: load_breg_immoff_6
176*9880d681SAndroid Build Coastguard Worker; SDAG:       orr	w[[NUM:[0-9]+]], wzr, #0x4000
177*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT:  ldr {{w[0-9]+}}, [x0, x[[NUM]]]
178*9880d681SAndroid Build Coastguard Worker; FAST-LABEL: load_breg_immoff_6
179*9880d681SAndroid Build Coastguard Worker; FAST:       add [[REG:x[0-9]+]], x0, #4, lsl #12
180*9880d681SAndroid Build Coastguard Worker; FAST-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
181*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 16384
182*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
183*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
184*9880d681SAndroid Build Coastguard Worker  ret i32 %3
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; Max supported negative offset
188*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_immoff_1(i64 %a) {
189*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_immoff_1
190*9880d681SAndroid Build Coastguard Worker; CHECK:       stur wzr, [x0, #-256]
191*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, -256
192*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
193*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %2
194*9880d681SAndroid Build Coastguard Worker  ret void
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; Min not-supported negative offset
198*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_immoff_2(i64 %a) {
199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_immoff_2
200*9880d681SAndroid Build Coastguard Worker; CHECK:       sub [[REG:x[0-9]+]], x0, #257
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  str wzr, {{\[}}[[REG]]{{\]}}
202*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, -257
203*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
204*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %2
205*9880d681SAndroid Build Coastguard Worker  ret void
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; Max supported unscaled offset
209*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_immoff_3(i64 %a) {
210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_immoff_3
211*9880d681SAndroid Build Coastguard Worker; CHECK:       stur wzr, [x0, #255]
212*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 255
213*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
214*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %2
215*9880d681SAndroid Build Coastguard Worker  ret void
216*9880d681SAndroid Build Coastguard Worker}
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker; Min un-supported unscaled offset
219*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_immoff_4(i64 %a) {
220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_immoff_4
221*9880d681SAndroid Build Coastguard Worker; CHECK:       add [[REG:x[0-9]+]], x0, #257
222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  str wzr, {{\[}}[[REG]]{{\]}}
223*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 257
224*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
225*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %2
226*9880d681SAndroid Build Coastguard Worker  ret void
227*9880d681SAndroid Build Coastguard Worker}
228*9880d681SAndroid Build Coastguard Worker
229*9880d681SAndroid Build Coastguard Worker; Max supported scaled offset
230*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_immoff_5(i64 %a) {
231*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_breg_immoff_5
232*9880d681SAndroid Build Coastguard Worker; CHECK:       str wzr, [x0, #16380]
233*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 16380
234*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
235*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %2
236*9880d681SAndroid Build Coastguard Worker  ret void
237*9880d681SAndroid Build Coastguard Worker}
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker; Min un-supported scaled offset
240*9880d681SAndroid Build Coastguard Workerdefine void @store_breg_immoff_6(i64 %a) {
241*9880d681SAndroid Build Coastguard Worker; SDAG-LABEL: store_breg_immoff_6
242*9880d681SAndroid Build Coastguard Worker; SDAG:       orr	w[[NUM:[0-9]+]], wzr, #0x4000
243*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT:  str wzr, [x0, x[[NUM]]]
244*9880d681SAndroid Build Coastguard Worker; FAST-LABEL: store_breg_immoff_6
245*9880d681SAndroid Build Coastguard Worker; FAST:       add [[REG:x[0-9]+]], x0, #4, lsl #12
246*9880d681SAndroid Build Coastguard Worker; FAST-NEXT:  str wzr, {{\[}}[[REG]]{{\]}}
247*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 16384
248*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
249*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %2
250*9880d681SAndroid Build Coastguard Worker  ret void
251*9880d681SAndroid Build Coastguard Worker}
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_immoff_7(i64 %a) {
254*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_immoff_7
255*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x0, #48]
256*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, 48
257*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i64*
258*9880d681SAndroid Build Coastguard Worker  %3 = load i64, i64* %2
259*9880d681SAndroid Build Coastguard Worker  ret i64 %3
260*9880d681SAndroid Build Coastguard Worker}
261*9880d681SAndroid Build Coastguard Worker
262*9880d681SAndroid Build Coastguard Worker; Flip add operands
263*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_immoff_8(i64 %a) {
264*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_immoff_8
265*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x0, #48]
266*9880d681SAndroid Build Coastguard Worker  %1 = add i64 48, %a
267*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i64*
268*9880d681SAndroid Build Coastguard Worker  %3 = load i64, i64* %2
269*9880d681SAndroid Build Coastguard Worker  ret i64 %3
270*9880d681SAndroid Build Coastguard Worker}
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker; Load Base Register + Register Offset
273*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_offreg_1(i64 %a, i64 %b) {
274*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_offreg_1
275*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x0, x1]
276*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
277*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i64*
278*9880d681SAndroid Build Coastguard Worker  %3 = load i64, i64* %2
279*9880d681SAndroid Build Coastguard Worker  ret i64 %3
280*9880d681SAndroid Build Coastguard Worker}
281*9880d681SAndroid Build Coastguard Worker
282*9880d681SAndroid Build Coastguard Worker; Flip add operands
283*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_offreg_2(i64 %a, i64 %b) {
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_offreg_2
285*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, x0]
286*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %b, %a
287*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i64*
288*9880d681SAndroid Build Coastguard Worker  %3 = load i64, i64* %2
289*9880d681SAndroid Build Coastguard Worker  ret i64 %3
290*9880d681SAndroid Build Coastguard Worker}
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker; Load Base Register + Register Offset + Immediate Offset
293*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_offreg_immoff_1(i64 %a, i64 %b) {
294*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_offreg_immoff_1
295*9880d681SAndroid Build Coastguard Worker; CHECK:       add [[REG:x[0-9]+]], x0, x1
296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ldr x0, {{\[}}[[REG]], #48{{\]}}
297*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
298*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %1, 48
299*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i64*
300*9880d681SAndroid Build Coastguard Worker  %4 = load i64, i64* %3
301*9880d681SAndroid Build Coastguard Worker  ret i64 %4
302*9880d681SAndroid Build Coastguard Worker}
303*9880d681SAndroid Build Coastguard Worker
304*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_offreg_immoff_2(i64 %a, i64 %b) {
305*9880d681SAndroid Build Coastguard Worker; SDAG-LABEL: load_breg_offreg_immoff_2
306*9880d681SAndroid Build Coastguard Worker; SDAG:       add [[REG1:x[0-9]+]], x0, x1
307*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT:  orr w[[NUM:[0-9]+]], wzr, #0xf000
308*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT:  ldr x0, {{\[}}[[REG1]], x[[NUM]]]
309*9880d681SAndroid Build Coastguard Worker; FAST-LABEL: load_breg_offreg_immoff_2
310*9880d681SAndroid Build Coastguard Worker; FAST:       add [[REG:x[0-9]+]], x0, #15, lsl #12
311*9880d681SAndroid Build Coastguard Worker; FAST-NEXT:  ldr x0, {{\[}}[[REG]], x1{{\]}}
312*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
313*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %1, 61440
314*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i64*
315*9880d681SAndroid Build Coastguard Worker  %4 = load i64, i64* %3
316*9880d681SAndroid Build Coastguard Worker  ret i64 %4
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker; Load Scaled Register Offset
320*9880d681SAndroid Build Coastguard Workerdefine i32 @load_shift_offreg_1(i64 %a) {
321*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_shift_offreg_1
322*9880d681SAndroid Build Coastguard Worker; CHECK:       lsl [[REG:x[0-9]+]], x0, #2
323*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
324*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %a, 2
325*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
326*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
327*9880d681SAndroid Build Coastguard Worker  ret i32 %3
328*9880d681SAndroid Build Coastguard Worker}
329*9880d681SAndroid Build Coastguard Worker
330*9880d681SAndroid Build Coastguard Workerdefine i32 @load_mul_offreg_1(i64 %a) {
331*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_mul_offreg_1
332*9880d681SAndroid Build Coastguard Worker; CHECK:       lsl [[REG:x[0-9]+]], x0, #2
333*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
334*9880d681SAndroid Build Coastguard Worker  %1 = mul i64 %a, 4
335*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
336*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
337*9880d681SAndroid Build Coastguard Worker  ret i32 %3
338*9880d681SAndroid Build Coastguard Worker}
339*9880d681SAndroid Build Coastguard Worker
340*9880d681SAndroid Build Coastguard Worker; Load Base Register + Scaled Register Offset
341*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_shift_offreg_1(i64 %a, i64 %b) {
342*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_shift_offreg_1
343*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, x0, lsl #2]
344*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %a, 2
345*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %1, %b
346*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i32*
347*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %3
348*9880d681SAndroid Build Coastguard Worker  ret i32 %4
349*9880d681SAndroid Build Coastguard Worker}
350*9880d681SAndroid Build Coastguard Worker
351*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_shift_offreg_2(i64 %a, i64 %b) {
352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_shift_offreg_2
353*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, x0, lsl #2]
354*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %a, 2
355*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %b, %1
356*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i32*
357*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %3
358*9880d681SAndroid Build Coastguard Worker  ret i32 %4
359*9880d681SAndroid Build Coastguard Worker}
360*9880d681SAndroid Build Coastguard Worker
361*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_shift_offreg_3(i64 %a, i64 %b) {
362*9880d681SAndroid Build Coastguard Worker; SDAG-LABEL: load_breg_shift_offreg_3
363*9880d681SAndroid Build Coastguard Worker; SDAG:       lsl [[REG:x[0-9]+]], x0, #2
364*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]], x1, lsl #2{{\]}}
365*9880d681SAndroid Build Coastguard Worker; FAST-LABEL: load_breg_shift_offreg_3
366*9880d681SAndroid Build Coastguard Worker; FAST:       lsl [[REG:x[0-9]+]], x1, #2
367*9880d681SAndroid Build Coastguard Worker; FAST-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
368*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %a, 2
369*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %b, 2
370*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %1, %2
371*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
372*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
373*9880d681SAndroid Build Coastguard Worker  ret i32 %5
374*9880d681SAndroid Build Coastguard Worker}
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_shift_offreg_4(i64 %a, i64 %b) {
377*9880d681SAndroid Build Coastguard Worker; SDAG-LABEL: load_breg_shift_offreg_4
378*9880d681SAndroid Build Coastguard Worker; SDAG:       lsl [[REG:x[0-9]+]], x1, #2
379*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
380*9880d681SAndroid Build Coastguard Worker; FAST-LABEL: load_breg_shift_offreg_4
381*9880d681SAndroid Build Coastguard Worker; FAST:       lsl [[REG:x[0-9]+]], x0, #2
382*9880d681SAndroid Build Coastguard Worker; FAST-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]], x1, lsl #2{{\]}}
383*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %a, 2
384*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %b, 2
385*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %1
386*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
387*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
388*9880d681SAndroid Build Coastguard Worker  ret i32 %5
389*9880d681SAndroid Build Coastguard Worker}
390*9880d681SAndroid Build Coastguard Worker
391*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_shift_offreg_5(i64 %a, i64 %b) {
392*9880d681SAndroid Build Coastguard Worker; SDAG-LABEL: load_breg_shift_offreg_5
393*9880d681SAndroid Build Coastguard Worker; SDAG:       lsl [[REG:x[0-9]+]], x1, #3
394*9880d681SAndroid Build Coastguard Worker; SDAG-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
395*9880d681SAndroid Build Coastguard Worker; FAST-LABEL: load_breg_shift_offreg_5
396*9880d681SAndroid Build Coastguard Worker; FAST:       lsl [[REG:x[0-9]+]], x1, #3
397*9880d681SAndroid Build Coastguard Worker; FAST-NEXT:  ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
398*9880d681SAndroid Build Coastguard Worker  %1 = shl i64 %a, 2
399*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %b, 3
400*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %1, %2
401*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
402*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
403*9880d681SAndroid Build Coastguard Worker  ret i32 %5
404*9880d681SAndroid Build Coastguard Worker}
405*9880d681SAndroid Build Coastguard Worker
406*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_mul_offreg_1(i64 %a, i64 %b) {
407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_mul_offreg_1
408*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, x0, lsl #2]
409*9880d681SAndroid Build Coastguard Worker  %1 = mul i64 %a, 4
410*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %1, %b
411*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i32*
412*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %3
413*9880d681SAndroid Build Coastguard Worker  ret i32 %4
414*9880d681SAndroid Build Coastguard Worker}
415*9880d681SAndroid Build Coastguard Worker
416*9880d681SAndroid Build Coastguard Workerdefine zeroext i8 @load_breg_and_offreg_1(i64 %a, i64 %b) {
417*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_and_offreg_1
418*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrb {{w[0-9]+}}, [x1, w0, uxtw]
419*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, 4294967295
420*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %1, %b
421*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i8*
422*9880d681SAndroid Build Coastguard Worker  %4 = load i8, i8* %3
423*9880d681SAndroid Build Coastguard Worker  ret i8 %4
424*9880d681SAndroid Build Coastguard Worker}
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Workerdefine zeroext i16 @load_breg_and_offreg_2(i64 %a, i64 %b) {
427*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_and_offreg_2
428*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrh {{w[0-9]+}}, [x1, w0, uxtw #1]
429*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, 4294967295
430*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 1
431*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
432*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i16*
433*9880d681SAndroid Build Coastguard Worker  %5 = load i16, i16* %4
434*9880d681SAndroid Build Coastguard Worker  ret i16 %5
435*9880d681SAndroid Build Coastguard Worker}
436*9880d681SAndroid Build Coastguard Worker
437*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_and_offreg_3(i64 %a, i64 %b) {
438*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_and_offreg_3
439*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
440*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, 4294967295
441*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 2
442*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
443*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
444*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
445*9880d681SAndroid Build Coastguard Worker  ret i32 %5
446*9880d681SAndroid Build Coastguard Worker}
447*9880d681SAndroid Build Coastguard Worker
448*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_and_offreg_4(i64 %a, i64 %b) {
449*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_and_offreg_4
450*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, uxtw #3]
451*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, 4294967295
452*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
453*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
454*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
455*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
456*9880d681SAndroid Build Coastguard Worker  ret i64 %5
457*9880d681SAndroid Build Coastguard Worker}
458*9880d681SAndroid Build Coastguard Worker
459*9880d681SAndroid Build Coastguard Worker; Not all 'and' instructions have immediates.
460*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_and_offreg_5(i64 %a, i64 %b, i64 %c) {
461*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_and_offreg_5
462*9880d681SAndroid Build Coastguard Worker; CHECK:       and [[REG:x[0-9]+]], x0, x2
463*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ldr {{x[0-9]+}}, {{\[}}[[REG]], x1{{\]}}
464*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, %c
465*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %1, %b
466*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i64*
467*9880d681SAndroid Build Coastguard Worker  %4 = load i64, i64* %3
468*9880d681SAndroid Build Coastguard Worker  ret i64 %4
469*9880d681SAndroid Build Coastguard Worker}
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_and_offreg_6(i64 %a, i64 %b, i64 %c) {
472*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_and_offreg_6
473*9880d681SAndroid Build Coastguard Worker; CHECK:       and [[REG:x[0-9]+]], x0, x2
474*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ldr {{x[0-9]+}}, {{\[}}x1, [[REG]], lsl #3{{\]}}
475*9880d681SAndroid Build Coastguard Worker  %1 = and i64 %a, %c
476*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
477*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
478*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
479*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
480*9880d681SAndroid Build Coastguard Worker  ret i64 %5
481*9880d681SAndroid Build Coastguard Worker}
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Worker; Load Base Register + Scaled Register Offset + Sign/Zero extension
484*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_zext_shift_offreg_1(i32 %a, i64 %b) {
485*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_zext_shift_offreg_1
486*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
487*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
488*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 2
489*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
490*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
491*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
492*9880d681SAndroid Build Coastguard Worker  ret i32 %5
493*9880d681SAndroid Build Coastguard Worker}
494*9880d681SAndroid Build Coastguard Worker
495*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_zext_shift_offreg_2(i32 %a, i64 %b) {
496*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_zext_shift_offreg_2
497*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
498*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
499*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 2
500*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
501*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
502*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
503*9880d681SAndroid Build Coastguard Worker  ret i32 %5
504*9880d681SAndroid Build Coastguard Worker}
505*9880d681SAndroid Build Coastguard Worker
506*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_zext_mul_offreg_1(i32 %a, i64 %b) {
507*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_zext_mul_offreg_1
508*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
509*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
510*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 4
511*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
512*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
513*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
514*9880d681SAndroid Build Coastguard Worker  ret i32 %5
515*9880d681SAndroid Build Coastguard Worker}
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_sext_shift_offreg_1(i32 %a, i64 %b) {
518*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_sext_shift_offreg_1
519*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, w0, sxtw #2]
520*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
521*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 2
522*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
523*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
524*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
525*9880d681SAndroid Build Coastguard Worker  ret i32 %5
526*9880d681SAndroid Build Coastguard Worker}
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_sext_shift_offreg_2(i32 %a, i64 %b) {
529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_sext_shift_offreg_2
530*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, w0, sxtw #2]
531*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
532*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 2
533*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
534*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
535*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
536*9880d681SAndroid Build Coastguard Worker  ret i32 %5
537*9880d681SAndroid Build Coastguard Worker}
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker; Make sure that we don't drop the first 'add' instruction.
540*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_sext_shift_offreg_3(i32 %a, i64 %b) {
541*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_sext_shift_offreg_3
542*9880d681SAndroid Build Coastguard Worker; CHECK:       add [[REG:w[0-9]+]], w0, #4
543*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, {{\[}}x1, [[REG]], sxtw #2{{\]}}
544*9880d681SAndroid Build Coastguard Worker  %1 = add i32 %a, 4
545*9880d681SAndroid Build Coastguard Worker  %2 = sext i32 %1 to i64
546*9880d681SAndroid Build Coastguard Worker  %3 = shl i64 %2, 2
547*9880d681SAndroid Build Coastguard Worker  %4 = add i64 %b, %3
548*9880d681SAndroid Build Coastguard Worker  %5 = inttoptr i64 %4 to i32*
549*9880d681SAndroid Build Coastguard Worker  %6 = load i32, i32* %5
550*9880d681SAndroid Build Coastguard Worker  ret i32 %6
551*9880d681SAndroid Build Coastguard Worker}
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Worker
554*9880d681SAndroid Build Coastguard Workerdefine i32 @load_breg_sext_mul_offreg_1(i32 %a, i64 %b) {
555*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_sext_mul_offreg_1
556*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, [x1, w0, sxtw #2]
557*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
558*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 4
559*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, %b
560*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i32*
561*9880d681SAndroid Build Coastguard Worker  %5 = load i32, i32* %4
562*9880d681SAndroid Build Coastguard Worker  ret i32 %5
563*9880d681SAndroid Build Coastguard Worker}
564*9880d681SAndroid Build Coastguard Worker
565*9880d681SAndroid Build Coastguard Worker; Load Scaled Register Offset + Immediate Offset + Sign/Zero extension
566*9880d681SAndroid Build Coastguard Workerdefine i64 @load_sext_shift_offreg_imm1(i32 %a) {
567*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_sext_shift_offreg_imm1
568*9880d681SAndroid Build Coastguard Worker; CHECK:       sbfiz [[REG:x[0-9]+]], {{x[0-9]+}}, #3, #32
569*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ldr {{x[0-9]+}}, {{\[}}[[REG]], #8{{\]}}
570*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
571*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
572*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %2, 8
573*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
574*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
575*9880d681SAndroid Build Coastguard Worker  ret i64 %5
576*9880d681SAndroid Build Coastguard Worker}
577*9880d681SAndroid Build Coastguard Worker
578*9880d681SAndroid Build Coastguard Worker; Load Base Register + Scaled Register Offset + Immediate Offset + Sign/Zero extension
579*9880d681SAndroid Build Coastguard Workerdefine i64 @load_breg_sext_shift_offreg_imm1(i32 %a, i64 %b) {
580*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_breg_sext_shift_offreg_imm1
581*9880d681SAndroid Build Coastguard Worker; CHECK:       add [[REG:x[0-9]+]], x1, w0, sxtw #3
582*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ldr {{x[0-9]+}}, {{\[}}[[REG]], #8{{\]}}
583*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
584*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
585*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
586*9880d681SAndroid Build Coastguard Worker  %4 = add i64 %3, 8
587*9880d681SAndroid Build Coastguard Worker  %5 = inttoptr i64 %4 to i64*
588*9880d681SAndroid Build Coastguard Worker  %6 = load i64, i64* %5
589*9880d681SAndroid Build Coastguard Worker  ret i64 %6
590*9880d681SAndroid Build Coastguard Worker}
591*9880d681SAndroid Build Coastguard Worker
592*9880d681SAndroid Build Coastguard Worker; Test that the kill flag is not set - the machine instruction verifier does that for us.
593*9880d681SAndroid Build Coastguard Workerdefine i64 @kill_reg(i64 %a) {
594*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
595*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %1, 96
596*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i64*
597*9880d681SAndroid Build Coastguard Worker  %4 = load i64, i64* %3
598*9880d681SAndroid Build Coastguard Worker  %5 = add i64 %2, %4
599*9880d681SAndroid Build Coastguard Worker  ret i64 %5
600*9880d681SAndroid Build Coastguard Worker}
601*9880d681SAndroid Build Coastguard Worker
602*9880d681SAndroid Build Coastguard Workerdefine void @store_fi(i64 %i) {
603*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: store_fi
604*9880d681SAndroid Build Coastguard Worker; CHECK:       mov [[REG:x[0-9]+]], sp
605*9880d681SAndroid Build Coastguard Worker; CHECK:       str {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
606*9880d681SAndroid Build Coastguard Worker  %1 = alloca [8 x i32]
607*9880d681SAndroid Build Coastguard Worker  %2 = ptrtoint [8 x i32]* %1 to i64
608*9880d681SAndroid Build Coastguard Worker  %3 = mul i64 %i, 4
609*9880d681SAndroid Build Coastguard Worker  %4 = add i64 %2, %3
610*9880d681SAndroid Build Coastguard Worker  %5 = inttoptr i64 %4 to i32*
611*9880d681SAndroid Build Coastguard Worker  store i32 47, i32* %5, align 4
612*9880d681SAndroid Build Coastguard Worker  ret void
613*9880d681SAndroid Build Coastguard Worker}
614*9880d681SAndroid Build Coastguard Worker
615*9880d681SAndroid Build Coastguard Workerdefine i32 @load_fi(i64 %i) {
616*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_fi
617*9880d681SAndroid Build Coastguard Worker; CHECK:       mov [[REG:x[0-9]+]], sp
618*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
619*9880d681SAndroid Build Coastguard Worker  %1 = alloca [8 x i32]
620*9880d681SAndroid Build Coastguard Worker  %2 = ptrtoint [8 x i32]* %1 to i64
621*9880d681SAndroid Build Coastguard Worker  %3 = mul i64 %i, 4
622*9880d681SAndroid Build Coastguard Worker  %4 = add i64 %2, %3
623*9880d681SAndroid Build Coastguard Worker  %5 = inttoptr i64 %4 to i32*
624*9880d681SAndroid Build Coastguard Worker  %6 = load i32, i32* %5, align 4
625*9880d681SAndroid Build Coastguard Worker  ret i32 %6
626*9880d681SAndroid Build Coastguard Worker}
627*9880d681SAndroid Build Coastguard Worker
628