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