xref: /aosp_15_r20/external/llvm/test/CodeGen/ARM/load.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv6m-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T1
2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=thumbv7m-eabi %s -o - | FileCheck %s -check-prefix=CHECK -check-prefix=CHECK-T2
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; Register offset
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsb_rr
8*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrsb   r0, [r0, r1]
9*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsb_rr(i8* %p, i32 %n) {
10*9880d681SAndroid Build Coastguard Workerentry:
11*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 %n
12*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1
13*9880d681SAndroid Build Coastguard Worker  %conv = sext i8 %0 to i32
14*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsh_rr
18*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #1
19*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrsh   r0, [r0, r1]
20*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsh.w r0, [r0, r1, lsl #1]
21*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsh_rr(i16* %p, i32 %n) {
22*9880d681SAndroid Build Coastguard Workerentry:
23*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 %n
24*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %arrayidx, align 2
25*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %0 to i32
26*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrb_rr
30*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrb r0, [r0, r1]
31*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrb_rr(i8* %p, i32 %n) {
32*9880d681SAndroid Build Coastguard Workerentry:
33*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 %n
34*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1
35*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %0 to i32
36*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
37*9880d681SAndroid Build Coastguard Worker}
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrh_rr
40*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #1
41*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrh    r0, [r0, r1]
42*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrh.w  r0, [r0, r1, lsl #1]
43*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrh_rr(i16* %p, i32 %n) {
44*9880d681SAndroid Build Coastguard Workerentry:
45*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 %n
46*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %arrayidx, align 2
47*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %0 to i32
48*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_rr
52*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #2
53*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r0, [r0, r1]
54*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldr.w   r0, [r0, r1, lsl #2]
55*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_rr(i32* %p, i32 %n) {
56*9880d681SAndroid Build Coastguard Workerentry:
57*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %n
58*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
59*9880d681SAndroid Build Coastguard Worker  ret i32 %0
60*9880d681SAndroid Build Coastguard Worker}
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strb_rr
63*9880d681SAndroid Build Coastguard Worker; CHECK:    strb    r2, [r0, r1]
64*9880d681SAndroid Build Coastguard Workerdefine void @strb_rr(i8* %p, i32 %n, i32 %x) {
65*9880d681SAndroid Build Coastguard Workerentry:
66*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i8
67*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 %n
68*9880d681SAndroid Build Coastguard Worker  store i8 %conv, i8* %arrayidx, align 1
69*9880d681SAndroid Build Coastguard Worker  ret void
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strh_rr
73*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #1
74*9880d681SAndroid Build Coastguard Worker; CHECK-T1: strh    r2, [r0, r1]
75*9880d681SAndroid Build Coastguard Worker; CHECK-T2: strh.w  r2, [r0, r1, lsl #1]
76*9880d681SAndroid Build Coastguard Workerdefine void @strh_rr(i16* %p, i32 %n, i32 %x) {
77*9880d681SAndroid Build Coastguard Workerentry:
78*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i16
79*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 %n
80*9880d681SAndroid Build Coastguard Worker  store i16 %conv, i16* %arrayidx, align 2
81*9880d681SAndroid Build Coastguard Worker  ret void
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: str_rr
85*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #2
86*9880d681SAndroid Build Coastguard Worker; CHECK-T1: str     r2, [r0, r1]
87*9880d681SAndroid Build Coastguard Worker; CHECK-T2: str.w   r2, [r0, r1, lsl #2]
88*9880d681SAndroid Build Coastguard Workerdefine void @str_rr(i32* %p, i32 %n, i32 %x) {
89*9880d681SAndroid Build Coastguard Workerentry:
90*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i32 %n
91*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32* %arrayidx, align 4
92*9880d681SAndroid Build Coastguard Worker  ret void
93*9880d681SAndroid Build Coastguard Worker}
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Worker; Immediate offset of zero
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsb_ri_zero
99*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrb    r0, [r0]
100*9880d681SAndroid Build Coastguard Worker; CHECK-T1: sxtb    r0, r0
101*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsb.w r0, [r0]
102*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsb_ri_zero(i8* %p) {
103*9880d681SAndroid Build Coastguard Workerentry:
104*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %p, align 1
105*9880d681SAndroid Build Coastguard Worker  %conv = sext i8 %0 to i32
106*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsh_ri_zero
110*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrh    r0, [r0]
111*9880d681SAndroid Build Coastguard Worker; CHECK-T1: sxth    r0, r0
112*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsh.w r0, [r0]
113*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsh_ri_zero(i16* %p) {
114*9880d681SAndroid Build Coastguard Workerentry:
115*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %p, align 2
116*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %0 to i32
117*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrb_ri_zero
121*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrb    r0, [r0]
122*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrb_ri_zero(i8* %p) {
123*9880d681SAndroid Build Coastguard Workerentry:
124*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %p, align 1
125*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %0 to i32
126*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrh_ri_zero
130*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrh    r0, [r0]
131*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrh_ri_zero(i16* %p) {
132*9880d681SAndroid Build Coastguard Workerentry:
133*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %p, align 2
134*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %0 to i32
135*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_ri_zero
139*9880d681SAndroid Build Coastguard Worker; CHECK:    ldr     r0, [r0]
140*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_ri_zero(i32* %p) {
141*9880d681SAndroid Build Coastguard Workerentry:
142*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %p, align 4
143*9880d681SAndroid Build Coastguard Worker  ret i32 %0
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strb_ri_zero
147*9880d681SAndroid Build Coastguard Worker; CHECK:    strb    r1, [r0]
148*9880d681SAndroid Build Coastguard Workerdefine void @strb_ri_zero(i8* %p, i32 %x) {
149*9880d681SAndroid Build Coastguard Workerentry:
150*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i8
151*9880d681SAndroid Build Coastguard Worker  store i8 %conv, i8* %p, align 1
152*9880d681SAndroid Build Coastguard Worker  ret void
153*9880d681SAndroid Build Coastguard Worker}
154*9880d681SAndroid Build Coastguard Worker
155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strh_ri_zero
156*9880d681SAndroid Build Coastguard Worker; CHECK:    strh    r1, [r0]
157*9880d681SAndroid Build Coastguard Workerdefine void @strh_ri_zero(i16* %p, i32 %x) {
158*9880d681SAndroid Build Coastguard Workerentry:
159*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i16
160*9880d681SAndroid Build Coastguard Worker  store i16 %conv, i16* %p, align 2
161*9880d681SAndroid Build Coastguard Worker  ret void
162*9880d681SAndroid Build Coastguard Worker}
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: str_ri_zero
165*9880d681SAndroid Build Coastguard Worker; CHECK:    str     r1, [r0]
166*9880d681SAndroid Build Coastguard Workerdefine void @str_ri_zero(i32* %p, i32 %x) {
167*9880d681SAndroid Build Coastguard Workerentry:
168*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32* %p, align 4
169*9880d681SAndroid Build Coastguard Worker  ret void
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker; Maximum Thumb-1 immediate offset
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsb_ri_t1_max
176*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #31
177*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrsb   r0, [r0, r1]
178*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsb.w r0, [r0, #31]
179*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsb_ri_t1_max(i8* %p) {
180*9880d681SAndroid Build Coastguard Workerentry:
181*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 31
182*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1
183*9880d681SAndroid Build Coastguard Worker  %conv = sext i8 %0 to i32
184*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
185*9880d681SAndroid Build Coastguard Worker}
186*9880d681SAndroid Build Coastguard Worker
187*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsh_ri_t1_max
188*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #62
189*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrsh   r0, [r0, r1]
190*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsh.w r0, [r0, #62]
191*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsh_ri_t1_max(i16* %p) {
192*9880d681SAndroid Build Coastguard Workerentry:
193*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 31
194*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %arrayidx, align 2
195*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %0 to i32
196*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
197*9880d681SAndroid Build Coastguard Worker}
198*9880d681SAndroid Build Coastguard Worker
199*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrb_ri_t1_max
200*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrb    r0, [r0, #31]
201*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrb_ri_t1_max(i8* %p) {
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 31
204*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1
205*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %0 to i32
206*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrh_ri_t1_max
210*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrh    r0, [r0, #62]
211*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrh_ri_t1_max(i16* %p) {
212*9880d681SAndroid Build Coastguard Workerentry:
213*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 31
214*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %arrayidx, align 2
215*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %0 to i32
216*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
217*9880d681SAndroid Build Coastguard Worker}
218*9880d681SAndroid Build Coastguard Worker
219*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_ri_t1_max
220*9880d681SAndroid Build Coastguard Worker; CHECK:    ldr     r0, [r0, #124]
221*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_ri_t1_max(i32* %p) {
222*9880d681SAndroid Build Coastguard Workerentry:
223*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i32 31
224*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
225*9880d681SAndroid Build Coastguard Worker  ret i32 %0
226*9880d681SAndroid Build Coastguard Worker}
227*9880d681SAndroid Build Coastguard Worker
228*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strb_ri_t1_max
229*9880d681SAndroid Build Coastguard Worker; CHECK:    strb    r1, [r0, #31]
230*9880d681SAndroid Build Coastguard Workerdefine void @strb_ri_t1_max(i8* %p, i32 %x) {
231*9880d681SAndroid Build Coastguard Workerentry:
232*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i8
233*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 31
234*9880d681SAndroid Build Coastguard Worker  store i8 %conv, i8* %arrayidx, align 1
235*9880d681SAndroid Build Coastguard Worker  ret void
236*9880d681SAndroid Build Coastguard Worker}
237*9880d681SAndroid Build Coastguard Worker
238*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strh_ri_t1_max
239*9880d681SAndroid Build Coastguard Worker; CHECK:    strh    r1, [r0, #62]
240*9880d681SAndroid Build Coastguard Workerdefine void @strh_ri_t1_max(i16* %p, i32 %x) {
241*9880d681SAndroid Build Coastguard Workerentry:
242*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i16
243*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 31
244*9880d681SAndroid Build Coastguard Worker  store i16 %conv, i16* %arrayidx, align 2
245*9880d681SAndroid Build Coastguard Worker  ret void
246*9880d681SAndroid Build Coastguard Worker}
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: str_ri_t1_max
249*9880d681SAndroid Build Coastguard Worker; CHECK:    str     r1, [r0, #124]
250*9880d681SAndroid Build Coastguard Workerdefine void @str_ri_t1_max(i32* %p, i32 %x) {
251*9880d681SAndroid Build Coastguard Workerentry:
252*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i32 31
253*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32* %arrayidx, align 4
254*9880d681SAndroid Build Coastguard Worker  ret void
255*9880d681SAndroid Build Coastguard Worker}
256*9880d681SAndroid Build Coastguard Worker
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker; One past maximum Thumb-1 immediate offset
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsb_ri_t1_too_big
261*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #32
262*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrsb   r0, [r0, r1]
263*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsb.w r0, [r0, #32]
264*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsb_ri_t1_too_big(i8* %p) {
265*9880d681SAndroid Build Coastguard Workerentry:
266*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 32
267*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1
268*9880d681SAndroid Build Coastguard Worker  %conv = sext i8 %0 to i32
269*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
270*9880d681SAndroid Build Coastguard Worker}
271*9880d681SAndroid Build Coastguard Worker
272*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsh_ri_t1_too_big
273*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #64
274*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrsh   r0, [r0, r1]
275*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsh.w r0, [r0, #64]
276*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsh_ri_t1_too_big(i16* %p) {
277*9880d681SAndroid Build Coastguard Workerentry:
278*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 32
279*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %arrayidx, align 2
280*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %0 to i32
281*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
282*9880d681SAndroid Build Coastguard Worker}
283*9880d681SAndroid Build Coastguard Worker
284*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrb_ri_t1_too_big
285*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #32
286*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrb    r0, [r0, r1]
287*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrb.w  r0, [r0, #32]
288*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrb_ri_t1_too_big(i8* %p) {
289*9880d681SAndroid Build Coastguard Workerentry:
290*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 32
291*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %arrayidx, align 1
292*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %0 to i32
293*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
294*9880d681SAndroid Build Coastguard Worker}
295*9880d681SAndroid Build Coastguard Worker
296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrh_ri_t1_too_big
297*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #64
298*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrh    r0, [r0, r1]
299*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrh.w  r0, [r0, #64]
300*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrh_ri_t1_too_big(i16* %p) {
301*9880d681SAndroid Build Coastguard Workerentry:
302*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 32
303*9880d681SAndroid Build Coastguard Worker  %0 = load i16, i16* %arrayidx, align 2
304*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %0 to i32
305*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
306*9880d681SAndroid Build Coastguard Worker}
307*9880d681SAndroid Build Coastguard Worker
308*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_ri_t1_too_big
309*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #128
310*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r0, [r0, r1]
311*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldr.w   r0, [r0, #128]
312*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_ri_t1_too_big(i32* %p) {
313*9880d681SAndroid Build Coastguard Workerentry:
314*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i32 32
315*9880d681SAndroid Build Coastguard Worker  %0 = load i32, i32* %arrayidx, align 4
316*9880d681SAndroid Build Coastguard Worker  ret i32 %0
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strb_ri_t1_too_big
320*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r2, #32
321*9880d681SAndroid Build Coastguard Worker; CHECK-T1: strb    r1, [r0, r2]
322*9880d681SAndroid Build Coastguard Worker; CHECK-T2: strb.w  r1, [r0, #32]
323*9880d681SAndroid Build Coastguard Workerdefine void @strb_ri_t1_too_big(i8* %p, i32 %x) {
324*9880d681SAndroid Build Coastguard Workerentry:
325*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i8
326*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i8, i8* %p, i32 32
327*9880d681SAndroid Build Coastguard Worker  store i8 %conv, i8* %arrayidx, align 1
328*9880d681SAndroid Build Coastguard Worker  ret void
329*9880d681SAndroid Build Coastguard Worker}
330*9880d681SAndroid Build Coastguard Worker
331*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strh_ri_t1_too_big
332*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r2, #64
333*9880d681SAndroid Build Coastguard Worker; CHECK-T1: strh    r1, [r0, r2]
334*9880d681SAndroid Build Coastguard Worker; CHECK-T2: strh.w  r1, [r0, #64]
335*9880d681SAndroid Build Coastguard Workerdefine void @strh_ri_t1_too_big(i16* %p, i32 %x) {
336*9880d681SAndroid Build Coastguard Workerentry:
337*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i16
338*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %p, i32 32
339*9880d681SAndroid Build Coastguard Worker  store i16 %conv, i16* %arrayidx, align 2
340*9880d681SAndroid Build Coastguard Worker  ret void
341*9880d681SAndroid Build Coastguard Worker}
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: str_ri_t1_too_big
344*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r2, #128
345*9880d681SAndroid Build Coastguard Worker; CHECK-T1: str     r1, [r0, r2]
346*9880d681SAndroid Build Coastguard Worker; CHECK-T2: str.w   r1, [r0, #128]
347*9880d681SAndroid Build Coastguard Workerdefine void @str_ri_t1_too_big(i32* %p, i32 %x) {
348*9880d681SAndroid Build Coastguard Workerentry:
349*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i32, i32* %p, i32 32
350*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32* %arrayidx, align 4
351*9880d681SAndroid Build Coastguard Worker  ret void
352*9880d681SAndroid Build Coastguard Worker}
353*9880d681SAndroid Build Coastguard Worker
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker; Maximum Thumb-2 immediate offset
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsb_ri_t2_max
358*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r1, .LCP
359*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrsb   r0, [r0, r1]
360*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsb.w r0, [r0, #4095]
361*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsb_ri_t2_max(i8* %p) {
362*9880d681SAndroid Build Coastguard Workerentry:
363*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
364*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %add.ptr, align 1
365*9880d681SAndroid Build Coastguard Worker  %conv = sext i8 %0 to i32
366*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
367*9880d681SAndroid Build Coastguard Worker}
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsh_ri_t2_max
370*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r1, .LCP
371*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrsh   r0, [r0, r1]
372*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrsh.w r0, [r0, #4095]
373*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsh_ri_t2_max(i8* %p) {
374*9880d681SAndroid Build Coastguard Workerentry:
375*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
376*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i16*
377*9880d681SAndroid Build Coastguard Worker  %1 = load i16, i16* %0, align 2
378*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %1 to i32
379*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
380*9880d681SAndroid Build Coastguard Worker}
381*9880d681SAndroid Build Coastguard Worker
382*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrb_ri_t2_max
383*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r1, .LCP
384*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrb    r0, [r0, r1]
385*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrb.w  r0, [r0, #4095]
386*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrb_ri_t2_max(i8* %p) {
387*9880d681SAndroid Build Coastguard Workerentry:
388*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
389*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %add.ptr, align 1
390*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %0 to i32
391*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
392*9880d681SAndroid Build Coastguard Worker}
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrh_ri_t2_max
395*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r1, .LCP
396*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldrh    r0, [r0, r1]
397*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldrh.w  r0, [r0, #4095]
398*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrh_ri_t2_max(i8* %p) {
399*9880d681SAndroid Build Coastguard Workerentry:
400*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
401*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i16*
402*9880d681SAndroid Build Coastguard Worker  %1 = load i16, i16* %0, align 2
403*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %1 to i32
404*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
405*9880d681SAndroid Build Coastguard Worker}
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_ri_t2_max
408*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r1, .LCP
409*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r0, [r0, r1]
410*9880d681SAndroid Build Coastguard Worker; CHECK-T2: ldr.w   r0, [r0, #4095]
411*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_ri_t2_max(i8* %p) {
412*9880d681SAndroid Build Coastguard Workerentry:
413*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
414*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i32*
415*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %0, align 4
416*9880d681SAndroid Build Coastguard Worker  ret i32 %1
417*9880d681SAndroid Build Coastguard Worker}
418*9880d681SAndroid Build Coastguard Worker
419*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strb_ri_t2_max
420*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r2, .LCP
421*9880d681SAndroid Build Coastguard Worker; CHECK-T1: strb    r1, [r0, r2]
422*9880d681SAndroid Build Coastguard Worker; CHECK-T2: strb.w  r1, [r0, #4095]
423*9880d681SAndroid Build Coastguard Workerdefine void @strb_ri_t2_max(i8* %p, i32 %x) {
424*9880d681SAndroid Build Coastguard Workerentry:
425*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i8
426*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
427*9880d681SAndroid Build Coastguard Worker  store i8 %conv, i8* %add.ptr, align 1
428*9880d681SAndroid Build Coastguard Worker  ret void
429*9880d681SAndroid Build Coastguard Worker}
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strh_ri_t2_max
432*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r2, .LCP
433*9880d681SAndroid Build Coastguard Worker; CHECK-T1: strh    r1, [r0, r2]
434*9880d681SAndroid Build Coastguard Worker; CHECK-T2: strh.w  r1, [r0, #4095]
435*9880d681SAndroid Build Coastguard Workerdefine void @strh_ri_t2_max(i8* %p, i32 %x) {
436*9880d681SAndroid Build Coastguard Workerentry:
437*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i16
438*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
439*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i16*
440*9880d681SAndroid Build Coastguard Worker  store i16 %conv, i16* %0, align 2
441*9880d681SAndroid Build Coastguard Worker  ret void
442*9880d681SAndroid Build Coastguard Worker}
443*9880d681SAndroid Build Coastguard Worker
444*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: str_ri_t2_max
445*9880d681SAndroid Build Coastguard Worker; CHECK-T1: ldr     r2, .LCP
446*9880d681SAndroid Build Coastguard Worker; CHECK-T1: str     r1, [r0, r2]
447*9880d681SAndroid Build Coastguard Worker; CHECK-T2: str.w   r1, [r0, #4095]
448*9880d681SAndroid Build Coastguard Workerdefine void @str_ri_t2_max(i8* %p, i32 %x) {
449*9880d681SAndroid Build Coastguard Workerentry:
450*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4095
451*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i32*
452*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32* %0, align 4
453*9880d681SAndroid Build Coastguard Worker  ret void
454*9880d681SAndroid Build Coastguard Worker}
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Worker
457*9880d681SAndroid Build Coastguard Worker; One past maximum Thumb-2 immediate offset
458*9880d681SAndroid Build Coastguard Worker
459*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsb_ri_t2_too_big
460*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #1
461*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #12
462*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r1, #4096
463*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrsb   r0, [r0, r1]
464*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsb_ri_t2_too_big(i8* %p) {
465*9880d681SAndroid Build Coastguard Workerentry:
466*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
467*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %add.ptr, align 1
468*9880d681SAndroid Build Coastguard Worker  %conv = sext i8 %0 to i32
469*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
470*9880d681SAndroid Build Coastguard Worker}
471*9880d681SAndroid Build Coastguard Worker
472*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrsh_ri_t2_too_big
473*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #1
474*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #12
475*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r1, #4096
476*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrsh   r0, [r0, r1]
477*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrsh_ri_t2_too_big(i8* %p) {
478*9880d681SAndroid Build Coastguard Workerentry:
479*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
480*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i16*
481*9880d681SAndroid Build Coastguard Worker  %1 = load i16, i16* %0, align 2
482*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %1 to i32
483*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
484*9880d681SAndroid Build Coastguard Worker}
485*9880d681SAndroid Build Coastguard Worker
486*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrb_ri_t2_too_big
487*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #1
488*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #12
489*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r1, #4096
490*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrb    r0, [r0, r1]
491*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrb_ri_t2_too_big(i8* %p) {
492*9880d681SAndroid Build Coastguard Workerentry:
493*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
494*9880d681SAndroid Build Coastguard Worker  %0 = load i8, i8* %add.ptr, align 1
495*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %0 to i32
496*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
497*9880d681SAndroid Build Coastguard Worker}
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldrh_ri_t2_too_big
500*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #1
501*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #12
502*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r1, #4096
503*9880d681SAndroid Build Coastguard Worker; CHECK:    ldrh    r0, [r0, r1]
504*9880d681SAndroid Build Coastguard Workerdefine i32 @ldrh_ri_t2_too_big(i8* %p) {
505*9880d681SAndroid Build Coastguard Workerentry:
506*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
507*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i16*
508*9880d681SAndroid Build Coastguard Worker  %1 = load i16, i16* %0, align 2
509*9880d681SAndroid Build Coastguard Worker  %conv = zext i16 %1 to i32
510*9880d681SAndroid Build Coastguard Worker  ret i32 %conv
511*9880d681SAndroid Build Coastguard Worker}
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: ldr_ri_t2_too_big
514*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r1, #1
515*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r1, r1, #12
516*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r1, #4096
517*9880d681SAndroid Build Coastguard Worker; CHECK:    ldr     r0, [r0, r1]
518*9880d681SAndroid Build Coastguard Workerdefine i32 @ldr_ri_t2_too_big(i8* %p) {
519*9880d681SAndroid Build Coastguard Workerentry:
520*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
521*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i32*
522*9880d681SAndroid Build Coastguard Worker  %1 = load i32, i32* %0, align 4
523*9880d681SAndroid Build Coastguard Worker  ret i32 %1
524*9880d681SAndroid Build Coastguard Worker}
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strb_ri_t2_too_big
527*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r2, #1
528*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r2, r2, #12
529*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r2, #4096
530*9880d681SAndroid Build Coastguard Worker; CHECK:    strb    r1, [r0, r2]
531*9880d681SAndroid Build Coastguard Workerdefine void @strb_ri_t2_too_big(i8* %p, i32 %x) {
532*9880d681SAndroid Build Coastguard Workerentry:
533*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i8
534*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
535*9880d681SAndroid Build Coastguard Worker  store i8 %conv, i8* %add.ptr, align 1
536*9880d681SAndroid Build Coastguard Worker  ret void
537*9880d681SAndroid Build Coastguard Worker}
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: strh_ri_t2_too_big
540*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r2, #1
541*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r2, r2, #12
542*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r2, #4096
543*9880d681SAndroid Build Coastguard Worker; CHECK:    strh    r1, [r0, r2]
544*9880d681SAndroid Build Coastguard Workerdefine void @strh_ri_t2_too_big(i8* %p, i32 %x) {
545*9880d681SAndroid Build Coastguard Workerentry:
546*9880d681SAndroid Build Coastguard Worker  %conv = trunc i32 %x to i16
547*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
548*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i16*
549*9880d681SAndroid Build Coastguard Worker  store i16 %conv, i16* %0, align 2
550*9880d681SAndroid Build Coastguard Worker  ret void
551*9880d681SAndroid Build Coastguard Worker}
552*9880d681SAndroid Build Coastguard Worker
553*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: str_ri_t2_too_big
554*9880d681SAndroid Build Coastguard Worker; CHECK-T1: movs    r2, #1
555*9880d681SAndroid Build Coastguard Worker; CHECK-T1: lsls    r2, r2, #12
556*9880d681SAndroid Build Coastguard Worker; CHECK-T2: mov.w   r2, #4096
557*9880d681SAndroid Build Coastguard Worker; CHECK:    str     r1, [r0, r2]
558*9880d681SAndroid Build Coastguard Workerdefine void @str_ri_t2_too_big(i8* %p, i32 %x) {
559*9880d681SAndroid Build Coastguard Workerentry:
560*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %p, i32 4096
561*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %add.ptr to i32*
562*9880d681SAndroid Build Coastguard Worker  store i32 %x, i32* %0, align 4
563*9880d681SAndroid Build Coastguard Worker  ret void
564*9880d681SAndroid Build Coastguard Worker}
565