@@ -4234,7 +4234,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4234
4234
} else {
4235
4235
result_reg = Z_REG(res_addr);
4236
4236
}
4237
- } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) {
4237
+ } else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr) && !may_overflow ) {
4238
4238
result_reg = Z_REG(op1_addr);
4239
4239
} else if (Z_REG(res_addr) != ZREG_R0) {
4240
4240
result_reg = ZREG_R0;
@@ -4245,32 +4245,42 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4245
4245
}
4246
4246
4247
4247
if (opcode == ZEND_MUL &&
4248
- ((Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4249
- IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr))) &&
4250
- is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr)))) ||
4251
- (Z_MODE(op1_addr) == IS_CONST_ZVAL &&
4252
- IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr))) &&
4253
- is_power_of_two(Z_LVAL_P(Z_ZV(op1_addr)))))) {
4254
- if (Z_MODE(op2_addr) == IS_CONST_ZVAL) {
4255
- if (Z_MODE(op1_addr) == IS_REG && Z_LVAL_P(Z_ZV(op2_addr)) == 2) {
4256
- | lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Ra(Z_REG(op1_addr))]
4257
- } else {
4258
- | GET_ZVAL_LVAL result_reg, op1_addr
4259
- | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4260
- }
4248
+ Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4249
+ Z_LVAL_P(Z_ZV(op2_addr)) == 2) {
4250
+ if (Z_MODE(op1_addr) == IS_REG && !may_overflow) {
4251
+ | lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Ra(Z_REG(op1_addr))]
4261
4252
} else {
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))]
4264
- } else {
4265
- | GET_ZVAL_LVAL result_reg, op2_addr
4266
- | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
4267
- }
4253
+ | GET_ZVAL_LVAL result_reg, op1_addr
4254
+ | add Ra(result_reg), Ra(result_reg)
4268
4255
}
4256
+ } else if (opcode == ZEND_MUL &&
4257
+ Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4258
+ !may_overflow &&
4259
+ Z_LVAL_P(Z_ZV(op2_addr)) > 0 &&
4260
+ zend_long_is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr)))) {
4261
+ | GET_ZVAL_LVAL result_reg, op1_addr
4262
+ | shl Ra(result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4263
+ } else if (opcode == ZEND_MUL &&
4264
+ Z_MODE(op1_addr) == IS_CONST_ZVAL &&
4265
+ Z_LVAL_P(Z_ZV(op1_addr)) == 2) {
4266
+ if (Z_MODE(op2_addr) == IS_REG && !may_overflow) {
4267
+ | lea Ra(result_reg), [Ra(Z_REG(op2_addr))+Ra(Z_REG(op2_addr))]
4268
+ } else {
4269
+ | GET_ZVAL_LVAL result_reg, op2_addr
4270
+ | add Ra(result_reg), Ra(result_reg)
4271
+ }
4272
+ } else if (opcode == ZEND_MUL &&
4273
+ Z_MODE(op1_addr) == IS_CONST_ZVAL &&
4274
+ !may_overflow &&
4275
+ Z_LVAL_P(Z_ZV(op1_addr)) > 0 &&
4276
+ zend_long_is_power_of_two(Z_LVAL_P(Z_ZV(op1_addr)))) {
4277
+ | GET_ZVAL_LVAL result_reg, op2_addr
4278
+ | shl Ra(result_reg), zend_long_floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
4269
4279
} else if (opcode == ZEND_DIV &&
4270
4280
(Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4271
- is_power_of_two (Z_LVAL_P(Z_ZV(op2_addr))))) {
4281
+ zend_long_is_power_of_two (Z_LVAL_P(Z_ZV(op2_addr))))) {
4272
4282
| GET_ZVAL_LVAL result_reg, op1_addr
4273
- | shr Ra(result_reg), floor_log2 (Z_LVAL_P(Z_ZV(op2_addr)))
4283
+ | shr Ra(result_reg), zend_long_floor_log2 (Z_LVAL_P(Z_ZV(op2_addr)))
4274
4284
} else if (opcode == ZEND_ADD &&
4275
4285
!may_overflow &&
4276
4286
Z_MODE(op1_addr) == IS_REG &&
0 commit comments