@@ -201,29 +201,75 @@ static int logical_immediate_p (uint64_t value, uint32_t reg_size)
201
201
202
202
|.macro LOAD_ADDR, reg, addr
203
203
| // 48-bit virtual address
204
- | mov reg, #((uintptr_t)(addr) & 0xffff)
205
- | movk reg, #(((uintptr_t)(addr) >> 16) & 0xffff), lsl #16
206
- | movk reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
204
+ || if (((uintptr_t)(addr)) == 0) {
205
+ | mov reg, xzr
206
+ || } else if (((uintptr_t)(addr)) <= MOVZ_IMM) {
207
+ | movz reg, #((uint64_t)(addr))
208
+ || } else if ((uintptr_t)(addr) & 0xffff) {
209
+ | movz reg, #((uintptr_t)(addr) & 0xffff)
210
+ || if (((uintptr_t)(addr) >> 16) & 0xffff) {
211
+ | movk reg, #(((uintptr_t)(addr) >> 16) & 0xffff), lsl #16
212
+ || }
213
+ || if (((uintptr_t)(addr) >> 32) & 0xffff) {
214
+ | movk reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
215
+ || }
216
+ || } else if (((uintptr_t)(addr) >> 16) & 0xffff) {
217
+ | movz reg, #(((uintptr_t)(addr) >> 16) & 0xffff), lsl #16
218
+ || if (((uintptr_t)(addr) >> 32) & 0xffff) {
219
+ | movk reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
220
+ || }
221
+ || } else {
222
+ | movz reg, #(((uintptr_t)(addr) >> 32) & 0xffff), lsl #32
223
+ || }
207
224
|.endmacro
208
225
209
226
// Type cast to unsigned is used to avoid undefined behavior.
210
227
|.macro LOAD_32BIT_VAL, reg, val
211
- || if (((uintptr_t)(val)) <= MOVZ_IMM) {
212
- | movz reg, #val
228
+ || if (((uint32_t)(val)) <= MOVZ_IMM) {
229
+ | movz reg, #((uint32_t)(val))
230
+ || } else if (((uint32_t)(val) & 0xffff)) {
231
+ | movz reg, #((uint32_t)(val) & 0xffff)
232
+ || if ((((uint32_t)(val) >> 16) & 0xffff)) {
233
+ | movk reg, #(((uint32_t)(val) >> 16) & 0xffff), lsl #16
234
+ || }
213
235
|| } else {
214
- | mov reg, #((uint32_t)(val) & 0xffff)
215
- | movk reg, #(((uint32_t)(val) >> 16) & 0xffff), lsl #16
236
+ | movz reg, #(((uint32_t)(val) >> 16) & 0xffff), lsl #16
216
237
|| }
217
238
|.endmacro
218
239
219
240
|.macro LOAD_64BIT_VAL, reg, val
220
- || if (((uintptr_t)(val)) <= MOVZ_IMM) {
221
- | movz reg, #val
241
+ || if (((uint64_t)(val)) == 0) {
242
+ | mov reg, xzr
243
+ || } else if (((uint64_t)(val)) <= MOVZ_IMM) {
244
+ | movz reg, #((uint64_t)(val))
245
+ || } else if (~((uint64_t)(val)) <= MOVZ_IMM) {
246
+ | movn reg, #(~((uint64_t)(val)))
247
+ || } else if ((uint64_t)(val) & 0xffff) {
248
+ | movz reg, #((uint64_t)(val) & 0xffff)
249
+ || if (((uint64_t)(val) >> 16) & 0xffff) {
250
+ | movk reg, #(((uint64_t)(val) >> 16) & 0xffff), lsl #16
251
+ || }
252
+ || if (((uint64_t)(val) >> 32) & 0xffff) {
253
+ | movk reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
254
+ || }
255
+ || if ((((uint64_t)(val) >> 48) & 0xffff)) {
256
+ | movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
257
+ || }
258
+ || } else if (((uint64_t)(val) >> 16) & 0xffff) {
259
+ | movz reg, #(((uint64_t)(val) >> 16) & 0xffff), lsl #16
260
+ || if (((uint64_t)(val) >> 32) & 0xffff) {
261
+ | movk reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
262
+ || }
263
+ || if ((((uint64_t)(val) >> 48) & 0xffff)) {
264
+ | movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
265
+ || }
266
+ || } else if (((uint64_t)(val) >> 32) & 0xffff) {
267
+ | movz reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
268
+ || if ((((uint64_t)(val) >> 48) & 0xffff)) {
269
+ | movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
270
+ || }
222
271
|| } else {
223
- | mov reg, #((uint64_t)(val) & 0xffff)
224
- | movk reg, #(((uint64_t)(val) >> 16) & 0xffff), lsl #16
225
- | movk reg, #(((uint64_t)(val) >> 32) & 0xffff), lsl #32
226
- | movk reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
272
+ | movz reg, #(((uint64_t)(val) >> 48) & 0xffff), lsl #48
227
273
|| }
228
274
|.endmacro
229
275
0 commit comments