Skip to content

Commit a351da5

Browse files
committed
Simplify zend_jit_pre/post_inc/dec_typed_ref() helpers
1 parent ad61e14 commit a351da5

File tree

2 files changed

+34
-56
lines changed

2 files changed

+34
-56
lines changed

ext/opcache/jit/zend_jit_helpers.c

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1748,8 +1748,9 @@ static ZEND_COLD void zend_jit_throw_incdec_ref_error(zend_reference *ref, zend_
17481748
inc ? "max" : "min");
17491749
}
17501750

1751-
static void ZEND_FASTCALL zend_jit_pre_inc_typed_ref(zval *var_ptr, zend_reference *ref, zval *ret)
1751+
static void ZEND_FASTCALL zend_jit_pre_inc_typed_ref(zend_reference *ref, zval *ret)
17521752
{
1753+
zval *var_ptr = &ref->val;
17531754
zval tmp;
17541755

17551756
ZVAL_COPY(&tmp, var_ptr);
@@ -1770,8 +1771,9 @@ static void ZEND_FASTCALL zend_jit_pre_inc_typed_ref(zval *var_ptr, zend_referen
17701771
}
17711772
}
17721773

1773-
static void ZEND_FASTCALL zend_jit_pre_dec_typed_ref(zval *var_ptr, zend_reference *ref, zval *ret)
1774+
static void ZEND_FASTCALL zend_jit_pre_dec_typed_ref(zend_reference *ref, zval *ret)
17741775
{
1776+
zval *var_ptr = &ref->val;
17751777
zval tmp;
17761778

17771779
ZVAL_COPY(&tmp, var_ptr);
@@ -1792,8 +1794,9 @@ static void ZEND_FASTCALL zend_jit_pre_dec_typed_ref(zval *var_ptr, zend_referen
17921794
}
17931795
}
17941796

1795-
static void ZEND_FASTCALL zend_jit_post_inc_typed_ref(zval *var_ptr, zend_reference *ref, zval *ret)
1797+
static void ZEND_FASTCALL zend_jit_post_inc_typed_ref(zend_reference *ref, zval *ret)
17961798
{
1799+
zval *var_ptr = &ref->val;
17971800
ZVAL_COPY(ret, var_ptr);
17981801

17991802
increment_function(var_ptr);
@@ -1807,8 +1810,9 @@ static void ZEND_FASTCALL zend_jit_post_inc_typed_ref(zval *var_ptr, zend_refere
18071810
}
18081811
}
18091812

1810-
static void ZEND_FASTCALL zend_jit_post_dec_typed_ref(zval *var_ptr, zend_reference *ref, zval *ret)
1813+
static void ZEND_FASTCALL zend_jit_post_dec_typed_ref(zend_reference *ref, zval *ret)
18111814
{
1815+
zval *var_ptr = &ref->val;
18121816
ZVAL_COPY(ret, var_ptr);
18131817

18141818
decrement_function(var_ptr);
@@ -2259,7 +2263,7 @@ static void ZEND_FASTCALL zend_jit_pre_inc_obj_helper(zend_object *zobj, zend_st
22592263
zend_reference *ref = Z_REF_P(prop);
22602264
prop = Z_REFVAL_P(prop);
22612265
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
2262-
zend_jit_pre_inc_typed_ref(&ref->val, ref, result);
2266+
zend_jit_pre_inc_typed_ref(ref, result);
22632267
break;
22642268
}
22652269
}
@@ -2328,7 +2332,7 @@ static void ZEND_FASTCALL zend_jit_pre_dec_obj_helper(zend_object *zobj, zend_st
23282332
zend_reference *ref = Z_REF_P(prop);
23292333
prop = Z_REFVAL_P(prop);
23302334
if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
2331-
zend_jit_pre_dec_typed_ref(&ref->val, ref, result);
2335+
zend_jit_pre_dec_typed_ref(ref, result);
23322336
break;
23332337
}
23342338
}
@@ -2395,7 +2399,7 @@ static void ZEND_FASTCALL zend_jit_post_inc_obj_helper(zend_object *zobj, zend_s
23952399
zend_reference *ref = Z_REF_P(prop);
23962400
prop = Z_REFVAL_P(prop);
23972401
if (ZEND_REF_HAS_TYPE_SOURCES(ref)) {
2398-
zend_jit_post_inc_typed_ref(&ref->val, ref, result);
2402+
zend_jit_post_inc_typed_ref(ref, result);
23992403
return;
24002404
}
24012405
}
@@ -2454,7 +2458,7 @@ static void ZEND_FASTCALL zend_jit_post_dec_obj_helper(zend_object *zobj, zend_s
24542458
zend_reference *ref = Z_REF_P(prop);
24552459
prop = Z_REFVAL_P(prop);
24562460
if (ZEND_REF_HAS_TYPE_SOURCES(ref)) {
2457-
zend_jit_post_dec_typed_ref(&ref->val, ref, result);
2461+
zend_jit_post_dec_typed_ref(ref, result);
24582462
return;
24592463
}
24602464
}

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 22 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -4064,24 +4064,14 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
40644064
| // ZVAL_DEREF(var_ptr);
40654065
if (op1_info & MAY_BE_REF) {
40664066
| IF_NOT_Z_TYPE, FCARG1a, IS_REFERENCE, >2
4067-
| GET_Z_PTR FCARG2a, FCARG1a
4068-
| cmp aword [FCARG2a + offsetof(zend_reference, sources.ptr)], 0
4069-
| lea FCARG1a, [FCARG2a + offsetof(zend_reference, val)]
4070-
| jz >2
4071-
|.if X64
4072-
if (RETURN_VALUE_USED(opline)) {
4073-
| LOAD_ZVAL_ADDR CARG3, res_addr
4074-
} else {
4075-
| mov CARG3, 0
4076-
}
4077-
|.else
4078-
| sub r4, 12
4079-
if (RETURN_VALUE_USED(opline)) {
4080-
| PUSH_ZVAL_ADDR res_addr, r0
4081-
} else {
4082-
| push 0
4083-
}
4084-
|.endif
4067+
| GET_Z_PTR FCARG1a, FCARG1a
4068+
| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0
4069+
| jz >1
4070+
if (RETURN_VALUE_USED(opline)) {
4071+
| LOAD_ZVAL_ADDR FCARG2a, res_addr
4072+
} else {
4073+
| xor FCARG2a, FCARG2a
4074+
}
40854075
if (opline->opcode == ZEND_PRE_INC) {
40864076
| EXT_CALL zend_jit_pre_inc_typed_ref, r0
40874077
} else if (opline->opcode == ZEND_PRE_DEC) {
@@ -4093,11 +4083,10 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
40934083
} else {
40944084
ZEND_UNREACHABLE();
40954085
}
4096-
|.if not(X64)
4097-
| add r4, 12
4098-
|.endif
40994086
zend_jit_check_exception(Dst);
41004087
| jmp >3
4088+
|1:
4089+
| lea FCARG1a, [FCARG1a + offsetof(zend_reference, val)]
41014090
|2:
41024091
}
41034092

