Skip to content

Commit 3c37a34

Browse files
committed
Fixed possible incorrect assumption if constant is a power of 2.
1 parent 7aba6de commit 3c37a34

File tree

1 file changed

+17
-17
lines changed

1 file changed

+17
-17
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4244,26 +4244,26 @@ static int zend_jit_math_long_long(dasm_State **Dst,
42444244
}
42454245

42464246
if (opcode == ZEND_MUL &&
4247-
((Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4247+
Z_MODE(op2_addr) == IS_CONST_ZVAL &&
42484248
IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr))) &&
4249-
is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr)))) ||
4250-
(Z_MODE(op1_addr) == IS_CONST_ZVAL &&
4249+
is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr)))) {
4250+
4251+
if (Z_MODE(op1_addr) == IS_REG && Z_LVAL_P(Z_ZV(op2_addr)) == 2) {
4252+
| lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Ra(Z_REG(op1_addr))]
4253+
} else {
4254+
| GET_ZVAL_LVAL result_reg, op1_addr
4255+
| shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4256+
}
4257+
} else if (opcode == ZEND_MUL &&
4258+
Z_MODE(op1_addr) == IS_CONST_ZVAL &&
42514259
IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr))) &&
4252-
is_power_of_two(Z_LVAL_P(Z_ZV(op1_addr)))))) {
4253-
if (Z_MODE(op2_addr) == IS_CONST_ZVAL) {
4254-
if (Z_MODE(op1_addr) == IS_REG && Z_LVAL_P(Z_ZV(op2_addr)) == 2) {
4255-
| lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Ra(Z_REG(op1_addr))]
4256-
} else {
4257-
| GET_ZVAL_LVAL result_reg, op1_addr
4258-
| shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4259-
}
4260+
is_power_of_two(Z_LVAL_P(Z_ZV(op1_addr)))) {
4261+
4262+
if (Z_MODE(op2_addr) == IS_REG && Z_LVAL_P(Z_ZV(op1_addr)) == 2) {
4263+
| lea Ra(result_reg), [Ra(Z_REG(op2_addr))+Ra(Z_REG(op2_addr))]
42604264
} else {
4261-
if (Z_MODE(op2_addr) == IS_REG && Z_LVAL_P(Z_ZV(op1_addr)) == 2) {
4262-
| lea Ra(result_reg), [Ra(Z_REG(op2_addr))+Ra(Z_REG(op2_addr))]
4263-
} else {
4264-
| GET_ZVAL_LVAL result_reg, op2_addr
4265-
| shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
4266-
}
4265+
| GET_ZVAL_LVAL result_reg, op2_addr
4266+
| shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
42674267
}
42684268
} else if (opcode == ZEND_DIV &&
42694269
(Z_MODE(op2_addr) == IS_CONST_ZVAL &&

0 commit comments

Comments
 (0)