1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2 ; RUN: llc -mtriple=armv5e-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV5TE
3 ; RUN: llc -mtriple=thumbv6t2-arm-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-T2
4 ; RUN: llc -mtriple=armv4t-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV4T
5 ; RUN: llc -mtriple=armv7-arm-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV7
6 ; RUN: llc -mtriple=armv7-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV7-STRICT
7 ; RUN: llc -mtriple=armv6-arm-none-eabi %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV6
8 ; RUN: llc -mtriple=armv6-arm-none-eabi -mattr=+strict-align %s -o - | FileCheck %s --check-prefixes=CHECK-ARMV6-STRICT
10 @x = common dso_local global i64 0, align 8
11 @y = common dso_local global i64 0, align 8
13 @x_unaligned = common dso_local global i64 0, align 1
14 @y_unaligned = common dso_local global i64 0, align 1
16 @x_aligned_4 = common dso_local global i64 0, align 4
17 @y_aligned_4 = common dso_local global i64 0, align 4
20 ; CHECK-ARMV5TE-LABEL: test:
21 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
22 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI0_0
23 ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI0_1
24 ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0]
25 ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2]
26 ; CHECK-ARMV5TE-NEXT: bx lr
27 ; CHECK-ARMV5TE-NEXT: .p2align 2
28 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
29 ; CHECK-ARMV5TE-NEXT: .LCPI0_0:
30 ; CHECK-ARMV5TE-NEXT: .long x
31 ; CHECK-ARMV5TE-NEXT: .LCPI0_1:
32 ; CHECK-ARMV5TE-NEXT: .long y
34 ; CHECK-T2-LABEL: test:
35 ; CHECK-T2: @ %bb.0: @ %entry
36 ; CHECK-T2-NEXT: movw r0, :lower16:x
37 ; CHECK-T2-NEXT: movw r2, :lower16:y
38 ; CHECK-T2-NEXT: movt r0, :upper16:x
39 ; CHECK-T2-NEXT: movt r2, :upper16:y
40 ; CHECK-T2-NEXT: ldrd r0, r1, [r0]
41 ; CHECK-T2-NEXT: strd r0, r1, [r2]
42 ; CHECK-T2-NEXT: bx lr
44 ; CHECK-ARMV4T-LABEL: test:
45 ; CHECK-ARMV4T: @ %bb.0: @ %entry
46 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI0_0
47 ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI0_1
48 ; CHECK-ARMV4T-NEXT: ldr r1, [r0]
49 ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #4]
50 ; CHECK-ARMV4T-NEXT: str r0, [r2, #4]
51 ; CHECK-ARMV4T-NEXT: str r1, [r2]
52 ; CHECK-ARMV4T-NEXT: bx lr
53 ; CHECK-ARMV4T-NEXT: .p2align 2
54 ; CHECK-ARMV4T-NEXT: @ %bb.1:
55 ; CHECK-ARMV4T-NEXT: .LCPI0_0:
56 ; CHECK-ARMV4T-NEXT: .long x
57 ; CHECK-ARMV4T-NEXT: .LCPI0_1:
58 ; CHECK-ARMV4T-NEXT: .long y
60 ; CHECK-ARMV7-LABEL: test:
61 ; CHECK-ARMV7: @ %bb.0: @ %entry
62 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x
63 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y
64 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x
65 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y
66 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0]
67 ; CHECK-ARMV7-NEXT: strd r0, r1, [r2]
68 ; CHECK-ARMV7-NEXT: bx lr
70 ; CHECK-ARMV7-STRICT-LABEL: test:
71 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
72 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x
73 ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y
74 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x
75 ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y
76 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0]
77 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2]
78 ; CHECK-ARMV7-STRICT-NEXT: bx lr
80 ; CHECK-ARMV6-LABEL: test:
81 ; CHECK-ARMV6: @ %bb.0: @ %entry
82 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI0_0
83 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI0_1
84 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0]
85 ; CHECK-ARMV6-NEXT: strd r0, r1, [r2]
86 ; CHECK-ARMV6-NEXT: bx lr
87 ; CHECK-ARMV6-NEXT: .p2align 2
88 ; CHECK-ARMV6-NEXT: @ %bb.1:
89 ; CHECK-ARMV6-NEXT: .LCPI0_0:
90 ; CHECK-ARMV6-NEXT: .long x
91 ; CHECK-ARMV6-NEXT: .LCPI0_1:
92 ; CHECK-ARMV6-NEXT: .long y
94 ; CHECK-ARMV6-STRICT-LABEL: test:
95 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
96 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI0_0
97 ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI0_1
98 ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0]
99 ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2]
100 ; CHECK-ARMV6-STRICT-NEXT: bx lr
101 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
102 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
103 ; CHECK-ARMV6-STRICT-NEXT: .LCPI0_0:
104 ; CHECK-ARMV6-STRICT-NEXT: .long x
105 ; CHECK-ARMV6-STRICT-NEXT: .LCPI0_1:
106 ; CHECK-ARMV6-STRICT-NEXT: .long y
112 %0 = load volatile i64, ptr @x, align 8
113 store volatile i64 %0, ptr @y, align 8
117 define void @test_unaligned() {
118 ; CHECK-ARMV5TE-LABEL: test_unaligned:
119 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
120 ; CHECK-ARMV5TE-NEXT: .save {r4, r5, r6, lr}
121 ; CHECK-ARMV5TE-NEXT: push {r4, r5, r6, lr}
122 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI1_0
123 ; CHECK-ARMV5TE-NEXT: ldr r6, .LCPI1_1
124 ; CHECK-ARMV5TE-NEXT: mov r1, r0
125 ; CHECK-ARMV5TE-NEXT: ldrb lr, [r1, #4]!
126 ; CHECK-ARMV5TE-NEXT: ldrb r3, [r1, #2]
127 ; CHECK-ARMV5TE-NEXT: ldrb r12, [r1, #3]
128 ; CHECK-ARMV5TE-NEXT: ldrb r1, [r0]
129 ; CHECK-ARMV5TE-NEXT: ldrb r2, [r0, #1]
130 ; CHECK-ARMV5TE-NEXT: ldrb r4, [r0, #2]
131 ; CHECK-ARMV5TE-NEXT: ldrb r5, [r0, #3]
132 ; CHECK-ARMV5TE-NEXT: ldrb r0, [r0, #5]
133 ; CHECK-ARMV5TE-NEXT: strb r0, [r6, #5]
134 ; CHECK-ARMV5TE-NEXT: strb r4, [r6, #2]
135 ; CHECK-ARMV5TE-NEXT: strb r5, [r6, #3]
136 ; CHECK-ARMV5TE-NEXT: strb r1, [r6]
137 ; CHECK-ARMV5TE-NEXT: strb r2, [r6, #1]
138 ; CHECK-ARMV5TE-NEXT: strb lr, [r6, #4]!
139 ; CHECK-ARMV5TE-NEXT: strb r3, [r6, #2]
140 ; CHECK-ARMV5TE-NEXT: strb r12, [r6, #3]
141 ; CHECK-ARMV5TE-NEXT: pop {r4, r5, r6, pc}
142 ; CHECK-ARMV5TE-NEXT: .p2align 2
143 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
144 ; CHECK-ARMV5TE-NEXT: .LCPI1_0:
145 ; CHECK-ARMV5TE-NEXT: .long x_unaligned
146 ; CHECK-ARMV5TE-NEXT: .LCPI1_1:
147 ; CHECK-ARMV5TE-NEXT: .long y_unaligned
149 ; CHECK-T2-LABEL: test_unaligned:
150 ; CHECK-T2: @ %bb.0: @ %entry
151 ; CHECK-T2-NEXT: movw r0, :lower16:x_unaligned
152 ; CHECK-T2-NEXT: movw r2, :lower16:y_unaligned
153 ; CHECK-T2-NEXT: movt r0, :upper16:x_unaligned
154 ; CHECK-T2-NEXT: movt r2, :upper16:y_unaligned
155 ; CHECK-T2-NEXT: ldr r1, [r0]
156 ; CHECK-T2-NEXT: ldr r0, [r0, #4]
157 ; CHECK-T2-NEXT: str r0, [r2, #4]
158 ; CHECK-T2-NEXT: str r1, [r2]
159 ; CHECK-T2-NEXT: bx lr
161 ; CHECK-ARMV4T-LABEL: test_unaligned:
162 ; CHECK-ARMV4T: @ %bb.0: @ %entry
163 ; CHECK-ARMV4T-NEXT: .save {r4, r5, r6, lr}
164 ; CHECK-ARMV4T-NEXT: push {r4, r5, r6, lr}
165 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI1_0
166 ; CHECK-ARMV4T-NEXT: ldr r6, .LCPI1_1
167 ; CHECK-ARMV4T-NEXT: mov r1, r0
168 ; CHECK-ARMV4T-NEXT: ldrb lr, [r1, #4]!
169 ; CHECK-ARMV4T-NEXT: ldrb r3, [r1, #2]
170 ; CHECK-ARMV4T-NEXT: ldrb r12, [r1, #3]
171 ; CHECK-ARMV4T-NEXT: ldrb r1, [r0]
172 ; CHECK-ARMV4T-NEXT: ldrb r2, [r0, #1]
173 ; CHECK-ARMV4T-NEXT: ldrb r4, [r0, #2]
174 ; CHECK-ARMV4T-NEXT: ldrb r5, [r0, #3]
175 ; CHECK-ARMV4T-NEXT: ldrb r0, [r0, #5]
176 ; CHECK-ARMV4T-NEXT: strb r0, [r6, #5]
177 ; CHECK-ARMV4T-NEXT: strb r4, [r6, #2]
178 ; CHECK-ARMV4T-NEXT: strb r5, [r6, #3]
179 ; CHECK-ARMV4T-NEXT: strb r1, [r6]
180 ; CHECK-ARMV4T-NEXT: strb r2, [r6, #1]
181 ; CHECK-ARMV4T-NEXT: strb lr, [r6, #4]!
182 ; CHECK-ARMV4T-NEXT: strb r3, [r6, #2]
183 ; CHECK-ARMV4T-NEXT: strb r12, [r6, #3]
184 ; CHECK-ARMV4T-NEXT: pop {r4, r5, r6, lr}
185 ; CHECK-ARMV4T-NEXT: bx lr
186 ; CHECK-ARMV4T-NEXT: .p2align 2
187 ; CHECK-ARMV4T-NEXT: @ %bb.1:
188 ; CHECK-ARMV4T-NEXT: .LCPI1_0:
189 ; CHECK-ARMV4T-NEXT: .long x_unaligned
190 ; CHECK-ARMV4T-NEXT: .LCPI1_1:
191 ; CHECK-ARMV4T-NEXT: .long y_unaligned
193 ; CHECK-ARMV7-LABEL: test_unaligned:
194 ; CHECK-ARMV7: @ %bb.0: @ %entry
195 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x_unaligned
196 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y_unaligned
197 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x_unaligned
198 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y_unaligned
199 ; CHECK-ARMV7-NEXT: ldr r1, [r0]
200 ; CHECK-ARMV7-NEXT: ldr r0, [r0, #4]
201 ; CHECK-ARMV7-NEXT: str r0, [r2, #4]
202 ; CHECK-ARMV7-NEXT: str r1, [r2]
203 ; CHECK-ARMV7-NEXT: bx lr
205 ; CHECK-ARMV7-STRICT-LABEL: test_unaligned:
206 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
207 ; CHECK-ARMV7-STRICT-NEXT: .save {r4, r5, r6, lr}
208 ; CHECK-ARMV7-STRICT-NEXT: push {r4, r5, r6, lr}
209 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x_unaligned
210 ; CHECK-ARMV7-STRICT-NEXT: movw r6, :lower16:y_unaligned
211 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x_unaligned
212 ; CHECK-ARMV7-STRICT-NEXT: movt r6, :upper16:y_unaligned
213 ; CHECK-ARMV7-STRICT-NEXT: mov r1, r0
214 ; CHECK-ARMV7-STRICT-NEXT: ldrb r12, [r1, #4]!
215 ; CHECK-ARMV7-STRICT-NEXT: ldrb r3, [r0]
216 ; CHECK-ARMV7-STRICT-NEXT: ldrb lr, [r0, #1]
217 ; CHECK-ARMV7-STRICT-NEXT: ldrb r2, [r0, #2]
218 ; CHECK-ARMV7-STRICT-NEXT: ldrb r4, [r0, #3]
219 ; CHECK-ARMV7-STRICT-NEXT: ldrb r0, [r0, #5]
220 ; CHECK-ARMV7-STRICT-NEXT: ldrb r5, [r1, #2]
221 ; CHECK-ARMV7-STRICT-NEXT: ldrb r1, [r1, #3]
222 ; CHECK-ARMV7-STRICT-NEXT: strb r0, [r6, #5]
223 ; CHECK-ARMV7-STRICT-NEXT: strb r2, [r6, #2]
224 ; CHECK-ARMV7-STRICT-NEXT: strb r4, [r6, #3]
225 ; CHECK-ARMV7-STRICT-NEXT: strb r3, [r6]
226 ; CHECK-ARMV7-STRICT-NEXT: strb lr, [r6, #1]
227 ; CHECK-ARMV7-STRICT-NEXT: strb r12, [r6, #4]!
228 ; CHECK-ARMV7-STRICT-NEXT: strb r5, [r6, #2]
229 ; CHECK-ARMV7-STRICT-NEXT: strb r1, [r6, #3]
230 ; CHECK-ARMV7-STRICT-NEXT: pop {r4, r5, r6, pc}
232 ; CHECK-ARMV6-LABEL: test_unaligned:
233 ; CHECK-ARMV6: @ %bb.0: @ %entry
234 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI1_0
235 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI1_1
236 ; CHECK-ARMV6-NEXT: ldr r1, [r0]
237 ; CHECK-ARMV6-NEXT: ldr r0, [r0, #4]
238 ; CHECK-ARMV6-NEXT: str r0, [r2, #4]
239 ; CHECK-ARMV6-NEXT: str r1, [r2]
240 ; CHECK-ARMV6-NEXT: bx lr
241 ; CHECK-ARMV6-NEXT: .p2align 2
242 ; CHECK-ARMV6-NEXT: @ %bb.1:
243 ; CHECK-ARMV6-NEXT: .LCPI1_0:
244 ; CHECK-ARMV6-NEXT: .long x_unaligned
245 ; CHECK-ARMV6-NEXT: .LCPI1_1:
246 ; CHECK-ARMV6-NEXT: .long y_unaligned
248 ; CHECK-ARMV6-STRICT-LABEL: test_unaligned:
249 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
250 ; CHECK-ARMV6-STRICT-NEXT: .save {r4, r5, r6, lr}
251 ; CHECK-ARMV6-STRICT-NEXT: push {r4, r5, r6, lr}
252 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI1_0
253 ; CHECK-ARMV6-STRICT-NEXT: ldr r6, .LCPI1_1
254 ; CHECK-ARMV6-STRICT-NEXT: mov r1, r0
255 ; CHECK-ARMV6-STRICT-NEXT: ldrb lr, [r1, #4]!
256 ; CHECK-ARMV6-STRICT-NEXT: ldrb r3, [r1, #2]
257 ; CHECK-ARMV6-STRICT-NEXT: ldrb r12, [r1, #3]
258 ; CHECK-ARMV6-STRICT-NEXT: ldrb r1, [r0]
259 ; CHECK-ARMV6-STRICT-NEXT: ldrb r2, [r0, #1]
260 ; CHECK-ARMV6-STRICT-NEXT: ldrb r4, [r0, #2]
261 ; CHECK-ARMV6-STRICT-NEXT: ldrb r5, [r0, #3]
262 ; CHECK-ARMV6-STRICT-NEXT: ldrb r0, [r0, #5]
263 ; CHECK-ARMV6-STRICT-NEXT: strb r0, [r6, #5]
264 ; CHECK-ARMV6-STRICT-NEXT: strb r4, [r6, #2]
265 ; CHECK-ARMV6-STRICT-NEXT: strb r5, [r6, #3]
266 ; CHECK-ARMV6-STRICT-NEXT: strb r1, [r6]
267 ; CHECK-ARMV6-STRICT-NEXT: strb r2, [r6, #1]
268 ; CHECK-ARMV6-STRICT-NEXT: strb lr, [r6, #4]!
269 ; CHECK-ARMV6-STRICT-NEXT: strb r3, [r6, #2]
270 ; CHECK-ARMV6-STRICT-NEXT: strb r12, [r6, #3]
271 ; CHECK-ARMV6-STRICT-NEXT: pop {r4, r5, r6, pc}
272 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
273 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
274 ; CHECK-ARMV6-STRICT-NEXT: .LCPI1_0:
275 ; CHECK-ARMV6-STRICT-NEXT: .long x_unaligned
276 ; CHECK-ARMV6-STRICT-NEXT: .LCPI1_1:
277 ; CHECK-ARMV6-STRICT-NEXT: .long y_unaligned
279 %0 = load volatile i64, ptr @x_unaligned, align 1
280 store volatile i64 %0, ptr @y_unaligned, align 1
284 define void @test_align_4() {
285 ; CHECK-ARMV5TE-LABEL: test_align_4:
286 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
287 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI2_0
288 ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI2_1
289 ; CHECK-ARMV5TE-NEXT: ldr r1, [r0]
290 ; CHECK-ARMV5TE-NEXT: ldr r0, [r0, #4]
291 ; CHECK-ARMV5TE-NEXT: str r0, [r2, #4]
292 ; CHECK-ARMV5TE-NEXT: str r1, [r2]
293 ; CHECK-ARMV5TE-NEXT: bx lr
294 ; CHECK-ARMV5TE-NEXT: .p2align 2
295 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
296 ; CHECK-ARMV5TE-NEXT: .LCPI2_0:
297 ; CHECK-ARMV5TE-NEXT: .long x_aligned_4
298 ; CHECK-ARMV5TE-NEXT: .LCPI2_1:
299 ; CHECK-ARMV5TE-NEXT: .long y_aligned_4
301 ; CHECK-T2-LABEL: test_align_4:
302 ; CHECK-T2: @ %bb.0: @ %entry
303 ; CHECK-T2-NEXT: movw r0, :lower16:x_aligned_4
304 ; CHECK-T2-NEXT: movw r2, :lower16:y_aligned_4
305 ; CHECK-T2-NEXT: movt r0, :upper16:x_aligned_4
306 ; CHECK-T2-NEXT: movt r2, :upper16:y_aligned_4
307 ; CHECK-T2-NEXT: ldrd r0, r1, [r0]
308 ; CHECK-T2-NEXT: strd r0, r1, [r2]
309 ; CHECK-T2-NEXT: bx lr
311 ; CHECK-ARMV4T-LABEL: test_align_4:
312 ; CHECK-ARMV4T: @ %bb.0: @ %entry
313 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI2_0
314 ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI2_1
315 ; CHECK-ARMV4T-NEXT: ldr r1, [r0]
316 ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #4]
317 ; CHECK-ARMV4T-NEXT: str r0, [r2, #4]
318 ; CHECK-ARMV4T-NEXT: str r1, [r2]
319 ; CHECK-ARMV4T-NEXT: bx lr
320 ; CHECK-ARMV4T-NEXT: .p2align 2
321 ; CHECK-ARMV4T-NEXT: @ %bb.1:
322 ; CHECK-ARMV4T-NEXT: .LCPI2_0:
323 ; CHECK-ARMV4T-NEXT: .long x_aligned_4
324 ; CHECK-ARMV4T-NEXT: .LCPI2_1:
325 ; CHECK-ARMV4T-NEXT: .long y_aligned_4
327 ; CHECK-ARMV7-LABEL: test_align_4:
328 ; CHECK-ARMV7: @ %bb.0: @ %entry
329 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x_aligned_4
330 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y_aligned_4
331 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x_aligned_4
332 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y_aligned_4
333 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0]
334 ; CHECK-ARMV7-NEXT: strd r0, r1, [r2]
335 ; CHECK-ARMV7-NEXT: bx lr
337 ; CHECK-ARMV7-STRICT-LABEL: test_align_4:
338 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
339 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x_aligned_4
340 ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y_aligned_4
341 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x_aligned_4
342 ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y_aligned_4
343 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0]
344 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2]
345 ; CHECK-ARMV7-STRICT-NEXT: bx lr
347 ; CHECK-ARMV6-LABEL: test_align_4:
348 ; CHECK-ARMV6: @ %bb.0: @ %entry
349 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI2_0
350 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI2_1
351 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0]
352 ; CHECK-ARMV6-NEXT: strd r0, r1, [r2]
353 ; CHECK-ARMV6-NEXT: bx lr
354 ; CHECK-ARMV6-NEXT: .p2align 2
355 ; CHECK-ARMV6-NEXT: @ %bb.1:
356 ; CHECK-ARMV6-NEXT: .LCPI2_0:
357 ; CHECK-ARMV6-NEXT: .long x_aligned_4
358 ; CHECK-ARMV6-NEXT: .LCPI2_1:
359 ; CHECK-ARMV6-NEXT: .long y_aligned_4
361 ; CHECK-ARMV6-STRICT-LABEL: test_align_4:
362 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
363 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI2_0
364 ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI2_1
365 ; CHECK-ARMV6-STRICT-NEXT: ldr r1, [r0]
366 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, [r0, #4]
367 ; CHECK-ARMV6-STRICT-NEXT: str r0, [r2, #4]
368 ; CHECK-ARMV6-STRICT-NEXT: str r1, [r2]
369 ; CHECK-ARMV6-STRICT-NEXT: bx lr
370 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
371 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
372 ; CHECK-ARMV6-STRICT-NEXT: .LCPI2_0:
373 ; CHECK-ARMV6-STRICT-NEXT: .long x_aligned_4
374 ; CHECK-ARMV6-STRICT-NEXT: .LCPI2_1:
375 ; CHECK-ARMV6-STRICT-NEXT: .long y_aligned_4
377 %0 = load volatile i64, ptr @x_aligned_4, align 4
378 store volatile i64 %0, ptr @y_aligned_4, align 4
382 define void @test_offset() {
383 ; CHECK-ARMV5TE-LABEL: test_offset:
384 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
385 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI3_0
386 ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI3_1
387 ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0, #-4]
388 ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2, #-4]
389 ; CHECK-ARMV5TE-NEXT: bx lr
390 ; CHECK-ARMV5TE-NEXT: .p2align 2
391 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
392 ; CHECK-ARMV5TE-NEXT: .LCPI3_0:
393 ; CHECK-ARMV5TE-NEXT: .long x
394 ; CHECK-ARMV5TE-NEXT: .LCPI3_1:
395 ; CHECK-ARMV5TE-NEXT: .long y
397 ; CHECK-T2-LABEL: test_offset:
398 ; CHECK-T2: @ %bb.0: @ %entry
399 ; CHECK-T2-NEXT: movw r0, :lower16:x
400 ; CHECK-T2-NEXT: movw r2, :lower16:y
401 ; CHECK-T2-NEXT: movt r0, :upper16:x
402 ; CHECK-T2-NEXT: movt r2, :upper16:y
403 ; CHECK-T2-NEXT: ldrd r0, r1, [r0, #-4]
404 ; CHECK-T2-NEXT: strd r0, r1, [r2, #-4]
405 ; CHECK-T2-NEXT: bx lr
407 ; CHECK-ARMV4T-LABEL: test_offset:
408 ; CHECK-ARMV4T: @ %bb.0: @ %entry
409 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI3_0
410 ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI3_1
411 ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #-4]
412 ; CHECK-ARMV4T-NEXT: ldr r0, [r0]
413 ; CHECK-ARMV4T-NEXT: str r0, [r2]
414 ; CHECK-ARMV4T-NEXT: str r1, [r2, #-4]
415 ; CHECK-ARMV4T-NEXT: bx lr
416 ; CHECK-ARMV4T-NEXT: .p2align 2
417 ; CHECK-ARMV4T-NEXT: @ %bb.1:
418 ; CHECK-ARMV4T-NEXT: .LCPI3_0:
419 ; CHECK-ARMV4T-NEXT: .long x
420 ; CHECK-ARMV4T-NEXT: .LCPI3_1:
421 ; CHECK-ARMV4T-NEXT: .long y
423 ; CHECK-ARMV7-LABEL: test_offset:
424 ; CHECK-ARMV7: @ %bb.0: @ %entry
425 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x
426 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y
427 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x
428 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y
429 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0, #-4]
430 ; CHECK-ARMV7-NEXT: strd r0, r1, [r2, #-4]
431 ; CHECK-ARMV7-NEXT: bx lr
433 ; CHECK-ARMV7-STRICT-LABEL: test_offset:
434 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
435 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x
436 ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y
437 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x
438 ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y
439 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0, #-4]
440 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2, #-4]
441 ; CHECK-ARMV7-STRICT-NEXT: bx lr
443 ; CHECK-ARMV6-LABEL: test_offset:
444 ; CHECK-ARMV6: @ %bb.0: @ %entry
445 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI3_0
446 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI3_1
447 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0, #-4]
448 ; CHECK-ARMV6-NEXT: strd r0, r1, [r2, #-4]
449 ; CHECK-ARMV6-NEXT: bx lr
450 ; CHECK-ARMV6-NEXT: .p2align 2
451 ; CHECK-ARMV6-NEXT: @ %bb.1:
452 ; CHECK-ARMV6-NEXT: .LCPI3_0:
453 ; CHECK-ARMV6-NEXT: .long x
454 ; CHECK-ARMV6-NEXT: .LCPI3_1:
455 ; CHECK-ARMV6-NEXT: .long y
457 ; CHECK-ARMV6-STRICT-LABEL: test_offset:
458 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
459 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI3_0
460 ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI3_1
461 ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0, #-4]
462 ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2, #-4]
463 ; CHECK-ARMV6-STRICT-NEXT: bx lr
464 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
465 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
466 ; CHECK-ARMV6-STRICT-NEXT: .LCPI3_0:
467 ; CHECK-ARMV6-STRICT-NEXT: .long x
468 ; CHECK-ARMV6-STRICT-NEXT: .LCPI3_1:
469 ; CHECK-ARMV6-STRICT-NEXT: .long y
471 %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 -4), align 8
472 store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 -4), align 8
476 define void @test_offset_1() {
477 ; CHECK-ARMV5TE-LABEL: test_offset_1:
478 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
479 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI4_0
480 ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI4_1
481 ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0, #255]
482 ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2, #255]
483 ; CHECK-ARMV5TE-NEXT: bx lr
484 ; CHECK-ARMV5TE-NEXT: .p2align 2
485 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
486 ; CHECK-ARMV5TE-NEXT: .LCPI4_0:
487 ; CHECK-ARMV5TE-NEXT: .long x
488 ; CHECK-ARMV5TE-NEXT: .LCPI4_1:
489 ; CHECK-ARMV5TE-NEXT: .long y
491 ; CHECK-T2-LABEL: test_offset_1:
492 ; CHECK-T2: @ %bb.0: @ %entry
493 ; CHECK-T2-NEXT: movw r0, :lower16:y
494 ; CHECK-T2-NEXT: movw r1, :lower16:x
495 ; CHECK-T2-NEXT: movt r0, :upper16:y
496 ; CHECK-T2-NEXT: movt r1, :upper16:x
497 ; CHECK-T2-NEXT: adds r1, #255
498 ; CHECK-T2-NEXT: adds r0, #255
499 ; CHECK-T2-NEXT: ldrd r1, r2, [r1]
500 ; CHECK-T2-NEXT: strd r1, r2, [r0]
501 ; CHECK-T2-NEXT: bx lr
503 ; CHECK-ARMV4T-LABEL: test_offset_1:
504 ; CHECK-ARMV4T: @ %bb.0: @ %entry
505 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI4_0
506 ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI4_1
507 ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #255]
508 ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #259]
509 ; CHECK-ARMV4T-NEXT: str r0, [r2, #259]
510 ; CHECK-ARMV4T-NEXT: str r1, [r2, #255]
511 ; CHECK-ARMV4T-NEXT: bx lr
512 ; CHECK-ARMV4T-NEXT: .p2align 2
513 ; CHECK-ARMV4T-NEXT: @ %bb.1:
514 ; CHECK-ARMV4T-NEXT: .LCPI4_0:
515 ; CHECK-ARMV4T-NEXT: .long x
516 ; CHECK-ARMV4T-NEXT: .LCPI4_1:
517 ; CHECK-ARMV4T-NEXT: .long y
519 ; CHECK-ARMV7-LABEL: test_offset_1:
520 ; CHECK-ARMV7: @ %bb.0: @ %entry
521 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x
522 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y
523 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x
524 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y
525 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0, #255]
526 ; CHECK-ARMV7-NEXT: strd r0, r1, [r2, #255]
527 ; CHECK-ARMV7-NEXT: bx lr
529 ; CHECK-ARMV7-STRICT-LABEL: test_offset_1:
530 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
531 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x
532 ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y
533 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x
534 ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y
535 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0, #255]
536 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2, #255]
537 ; CHECK-ARMV7-STRICT-NEXT: bx lr
539 ; CHECK-ARMV6-LABEL: test_offset_1:
540 ; CHECK-ARMV6: @ %bb.0: @ %entry
541 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI4_0
542 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI4_1
543 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0, #255]
544 ; CHECK-ARMV6-NEXT: strd r0, r1, [r2, #255]
545 ; CHECK-ARMV6-NEXT: bx lr
546 ; CHECK-ARMV6-NEXT: .p2align 2
547 ; CHECK-ARMV6-NEXT: @ %bb.1:
548 ; CHECK-ARMV6-NEXT: .LCPI4_0:
549 ; CHECK-ARMV6-NEXT: .long x
550 ; CHECK-ARMV6-NEXT: .LCPI4_1:
551 ; CHECK-ARMV6-NEXT: .long y
553 ; CHECK-ARMV6-STRICT-LABEL: test_offset_1:
554 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
555 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI4_0
556 ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI4_1
557 ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0, #255]
558 ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2, #255]
559 ; CHECK-ARMV6-STRICT-NEXT: bx lr
560 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
561 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
562 ; CHECK-ARMV6-STRICT-NEXT: .LCPI4_0:
563 ; CHECK-ARMV6-STRICT-NEXT: .long x
564 ; CHECK-ARMV6-STRICT-NEXT: .LCPI4_1:
565 ; CHECK-ARMV6-STRICT-NEXT: .long y
568 %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 255), align 8
569 store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 255), align 8
573 define void @test_offset_2() {
574 ; CHECK-ARMV5TE-LABEL: test_offset_2:
575 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
576 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI5_0
577 ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI5_1
578 ; CHECK-ARMV5TE-NEXT: add r0, r0, #256
579 ; CHECK-ARMV5TE-NEXT: add r2, r2, #256
580 ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0]
581 ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2]
582 ; CHECK-ARMV5TE-NEXT: bx lr
583 ; CHECK-ARMV5TE-NEXT: .p2align 2
584 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
585 ; CHECK-ARMV5TE-NEXT: .LCPI5_0:
586 ; CHECK-ARMV5TE-NEXT: .long x
587 ; CHECK-ARMV5TE-NEXT: .LCPI5_1:
588 ; CHECK-ARMV5TE-NEXT: .long y
590 ; CHECK-T2-LABEL: test_offset_2:
591 ; CHECK-T2: @ %bb.0: @ %entry
592 ; CHECK-T2-NEXT: movw r0, :lower16:x
593 ; CHECK-T2-NEXT: movw r2, :lower16:y
594 ; CHECK-T2-NEXT: movt r0, :upper16:x
595 ; CHECK-T2-NEXT: movt r2, :upper16:y
596 ; CHECK-T2-NEXT: ldrd r0, r1, [r0, #256]
597 ; CHECK-T2-NEXT: strd r0, r1, [r2, #256]
598 ; CHECK-T2-NEXT: bx lr
600 ; CHECK-ARMV4T-LABEL: test_offset_2:
601 ; CHECK-ARMV4T: @ %bb.0: @ %entry
602 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI5_0
603 ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI5_1
604 ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #256]
605 ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #260]
606 ; CHECK-ARMV4T-NEXT: str r0, [r2, #260]
607 ; CHECK-ARMV4T-NEXT: str r1, [r2, #256]
608 ; CHECK-ARMV4T-NEXT: bx lr
609 ; CHECK-ARMV4T-NEXT: .p2align 2
610 ; CHECK-ARMV4T-NEXT: @ %bb.1:
611 ; CHECK-ARMV4T-NEXT: .LCPI5_0:
612 ; CHECK-ARMV4T-NEXT: .long x
613 ; CHECK-ARMV4T-NEXT: .LCPI5_1:
614 ; CHECK-ARMV4T-NEXT: .long y
616 ; CHECK-ARMV7-LABEL: test_offset_2:
617 ; CHECK-ARMV7: @ %bb.0: @ %entry
618 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x
619 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y
620 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x
621 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y
622 ; CHECK-ARMV7-NEXT: add r0, r0, #256
623 ; CHECK-ARMV7-NEXT: add r2, r2, #256
624 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0]
625 ; CHECK-ARMV7-NEXT: strd r0, r1, [r2]
626 ; CHECK-ARMV7-NEXT: bx lr
628 ; CHECK-ARMV7-STRICT-LABEL: test_offset_2:
629 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
630 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x
631 ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y
632 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x
633 ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y
634 ; CHECK-ARMV7-STRICT-NEXT: add r0, r0, #256
635 ; CHECK-ARMV7-STRICT-NEXT: add r2, r2, #256
636 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0]
637 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2]
638 ; CHECK-ARMV7-STRICT-NEXT: bx lr
640 ; CHECK-ARMV6-LABEL: test_offset_2:
641 ; CHECK-ARMV6: @ %bb.0: @ %entry
642 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI5_0
643 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI5_1
644 ; CHECK-ARMV6-NEXT: add r0, r0, #256
645 ; CHECK-ARMV6-NEXT: add r2, r2, #256
646 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0]
647 ; CHECK-ARMV6-NEXT: strd r0, r1, [r2]
648 ; CHECK-ARMV6-NEXT: bx lr
649 ; CHECK-ARMV6-NEXT: .p2align 2
650 ; CHECK-ARMV6-NEXT: @ %bb.1:
651 ; CHECK-ARMV6-NEXT: .LCPI5_0:
652 ; CHECK-ARMV6-NEXT: .long x
653 ; CHECK-ARMV6-NEXT: .LCPI5_1:
654 ; CHECK-ARMV6-NEXT: .long y
656 ; CHECK-ARMV6-STRICT-LABEL: test_offset_2:
657 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
658 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI5_0
659 ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI5_1
660 ; CHECK-ARMV6-STRICT-NEXT: add r0, r0, #256
661 ; CHECK-ARMV6-STRICT-NEXT: add r2, r2, #256
662 ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0]
663 ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2]
664 ; CHECK-ARMV6-STRICT-NEXT: bx lr
665 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
666 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
667 ; CHECK-ARMV6-STRICT-NEXT: .LCPI5_0:
668 ; CHECK-ARMV6-STRICT-NEXT: .long x
669 ; CHECK-ARMV6-STRICT-NEXT: .LCPI5_1:
670 ; CHECK-ARMV6-STRICT-NEXT: .long y
673 %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 256), align 8
674 store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 256), align 8
678 define void @test_offset_3() {
679 ; CHECK-ARMV5TE-LABEL: test_offset_3:
680 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
681 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI6_0
682 ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI6_1
683 ; CHECK-ARMV5TE-NEXT: add r0, r0, #1020
684 ; CHECK-ARMV5TE-NEXT: add r2, r2, #1020
685 ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0]
686 ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2]
687 ; CHECK-ARMV5TE-NEXT: bx lr
688 ; CHECK-ARMV5TE-NEXT: .p2align 2
689 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
690 ; CHECK-ARMV5TE-NEXT: .LCPI6_0:
691 ; CHECK-ARMV5TE-NEXT: .long x
692 ; CHECK-ARMV5TE-NEXT: .LCPI6_1:
693 ; CHECK-ARMV5TE-NEXT: .long y
695 ; CHECK-T2-LABEL: test_offset_3:
696 ; CHECK-T2: @ %bb.0: @ %entry
697 ; CHECK-T2-NEXT: movw r0, :lower16:x
698 ; CHECK-T2-NEXT: movw r2, :lower16:y
699 ; CHECK-T2-NEXT: movt r0, :upper16:x
700 ; CHECK-T2-NEXT: movt r2, :upper16:y
701 ; CHECK-T2-NEXT: ldrd r0, r1, [r0, #1020]
702 ; CHECK-T2-NEXT: strd r0, r1, [r2, #1020]
703 ; CHECK-T2-NEXT: bx lr
705 ; CHECK-ARMV4T-LABEL: test_offset_3:
706 ; CHECK-ARMV4T: @ %bb.0: @ %entry
707 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI6_0
708 ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI6_1
709 ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #1020]
710 ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #1024]
711 ; CHECK-ARMV4T-NEXT: str r0, [r2, #1024]
712 ; CHECK-ARMV4T-NEXT: str r1, [r2, #1020]
713 ; CHECK-ARMV4T-NEXT: bx lr
714 ; CHECK-ARMV4T-NEXT: .p2align 2
715 ; CHECK-ARMV4T-NEXT: @ %bb.1:
716 ; CHECK-ARMV4T-NEXT: .LCPI6_0:
717 ; CHECK-ARMV4T-NEXT: .long x
718 ; CHECK-ARMV4T-NEXT: .LCPI6_1:
719 ; CHECK-ARMV4T-NEXT: .long y
721 ; CHECK-ARMV7-LABEL: test_offset_3:
722 ; CHECK-ARMV7: @ %bb.0: @ %entry
723 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x
724 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y
725 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x
726 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y
727 ; CHECK-ARMV7-NEXT: add r0, r0, #1020
728 ; CHECK-ARMV7-NEXT: add r2, r2, #1020
729 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0]
730 ; CHECK-ARMV7-NEXT: strd r0, r1, [r2]
731 ; CHECK-ARMV7-NEXT: bx lr
733 ; CHECK-ARMV7-STRICT-LABEL: test_offset_3:
734 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
735 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x
736 ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y
737 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x
738 ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y
739 ; CHECK-ARMV7-STRICT-NEXT: add r0, r0, #1020
740 ; CHECK-ARMV7-STRICT-NEXT: add r2, r2, #1020
741 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0]
742 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2]
743 ; CHECK-ARMV7-STRICT-NEXT: bx lr
745 ; CHECK-ARMV6-LABEL: test_offset_3:
746 ; CHECK-ARMV6: @ %bb.0: @ %entry
747 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI6_0
748 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI6_1
749 ; CHECK-ARMV6-NEXT: add r0, r0, #1020
750 ; CHECK-ARMV6-NEXT: add r2, r2, #1020
751 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0]
752 ; CHECK-ARMV6-NEXT: strd r0, r1, [r2]
753 ; CHECK-ARMV6-NEXT: bx lr
754 ; CHECK-ARMV6-NEXT: .p2align 2
755 ; CHECK-ARMV6-NEXT: @ %bb.1:
756 ; CHECK-ARMV6-NEXT: .LCPI6_0:
757 ; CHECK-ARMV6-NEXT: .long x
758 ; CHECK-ARMV6-NEXT: .LCPI6_1:
759 ; CHECK-ARMV6-NEXT: .long y
761 ; CHECK-ARMV6-STRICT-LABEL: test_offset_3:
762 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
763 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI6_0
764 ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI6_1
765 ; CHECK-ARMV6-STRICT-NEXT: add r0, r0, #1020
766 ; CHECK-ARMV6-STRICT-NEXT: add r2, r2, #1020
767 ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0]
768 ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2]
769 ; CHECK-ARMV6-STRICT-NEXT: bx lr
770 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
771 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
772 ; CHECK-ARMV6-STRICT-NEXT: .LCPI6_0:
773 ; CHECK-ARMV6-STRICT-NEXT: .long x
774 ; CHECK-ARMV6-STRICT-NEXT: .LCPI6_1:
775 ; CHECK-ARMV6-STRICT-NEXT: .long y
778 %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 1020), align 8
779 store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 1020), align 8
783 define void @test_offset_4() {
784 ; CHECK-ARMV5TE-LABEL: test_offset_4:
785 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
786 ; CHECK-ARMV5TE-NEXT: ldr r0, .LCPI7_0
787 ; CHECK-ARMV5TE-NEXT: ldr r2, .LCPI7_1
788 ; CHECK-ARMV5TE-NEXT: add r0, r0, #1024
789 ; CHECK-ARMV5TE-NEXT: add r2, r2, #1024
790 ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [r0]
791 ; CHECK-ARMV5TE-NEXT: strd r0, r1, [r2]
792 ; CHECK-ARMV5TE-NEXT: bx lr
793 ; CHECK-ARMV5TE-NEXT: .p2align 2
794 ; CHECK-ARMV5TE-NEXT: @ %bb.1:
795 ; CHECK-ARMV5TE-NEXT: .LCPI7_0:
796 ; CHECK-ARMV5TE-NEXT: .long x
797 ; CHECK-ARMV5TE-NEXT: .LCPI7_1:
798 ; CHECK-ARMV5TE-NEXT: .long y
800 ; CHECK-T2-LABEL: test_offset_4:
801 ; CHECK-T2: @ %bb.0: @ %entry
802 ; CHECK-T2-NEXT: movw r0, :lower16:y
803 ; CHECK-T2-NEXT: movw r1, :lower16:x
804 ; CHECK-T2-NEXT: movt r0, :upper16:y
805 ; CHECK-T2-NEXT: movt r1, :upper16:x
806 ; CHECK-T2-NEXT: add.w r1, r1, #1024
807 ; CHECK-T2-NEXT: add.w r0, r0, #1024
808 ; CHECK-T2-NEXT: ldrd r1, r2, [r1]
809 ; CHECK-T2-NEXT: strd r1, r2, [r0]
810 ; CHECK-T2-NEXT: bx lr
812 ; CHECK-ARMV4T-LABEL: test_offset_4:
813 ; CHECK-ARMV4T: @ %bb.0: @ %entry
814 ; CHECK-ARMV4T-NEXT: ldr r0, .LCPI7_0
815 ; CHECK-ARMV4T-NEXT: ldr r2, .LCPI7_1
816 ; CHECK-ARMV4T-NEXT: ldr r1, [r0, #1024]
817 ; CHECK-ARMV4T-NEXT: ldr r0, [r0, #1028]
818 ; CHECK-ARMV4T-NEXT: str r0, [r2, #1028]
819 ; CHECK-ARMV4T-NEXT: str r1, [r2, #1024]
820 ; CHECK-ARMV4T-NEXT: bx lr
821 ; CHECK-ARMV4T-NEXT: .p2align 2
822 ; CHECK-ARMV4T-NEXT: @ %bb.1:
823 ; CHECK-ARMV4T-NEXT: .LCPI7_0:
824 ; CHECK-ARMV4T-NEXT: .long x
825 ; CHECK-ARMV4T-NEXT: .LCPI7_1:
826 ; CHECK-ARMV4T-NEXT: .long y
828 ; CHECK-ARMV7-LABEL: test_offset_4:
829 ; CHECK-ARMV7: @ %bb.0: @ %entry
830 ; CHECK-ARMV7-NEXT: movw r0, :lower16:x
831 ; CHECK-ARMV7-NEXT: movw r2, :lower16:y
832 ; CHECK-ARMV7-NEXT: movt r0, :upper16:x
833 ; CHECK-ARMV7-NEXT: movt r2, :upper16:y
834 ; CHECK-ARMV7-NEXT: add r0, r0, #1024
835 ; CHECK-ARMV7-NEXT: add r2, r2, #1024
836 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [r0]
837 ; CHECK-ARMV7-NEXT: strd r0, r1, [r2]
838 ; CHECK-ARMV7-NEXT: bx lr
840 ; CHECK-ARMV7-STRICT-LABEL: test_offset_4:
841 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
842 ; CHECK-ARMV7-STRICT-NEXT: movw r0, :lower16:x
843 ; CHECK-ARMV7-STRICT-NEXT: movw r2, :lower16:y
844 ; CHECK-ARMV7-STRICT-NEXT: movt r0, :upper16:x
845 ; CHECK-ARMV7-STRICT-NEXT: movt r2, :upper16:y
846 ; CHECK-ARMV7-STRICT-NEXT: add r0, r0, #1024
847 ; CHECK-ARMV7-STRICT-NEXT: add r2, r2, #1024
848 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [r0]
849 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [r2]
850 ; CHECK-ARMV7-STRICT-NEXT: bx lr
852 ; CHECK-ARMV6-LABEL: test_offset_4:
853 ; CHECK-ARMV6: @ %bb.0: @ %entry
854 ; CHECK-ARMV6-NEXT: ldr r0, .LCPI7_0
855 ; CHECK-ARMV6-NEXT: ldr r2, .LCPI7_1
856 ; CHECK-ARMV6-NEXT: add r0, r0, #1024
857 ; CHECK-ARMV6-NEXT: add r2, r2, #1024
858 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [r0]
859 ; CHECK-ARMV6-NEXT: strd r0, r1, [r2]
860 ; CHECK-ARMV6-NEXT: bx lr
861 ; CHECK-ARMV6-NEXT: .p2align 2
862 ; CHECK-ARMV6-NEXT: @ %bb.1:
863 ; CHECK-ARMV6-NEXT: .LCPI7_0:
864 ; CHECK-ARMV6-NEXT: .long x
865 ; CHECK-ARMV6-NEXT: .LCPI7_1:
866 ; CHECK-ARMV6-NEXT: .long y
868 ; CHECK-ARMV6-STRICT-LABEL: test_offset_4:
869 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
870 ; CHECK-ARMV6-STRICT-NEXT: ldr r0, .LCPI7_0
871 ; CHECK-ARMV6-STRICT-NEXT: ldr r2, .LCPI7_1
872 ; CHECK-ARMV6-STRICT-NEXT: add r0, r0, #1024
873 ; CHECK-ARMV6-STRICT-NEXT: add r2, r2, #1024
874 ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [r0]
875 ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [r2]
876 ; CHECK-ARMV6-STRICT-NEXT: bx lr
877 ; CHECK-ARMV6-STRICT-NEXT: .p2align 2
878 ; CHECK-ARMV6-STRICT-NEXT: @ %bb.1:
879 ; CHECK-ARMV6-STRICT-NEXT: .LCPI7_0:
880 ; CHECK-ARMV6-STRICT-NEXT: .long x
881 ; CHECK-ARMV6-STRICT-NEXT: .LCPI7_1:
882 ; CHECK-ARMV6-STRICT-NEXT: .long y
885 %0 = load volatile i64, ptr getelementptr (i8, ptr @x, i32 1024), align 8
886 store volatile i64 %0, ptr getelementptr (i8, ptr @y, i32 1024), align 8
890 define i64 @test_stack() {
891 ; CHECK-ARMV5TE-LABEL: test_stack:
892 ; CHECK-ARMV5TE: @ %bb.0: @ %entry
893 ; CHECK-ARMV5TE-NEXT: .pad #80
894 ; CHECK-ARMV5TE-NEXT: sub sp, sp, #80
895 ; CHECK-ARMV5TE-NEXT: mov r1, #0
896 ; CHECK-ARMV5TE-NEXT: mov r0, #1
897 ; CHECK-ARMV5TE-NEXT: strd r0, r1, [sp, #8]
898 ; CHECK-ARMV5TE-NEXT: ldrd r0, r1, [sp, #8]
899 ; CHECK-ARMV5TE-NEXT: add sp, sp, #80
900 ; CHECK-ARMV5TE-NEXT: bx lr
902 ; CHECK-T2-LABEL: test_stack:
903 ; CHECK-T2: @ %bb.0: @ %entry
904 ; CHECK-T2-NEXT: .pad #80
905 ; CHECK-T2-NEXT: sub sp, #80
906 ; CHECK-T2-NEXT: movs r0, #0
907 ; CHECK-T2-NEXT: movs r1, #1
908 ; CHECK-T2-NEXT: strd r1, r0, [sp, #8]
909 ; CHECK-T2-NEXT: ldrd r0, r1, [sp, #8]
910 ; CHECK-T2-NEXT: add sp, #80
911 ; CHECK-T2-NEXT: bx lr
913 ; CHECK-ARMV4T-LABEL: test_stack:
914 ; CHECK-ARMV4T: @ %bb.0: @ %entry
915 ; CHECK-ARMV4T-NEXT: .pad #80
916 ; CHECK-ARMV4T-NEXT: sub sp, sp, #80
917 ; CHECK-ARMV4T-NEXT: mov r0, #0
918 ; CHECK-ARMV4T-NEXT: str r0, [sp, #12]
919 ; CHECK-ARMV4T-NEXT: mov r0, #1
920 ; CHECK-ARMV4T-NEXT: str r0, [sp, #8]
921 ; CHECK-ARMV4T-NEXT: ldr r0, [sp, #8]
922 ; CHECK-ARMV4T-NEXT: ldr r1, [sp, #12]
923 ; CHECK-ARMV4T-NEXT: add sp, sp, #80
924 ; CHECK-ARMV4T-NEXT: bx lr
926 ; CHECK-ARMV7-LABEL: test_stack:
927 ; CHECK-ARMV7: @ %bb.0: @ %entry
928 ; CHECK-ARMV7-NEXT: .pad #80
929 ; CHECK-ARMV7-NEXT: sub sp, sp, #80
930 ; CHECK-ARMV7-NEXT: mov r1, #0
931 ; CHECK-ARMV7-NEXT: mov r0, #1
932 ; CHECK-ARMV7-NEXT: strd r0, r1, [sp, #8]
933 ; CHECK-ARMV7-NEXT: ldrd r0, r1, [sp, #8]
934 ; CHECK-ARMV7-NEXT: add sp, sp, #80
935 ; CHECK-ARMV7-NEXT: bx lr
937 ; CHECK-ARMV7-STRICT-LABEL: test_stack:
938 ; CHECK-ARMV7-STRICT: @ %bb.0: @ %entry
939 ; CHECK-ARMV7-STRICT-NEXT: .pad #80
940 ; CHECK-ARMV7-STRICT-NEXT: sub sp, sp, #80
941 ; CHECK-ARMV7-STRICT-NEXT: mov r1, #0
942 ; CHECK-ARMV7-STRICT-NEXT: mov r0, #1
943 ; CHECK-ARMV7-STRICT-NEXT: strd r0, r1, [sp, #8]
944 ; CHECK-ARMV7-STRICT-NEXT: ldrd r0, r1, [sp, #8]
945 ; CHECK-ARMV7-STRICT-NEXT: add sp, sp, #80
946 ; CHECK-ARMV7-STRICT-NEXT: bx lr
948 ; CHECK-ARMV6-LABEL: test_stack:
949 ; CHECK-ARMV6: @ %bb.0: @ %entry
950 ; CHECK-ARMV6-NEXT: .pad #80
951 ; CHECK-ARMV6-NEXT: sub sp, sp, #80
952 ; CHECK-ARMV6-NEXT: mov r1, #0
953 ; CHECK-ARMV6-NEXT: mov r0, #1
954 ; CHECK-ARMV6-NEXT: strd r0, r1, [sp, #8]
955 ; CHECK-ARMV6-NEXT: ldrd r0, r1, [sp, #8]
956 ; CHECK-ARMV6-NEXT: add sp, sp, #80
957 ; CHECK-ARMV6-NEXT: bx lr
959 ; CHECK-ARMV6-STRICT-LABEL: test_stack:
960 ; CHECK-ARMV6-STRICT: @ %bb.0: @ %entry
961 ; CHECK-ARMV6-STRICT-NEXT: .pad #80
962 ; CHECK-ARMV6-STRICT-NEXT: sub sp, sp, #80
963 ; CHECK-ARMV6-STRICT-NEXT: mov r1, #0
964 ; CHECK-ARMV6-STRICT-NEXT: mov r0, #1
965 ; CHECK-ARMV6-STRICT-NEXT: strd r0, r1, [sp, #8]
966 ; CHECK-ARMV6-STRICT-NEXT: ldrd r0, r1, [sp, #8]
967 ; CHECK-ARMV6-STRICT-NEXT: add sp, sp, #80
968 ; CHECK-ARMV6-STRICT-NEXT: bx lr
971 %a = alloca [10 x i64], align 8
972 %arrayidx = getelementptr inbounds [10 x i64], ptr %a, i32 0, i32 1
973 store volatile i64 1, ptr %arrayidx, align 8
974 %arrayidx1 = getelementptr inbounds [10 x i64], ptr %a, i32 0, i32 1
975 %0 = load volatile i64, ptr %arrayidx1, align 8