@@ -4180,7 +4180,6 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4180
4180
bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
4181
4181
zend_reg result_reg;
4182
4182
zend_reg tmp_reg = ZREG_R0;
4183
- bool use_ovf_flag = 1;
4184
4183
4185
4184
if (Z_MODE(res_addr) == IS_REG && (res_info & MAY_BE_LONG)) {
4186
4185
if (may_overflow && (res_info & MAY_BE_GUARD)
@@ -4201,67 +4200,39 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4201
4200
}
4202
4201
4203
4202
if (opcode == ZEND_MUL &&
4204
- Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4205
- Z_LVAL_P(Z_ZV(op2_addr)) > 0 &&
4206
- IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr))) &&
4207
- is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr)))) {
4208
-
4209
- if (Z_MODE(op1_addr) == IS_REG && Z_LVAL_P(Z_ZV(op2_addr)) == 2) {
4203
+ Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4204
+ Z_LVAL_P(Z_ZV(op2_addr)) == 2) {
4205
+ if (Z_MODE(op1_addr) == IS_REG && !may_overflow) {
4210
4206
| lea Ra(result_reg), [Ra(Z_REG(op1_addr))+Ra(Z_REG(op1_addr))]
4211
4207
} else {
4212
4208
| GET_ZVAL_LVAL result_reg, op1_addr
4213
- | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4214
- if (may_overflow) {
4215
- /* Compare 'op' and '((op << n) >> n)' for overflow.
4216
- * Flag: jne -> overflow. je -> no overflow.
4217
- */
4218
- use_ovf_flag = 0;
4219
- | sar Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4220
- if (Z_MODE(op1_addr) == IS_CONST_ZVAL) {
4221
- | cmp Ra(result_reg), Z_LVAL_P(Z_ZV(op1_addr))
4222
- } else if (Z_MODE(op1_addr) == IS_MEM_ZVAL) {
4223
- | cmp Ra(result_reg), [Ra(Z_REG(op1_addr))+Z_OFFSET(op1_addr)]
4224
- } else if (Z_MODE(op1_addr) == IS_REG) {
4225
- | cmp Ra(result_reg), Ra(Z_REG(op1_addr))
4226
- } else {
4227
- ZEND_UNREACHABLE();
4228
- }
4229
- | pushf
4230
- | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4231
- | popf
4232
- }
4209
+ | add Ra(result_reg), Ra(result_reg)
4233
4210
}
4234
4211
} else if (opcode == ZEND_MUL &&
4235
- Z_MODE(op1_addr) == IS_CONST_ZVAL &&
4236
- Z_LVAL_P(Z_ZV(op1_addr)) > 0 &&
4237
- IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr))) &&
4238
- is_power_of_two(Z_LVAL_P(Z_ZV(op1_addr)))) {
4239
-
4240
- if (Z_MODE(op2_addr) == IS_REG && Z_LVAL_P(Z_ZV(op1_addr)) == 2) {
4212
+ Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4213
+ !may_overflow &&
4214
+ Z_LVAL_P(Z_ZV(op2_addr)) > 0 &&
4215
+ IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op2_addr))) &&
4216
+ is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr)))) {
4217
+ | GET_ZVAL_LVAL result_reg, op1_addr
4218
+ | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op2_addr)))
4219
+ } else if (opcode == ZEND_MUL &&
4220
+ Z_MODE(op1_addr) == IS_CONST_ZVAL &&
4221
+ Z_LVAL_P(Z_ZV(op1_addr)) == 2) {
4222
+ if (Z_MODE(op2_addr) == IS_REG && !may_overflow) {
4241
4223
| lea Ra(result_reg), [Ra(Z_REG(op2_addr))+Ra(Z_REG(op2_addr))]
4242
4224
} else {
4243
4225
| GET_ZVAL_LVAL result_reg, op2_addr
4244
- | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
4245
- if (may_overflow) {
4246
- /* Compare 'op' and '((op << n) >> n)' for overflow.
4247
- * Flag: jne -> overflow. je -> no overflow.
4248
- */
4249
- use_ovf_flag = 0;
4250
- | sar Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
4251
- if (Z_MODE(op2_addr) == IS_CONST_ZVAL) {
4252
- | cmp Ra(result_reg), Z_LVAL_P(Z_ZV(op2_addr))
4253
- } else if (Z_MODE(op2_addr) == IS_MEM_ZVAL) {
4254
- | cmp Ra(result_reg), [Ra(Z_REG(op2_addr))+Z_OFFSET(op2_addr)]
4255
- } else if (Z_MODE(op2_addr) == IS_REG) {
4256
- | cmp Ra(result_reg), Ra(Z_REG(op2_addr))
4257
- } else {
4258
- ZEND_UNREACHABLE();
4259
- }
4260
- | pushf
4261
- | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
4262
- | popf
4263
- }
4226
+ | lea Ra(result_reg), [Ra(result_reg)+Ra(result_reg)]
4264
4227
}
4228
+ } else if (opcode == ZEND_MUL &&
4229
+ Z_MODE(op1_addr) == IS_CONST_ZVAL &&
4230
+ !may_overflow &&
4231
+ Z_LVAL_P(Z_ZV(op1_addr)) > 0 &&
4232
+ IS_SIGNED_32BIT(Z_LVAL_P(Z_ZV(op1_addr))) &&
4233
+ is_power_of_two(Z_LVAL_P(Z_ZV(op1_addr)))) {
4234
+ | GET_ZVAL_LVAL result_reg, op2_addr
4235
+ | shl Ra(result_reg), floor_log2(Z_LVAL_P(Z_ZV(op1_addr)))
4265
4236
} else if (opcode == ZEND_DIV &&
4266
4237
(Z_MODE(op2_addr) == IS_CONST_ZVAL &&
4267
4238
is_power_of_two(Z_LVAL_P(Z_ZV(op2_addr))))) {
@@ -4300,36 +4271,20 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4300
4271
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
4301
4272
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
4302
4273
if ((res_info & MAY_BE_ANY) == MAY_BE_LONG) {
4303
- if (use_ovf_flag) {
4304
- | jo &exit_addr
4305
- } else {
4306
- | jne &exit_addr
4307
- }
4274
+ | jo &exit_addr
4308
4275
if (Z_MODE(res_addr) == IS_REG && result_reg != Z_REG(res_addr)) {
4309
4276
| mov Ra(Z_REG(res_addr)), Ra(result_reg)
4310
4277
}
4311
4278
} else if ((res_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
4312
- if (use_ovf_flag) {
4313
- | jno &exit_addr
4314
- } else {
4315
- | je &exit_addr
4316
- }
4279
+ | jno &exit_addr
4317
4280
} else {
4318
4281
ZEND_UNREACHABLE();
4319
4282
}
4320
4283
} else {
4321
4284
if (res_info & MAY_BE_LONG) {
4322
- if (use_ovf_flag) {
4323
- | jo >1
4324
- } else {
4325
- | jne >1
4326
- }
4285
+ | jo >1
4327
4286
} else {
4328
- if (use_ovf_flag) {
4329
- | jno >1
4330
- } else {
4331
- | je >1
4332
- }
4287
+ | jno >1
4333
4288
}
4334
4289
}
4335
4290
}
0 commit comments