Skip to content

Commit ddb35fe

Browse files
committed
JIT/AArch64: Use ADR/ADRP if it makes sense
1 parent dec7b74 commit ddb35fe

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ static int sp_adj[SP_ADJ_LAST];
110110
#define LDRB_STRB_PIMM MAX_IMM12 // ldrb/strb insn
111111

112112
#define B_IMM (1<<27) // signed imm26 * 4
113+
#define ADR_IMM (1<<20) // signed imm21
114+
#define ADRP_IMM (1LL<<32) // signed imm21 * 4096
113115

114116
static bool arm64_may_use_b(const void *addr)
115117
{
@@ -123,6 +125,30 @@ static bool arm64_may_use_b(const void *addr)
123125
return 0;
124126
}
125127

128+
static bool arm64_may_use_adr(const void *addr)
129+
{
130+
if (addr >= dasm_buf && addr < dasm_end) {
131+
return (((char*)dasm_end - (char*)dasm_buf) < ADR_IMM);
132+
} else if (addr >= dasm_end) {
133+
return (((char*)addr - (char*)dasm_buf) < ADR_IMM);
134+
} else if (addr < dasm_buf) {
135+
return (((char*)dasm_end - (char*)addr) < ADR_IMM);
136+
}
137+
return 0;
138+
}
139+
140+
static bool arm64_may_use_adrp(const void *addr)
141+
{
142+
if (addr >= dasm_buf && addr < dasm_end) {
143+
return (((char*)dasm_end - (char*)dasm_buf) < ADRP_IMM);
144+
} else if (addr >= dasm_end) {
145+
return (((char*)addr - (char*)dasm_buf) < ADRP_IMM);
146+
} else if (addr < dasm_buf) {
147+
return (((char*)dasm_end - (char*)addr) < ADRP_IMM);
148+
}
149+
return 0;
150+
}
151+
126152
#include "Zend/zend_cpuinfo.h"
127153

128154
#ifdef HAVE_VALGRIND
@@ -223,6 +249,13 @@ static int logical_immediate_p (uint64_t value, uint32_t reg_size)
223249
| mov reg, xzr
224250
|| } else if (((uintptr_t)(addr)) <= MOVZ_IMM) {
225251
| movz reg, #((uint64_t)(addr))
252+
|| } else if (arm64_may_use_adr((void*)(addr))) {
253+
| adr reg, &addr
254+
|| } else if (arm64_may_use_adrp((void*)(addr))) {
255+
| adrp reg, &(((uintptr_t)(addr)))
256+
|| if (((uintptr_t)(addr)) & 0xfff) {
257+
| add reg, reg, #(((uintptr_t)(addr)) & 0xfff)
258+
|| }
226259
|| } else if ((uintptr_t)(addr) & 0xffff) {
227260
| movz reg, #((uintptr_t)(addr) & 0xffff)
228261
|| if (((uintptr_t)(addr) >> 16) & 0xffff) {

0 commit comments

Comments
 (0)