xref: /aosp_15_r20/external/llvm/test/CodeGen/AArch64/fast-isel-int-ext.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -fast-isel-abort=1 -verify-machineinstrs < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; Test that we only use the sign/zero extend in the address calculation when
5*9880d681SAndroid Build Coastguard Worker; necessary.
6*9880d681SAndroid Build Coastguard Worker;
7*9880d681SAndroid Build Coastguard Worker; SHIFT
8*9880d681SAndroid Build Coastguard Worker;
9*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_shift_zext1(i32 %a, i64 %b) {
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_shift_zext1
11*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, uxtw #3]
12*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
13*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
14*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
15*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
16*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
17*9880d681SAndroid Build Coastguard Worker  ret i64 %5
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_shift_zext2(i32 zeroext %a, i64 %b) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_shift_zext2
22*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, x0, lsl #3]
23*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
24*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
25*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
26*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
27*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
28*9880d681SAndroid Build Coastguard Worker  ret i64 %5
29*9880d681SAndroid Build Coastguard Worker}
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_shift_zext3(i32 signext %a, i64 %b) {
32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_shift_zext3
33*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, uxtw #3]
34*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
35*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
36*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
37*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
38*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
39*9880d681SAndroid Build Coastguard Worker  ret i64 %5
40*9880d681SAndroid Build Coastguard Worker}
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_shift_sext1(i32 %a, i64 %b) {
43*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_shift_sext1
44*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, sxtw #3]
45*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
46*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
47*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
48*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
49*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
50*9880d681SAndroid Build Coastguard Worker  ret i64 %5
51*9880d681SAndroid Build Coastguard Worker}
52*9880d681SAndroid Build Coastguard Worker
53*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_shift_sext2(i32 zeroext %a, i64 %b) {
54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_shift_sext2
55*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, sxtw #3]
56*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
57*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
58*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
59*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
60*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
61*9880d681SAndroid Build Coastguard Worker  ret i64 %5
62*9880d681SAndroid Build Coastguard Worker}
63*9880d681SAndroid Build Coastguard Worker
64*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_shift_sext3(i32 signext %a, i64 %b) {
65*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_shift_sext3
66*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, x0, lsl #3]
67*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
68*9880d681SAndroid Build Coastguard Worker  %2 = shl i64 %1, 3
69*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
70*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
71*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
72*9880d681SAndroid Build Coastguard Worker  ret i64 %5
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Worker;
76*9880d681SAndroid Build Coastguard Worker; MUL
77*9880d681SAndroid Build Coastguard Worker;
78*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_mul_zext1(i32 %a, i64 %b) {
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_mul_zext1
80*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, uxtw #3]
81*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
82*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 8
83*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
84*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
85*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
86*9880d681SAndroid Build Coastguard Worker  ret i64 %5
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_mul_zext2(i32 zeroext %a, i64 %b) {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_mul_zext2
91*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, x0, lsl #3]
92*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
93*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 8
94*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
95*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
96*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
97*9880d681SAndroid Build Coastguard Worker  ret i64 %5
98*9880d681SAndroid Build Coastguard Worker}
99*9880d681SAndroid Build Coastguard Worker
100*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_mul_zext3(i32 signext %a, i64 %b) {
101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_mul_zext3
102*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, uxtw #3]
103*9880d681SAndroid Build Coastguard Worker  %1 = zext i32 %a to i64
104*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 8
105*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
106*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
107*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
108*9880d681SAndroid Build Coastguard Worker  ret i64 %5
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_mul_sext1(i32 %a, i64 %b) {
112*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_mul_sext1
113*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, sxtw #3]
114*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
115*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 8
116*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
117*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
118*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
119*9880d681SAndroid Build Coastguard Worker  ret i64 %5
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_mul_sext2(i32 zeroext %a, i64 %b) {
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_mul_sext2
124*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, w0, sxtw #3]
125*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
126*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 8
127*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
128*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
129*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
130*9880d681SAndroid Build Coastguard Worker  ret i64 %5
131*9880d681SAndroid Build Coastguard Worker}
132*9880d681SAndroid Build Coastguard Worker
133*9880d681SAndroid Build Coastguard Workerdefine i64 @load_addr_mul_sext3(i32 signext %a, i64 %b) {
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_addr_mul_sext3
135*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr {{x[0-9]+}}, [x1, x0, lsl #3]
136*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %a to i64
137*9880d681SAndroid Build Coastguard Worker  %2 = mul i64 %1, 8
138*9880d681SAndroid Build Coastguard Worker  %3 = add i64 %b, %2
139*9880d681SAndroid Build Coastguard Worker  %4 = inttoptr i64 %3 to i64*
140*9880d681SAndroid Build Coastguard Worker  %5 = load i64, i64* %4
141*9880d681SAndroid Build Coastguard Worker  ret i64 %5
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker
145*9880d681SAndroid Build Coastguard Worker;
146*9880d681SAndroid Build Coastguard Worker; Test folding of the sign-/zero-extend into the load instruction.
147*9880d681SAndroid Build Coastguard Worker;
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Worker; Unscaled
150*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_zext_i8_to_i32(i64 %a) {
151*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i8_to_i32
152*9880d681SAndroid Build Coastguard Worker; CHECK:       ldurb w0, [x0, #-8]
153*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtb
154*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
155*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
156*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
157*9880d681SAndroid Build Coastguard Worker  %4 = zext i8 %3 to i32
158*9880d681SAndroid Build Coastguard Worker  ret i32 %4
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_zext_i16_to_i32(i64 %a) {
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i16_to_i32
163*9880d681SAndroid Build Coastguard Worker; CHECK:       ldurh w0, [x0, #-8]
164*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxth
165*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
166*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
167*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
168*9880d681SAndroid Build Coastguard Worker  %4 = zext i16 %3 to i32
169*9880d681SAndroid Build Coastguard Worker  ret i32 %4
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_zext_i8_to_i64(i64 %a) {
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i8_to_i64
174*9880d681SAndroid Build Coastguard Worker; CHECK:       ldurb w0, [x0, #-8]
175*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtb
176*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
177*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
178*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
179*9880d681SAndroid Build Coastguard Worker  %4 = zext i8 %3 to i64
180*9880d681SAndroid Build Coastguard Worker  ret i64 %4
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_zext_i16_to_i64(i64 %a) {
184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i16_to_i64
185*9880d681SAndroid Build Coastguard Worker; CHECK:       ldurh w0, [x0, #-8]
186*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxth
187*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
188*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
189*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
190*9880d681SAndroid Build Coastguard Worker  %4 = zext i16 %3 to i64
191*9880d681SAndroid Build Coastguard Worker  ret i64 %4
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_zext_i32_to_i64(i64 %a) {
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_zext_i32_to_i64
196*9880d681SAndroid Build Coastguard Worker; CHECK:       ldur w0, [x0, #-8]
197*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtw
198*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
199*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
200*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
201*9880d681SAndroid Build Coastguard Worker  %4 = zext i32 %3 to i64
202*9880d681SAndroid Build Coastguard Worker  ret i64 %4
203*9880d681SAndroid Build Coastguard Worker}
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_sext_i8_to_i32(i64 %a) {
206*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i8_to_i32
207*9880d681SAndroid Build Coastguard Worker; CHECK:       ldursb w0, [x0, #-8]
208*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtb
209*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
210*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
211*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
212*9880d681SAndroid Build Coastguard Worker  %4 = sext i8 %3 to i32
213*9880d681SAndroid Build Coastguard Worker  ret i32 %4
214*9880d681SAndroid Build Coastguard Worker}
215*9880d681SAndroid Build Coastguard Worker
216*9880d681SAndroid Build Coastguard Workerdefine i32 @load_unscaled_sext_i16_to_i32(i64 %a) {
217*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i16_to_i32
218*9880d681SAndroid Build Coastguard Worker; CHECK:       ldursh w0, [x0, #-8]
219*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxth
220*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
221*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
222*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
223*9880d681SAndroid Build Coastguard Worker  %4 = sext i16 %3 to i32
224*9880d681SAndroid Build Coastguard Worker  ret i32 %4
225*9880d681SAndroid Build Coastguard Worker}
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_sext_i8_to_i64(i64 %a) {
228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i8_to_i64
229*9880d681SAndroid Build Coastguard Worker; CHECK:       ldursb x0, [x0, #-8]
230*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtb
231*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
232*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
233*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
234*9880d681SAndroid Build Coastguard Worker  %4 = sext i8 %3 to i64
235*9880d681SAndroid Build Coastguard Worker  ret i64 %4
236*9880d681SAndroid Build Coastguard Worker}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_sext_i16_to_i64(i64 %a) {
239*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i16_to_i64
240*9880d681SAndroid Build Coastguard Worker; CHECK:       ldursh x0, [x0, #-8]
241*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxth
242*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
243*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
244*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
245*9880d681SAndroid Build Coastguard Worker  %4 = sext i16 %3 to i64
246*9880d681SAndroid Build Coastguard Worker  ret i64 %4
247*9880d681SAndroid Build Coastguard Worker}
248*9880d681SAndroid Build Coastguard Worker
249*9880d681SAndroid Build Coastguard Workerdefine i64 @load_unscaled_sext_i32_to_i64(i64 %a) {
250*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_unscaled_sext_i32_to_i64
251*9880d681SAndroid Build Coastguard Worker; CHECK:       ldursw x0, [x0, #-8]
252*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtw
253*9880d681SAndroid Build Coastguard Worker  %1 = sub i64 %a, 8
254*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
255*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
256*9880d681SAndroid Build Coastguard Worker  %4 = sext i32 %3 to i64
257*9880d681SAndroid Build Coastguard Worker  ret i64 %4
258*9880d681SAndroid Build Coastguard Worker}
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker; Register
261*9880d681SAndroid Build Coastguard Workerdefine i32 @load_register_zext_i8_to_i32(i64 %a, i64 %b) {
262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_zext_i8_to_i32
263*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrb w0, [x0, x1]
264*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtb
265*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
266*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
267*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
268*9880d681SAndroid Build Coastguard Worker  %4 = zext i8 %3 to i32
269*9880d681SAndroid Build Coastguard Worker  ret i32 %4
270*9880d681SAndroid Build Coastguard Worker}
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Workerdefine i32 @load_register_zext_i16_to_i32(i64 %a, i64 %b) {
273*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_zext_i16_to_i32
274*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrh w0, [x0, x1]
275*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxth
276*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
277*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
278*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
279*9880d681SAndroid Build Coastguard Worker  %4 = zext i16 %3 to i32
280*9880d681SAndroid Build Coastguard Worker  ret i32 %4
281*9880d681SAndroid Build Coastguard Worker}
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Workerdefine i64 @load_register_zext_i8_to_i64(i64 %a, i64 %b) {
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_zext_i8_to_i64
285*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrb w0, [x0, x1]
286*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtb
287*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
288*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
289*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
290*9880d681SAndroid Build Coastguard Worker  %4 = zext i8 %3 to i64
291*9880d681SAndroid Build Coastguard Worker  ret i64 %4
292*9880d681SAndroid Build Coastguard Worker}
293*9880d681SAndroid Build Coastguard Worker
294*9880d681SAndroid Build Coastguard Workerdefine i64 @load_register_zext_i16_to_i64(i64 %a, i64 %b) {
295*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_zext_i16_to_i64
296*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrh w0, [x0, x1]
297*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxth
298*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
299*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
300*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
301*9880d681SAndroid Build Coastguard Worker  %4 = zext i16 %3 to i64
302*9880d681SAndroid Build Coastguard Worker  ret i64 %4
303*9880d681SAndroid Build Coastguard Worker}
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Workerdefine i64 @load_register_zext_i32_to_i64(i64 %a, i64 %b) {
306*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_zext_i32_to_i64
307*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr w0, [x0, x1]
308*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtw
309*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
310*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
311*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
312*9880d681SAndroid Build Coastguard Worker  %4 = zext i32 %3 to i64
313*9880d681SAndroid Build Coastguard Worker  ret i64 %4
314*9880d681SAndroid Build Coastguard Worker}
315*9880d681SAndroid Build Coastguard Worker
316*9880d681SAndroid Build Coastguard Workerdefine i32 @load_register_sext_i8_to_i32(i64 %a, i64 %b) {
317*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_sext_i8_to_i32
318*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsb w0, [x0, x1]
319*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtb
320*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
321*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
322*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
323*9880d681SAndroid Build Coastguard Worker  %4 = sext i8 %3 to i32
324*9880d681SAndroid Build Coastguard Worker  ret i32 %4
325*9880d681SAndroid Build Coastguard Worker}
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Workerdefine i32 @load_register_sext_i16_to_i32(i64 %a, i64 %b) {
328*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_sext_i16_to_i32
329*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsh w0, [x0, x1]
330*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxth
331*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
332*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
333*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
334*9880d681SAndroid Build Coastguard Worker  %4 = sext i16 %3 to i32
335*9880d681SAndroid Build Coastguard Worker  ret i32 %4
336*9880d681SAndroid Build Coastguard Worker}
337*9880d681SAndroid Build Coastguard Worker
338*9880d681SAndroid Build Coastguard Workerdefine i64 @load_register_sext_i8_to_i64(i64 %a, i64 %b) {
339*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_sext_i8_to_i64
340*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsb x0, [x0, x1]
341*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtb
342*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
343*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i8*
344*9880d681SAndroid Build Coastguard Worker  %3 = load i8, i8* %2
345*9880d681SAndroid Build Coastguard Worker  %4 = sext i8 %3 to i64
346*9880d681SAndroid Build Coastguard Worker  ret i64 %4
347*9880d681SAndroid Build Coastguard Worker}
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Workerdefine i64 @load_register_sext_i16_to_i64(i64 %a, i64 %b) {
350*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_sext_i16_to_i64
351*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsh x0, [x0, x1]
352*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxth
353*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
354*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i16*
355*9880d681SAndroid Build Coastguard Worker  %3 = load i16, i16* %2
356*9880d681SAndroid Build Coastguard Worker  %4 = sext i16 %3 to i64
357*9880d681SAndroid Build Coastguard Worker  ret i64 %4
358*9880d681SAndroid Build Coastguard Worker}
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Workerdefine i64 @load_register_sext_i32_to_i64(i64 %a, i64 %b) {
361*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_register_sext_i32_to_i64
362*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsw x0, [x0, x1]
363*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtw
364*9880d681SAndroid Build Coastguard Worker  %1 = add i64 %a, %b
365*9880d681SAndroid Build Coastguard Worker  %2 = inttoptr i64 %1 to i32*
366*9880d681SAndroid Build Coastguard Worker  %3 = load i32, i32* %2
367*9880d681SAndroid Build Coastguard Worker  %4 = sext i32 %3 to i64
368*9880d681SAndroid Build Coastguard Worker  ret i64 %4
369*9880d681SAndroid Build Coastguard Worker}
370*9880d681SAndroid Build Coastguard Worker
371*9880d681SAndroid Build Coastguard Worker; Extend
372*9880d681SAndroid Build Coastguard Workerdefine i32 @load_extend_zext_i8_to_i32(i64 %a, i32 %b) {
373*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_zext_i8_to_i32
374*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrb w0, [x0, w1, sxtw]
375*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtb
376*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
377*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
378*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i8*
379*9880d681SAndroid Build Coastguard Worker  %4 = load i8, i8* %3
380*9880d681SAndroid Build Coastguard Worker  %5 = zext i8 %4 to i32
381*9880d681SAndroid Build Coastguard Worker  ret i32 %5
382*9880d681SAndroid Build Coastguard Worker}
383*9880d681SAndroid Build Coastguard Worker
384*9880d681SAndroid Build Coastguard Workerdefine i32 @load_extend_zext_i16_to_i32(i64 %a, i32 %b) {
385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_zext_i16_to_i32
386*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrh w0, [x0, w1, sxtw]
387*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxth
388*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
389*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
390*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i16*
391*9880d681SAndroid Build Coastguard Worker  %4 = load i16, i16* %3
392*9880d681SAndroid Build Coastguard Worker  %5 = zext i16 %4 to i32
393*9880d681SAndroid Build Coastguard Worker  ret i32 %5
394*9880d681SAndroid Build Coastguard Worker}
395*9880d681SAndroid Build Coastguard Worker
396*9880d681SAndroid Build Coastguard Workerdefine i64 @load_extend_zext_i8_to_i64(i64 %a, i32 %b) {
397*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_zext_i8_to_i64
398*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrb w0, [x0, w1, sxtw]
399*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtb
400*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
401*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
402*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i8*
403*9880d681SAndroid Build Coastguard Worker  %4 = load i8, i8* %3
404*9880d681SAndroid Build Coastguard Worker  %5 = zext i8 %4 to i64
405*9880d681SAndroid Build Coastguard Worker  ret i64 %5
406*9880d681SAndroid Build Coastguard Worker}
407*9880d681SAndroid Build Coastguard Worker
408*9880d681SAndroid Build Coastguard Workerdefine i64 @load_extend_zext_i16_to_i64(i64 %a, i32 %b) {
409*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_zext_i16_to_i64
410*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrh w0, [x0, w1, sxtw]
411*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxth
412*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
413*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
414*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i16*
415*9880d681SAndroid Build Coastguard Worker  %4 = load i16, i16* %3
416*9880d681SAndroid Build Coastguard Worker  %5 = zext i16 %4 to i64
417*9880d681SAndroid Build Coastguard Worker  ret i64 %5
418*9880d681SAndroid Build Coastguard Worker}
419*9880d681SAndroid Build Coastguard Worker
420*9880d681SAndroid Build Coastguard Workerdefine i64 @load_extend_zext_i32_to_i64(i64 %a, i32 %b) {
421*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_zext_i32_to_i64
422*9880d681SAndroid Build Coastguard Worker; CHECK:       ldr w0, [x0, w1, sxtw]
423*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   uxtw
424*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
425*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
426*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i32*
427*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %3
428*9880d681SAndroid Build Coastguard Worker  %5 = zext i32 %4 to i64
429*9880d681SAndroid Build Coastguard Worker  ret i64 %5
430*9880d681SAndroid Build Coastguard Worker}
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Workerdefine i32 @load_extend_sext_i8_to_i32(i64 %a, i32 %b) {
433*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_sext_i8_to_i32
434*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsb w0, [x0, w1, sxtw]
435*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtb
436*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
437*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
438*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i8*
439*9880d681SAndroid Build Coastguard Worker  %4 = load i8, i8* %3
440*9880d681SAndroid Build Coastguard Worker  %5 = sext i8 %4 to i32
441*9880d681SAndroid Build Coastguard Worker  ret i32 %5
442*9880d681SAndroid Build Coastguard Worker}
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Workerdefine i32 @load_extend_sext_i16_to_i32(i64 %a, i32 %b) {
445*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_sext_i16_to_i32
446*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsh w0, [x0, w1, sxtw]
447*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxth
448*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
449*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
450*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i16*
451*9880d681SAndroid Build Coastguard Worker  %4 = load i16, i16* %3
452*9880d681SAndroid Build Coastguard Worker  %5 = sext i16 %4 to i32
453*9880d681SAndroid Build Coastguard Worker  ret i32 %5
454*9880d681SAndroid Build Coastguard Worker}
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Workerdefine i64 @load_extend_sext_i8_to_i64(i64 %a, i32 %b) {
457*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_sext_i8_to_i64
458*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsb x0, [x0, w1, sxtw]
459*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtb
460*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
461*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
462*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i8*
463*9880d681SAndroid Build Coastguard Worker  %4 = load i8, i8* %3
464*9880d681SAndroid Build Coastguard Worker  %5 = sext i8 %4 to i64
465*9880d681SAndroid Build Coastguard Worker  ret i64 %5
466*9880d681SAndroid Build Coastguard Worker}
467*9880d681SAndroid Build Coastguard Worker
468*9880d681SAndroid Build Coastguard Workerdefine i64 @load_extend_sext_i16_to_i64(i64 %a, i32 %b) {
469*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_sext_i16_to_i64
470*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsh x0, [x0, w1, sxtw]
471*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxth
472*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
473*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
474*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i16*
475*9880d681SAndroid Build Coastguard Worker  %4 = load i16, i16* %3
476*9880d681SAndroid Build Coastguard Worker  %5 = sext i16 %4 to i64
477*9880d681SAndroid Build Coastguard Worker  ret i64 %5
478*9880d681SAndroid Build Coastguard Worker}
479*9880d681SAndroid Build Coastguard Worker
480*9880d681SAndroid Build Coastguard Workerdefine i64 @load_extend_sext_i32_to_i64(i64 %a, i32 %b) {
481*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: load_extend_sext_i32_to_i64
482*9880d681SAndroid Build Coastguard Worker; CHECK:       ldrsw x0, [x0, w1, sxtw]
483*9880d681SAndroid Build Coastguard Worker; CHECK-NOT:   sxtw
484*9880d681SAndroid Build Coastguard Worker  %1 = sext i32 %b to i64
485*9880d681SAndroid Build Coastguard Worker  %2 = add i64 %a, %1
486*9880d681SAndroid Build Coastguard Worker  %3 = inttoptr i64 %2 to i32*
487*9880d681SAndroid Build Coastguard Worker  %4 = load i32, i32* %3
488*9880d681SAndroid Build Coastguard Worker  %5 = sext i32 %4 to i64
489*9880d681SAndroid Build Coastguard Worker  ret i64 %5
490*9880d681SAndroid Build Coastguard Worker}
491*9880d681SAndroid Build Coastguard Worker
492