@@ -3936,8 +3936,11 @@ static int zend_jit_math_long_long(dasm_State **Dst,
3936
3936
result_reg = Z_REG(res_addr);
3937
3937
} else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) {
3938
3938
result_reg = Z_REG(op1_addr);
3939
- } else {
3939
+ } else if (Z_REG(res_addr) != ZREG_R0) {
3940
3940
result_reg = ZREG_R0;
3941
+ } else {
3942
+ /* ASSIGN_DIM_OP */
3943
+ result_reg = ZREG_FCARG1a;
3941
3944
}
3942
3945
3943
3946
if (opcode == ZEND_MUL &&
@@ -4392,7 +4395,6 @@ static int zend_jit_math_helper(dasm_State **Dst,
4392
4395
|.cold_code
4393
4396
}
4394
4397
|6:
4395
- | SAVE_VALID_OPLINE opline, r0
4396
4398
if (Z_MODE(res_addr) == IS_REG) {
4397
4399
zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var);
4398
4400
| LOAD_ZVAL_ADDR FCARG1a, real_addr
@@ -4420,6 +4422,7 @@ static int zend_jit_math_helper(dasm_State **Dst,
4420
4422
| sub r4, 12
4421
4423
| PUSH_ZVAL_ADDR op2_addr, r0
4422
4424
|.endif
4425
+ | SAVE_VALID_OPLINE opline, r0
4423
4426
if (opcode == ZEND_ADD) {
4424
4427
| EXT_CALL add_function, r0
4425
4428
} else if (opcode == ZEND_SUB) {
@@ -4545,8 +4548,17 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
4545
4548
result_reg = Z_REG(res_addr);
4546
4549
} else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) {
4547
4550
result_reg = Z_REG(op1_addr);
4548
- } else {
4551
+ } else if (Z_REG(res_addr) != ZREG_R0) {
4549
4552
result_reg = ZREG_R0;
4553
+ } else {
4554
+ /* ASSIGN_DIM_OP */
4555
+ if (sizeof(void*) == 4
4556
+ && (opcode == ZEND_SL || opcode == ZEND_SR)
4557
+ && Z_MODE(op2_addr) != IS_CONST_ZVAL) {
4558
+ result_reg = ZREG_R2;
4559
+ } else {
4560
+ result_reg = ZREG_FCARG1a;
4561
+ }
4550
4562
}
4551
4563
4552
4564
if (opcode == ZEND_SL) {
@@ -4716,7 +4728,6 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
4716
4728
|.cold_code
4717
4729
}
4718
4730
|6:
4719
- | SAVE_VALID_OPLINE opline, r0
4720
4731
if (Z_MODE(res_addr) == IS_REG) {
4721
4732
zend_jit_addr real_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FP, res_var);
4722
4733
| LOAD_ZVAL_ADDR FCARG1a, real_addr
@@ -4744,6 +4755,7 @@ static int zend_jit_long_math_helper(dasm_State **Dst,
4744
4755
| sub r4, 12
4745
4756
| PUSH_ZVAL_ADDR op2_addr, r0
4746
4757
|.endif
4758
+ | SAVE_VALID_OPLINE opline, r0
4747
4759
if (opcode == ZEND_BW_OR) {
4748
4760
| EXT_CALL bitwise_or_function, r0
4749
4761
} else if (opcode == ZEND_BW_AND) {
@@ -4864,7 +4876,6 @@ static int zend_jit_concat_helper(dasm_State **Dst,
4864
4876
|6:
4865
4877
}
4866
4878
#endif
4867
- | SAVE_VALID_OPLINE opline, r0
4868
4879
if (Z_REG(res_addr) != ZREG_FCARG1a || Z_OFFSET(res_addr) != 0) {
4869
4880
| LOAD_ZVAL_ADDR FCARG1a, res_addr
4870
4881
}
@@ -4875,6 +4886,7 @@ static int zend_jit_concat_helper(dasm_State **Dst,
4875
4886
| sub r4, 12
4876
4887
| PUSH_ZVAL_ADDR op2_addr, r0
4877
4888
|.endif
4889
+ | SAVE_VALID_OPLINE opline, r0
4878
4890
| EXT_CALL concat_function, r0
4879
4891
|.if not(X64)
4880
4892
| add r4, 12
@@ -5993,7 +6005,6 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3
5993
6005
| //ZEND_VM_C_GOTO(assign_dim_op_ret_null);
5994
6006
| jmp >9
5995
6007
|.code
5996
- | mov FCARG1a, r0
5997
6008
} else {
5998
6009
var_info = zend_array_element_type(op1_info, opline->op1_type, 0, 0);
5999
6010
if (op1_info & (MAY_BE_ARRAY_OF_REF|MAY_BE_OBJECT)) {
@@ -6008,14 +6019,13 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3
6008
6019
}
6009
6020
6010
6021
|8:
6011
- | mov FCARG1a, r0
6012
6022
if (op1_info & (MAY_BE_ARRAY_OF_REF)) {
6013
6023
binary_op_type binary_op = get_binary_op(opline->extended_value);
6014
- | IF_NOT_Z_TYPE, FCARG1a , IS_REFERENCE, >1
6015
- | GET_Z_PTR FCARG1a, FCARG1a
6024
+ | IF_NOT_Z_TYPE, r0 , IS_REFERENCE, >1
6025
+ | GET_Z_PTR FCARG1a, r0
6016
6026
| cmp aword [FCARG1a + offsetof(zend_reference, sources.ptr)], 0
6017
6027
| jnz >2
6018
- | add FCARG1a, offsetof(zend_reference, val)
6028
+ | lea r0, aword [FCARG1a + offsetof(zend_reference, val)]
6019
6029
|.cold_code
6020
6030
|2:
6021
6031
| LOAD_ZVAL_ADDR FCARG2a, op3_addr
@@ -6037,7 +6047,7 @@ static int zend_jit_assign_dim_op(dasm_State **Dst, const zend_op *opline, uint3
6037
6047
}
6038
6048
}
6039
6049
6040
- var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_FCARG1a , 0);
6050
+ var_addr = ZEND_ADDR_MEM_ZVAL(ZREG_R0 , 0);
6041
6051
switch (opline->extended_value) {
6042
6052
case ZEND_ADD:
6043
6053
case ZEND_SUB:
0 commit comments