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