Skip to content

Commit 990b556

Browse files
committed
Use cheaper code for overflow +/-1
1 parent 9554fb3 commit 990b556

File tree

1 file changed

+47
-23
lines changed

1 file changed

+47
-23
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 47 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -3036,38 +3036,62 @@ static int zend_jit_math_long_long(dasm_State **Dst,
30363036
}
30373037
if (may_overflow) {
30383038
| jo >1
3039-
|.cold_code
3040-
|1:
3039+
}
3040+
3041+
| SET_ZVAL_LVAL res_addr, Ra(result_reg)
3042+
if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
3043+
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_LONG) {
3044+
| SET_ZVAL_TYPE_INFO res_addr, IS_LONG
3045+
}
3046+
}
3047+
3048+
if (may_overflow) {
30413049
zend_reg tmp_reg1 = ZREG_XMM0;
30423050
zend_reg tmp_reg2 = ZREG_XMM1;
30433051

3044-
| SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
3045-
| SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
3046-
if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
3047-
| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
3048-
} else {
3049-
| SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
3050-
}
3051-
| SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
3052+
|.cold_code
3053+
|1:
3054+
3055+
do {
3056+
if ((Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 1) ||
3057+
(Z_MODE(op2_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op2_addr)) == 1)) {
3058+
if (opcode == ZEND_ADD) {
3059+
|.if X64
3060+
| mov64 rax, 0x43e0000000000000
3061+
| SET_ZVAL_LVAL res_addr, rax
3062+
|.else
3063+
| SET_ZVAL_LVAL res_addr, 0
3064+
| SET_ZVAL_W2 res_addr, 0x41e00000
3065+
|.endif
3066+
break;
3067+
} else if (opcode == ZEND_SUB) {
3068+
|.if X64
3069+
| mov64 rax, 0xc3e0000000000000
3070+
| SET_ZVAL_LVAL res_addr, rax
3071+
|.else
3072+
| SET_ZVAL_LVAL res_addr, 0x00200000
3073+
| SET_ZVAL_W2 res_addr, 0xc1e00000
3074+
|.endif
3075+
break;
3076+
}
3077+
}
3078+
3079+
| SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
3080+
| SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
3081+
if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
3082+
| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
3083+
} else {
3084+
| SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
3085+
}
3086+
| SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
3087+
} while (0);
3088+
30523089
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_DOUBLE) {
30533090
| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE
30543091
}
30553092
| jmp >2
30563093
|.code
3057-
| SET_ZVAL_LVAL res_addr, Ra(result_reg)
3058-
if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
3059-
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_LONG) {
3060-
| SET_ZVAL_TYPE_INFO res_addr, IS_LONG
3061-
}
3062-
}
30633094
|2:
3064-
} else if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
3065-
| SET_ZVAL_LVAL res_addr, Ra(result_reg)
3066-
if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
3067-
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_LONG) {
3068-
| SET_ZVAL_TYPE_INFO res_addr, IS_LONG
3069-
}
3070-
}
30713095
}
30723096

30733097
return 1;

0 commit comments

Comments
 (0)