blob: b33c06ee27880514240b1ad7f9b5c91847619ac3 [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) {
133; SDAG-LABEL: load_breg_immoff_2
134; SDAG: sub [[REG:x[0-9]+]], x0, #257
135; SDAG-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
136; FAST-LABEL: load_breg_immoff_2
137; FAST: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
138; FAST-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
139 %1 = add i64 %a, -257
140 %2 = inttoptr i64 %1 to i32*
141 %3 = load i32* %2
142 ret i32 %3
143}
144
145; Max supported unscaled offset
146define i32 @load_breg_immoff_3(i64 %a) {
147; CHECK-LABEL: load_breg_immoff_3
148; CHECK: ldur {{w[0-9]+}}, [x0, #255]
149 %1 = add i64 %a, 255
150 %2 = inttoptr i64 %1 to i32*
151 %3 = load i32* %2
152 ret i32 %3
153}
154
155; Min un-supported unscaled offset
156define i32 @load_breg_immoff_4(i64 %a) {
157; SDAG-LABEL: load_breg_immoff_4
158; SDAG: add [[REG:x[0-9]+]], x0, #257
159; SDAG-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
160; FAST-LABEL: load_breg_immoff_4
161; FAST: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
162; FAST-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
163 %1 = add i64 %a, 257
164 %2 = inttoptr i64 %1 to i32*
165 %3 = load i32* %2
166 ret i32 %3
167}
168
169; Max supported scaled offset
170define i32 @load_breg_immoff_5(i64 %a) {
171; CHECK-LABEL: load_breg_immoff_5
172; CHECK: ldr {{w[0-9]+}}, [x0, #16380]
173 %1 = add i64 %a, 16380
174 %2 = inttoptr i64 %1 to i32*
175 %3 = load i32* %2
176 ret i32 %3
177}
178
179; Min un-supported scaled offset
180define i32 @load_breg_immoff_6(i64 %a) {
181; SDAG-LABEL: load_breg_immoff_6
182; SDAG: add [[REG:x[0-9]+]], x0, #4, lsl #12
183; SDAG-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
184; FAST-LABEL: load_breg_immoff_6
185; FAST: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
186; FAST-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
187 %1 = add i64 %a, 16384
188 %2 = inttoptr i64 %1 to i32*
189 %3 = load i32* %2
190 ret i32 %3
191}
192
193; Max supported negative offset
194define void @store_breg_immoff_1(i64 %a) {
195; CHECK-LABEL: store_breg_immoff_1
196; CHECK: stur wzr, [x0, #-256]
197 %1 = add i64 %a, -256
198 %2 = inttoptr i64 %1 to i32*
199 store i32 0, i32* %2
200 ret void
201}
202
203; Min not-supported negative offset
204define void @store_breg_immoff_2(i64 %a) {
205; SDAG-LABEL: store_breg_immoff_2
206; SDAG: sub [[REG:x[0-9]+]], x0, #257
207; SDAG-NEXT: str wzr, {{\[}}[[REG]]{{\]}}
208; FAST-LABEL: store_breg_immoff_2
209; FAST: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
210; FAST-NEXT: str wzr, {{\[}}[[REG]]{{\]}}
211 %1 = add i64 %a, -257
212 %2 = inttoptr i64 %1 to i32*
213 store i32 0, i32* %2
214 ret void
215}
216
217; Max supported unscaled offset
218define void @store_breg_immoff_3(i64 %a) {
219; CHECK-LABEL: store_breg_immoff_3
220; CHECK: stur wzr, [x0, #255]
221 %1 = add i64 %a, 255
222 %2 = inttoptr i64 %1 to i32*
223 store i32 0, i32* %2
224 ret void
225}
226
227; Min un-supported unscaled offset
228define void @store_breg_immoff_4(i64 %a) {
229; SDAG-LABEL: store_breg_immoff_4
230; SDAG: add [[REG:x[0-9]+]], x0, #257
231; SDAG-NEXT: str wzr, {{\[}}[[REG]]{{\]}}
232; FAST-LABEL: store_breg_immoff_4
233; FAST: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
234; FAST-NEXT: str wzr, {{\[}}[[REG]]{{\]}}
235 %1 = add i64 %a, 257
236 %2 = inttoptr i64 %1 to i32*
237 store i32 0, i32* %2
238 ret void
239}
240
241; Max supported scaled offset
242define void @store_breg_immoff_5(i64 %a) {
243; CHECK-LABEL: store_breg_immoff_5
244; CHECK: str wzr, [x0, #16380]
245 %1 = add i64 %a, 16380
246 %2 = inttoptr i64 %1 to i32*
247 store i32 0, i32* %2
248 ret void
249}
250
251; Min un-supported scaled offset
252define void @store_breg_immoff_6(i64 %a) {
253; SDAG-LABEL: store_breg_immoff_6
254; SDAG: add [[REG:x[0-9]+]], x0, #4, lsl #12
255; SDAG-NEXT: str wzr, {{\[}}[[REG]]{{\]}}
256; FAST-LABEL: store_breg_immoff_6
257; FAST: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
258; FAST-NEXT: str wzr, {{\[}}[[REG]]{{\]}}
259 %1 = add i64 %a, 16384
260 %2 = inttoptr i64 %1 to i32*
261 store i32 0, i32* %2
262 ret void
263}
264
265define i64 @load_breg_immoff_7(i64 %a) {
266; CHECK-LABEL: load_breg_immoff_7
267; CHECK: ldr {{x[0-9]+}}, [x0, #48]
268 %1 = add i64 %a, 48
269 %2 = inttoptr i64 %1 to i64*
270 %3 = load i64* %2
271 ret i64 %3
272}
273
274; Flip add operands
275define i64 @load_breg_immoff_8(i64 %a) {
276; CHECK-LABEL: load_breg_immoff_8
277; CHECK: ldr {{x[0-9]+}}, [x0, #48]
278 %1 = add i64 48, %a
279 %2 = inttoptr i64 %1 to i64*
280 %3 = load i64* %2
281 ret i64 %3
282}
283
284; Load Base Register + Register Offset
285define i64 @load_breg_offreg_1(i64 %a, i64 %b) {
286; CHECK-LABEL: load_breg_offreg_1
287; CHECK: ldr {{x[0-9]+}}, [x0, x1]
288 %1 = add i64 %a, %b
289 %2 = inttoptr i64 %1 to i64*
290 %3 = load i64* %2
291 ret i64 %3
292}
293
294; Flip add operands
295define i64 @load_breg_offreg_2(i64 %a, i64 %b) {
296; CHECK-LABEL: load_breg_offreg_2
297; CHECK: ldr {{x[0-9]+}}, [x1, x0]
298 %1 = add i64 %b, %a
299 %2 = inttoptr i64 %1 to i64*
300 %3 = load i64* %2
301 ret i64 %3
302}
303
304; Load Base Register + Register Offset + Immediate Offset
305define i64 @load_breg_offreg_immoff_1(i64 %a, i64 %b) {
306; CHECK-LABEL: load_breg_offreg_immoff_1
307; CHECK: add [[REG:x[0-9]+]], x0, x1
308; CHECK-NEXT: ldr x0, {{\[}}[[REG]], #48{{\]}}
309 %1 = add i64 %a, %b
310 %2 = add i64 %1, 48
311 %3 = inttoptr i64 %2 to i64*
312 %4 = load i64* %3
313 ret i64 %4
314}
315
316define i64 @load_breg_offreg_immoff_2(i64 %a, i64 %b) {
317; SDAG-LABEL: load_breg_offreg_immoff_2
318; SDAG: add [[REG1:x[0-9]+]], x0, x1
319; SDAG-NEXT: add [[REG2:x[0-9]+]], [[REG1]], #15, lsl #12
320; SDAG-NEXT: ldr x0, {{\[}}[[REG2]]{{\]}}
321; FAST-LABEL: load_breg_offreg_immoff_2
322; FAST: add [[REG:x[0-9]+]], x0, {{x[0-9]+}}
323; FAST-NEXT: ldr x0, {{\[}}[[REG]], x1{{\]}}
324 %1 = add i64 %a, %b
325 %2 = add i64 %1, 61440
326 %3 = inttoptr i64 %2 to i64*
327 %4 = load i64* %3
328 ret i64 %4
329}
330
Juergen Ributzka3c1b2862014-08-27 21:38:33 +0000331; Load Scaled Register Offset
332define i32 @load_shift_offreg_1(i64 %a) {
333; CHECK-LABEL: load_shift_offreg_1
334; CHECK: lsl [[REG:x[0-9]+]], x0, #2
335; CHECK: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
336 %1 = shl i64 %a, 2
337 %2 = inttoptr i64 %1 to i32*
338 %3 = load i32* %2
339 ret i32 %3
340}
341
Juergen Ributzka22d4cd02014-09-17 19:19:31 +0000342define i32 @load_mul_offreg_1(i64 %a) {
343; CHECK-LABEL: load_mul_offreg_1
344; CHECK: lsl [[REG:x[0-9]+]], x0, #2
345; CHECK: ldr {{w[0-9]+}}, {{\[}}[[REG]]{{\]}}
346 %1 = mul i64 %a, 4
347 %2 = inttoptr i64 %1 to i32*
348 %3 = load i32* %2
349 ret i32 %3
350}
351
Juergen Ributzkab46ea082014-08-19 19:44:17 +0000352; Load Base Register + Scaled Register Offset
353define i32 @load_breg_shift_offreg_1(i64 %a, i64 %b) {
354; CHECK-LABEL: load_breg_shift_offreg_1
355; CHECK: ldr {{w[0-9]+}}, [x1, x0, lsl #2]
356 %1 = shl i64 %a, 2
357 %2 = add i64 %1, %b
358 %3 = inttoptr i64 %2 to i32*
359 %4 = load i32* %3
360 ret i32 %4
361}
362
363define i32 @load_breg_shift_offreg_2(i64 %a, i64 %b) {
364; CHECK-LABEL: load_breg_shift_offreg_2
365; CHECK: ldr {{w[0-9]+}}, [x1, x0, lsl #2]
366 %1 = shl i64 %a, 2
367 %2 = add i64 %b, %1
368 %3 = inttoptr i64 %2 to i32*
369 %4 = load i32* %3
370 ret i32 %4
371}
372
373define i32 @load_breg_shift_offreg_3(i64 %a, i64 %b) {
374; SDAG-LABEL: load_breg_shift_offreg_3
375; SDAG: lsl [[REG:x[0-9]+]], x0, #2
376; SDAG-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]], x1, lsl #2{{\]}}
377; FAST-LABEL: load_breg_shift_offreg_3
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000378; FAST: lsl [[REG:x[0-9]+]], x1, #2
Juergen Ributzkab46ea082014-08-19 19:44:17 +0000379; FAST-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
380 %1 = shl i64 %a, 2
381 %2 = shl i64 %b, 2
382 %3 = add i64 %1, %2
383 %4 = inttoptr i64 %3 to i32*
384 %5 = load i32* %4
385 ret i32 %5
386}
387
388define i32 @load_breg_shift_offreg_4(i64 %a, i64 %b) {
389; SDAG-LABEL: load_breg_shift_offreg_4
390; SDAG: lsl [[REG:x[0-9]+]], x1, #2
391; SDAG-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
392; FAST-LABEL: load_breg_shift_offreg_4
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000393; FAST: lsl [[REG:x[0-9]+]], x0, #2
Juergen Ributzkab46ea082014-08-19 19:44:17 +0000394; FAST-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]], x1, lsl #2{{\]}}
395 %1 = shl i64 %a, 2
396 %2 = shl i64 %b, 2
397 %3 = add i64 %2, %1
398 %4 = inttoptr i64 %3 to i32*
399 %5 = load i32* %4
400 ret i32 %5
401}
402
403define i32 @load_breg_shift_offreg_5(i64 %a, i64 %b) {
404; SDAG-LABEL: load_breg_shift_offreg_5
405; SDAG: lsl [[REG:x[0-9]+]], x1, #3
406; SDAG-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
407; FAST-LABEL: load_breg_shift_offreg_5
Juergen Ributzka53dbef62014-09-02 22:33:57 +0000408; FAST: lsl [[REG:x[0-9]+]], x1, #3
Juergen Ributzkab46ea082014-08-19 19:44:17 +0000409; FAST-NEXT: ldr {{w[0-9]+}}, {{\[}}[[REG]], x0, lsl #2{{\]}}
410 %1 = shl i64 %a, 2
411 %2 = shl i64 %b, 3
412 %3 = add i64 %1, %2
413 %4 = inttoptr i64 %3 to i32*
414 %5 = load i32* %4
415 ret i32 %5
416}
417
Juergen Ributzka22d4cd02014-09-17 19:19:31 +0000418define i32 @load_breg_mul_offreg_1(i64 %a, i64 %b) {
419; CHECK-LABEL: load_breg_mul_offreg_1
420; CHECK: ldr {{w[0-9]+}}, [x1, x0, lsl #2]
421 %1 = mul i64 %a, 4
422 %2 = add i64 %1, %b
423 %3 = inttoptr i64 %2 to i32*
424 %4 = load i32* %3
425 ret i32 %4
426}
Juergen Ributzkab46ea082014-08-19 19:44:17 +0000427
Juergen Ributzka99b77582014-09-18 05:40:41 +0000428define zeroext i8 @load_breg_and_offreg_1(i64 %a, i64 %b) {
429; CHECK-LABEL: load_breg_and_offreg_1
430; CHECK: ldrb {{w[0-9]+}}, [x1, w0, uxtw]
431 %1 = and i64 %a, 4294967295
432 %2 = add i64 %1, %b
433 %3 = inttoptr i64 %2 to i8*
434 %4 = load i8* %3
435 ret i8 %4
436}
437
438define zeroext i16 @load_breg_and_offreg_2(i64 %a, i64 %b) {
439; CHECK-LABEL: load_breg_and_offreg_2
440; CHECK: ldrh {{w[0-9]+}}, [x1, w0, uxtw #1]
441 %1 = and i64 %a, 4294967295
442 %2 = shl i64 %1, 1
443 %3 = add i64 %2, %b
444 %4 = inttoptr i64 %3 to i16*
445 %5 = load i16* %4
446 ret i16 %5
447}
448
449define i32 @load_breg_and_offreg_3(i64 %a, i64 %b) {
450; CHECK-LABEL: load_breg_and_offreg_3
451; CHECK: ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
452 %1 = and i64 %a, 4294967295
453 %2 = shl i64 %1, 2
454 %3 = add i64 %2, %b
455 %4 = inttoptr i64 %3 to i32*
456 %5 = load i32* %4
457 ret i32 %5
458}
459
460define i64 @load_breg_and_offreg_4(i64 %a, i64 %b) {
461; CHECK-LABEL: load_breg_and_offreg_4
462; CHECK: ldr {{x[0-9]+}}, [x1, w0, uxtw #3]
463 %1 = and i64 %a, 4294967295
464 %2 = shl i64 %1, 3
465 %3 = add i64 %2, %b
466 %4 = inttoptr i64 %3 to i64*
467 %5 = load i64* %4
468 ret i64 %5
469}
470
Juergen Ributzkab46ea082014-08-19 19:44:17 +0000471; Load Base Register + Scaled Register Offset + Sign/Zero extension
472define i32 @load_breg_zext_shift_offreg_1(i32 %a, i64 %b) {
473; CHECK-LABEL: load_breg_zext_shift_offreg_1
474; CHECK: ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
475 %1 = zext i32 %a to i64
476 %2 = shl i64 %1, 2
477 %3 = add i64 %2, %b
478 %4 = inttoptr i64 %3 to i32*
479 %5 = load i32* %4
480 ret i32 %5
481}
482
483define i32 @load_breg_zext_shift_offreg_2(i32 %a, i64 %b) {
484; CHECK-LABEL: load_breg_zext_shift_offreg_2
485; CHECK: ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
486 %1 = zext i32 %a to i64
487 %2 = shl i64 %1, 2
488 %3 = add i64 %b, %2
489 %4 = inttoptr i64 %3 to i32*
490 %5 = load i32* %4
491 ret i32 %5
492}
493
Juergen Ributzka22d4cd02014-09-17 19:19:31 +0000494define i32 @load_breg_zext_mul_offreg_1(i32 %a, i64 %b) {
495; CHECK-LABEL: load_breg_zext_mul_offreg_1
496; CHECK: ldr {{w[0-9]+}}, [x1, w0, uxtw #2]
497 %1 = zext i32 %a to i64
498 %2 = mul i64 %1, 4
499 %3 = add i64 %2, %b
500 %4 = inttoptr i64 %3 to i32*
501 %5 = load i32* %4
502 ret i32 %5
503}
504
Juergen Ributzkab46ea082014-08-19 19:44:17 +0000505define i32 @load_breg_sext_shift_offreg_1(i32 %a, i64 %b) {
506; CHECK-LABEL: load_breg_sext_shift_offreg_1
507; CHECK: ldr {{w[0-9]+}}, [x1, w0, sxtw #2]
508 %1 = sext i32 %a to i64
509 %2 = shl i64 %1, 2
510 %3 = add i64 %2, %b
511 %4 = inttoptr i64 %3 to i32*
512 %5 = load i32* %4
513 ret i32 %5
514}
515
516define i32 @load_breg_sext_shift_offreg_2(i32 %a, i64 %b) {
517; CHECK-LABEL: load_breg_sext_shift_offreg_2
518; CHECK: ldr {{w[0-9]+}}, [x1, w0, sxtw #2]
519 %1 = sext i32 %a to i64
520 %2 = shl i64 %1, 2
521 %3 = add i64 %b, %2
522 %4 = inttoptr i64 %3 to i32*
523 %5 = load i32* %4
524 ret i32 %5
525}
526
Juergen Ributzka22d4cd02014-09-17 19:19:31 +0000527define i32 @load_breg_sext_mul_offreg_1(i32 %a, i64 %b) {
528; CHECK-LABEL: load_breg_sext_mul_offreg_1
529; CHECK: ldr {{w[0-9]+}}, [x1, w0, sxtw #2]
530 %1 = sext i32 %a to i64
531 %2 = mul i64 %1, 4
532 %3 = add i64 %2, %b
533 %4 = inttoptr i64 %3 to i32*
534 %5 = load i32* %4
535 ret i32 %5
536}
537
Juergen Ributzkafb506a42014-08-27 00:58:30 +0000538; Load Scaled Register Offset + Immediate Offset + Sign/Zero extension
539define i64 @load_sext_shift_offreg_imm1(i32 %a) {
540; CHECK-LABEL: load_sext_shift_offreg_imm1
Juergen Ributzka100a9b72014-08-27 21:04:52 +0000541; CHECK: sbfiz [[REG:x[0-9]+]], {{x[0-9]+}}, #3, #32
Juergen Ributzkafb506a42014-08-27 00:58:30 +0000542; CHECK-NEXT: ldr {{x[0-9]+}}, {{\[}}[[REG]], #8{{\]}}
543 %1 = sext i32 %a to i64
544 %2 = shl i64 %1, 3
545 %3 = add i64 %2, 8
546 %4 = inttoptr i64 %3 to i64*
547 %5 = load i64* %4
548 ret i64 %5
549}
550
551; Load Base Register + Scaled Register Offset + Immediate Offset + Sign/Zero extension
552define i64 @load_breg_sext_shift_offreg_imm1(i32 %a, i64 %b) {
553; CHECK-LABEL: load_breg_sext_shift_offreg_imm1
554; CHECK: add [[REG:x[0-9]+]], x1, w0, sxtw #3
555; CHECK-NEXT: ldr {{x[0-9]+}}, {{\[}}[[REG]], #8{{\]}}
556 %1 = sext i32 %a to i64
557 %2 = shl i64 %1, 3
558 %3 = add i64 %b, %2
559 %4 = add i64 %3, 8
560 %5 = inttoptr i64 %4 to i64*
561 %6 = load i64* %5
562 ret i64 %6
563}
564
Juergen Ributzka4f1a54a2014-08-28 00:09:46 +0000565; Test that the kill flag is not set - the machine instruction verifier does that for us.
566define i64 @kill_reg(i64 %a) {
567 %1 = sub i64 %a, 8
568 %2 = add i64 %1, 96
569 %3 = inttoptr i64 %2 to i64*
570 %4 = load i64* %3
571 %5 = add i64 %2, %4
572 ret i64 %5
573}
574