@@ -12516,33 +12505,24 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
1251612505
if (!prop_info || !ZEND_TYPE_IS_SET(prop_info->type)) {
1251712506
zend_jit_addr var_addr = prop_addr;
1251812507

12519-
var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0, 0);
12520-
| LOAD_ZVAL_ADDR r0, prop_addr
12508+
var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
12509+
| LOAD_ZVAL_ADDR FCARG1a, prop_addr
1252112510

1252212511
| IF_NOT_ZVAL_TYPE var_addr, IS_REFERENCE, >2
12523-
| GET_ZVAL_PTR FCARG2a, var_addr
12524-
| cmp aword [FCARG2a + offsetof(zend_reference, sources.ptr)], 0
12512+
| GET_ZVAL_PTR FCARG1a, var_addr
12513+
| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0
1252512514
| jnz >1
12526-
| lea r0, aword [FCARG2a + offsetof(zend_reference, val)]
12515+
| lea FCARG1a, aword [FCARG1a + offsetof(zend_reference, val)]
1252712516
|.cold_code
1252812517
|1:
12529-
| lea FCARG1a, [FCARG2a + offsetof(zend_reference, val)]
1253012518
if (opline) {
1253112519
| SET_EX_OPLINE opline, r0
1253212520
}
12533-
|.if X64
12534-
if (opline->result_type == IS_UNUSED) {
12535-
| xor CARG3, CARG3
12536-
} else {
12537-
| LOAD_ZVAL_ADDR CARG3, res_addr
12538-
}
12539-
|.else
12540-
if (opline->result_type == IS_UNUSED) {
12541-
| push 0
12542-
} else {
12543-
| PUSH_ZVAL_ADDR res_addr, r0
12544-
}
12545-
|.endif
12521+
if (opline->result_type == IS_UNUSED) {
12522+
| xor FCARG2a, FCARG2a
12523+
} else {
12524+
| LOAD_ZVAL_ADDR FCARG2a, res_addr
12525+
}
1254612526
switch (opline->opcode) {
1254712527
case ZEND_PRE_INC_OBJ:
1254812528
| EXT_CALL zend_jit_pre_inc_typed_ref, r0
@@ -12559,9 +12539,6 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
1255912539
default:
1256012540
ZEND_UNREACHABLE();
1256112541
}
12562-
|.if not(X64)
12563-
| add r4, 12
12564-
|.endif
1256512542
| jmp >9
1256612543
|.code
1256712544

@@ -12580,16 +12557,13 @@ static int zend_jit_incdec_obj(dasm_State **Dst,
1258012557
| jo >3
1258112558
if (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_PRE_DEC_OBJ) {
1258212559
if (opline->result_type != IS_UNUSED) {
12583-
| ZVAL_COPY_VALUE res_addr, -1, var_addr, MAY_BE_LONG, ZREG_R1, ZREG_R2
12560+
| ZVAL_COPY_VALUE res_addr, -1, var_addr, MAY_BE_LONG, ZREG_R0, ZREG_R2
1258412561
}
1258512562
}
1258612563
|.cold_code
1258712564
|2:
12588-
| LOAD_ZVAL_ADDR FCARG1a, var_addr
1258912565
if (opline->opcode == ZEND_POST_INC_OBJ || opline->opcode == ZEND_POST_DEC_OBJ) {
12590-
zend_jit_addr val_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a, 0);
12591-
12592-
| ZVAL_COPY_VALUE res_addr, -1, val_addr, MAY_BE_ANY, ZREG_R0, ZREG_R2
12566+
| ZVAL_COPY_VALUE res_addr, -1, var_addr, MAY_BE_ANY, ZREG_R0, ZREG_R2
1259312567
| TRY_ADDREF MAY_BE_ANY, ah, r2
1259412568
}
1259512569
if (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_POST_INC_OBJ) {

0 commit comments

Comments
 (0)