Skip to content

Commit 7215283

Browse files
committed
Use B/BL intead of BR/BLR if possible
1 parent f81f8f5 commit 7215283

File tree

1 file changed

+26
-4
lines changed

1 file changed

+26
-4
lines changed

ext/opcache/jit/zend_jit_arm64.dasc

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,20 @@
103103
#define LDR_STR_PIMM32 (MAX_IMM12*4) // ldr/str insn for 32-bit register: pimm is imm12 * 4
104104
#define LDRB_STRB_PIMM MAX_IMM12 // ldrb/strb insn
105105

106+
#define B_IMM26 (((1<<26)-1)*4)
107+
108+
static bool arm64_may_use_b(void *addr)
109+
{
110+
if (addr >= dasm_buf && addr < dasm_end) {
111+
return (((char*)dasm_end - (char*)dasm_buf) < B_IMM26);
112+
} else if (addr >= dasm_end) {
113+
return (((char*)addr - (char*)dasm_buf) < B_IMM26);
114+
} else if (addr < dasm_buf) {
115+
return (((char*)dasm_end - (char*)addr) < B_IMM26);
116+
}
117+
return 0;
118+
}
119+
106120
#include "Zend/zend_cpuinfo.h"
107121

108122
#ifdef HAVE_VALGRIND
@@ -609,13 +623,21 @@ static int logical_immediate_p (uint64_t value, uint32_t reg_size)
609623
|.endmacro
610624

611625
|.macro EXT_CALL, func, tmp_reg
612-
| LOAD_ADDR tmp_reg, func
613-
| blr tmp_reg
626+
|| if (arm64_may_use_b(func)) {
627+
| bl &func
628+
|| } else {
629+
| LOAD_ADDR tmp_reg, func
630+
| blr tmp_reg
631+
|| }
614632
|.endmacro
615633

616634
|.macro EXT_JMP, func, tmp_reg
617-
| LOAD_ADDR tmp_reg, func
618-
| br tmp_reg
635+
|| if (arm64_may_use_b(func)) {
636+
| b &func
637+
|| } else {
638+
| LOAD_ADDR tmp_reg, func
639+
| br tmp_reg
640+
|| }
619641
|.endmacro
620642

621643
|.macro SAVE_IP

0 commit comments

Comments
 (0)