1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=aarch64-- -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
3
4--- |
5  target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
6
7  define void @store_s64_gpr(i64* %addr) { ret void }
8  define void @store_s32_gpr(i32* %addr) { ret void }
9  define void @store_s16_gpr(i16* %addr) { ret void }
10  define void @store_s8_gpr(i8* %addr) { ret void }
11
12  define void @store_zero_s64_gpr(i64* %addr) { ret void }
13  define void @store_zero_s32_gpr(i32* %addr) { ret void }
14  define void @store_zero_s16(i32* %addr) { ret void }
15  define void @store_zero_s8(i32* %addr) { ret void }
16  define void @store_zero_look_through_cst(i32* %addr) { ret void }
17
18  define void @store_fi_s64_gpr() {
19    %ptr0 = alloca i64
20    ret void
21  }
22
23  define void @store_gep_128_s64_gpr(i64* %addr) { ret void }
24  define void @store_gep_512_s32_gpr(i32* %addr) { ret void }
25  define void @store_gep_64_s16_gpr(i16* %addr) { ret void }
26  define void @store_gep_1_s8_gpr(i8* %addr) { ret void }
27
28  define void @store_s64_fpr(i64* %addr) { ret void }
29  define void @store_s32_fpr(i32* %addr) { ret void }
30
31  define void @store_gep_8_s64_fpr(i64* %addr) { ret void }
32  define void @store_gep_8_s32_fpr(i32* %addr) { ret void }
33
34  define void @store_v2s32(i64 *%addr) { ret void }
35  define void @store_v2s64(i64 *%addr) { ret void }
36
37  define void @store_4xi16(<4 x i16> %v, <4 x i16>* %ptr) { ret void }
38  define void @store_4xi32(<4 x i32> %v, <4 x i32>* %ptr) { ret void }
39  define void @store_8xi16(<8 x i16> %v, <8 x i16>* %ptr) { ret void }
40  define void @store_16xi8(<16 x i8> %v, <16 x i8>* %ptr) { ret void }
41
42  @x = external hidden local_unnamed_addr global i32*, align 8
43  define void @store_adrp_add_low() { ret void }
44
45...
46
47---
48name:            store_s64_gpr
49legalized:       true
50regBankSelected: true
51
52registers:
53  - { id: 0, class: gpr }
54  - { id: 1, class: gpr }
55
56body:             |
57  bb.0:
58    liveins: $x0, $x1
59
60    ; CHECK-LABEL: name: store_s64_gpr
61    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
62    ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
63    ; CHECK: STRXui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr)
64    %0(p0) = COPY $x0
65    %1(s64) = COPY $x1
66    G_STORE  %1, %0 :: (store 8 into %ir.addr)
67
68...
69
70---
71name:            store_s32_gpr
72legalized:       true
73regBankSelected: true
74
75registers:
76  - { id: 0, class: gpr }
77  - { id: 1, class: gpr }
78
79body:             |
80  bb.0:
81    liveins: $x0, $w1
82
83    ; CHECK-LABEL: name: store_s32_gpr
84    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
85    ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
86    ; CHECK: STRWui [[COPY1]], [[COPY]], 0 :: (store 4 into %ir.addr)
87    %0(p0) = COPY $x0
88    %1(s32) = COPY $w1
89    G_STORE  %1, %0 :: (store 4 into %ir.addr)
90
91...
92
93---
94name:            store_s16_gpr
95legalized:       true
96regBankSelected: true
97
98registers:
99  - { id: 0, class: gpr }
100  - { id: 1, class: gpr }
101
102body:             |
103  bb.0:
104    liveins: $x0, $w1
105
106    ; CHECK-LABEL: name: store_s16_gpr
107    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
108    ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
109    ; CHECK: STRHHui [[COPY1]], [[COPY]], 0 :: (store 2 into %ir.addr)
110    %0(p0) = COPY $x0
111    %2:gpr(s32) = COPY $w1
112    %1(s16) = G_TRUNC %2
113    G_STORE  %1, %0 :: (store 2 into %ir.addr)
114
115...
116
117---
118name:            store_s8_gpr
119legalized:       true
120regBankSelected: true
121
122registers:
123  - { id: 0, class: gpr }
124  - { id: 1, class: gpr }
125
126body:             |
127  bb.0:
128    liveins: $x0, $w1
129
130    ; CHECK-LABEL: name: store_s8_gpr
131    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
132    ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
133    ; CHECK: STRBBui [[COPY1]], [[COPY]], 0 :: (store 1 into %ir.addr)
134    %0(p0) = COPY $x0
135    %2:gpr(s32) = COPY $w1
136    %1(s8) = G_TRUNC %2
137    G_STORE  %1, %0 :: (store 1 into %ir.addr)
138
139...
140
141---
142name:            store_zero_s64_gpr
143legalized:       true
144regBankSelected: true
145
146registers:
147  - { id: 0, class: gpr }
148  - { id: 1, class: gpr }
149
150body:             |
151  bb.0:
152    liveins: $x0, $x1
153
154    ; CHECK-LABEL: name: store_zero_s64_gpr
155    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
156    ; CHECK: STRXui $xzr, [[COPY]], 0 :: (store 8 into %ir.addr)
157    %0(p0) = COPY $x0
158    %1(s64) = G_CONSTANT i64 0
159    G_STORE  %1, %0 :: (store 8 into %ir.addr)
160
161...
162
163---
164name:            store_zero_s32_gpr
165legalized:       true
166regBankSelected: true
167
168registers:
169  - { id: 0, class: gpr }
170  - { id: 1, class: gpr }
171
172body:             |
173  bb.0:
174    liveins: $x0
175
176    ; CHECK-LABEL: name: store_zero_s32_gpr
177    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
178    ; CHECK: STRWui $wzr, [[COPY]], 0 :: (store 4 into %ir.addr)
179    %0(p0) = COPY $x0
180    %1(s32) = G_CONSTANT i32 0
181    G_STORE  %1, %0 :: (store 4 into %ir.addr)
182
183...
184
185---
186name:            store_zero_s16
187legalized:       true
188regBankSelected: true
189body:             |
190  bb.0:
191    liveins: $x0
192    ; CHECK-LABEL: name: store_zero_s16
193    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
194    ; CHECK: STRHHui $wzr, [[COPY]], 0 :: (store 2)
195    %0:gpr(p0) = COPY $x0
196    %1:gpr(s16) = G_CONSTANT i16 0
197    G_STORE %1(s16), %0(p0) :: (store 2)
198
199...
200
201---
202name:            store_zero_s8
203legalized:       true
204regBankSelected: true
205body:             |
206  bb.0:
207    liveins: $x0
208    ; CHECK-LABEL: name: store_zero_s8
209    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
210    ; CHECK: STRBBui $wzr, [[COPY]], 0 :: (store 1)
211    %0:gpr(p0) = COPY $x0
212    %1:gpr(s8) = G_CONSTANT i8 0
213    G_STORE %1(s8), %0(p0) :: (store 1)
214...
215
216---
217name:            store_zero_look_through_cst
218legalized:       true
219regBankSelected: true
220body:             |
221  bb.0:
222    liveins: $x0
223    ; CHECK-LABEL: name: store_zero_look_through_cst
224    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
225    ; CHECK: STRXui $xzr, [[COPY]], 0 :: (store 8 into %ir.addr)
226    %0:gpr(p0) = COPY $x0
227    %1:gpr(s32) = G_CONSTANT i32 0
228    %2:gpr(s64) = G_ZEXT %1
229    G_STORE  %2, %0 :: (store 8 into %ir.addr)
230...
231
232---
233name:            store_fi_s64_gpr
234legalized:       true
235regBankSelected: true
236
237registers:
238  - { id: 0, class: gpr }
239  - { id: 1, class: gpr }
240
241stack:
242  - { id: 0, name: ptr0, offset: 0, size: 8, alignment: 8 }
243
244body:             |
245  bb.0:
246    liveins: $x0
247
248    ; CHECK-LABEL: name: store_fi_s64_gpr
249    ; CHECK: [[COPY:%[0-9]+]]:gpr64 = COPY $x0
250    ; CHECK: STRXui [[COPY]], %stack.0.ptr0, 0 :: (store 8)
251    %0(p0) = COPY $x0
252    %1(p0) = G_FRAME_INDEX %stack.0.ptr0
253    G_STORE  %0, %1 :: (store 8)
254...
255
256---
257name:            store_gep_128_s64_gpr
258legalized:       true
259regBankSelected: true
260
261registers:
262  - { id: 0, class: gpr }
263  - { id: 1, class: gpr }
264  - { id: 2, class: gpr }
265  - { id: 3, class: gpr }
266
267body:             |
268  bb.0:
269    liveins: $x0, $x1
270
271    ; CHECK-LABEL: name: store_gep_128_s64_gpr
272    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
273    ; CHECK: [[COPY1:%[0-9]+]]:gpr64 = COPY $x1
274    ; CHECK: STRXui [[COPY1]], [[COPY]], 16 :: (store 8 into %ir.addr)
275    %0(p0) = COPY $x0
276    %1(s64) = COPY $x1
277    %2(s64) = G_CONSTANT i64 128
278    %3(p0) = G_PTR_ADD %0, %2
279    G_STORE %1, %3 :: (store 8 into %ir.addr)
280...
281
282---
283name:            store_gep_512_s32_gpr
284legalized:       true
285regBankSelected: true
286
287registers:
288  - { id: 0, class: gpr }
289  - { id: 1, class: gpr }
290  - { id: 2, class: gpr }
291  - { id: 3, class: gpr }
292
293body:             |
294  bb.0:
295    liveins: $x0, $w1
296
297    ; CHECK-LABEL: name: store_gep_512_s32_gpr
298    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
299    ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
300    ; CHECK: STRWui [[COPY1]], [[COPY]], 128 :: (store 4 into %ir.addr)
301    %0(p0) = COPY $x0
302    %1(s32) = COPY $w1
303    %2(s64) = G_CONSTANT i64 512
304    %3(p0) = G_PTR_ADD %0, %2
305    G_STORE %1, %3 :: (store 4 into %ir.addr)
306...
307
308---
309name:            store_gep_64_s16_gpr
310legalized:       true
311regBankSelected: true
312
313registers:
314  - { id: 0, class: gpr }
315  - { id: 1, class: gpr }
316  - { id: 2, class: gpr }
317  - { id: 3, class: gpr }
318
319body:             |
320  bb.0:
321    liveins: $x0, $w1
322
323    ; CHECK-LABEL: name: store_gep_64_s16_gpr
324    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
325    ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
326    ; CHECK: STRHHui [[COPY1]], [[COPY]], 32 :: (store 2 into %ir.addr)
327    %0(p0) = COPY $x0
328    %4:gpr(s32) = COPY $w1
329    %1(s16) = G_TRUNC %4
330    %2(s64) = G_CONSTANT i64 64
331    %3(p0) = G_PTR_ADD %0, %2
332    G_STORE %1, %3 :: (store 2 into %ir.addr)
333...
334
335---
336name:            store_gep_1_s8_gpr
337legalized:       true
338regBankSelected: true
339
340registers:
341  - { id: 0, class: gpr }
342  - { id: 1, class: gpr }
343  - { id: 2, class: gpr }
344  - { id: 3, class: gpr }
345
346body:             |
347  bb.0:
348    liveins: $x0, $w1
349
350    ; CHECK-LABEL: name: store_gep_1_s8_gpr
351    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
352    ; CHECK: [[COPY1:%[0-9]+]]:gpr32 = COPY $w1
353    ; CHECK: STRBBui [[COPY1]], [[COPY]], 1 :: (store 1 into %ir.addr)
354    %0(p0) = COPY $x0
355    %4:gpr(s32) = COPY $w1
356    %1(s8) = G_TRUNC %4
357    %2(s64) = G_CONSTANT i64 1
358    %3(p0) = G_PTR_ADD %0, %2
359    G_STORE %1, %3 :: (store 1 into %ir.addr)
360...
361
362---
363name:            store_s64_fpr
364legalized:       true
365regBankSelected: true
366
367registers:
368  - { id: 0, class: gpr }
369  - { id: 1, class: fpr }
370
371body:             |
372  bb.0:
373    liveins: $x0, $d1
374
375    ; CHECK-LABEL: name: store_s64_fpr
376    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
377    ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
378    ; CHECK: STRDui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr)
379    %0(p0) = COPY $x0
380    %1(s64) = COPY $d1
381    G_STORE  %1, %0 :: (store 8 into %ir.addr)
382
383...
384
385---
386name:            store_s32_fpr
387legalized:       true
388regBankSelected: true
389
390registers:
391  - { id: 0, class: gpr }
392  - { id: 1, class: fpr }
393
394body:             |
395  bb.0:
396    liveins: $x0, $s1
397
398    ; CHECK-LABEL: name: store_s32_fpr
399    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
400    ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
401    ; CHECK: STRSui [[COPY1]], [[COPY]], 0 :: (store 4 into %ir.addr)
402    %0(p0) = COPY $x0
403    %1(s32) = COPY $s1
404    G_STORE  %1, %0 :: (store 4 into %ir.addr)
405
406...
407
408---
409name:            store_gep_8_s64_fpr
410legalized:       true
411regBankSelected: true
412
413registers:
414  - { id: 0, class: gpr }
415  - { id: 1, class: fpr }
416  - { id: 2, class: gpr }
417  - { id: 3, class: gpr }
418
419body:             |
420  bb.0:
421    liveins: $x0, $d1
422
423    ; CHECK-LABEL: name: store_gep_8_s64_fpr
424    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
425    ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
426    ; CHECK: STRDui [[COPY1]], [[COPY]], 1 :: (store 8 into %ir.addr)
427    %0(p0) = COPY $x0
428    %1(s64) = COPY $d1
429    %2(s64) = G_CONSTANT i64 8
430    %3(p0) = G_PTR_ADD %0, %2
431    G_STORE %1, %3 :: (store 8 into %ir.addr)
432...
433
434---
435name:            store_gep_8_s32_fpr
436legalized:       true
437regBankSelected: true
438
439registers:
440  - { id: 0, class: gpr }
441  - { id: 1, class: fpr }
442  - { id: 2, class: gpr }
443  - { id: 3, class: gpr }
444
445body:             |
446  bb.0:
447    liveins: $x0, $s1
448
449    ; CHECK-LABEL: name: store_gep_8_s32_fpr
450    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
451    ; CHECK: [[COPY1:%[0-9]+]]:fpr32 = COPY $s1
452    ; CHECK: STRSui [[COPY1]], [[COPY]], 2 :: (store 4 into %ir.addr)
453    %0(p0) = COPY $x0
454    %1(s32) = COPY $s1
455    %2(s64) = G_CONSTANT i64 8
456    %3(p0) = G_PTR_ADD %0, %2
457    G_STORE %1, %3 :: (store 4 into %ir.addr)
458...
459---
460name:            store_v2s32
461legalized:       true
462regBankSelected: true
463
464registers:
465  - { id: 0, class: gpr }
466  - { id: 1, class: fpr }
467
468body:             |
469  bb.0:
470    liveins: $x0, $d1
471
472    ; CHECK-LABEL: name: store_v2s32
473    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
474    ; CHECK: [[COPY1:%[0-9]+]]:fpr64 = COPY $d1
475    ; CHECK: STRDui [[COPY1]], [[COPY]], 0 :: (store 8 into %ir.addr)
476    %0(p0) = COPY $x0
477    %1(<2 x s32>) = COPY $d1
478    G_STORE  %1, %0 :: (store 8 into %ir.addr)
479
480...
481---
482name:            store_v2s64
483legalized:       true
484regBankSelected: true
485
486registers:
487  - { id: 0, class: gpr }
488  - { id: 1, class: fpr }
489
490body:             |
491  bb.0:
492    liveins: $x0, $d1
493    ; CHECK-LABEL: name: store_v2s64
494    ; CHECK: [[COPY:%[0-9]+]]:gpr64sp = COPY $x0
495    ; CHECK: [[COPY1:%[0-9]+]]:fpr128 = COPY $q1
496    ; CHECK: STRQui [[COPY1]], [[COPY]], 0 :: (store 16 into %ir.addr, align 8)
497    %0(p0) = COPY $x0
498    %1(<2 x s64>) = COPY $q1
499    G_STORE %1, %0 :: (store 16 into %ir.addr, align 8)
500
501...
502---
503name:            store_4xi16
504alignment:       4
505legalized:       true
506regBankSelected: true
507tracksRegLiveness: true
508registers:
509  - { id: 0, class: fpr }
510  - { id: 1, class: gpr }
511machineFunctionInfo: {}
512body:             |
513  bb.1 (%ir-block.0):
514    liveins: $d0, $x0
515
516    ; CHECK-LABEL: name: store_4xi16
517    ; CHECK: liveins: $d0, $x0
518    ; CHECK: [[COPY:%[0-9]+]]:fpr64 = COPY $d0
519    ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
520    ; CHECK: STRDui [[COPY]], [[COPY1]], 0 :: (store 8 into %ir.ptr)
521    ; CHECK: RET_ReallyLR
522    %0:fpr(<4 x s16>) = COPY $d0
523    %1:gpr(p0) = COPY $x0
524    G_STORE %0(<4 x s16>), %1(p0) :: (store 8 into %ir.ptr)
525    RET_ReallyLR
526
527...
528---
529name:            store_4xi32
530alignment:       4
531legalized:       true
532regBankSelected: true
533tracksRegLiveness: true
534registers:
535  - { id: 0, class: fpr }
536  - { id: 1, class: gpr }
537machineFunctionInfo: {}
538body:             |
539  bb.1 (%ir-block.0):
540    liveins: $q0, $x0
541
542    ; CHECK-LABEL: name: store_4xi32
543    ; CHECK: liveins: $q0, $x0
544    ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
545    ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
546    ; CHECK: STRQui [[COPY]], [[COPY1]], 0 :: (store 16 into %ir.ptr)
547    ; CHECK: RET_ReallyLR
548    %0:fpr(<4 x s32>) = COPY $q0
549    %1:gpr(p0) = COPY $x0
550    G_STORE %0(<4 x s32>), %1(p0) :: (store 16 into %ir.ptr)
551    RET_ReallyLR
552
553...
554---
555name:            store_8xi16
556alignment:       4
557legalized:       true
558regBankSelected: true
559tracksRegLiveness: true
560registers:
561  - { id: 0, class: fpr }
562  - { id: 1, class: gpr }
563machineFunctionInfo: {}
564body:             |
565  bb.1 (%ir-block.0):
566    liveins: $q0, $x0
567
568    ; CHECK-LABEL: name: store_8xi16
569    ; CHECK: liveins: $q0, $x0
570    ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
571    ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
572    ; CHECK: STRQui [[COPY]], [[COPY1]], 0 :: (store 16 into %ir.ptr)
573    ; CHECK: RET_ReallyLR
574    %0:fpr(<8 x s16>) = COPY $q0
575    %1:gpr(p0) = COPY $x0
576    G_STORE %0(<8 x s16>), %1(p0) :: (store 16 into %ir.ptr)
577    RET_ReallyLR
578
579...
580---
581name:            store_16xi8
582alignment:       4
583legalized:       true
584regBankSelected: true
585tracksRegLiveness: true
586registers:
587  - { id: 0, class: fpr }
588  - { id: 1, class: gpr }
589machineFunctionInfo: {}
590body:             |
591  bb.1 (%ir-block.0):
592    liveins: $q0, $x0
593
594    ; CHECK-LABEL: name: store_16xi8
595    ; CHECK: liveins: $q0, $x0
596    ; CHECK: [[COPY:%[0-9]+]]:fpr128 = COPY $q0
597    ; CHECK: [[COPY1:%[0-9]+]]:gpr64sp = COPY $x0
598    ; CHECK: STRQui [[COPY]], [[COPY1]], 0 :: (store 16 into %ir.ptr)
599    ; CHECK: RET_ReallyLR
600    %0:fpr(<16 x s8>) = COPY $q0
601    %1:gpr(p0) = COPY $x0
602    G_STORE %0(<16 x s8>), %1(p0) :: (store 16 into %ir.ptr)
603    RET_ReallyLR
604
605...
606---
607name:            store_adrp_add_low
608legalized:       true
609regBankSelected: true
610tracksRegLiveness: true
611body:             |
612  bb.0:
613    liveins: $x0
614    ; CHECK-LABEL: name: store_adrp_add_low
615    ; CHECK: liveins: $x0
616    ; CHECK: %copy:gpr64 = COPY $x0
617    ; CHECK: %adrp:gpr64common = ADRP target-flags(aarch64-page) @x
618    ; CHECK: STRXui %copy, %adrp, target-flags(aarch64-pageoff, aarch64-nc) @x :: (store 8 into @x)
619    %copy:gpr(p0) = COPY $x0
620    %adrp:gpr64(p0) = ADRP target-flags(aarch64-page) @x
621    %add_low:gpr(p0) = G_ADD_LOW %adrp(p0), target-flags(aarch64-pageoff, aarch64-nc) @x
622    G_STORE %copy(p0), %add_low(p0) :: (store 8 into @x)
623