@@ -4185,7 +4185,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4185
4185
zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
4186
4186
zend_reg result_reg;
4187
4187
4188
- if (Z_MODE(res_addr) == IS_REG) {
4188
+ if (Z_MODE(res_addr) == IS_REG && (res_info & MAY_BE_LONG) ) {
4189
4189
result_reg = Z_REG(res_addr);
4190
4190
} else if (Z_MODE(op1_addr) == IS_REG && Z_LAST_USE(op1_addr)) {
4191
4191
result_reg = Z_REG(op1_addr);
@@ -4255,13 +4255,23 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4255
4255
if (res_info & MAY_BE_GUARD) {
4256
4256
int32_t exit_point = zend_jit_trace_get_exit_point(opline, 0);
4257
4257
const void *exit_addr = zend_jit_trace_get_exit_addr(exit_point);
4258
- | jo &exit_addr
4258
+ if ((res_info & MAY_BE_ANY) == MAY_BE_LONG) {
4259
+ | jo &exit_addr
4260
+ } else if ((res_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
4261
+ | jno &exit_addr
4262
+ } else {
4263
+ ZEND_UNREACHABLE();
4264
+ }
4259
4265
} else {
4260
- | jo >1
4266
+ if (res_info & MAY_BE_LONG) {
4267
+ | jo >1
4268
+ } else {
4269
+ | jno >1
4270
+ }
4261
4271
}
4262
4272
}
4263
4273
4264
- if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
4274
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL && (res_info & MAY_BE_LONG) ) {
4265
4275
| SET_ZVAL_LVAL res_addr, Ra(result_reg)
4266
4276
if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
4267
4277
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_LONG) {
@@ -4270,12 +4280,14 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4270
4280
}
4271
4281
}
4272
4282
4273
- if (may_overflow && !(res_info & MAY_BE_GUARD)) {
4283
+ if (may_overflow && ( !(res_info & MAY_BE_GUARD) || (res_info & MAY_BE_ANY) == MAY_BE_DOUBLE )) {
4274
4284
zend_reg tmp_reg1 = ZREG_XMM0;
4275
4285
zend_reg tmp_reg2 = ZREG_XMM1;
4276
4286
4277
- |.cold_code
4278
- |1:
4287
+ if (res_info & MAY_BE_LONG) {
4288
+ |.cold_code
4289
+ |1:
4290
+ }
4279
4291
4280
4292
do {
4281
4293
if ((Z_MODE(op1_addr) == IS_CONST_ZVAL && Z_LVAL_P(Z_ZV(op1_addr)) == 1) ||
@@ -4311,11 +4323,14 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4311
4323
| SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
4312
4324
} while (0);
4313
4325
4314
- if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) {
4326
+ if (Z_MODE(res_addr) == IS_MEM_ZVAL
4327
+ && (res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF|MAY_BE_GUARD)) != MAY_BE_DOUBLE) {
4315
4328
| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE
4316
4329
}
4317
- | jmp >2
4318
- |.code
4330
+ if (res_info & MAY_BE_LONG) {
4331
+ | jmp >2
4332
+ |.code
4333
+ }
4319
4334
|2:
4320
4335
}
4321
4336
0 commit comments