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