Skip to content

Commit f81f8f5

Browse files
committed
Imroved code for constants loading
1 parent d58d2e7 commit f81f8f5

File tree

1 file changed

+59
-13
lines changed

1 file changed

+59
-13
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 59 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -201,29 +201,75 @@ static int logical_immediate_p (uint64_t value, uint32_t reg_size)
201201

202202
|.macro LOAD_ADDR, reg, addr
203203
| // 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+
|| }
207224
|.endmacro
208225

209226
// Type cast to unsigned is used to avoid undefined behavior.
210227
|.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+
|| }
213235
|| } 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
216237
|| }
217238
|.endmacro
218239

219240
|.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+
|| }
222271
|| } 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
227273
|| }
228274
|.endmacro
229275

0 commit comments

Comments
 (0)