@@ -3843,7 +3843,12 @@ static int zend_jit_math_long_long(dasm_State **Dst,
3843
3843
| lea Ra(result_reg), [Ra(Z_REG(op1_addr))-Z_LVAL_P(Z_ZV(op2_addr))]
3844
3844
} else {
3845
3845
| GET_ZVAL_LVAL result_reg, op1_addr
3846
- if (same_ops && opcode != ZEND_DIV) {
3846
+ if ((opcode == ZEND_ADD || opcode == ZEND_SUB)
3847
+ && Z_MODE(op2_addr) == IS_CONST_ZVAL
3848
+ && Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
3849
+ /* +/- 0 */
3850
+ may_overflow = 0;
3851
+ } else if (same_ops && opcode != ZEND_DIV) {
3847
3852
| LONG_MATH_REG opcode, Ra(result_reg), Ra(result_reg)
3848
3853
} else {
3849
3854
| LONG_MATH opcode, result_reg, op2_addr
@@ -3990,12 +3995,24 @@ static int zend_jit_math_double_long(dasm_State **Dst,
3990
3995
| SSE_GET_ZVAL_DVAL result_reg, op1_addr
3991
3996
op1_reg = result_reg;
3992
3997
}
3993
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
3994
- | AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg
3998
+ if ((opcode == ZEND_ADD || opcode == ZEND_SUB)
3999
+ && Z_MODE(op2_addr) == IS_CONST_ZVAL
4000
+ && Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
4001
+ /* +/- 0 */
4002
+ } else {
4003
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
4004
+ | AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg
4005
+ }
3995
4006
} else {
3996
4007
| SSE_GET_ZVAL_DVAL result_reg, op1_addr
3997
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
3998
- | SSE_MATH_REG opcode, result_reg, tmp_reg
4008
+ if ((opcode == ZEND_ADD || opcode == ZEND_SUB)
4009
+ && Z_MODE(op2_addr) == IS_CONST_ZVAL
4010
+ && Z_LVAL_P(Z_ZV(op2_addr)) == 0) {
4011
+ /* +/- 0 */
4012
+ } else {
4013
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
4014
+ | SSE_MATH_REG opcode, result_reg, tmp_reg
4015
+ }
3999
4016
}
4000
4017
}
4001
4018
| SSE_SET_ZVAL_DVAL res_addr, result_reg
0 commit comments