diff options
-rw-r--r-- | ext/opcache/jit/zend_jit.c | 1 | ||||
-rw-r--r-- | ext/opcache/jit/zend_jit_disasm_x86.c | 3 | ||||
-rw-r--r-- | ext/opcache/jit/zend_jit_helpers.c | 29 | ||||
-rw-r--r-- | ext/opcache/jit/zend_jit_x86.dasc | 25 |
4 files changed, 45 insertions, 13 deletions
diff --git a/ext/opcache/jit/zend_jit.c b/ext/opcache/jit/zend_jit.c index 5ebf1c079c..41793fc299 100644 --- a/ext/opcache/jit/zend_jit.c +++ b/ext/opcache/jit/zend_jit.c @@ -16,6 +16,7 @@ +----------------------------------------------------------------------+ */ +#include "php_version.h" #include <ZendAccelerator.h> #include "zend_shared_alloc.h" #include "Zend/zend_execute.h" diff --git a/ext/opcache/jit/zend_jit_disasm_x86.c b/ext/opcache/jit/zend_jit_disasm_x86.c index a470179917..730a5d1319 100644 --- a/ext/opcache/jit/zend_jit_disasm_x86.c +++ b/ext/opcache/jit/zend_jit_disasm_x86.c @@ -490,6 +490,9 @@ static int zend_jit_disasm_init(void) REGISTER_HELPER(zend_jit_pre_dec_obj_helper); REGISTER_HELPER(zend_jit_post_inc_obj_helper); REGISTER_HELPER(zend_jit_post_dec_obj_helper); +#if (PHP_VERSION_ID <= 80000) && (SIZEOF_SIZE_T == 4) + REGISTER_HELPER(zval_jit_update_constant_ex); +#endif #undef REGISTER_HELPER #ifndef _WIN32 diff --git a/ext/opcache/jit/zend_jit_helpers.c b/ext/opcache/jit/zend_jit_helpers.c index 22904a8e1d..c366e6274a 100644 --- a/ext/opcache/jit/zend_jit_helpers.c +++ b/ext/opcache/jit/zend_jit_helpers.c @@ -2609,3 +2609,32 @@ static void ZEND_FASTCALL zend_jit_post_dec_obj_helper(zend_object *zobj, zend_s zval_ptr_dtor(z); } } + +#if (PHP_VERSION_ID <= 80000) && (SIZEOF_SIZE_T == 4) +static zend_result ZEND_FASTCALL zval_jit_update_constant_ex(zval *p, zend_class_entry *scope) +{ + if (Z_TYPE_P(p) == IS_CONSTANT_AST) { + zend_ast *ast = Z_ASTVAL_P(p); + + if (ast->kind == ZEND_AST_CONSTANT) { + zend_string *name = zend_ast_get_constant_name(ast); + zval *zv = zend_get_constant_ex(name, scope, ast->attr); + if (UNEXPECTED(zv == NULL)) { + return FAILURE; + } + + zval_ptr_dtor_nogc(p); + ZVAL_COPY_OR_DUP(p, zv); + } else { + zval tmp; + + if (UNEXPECTED(zend_ast_evaluate(&tmp, ast, scope) != SUCCESS)) { + return FAILURE; + } + zval_ptr_dtor_nogc(p); + ZVAL_COPY_VALUE(p, &tmp); + } + } + return SUCCESS; +} +#endif
\ No newline at end of file diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc index 066a8ea073..bf190427fb 100644 --- a/ext/opcache/jit/zend_jit_x86.dasc +++ b/ext/opcache/jit/zend_jit_x86.dasc @@ -12413,19 +12413,18 @@ static int zend_jit_recv_init(dasm_State **Dst, const zend_op *opline, const zen } else { | ADDR_OP2_2 mov, aword EX->opline, opline, r0 } - |.if X64 - | LOAD_ZVAL_ADDR CARG1, res_addr - | mov r0, EX->func - | mov CARG2, [r0 + offsetof(zend_op_array, scope)] - | EXT_CALL zval_update_constant_ex, r0 - |.else - | sub r4, 8 - | mov r0, EX->func - | push dword [r0 + offsetof(zend_op_array, scope)] - | PUSH_ZVAL_ADDR res_addr, r0 - | EXT_CALL zval_update_constant_ex, r0 - | add r4, 16 - |.endif + | LOAD_ZVAL_ADDR FCARG1a, res_addr + | mov r0, EX->func + | mov FCARG2a, [r0 + offsetof(zend_op_array, scope)] + | .if X64 + | EXT_CALL zval_update_constant_ex, r0 + | .else + ||#if (PHP_VERSION_ID <= 80000) + | EXT_CALL zval_jit_update_constant_ex, r0 + ||#else + | EXT_CALL zval_update_constant_ex, r0 + ||#endif + | .endif | test al, al | jnz >1 |.cold_code |