1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=aarch64-unknown-unknown -run-pass=instruction-select -verify-machineinstrs %s -o - | FileCheck %s
3#
4# Test using the xro addressing mode with immediates. This should be done for
5# wide constants which are preferably selected using a mov rather than an add.
6
7...
8---
9name:            use_xro_cannot_encode_add_lsl
10alignment:       4
11legalized:       true
12regBankSelected: true
13tracksRegLiveness: true
14body:             |
15  bb.0:
16    liveins: $x0
17    ; Check that we use the XRO addressing mode when the constant cannot be
18    ; represented using an add + lsl.
19    ;
20    ; cst = 0000000111000000
21    ; cst & 000fffffff000000 != 0
22    ;
23    ; CHECK-LABEL: name: use_xro_cannot_encode_add_lsl
24    ; CHECK: liveins: $x0
25    ; CHECK: %copy:gpr64sp = COPY $x0
26    ; CHECK: %cst:gpr64 = MOVi64imm 4580179968
27    ; CHECK: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load 8)
28    ; CHECK: RET_ReallyLR
29    %copy:gpr(p0) = COPY $x0
30    %cst:gpr(s64) = G_CONSTANT i64 4580179968
31    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
32    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
33    RET_ReallyLR
34
35...
36---
37name:            use_xro_preferred_mov
38alignment:       4
39legalized:       true
40regBankSelected: true
41tracksRegLiveness: true
42body:             |
43  bb.0:
44    liveins: $x0
45    ; Check that we use the XRO addressing mode when the constant can be
46    ; represented using a single movk.
47    ;
48    ; cst = 000000000000f000
49    ; cst & 000fffffff000000 == 0
50    ; cst & ffffffffffff0fff != 0
51    ;
52    ; CHECK-LABEL: name: use_xro_preferred_mov
53    ; CHECK: liveins: $x0
54    ; CHECK: %copy:gpr64sp = COPY $x0
55    ; CHECK: [[MOVi32imm:%[0-9]+]]:gpr32 = MOVi32imm 61440
56    ; CHECK: %cst:gpr64 = SUBREG_TO_REG 0, [[MOVi32imm]], %subreg.sub_32
57    ; CHECK: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load 8)
58    ; CHECK: RET_ReallyLR
59    %copy:gpr(p0) = COPY $x0
60    %cst:gpr(s64) = G_CONSTANT i64 61440
61    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
62    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
63    RET_ReallyLR
64
65...
66---
67name:            use_xro_negative_imm
68alignment:       4
69legalized:       true
70regBankSelected: true
71tracksRegLiveness: true
72body:             |
73  bb.0:
74    liveins: $x0
75    ; Check that this works even if we have a negative immediate.
76    ;
77    ; CHECK-LABEL: name: use_xro_negative_imm
78    ; CHECK: liveins: $x0
79    ; CHECK: %copy:gpr64sp = COPY $x0
80    ; CHECK: %cst:gpr64 = MOVi64imm -61440
81    ; CHECK: %load:gpr64 = LDRXroX %copy, %cst, 0, 0 :: (volatile load 8)
82    ; CHECK: RET_ReallyLR
83    %copy:gpr(p0) = COPY $x0
84    %cst:gpr(s64) = G_CONSTANT i64 -61440
85    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
86    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
87    RET_ReallyLR
88
89...
90---
91name:            dont_use_xro_selectable_imm
92alignment:       4
93legalized:       true
94regBankSelected: true
95tracksRegLiveness: true
96body:             |
97  bb.0:
98    liveins: $x0
99    ; Immediates that can be encoded in a LDRXui should be skipped.
100    ;
101    ; CHECK-LABEL: name: dont_use_xro_selectable_imm
102    ; CHECK: liveins: $x0
103    ; CHECK: %copy:gpr64sp = COPY $x0
104    ; CHECK: %load:gpr64 = LDRXui %copy, 2 :: (volatile load 8)
105    ; CHECK: RET_ReallyLR
106    %copy:gpr(p0) = COPY $x0
107    %cst:gpr(s64) = G_CONSTANT i64 16
108    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
109    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
110    RET_ReallyLR
111
112...
113---
114name:            dont_use_xro_selectable_negative_imm
115alignment:       4
116legalized:       true
117regBankSelected: true
118tracksRegLiveness: true
119body:             |
120  bb.0:
121    liveins: $x0
122    ; Immediates that can be encoded in a LDRXui should be skipped.
123    ;
124    ; CHECK-LABEL: name: dont_use_xro_selectable_negative_imm
125    ; CHECK: liveins: $x0
126    ; CHECK: %copy:gpr64sp = COPY $x0
127    ; CHECK: %load:gpr64 = LDURXi %copy, -16 :: (volatile load 8)
128    ; CHECK: RET_ReallyLR
129    %copy:gpr(p0) = COPY $x0
130    %cst:gpr(s64) = G_CONSTANT i64 -16
131    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
132    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
133    RET_ReallyLR
134
135...
136---
137name:            dont_use_xro_zero
138alignment:       4
139legalized:       true
140regBankSelected: true
141tracksRegLiveness: true
142body:             |
143  bb.0:
144    liveins: $x0
145    ; Immediates that can be encoded in a LDRXui should be skipped.
146    ;
147    ; CHECK-LABEL: name: dont_use_xro_zero
148    ; CHECK: liveins: $x0
149    ; CHECK: %copy:gpr64sp = COPY $x0
150    ; CHECK: %load:gpr64 = LDRXui %copy, 0 :: (volatile load 8)
151    ; CHECK: RET_ReallyLR
152    %copy:gpr(p0) = COPY $x0
153    %cst:gpr(s64) = G_CONSTANT i64 0
154    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
155    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
156    RET_ReallyLR
157
158...
159---
160name:            dont_use_xro_in_range
161alignment:       4
162legalized:       true
163regBankSelected: true
164tracksRegLiveness: true
165body:             |
166  bb.0:
167    liveins: $x0
168    ; Check that we skip constants which can be encoded in an add.
169    ; 17 is in [0x0, 0xfff]
170    ;
171    ; CHECK-LABEL: name: dont_use_xro_in_range
172    ; CHECK: liveins: $x0
173    ; CHECK: %copy:gpr64sp = COPY $x0
174    ; CHECK: %load:gpr64 = LDURXi %copy, 17 :: (volatile load 8)
175    ; CHECK: RET_ReallyLR
176    %copy:gpr(p0) = COPY $x0
177    %cst:gpr(s64) = G_CONSTANT i64 17
178    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
179    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
180    RET_ReallyLR
181
182...
183---
184name:            dont_use_xro_add_lsl
185alignment:       4
186legalized:       true
187regBankSelected: true
188tracksRegLiveness: true
189body:             |
190  bb.0:
191    liveins: $x0
192    ; Check that we skip when we have an add with an lsl which cannot be
193    ; represented as a movk.
194    ;
195    ; cst = 0x0000000000111000
196    ; cst & 000fffffff000000 = 0
197    ; cst & ffffffffff00ffff != 0
198    ; cst & ffffffffffff0fff != 0
199    ;
200    ; CHECK-LABEL: name: dont_use_xro_add_lsl
201    ; CHECK: liveins: $x0
202    ; CHECK: %copy:gpr64 = COPY $x0
203    ; CHECK: [[COPY:%[0-9]+]]:gpr64common = COPY %copy
204    ; CHECK: %addr:gpr64sp = ADDXri [[COPY]], 273, 12
205    ; CHECK: %load:gpr64 = LDRXui %addr, 0 :: (volatile load 8)
206    ; CHECK: RET_ReallyLR
207    %copy:gpr(p0) = COPY $x0
208    %cst:gpr(s64) = G_CONSTANT i64 1118208
209    %addr:gpr(p0) = G_PTR_ADD %copy, %cst(s64)
210    %load:gpr(s64) = G_LOAD %addr(p0) :: (volatile load 8)
211    RET_ReallyLR
212