Skip to content

Commit 00076ef

Browse files
committed
Attempt to fix bug #80014 (PHP 8.0 beta2 crashes with default JIT flags due to hardware incompatibility)
1 parent bea4442 commit 00076ef

File tree

1 file changed

+19
-19
lines changed

1 file changed

+19
-19
lines changed

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -544,7 +544,7 @@ static void* dasm_labels[zend_lb_MAX];
544544
|.endmacro
545545

546546
|.macro SSE_AVX_INS, sse_ins, avx_ins, op1, op2
547-
|| if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
547+
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
548548
| avx_ins op1, op2
549549
|| } else {
550550
| sse_ins op1, op2
@@ -586,7 +586,7 @@ static void* dasm_labels[zend_lb_MAX];
586586

587587
|.macro SSE_GET_LONG, reg, lval
588588
|| if (lval == 0) {
589-
|| if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
589+
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
590590
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
591591
|| } else {
592592
| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
@@ -601,7 +601,7 @@ static void* dasm_labels[zend_lb_MAX];
601601
|.else
602602
| mov r0, lval
603603
|.endif
604-
|| if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
604+
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
605605
| vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), r0
606606
|| } else {
607607
| cvtsi2sd, xmm(reg-ZREG_XMM0), r0
@@ -613,13 +613,13 @@ static void* dasm_labels[zend_lb_MAX];
613613
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
614614
| SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr))
615615
|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
616-
|| if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
616+
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
617617
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
618618
|| } else {
619619
| cvtsi2sd xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
620620
|| }
621621
|| } else if (Z_MODE(addr) == IS_REG) {
622-
|| if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
622+
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
623623
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(Z_REG(addr))
624624
|| } else {
625625
| cvtsi2sd xmm(reg-ZREG_XMM0), Ra(Z_REG(addr))
@@ -897,7 +897,7 @@ static void* dasm_labels[zend_lb_MAX];
897897
|| if (Z_TYPE_P(zv) == IS_DOUBLE) {
898898
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0;
899899
|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
900-
|| if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
900+
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
901901
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
902902
|| } else {
903903
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
@@ -951,7 +951,7 @@ static void* dasm_labels[zend_lb_MAX];
951951
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ?
952952
|| Z_REG(dst_addr) : ((Z_MODE(res_addr) == IS_REG) ? Z_MODE(res_addr) : ZREG_XMM0);
953953
|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
954-
|| if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
954+
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
955955
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
956956
|| } else {
957957
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
@@ -1615,6 +1615,7 @@ static zend_bool use_last_vald_opline = 0;
16151615
static zend_bool track_last_valid_opline = 0;
16161616
static int jit_return_label = -1;
16171617
static uint32_t current_trace_num = 0;
1618+
static uint32_t allowed_opt_flags = 0;
16181619

16191620
static void zend_jit_track_last_valid_opline(void)
16201621
{
@@ -2850,10 +2851,9 @@ static int zend_jit_setup(void)
28502851
zend_error(E_CORE_ERROR, "CPU doesn't support SSE2");
28512852
return FAILURE;
28522853
}
2853-
if (JIT_G(opt_flags)) {
2854-
if (!zend_cpu_supports(ZEND_CPU_FEATURE_AVX)) {
2855-
JIT_G(opt_flags) &= ~ZEND_JIT_CPU_AVX;
2856-
}
2854+
allowed_opt_flags = 0;
2855+
if (zend_cpu_supports(ZEND_CPU_FEATURE_AVX)) {
2856+
allowed_opt_flags |= ZEND_JIT_CPU_AVX;
28572857
}
28582858

28592859
#if ZTS
@@ -4120,13 +4120,13 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
41204120
}
41214121
| SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
41224122
if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) {
4123-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
4123+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
41244124
| vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
41254125
} else {
41264126
| addsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
41274127
}
41284128
} else {
4129-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
4129+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
41304130
| vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
41314131
} else {
41324132
| subsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
@@ -4285,7 +4285,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
42854285

42864286
| SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
42874287
| SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
4288-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
4288+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
42894289
| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
42904290
} else {
42914291
| SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
@@ -4315,7 +4315,7 @@ static int zend_jit_math_long_double(dasm_State **Dst,
43154315
(Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0;
43164316

43174317
| SSE_GET_ZVAL_LVAL result_reg, op1_addr
4318-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
4318+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
43194319
| AVX_MATH opcode, result_reg, result_reg, op2_addr
43204320
} else {
43214321
| SSE_MATH opcode, result_reg, op2_addr
@@ -4348,7 +4348,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
43484348
result_reg = ZREG_XMM0;
43494349
}
43504350
| SSE_GET_ZVAL_LVAL result_reg, op2_addr
4351-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
4351+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
43524352
| AVX_MATH opcode, result_reg, result_reg, op1_addr
43534353
} else {
43544354
| SSE_MATH opcode, result_reg, op1_addr
@@ -4366,7 +4366,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
43664366
result_reg = ZREG_XMM0;
43674367
tmp_reg = ZREG_XMM1;
43684368
}
4369-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
4369+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
43704370
zend_reg op1_reg;
43714371

43724372
if (Z_MODE(op1_addr) == IS_REG) {
@@ -4426,7 +4426,7 @@ static int zend_jit_math_double_double(dasm_State **Dst,
44264426
result_reg = ZREG_XMM0;
44274427
}
44284428

4429-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
4429+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
44304430
zend_reg op1_reg;
44314431
zend_jit_addr val_addr;
44324432

@@ -8200,7 +8200,7 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_
82008200
}
82018201

82028202
if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
8203-
if (JIT_G(opt_flags) & ZEND_JIT_CPU_AVX) {
8203+
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
82048204
| vxorps xmm0, xmm0, xmm0
82058205
} else {
82068206
| xorps xmm0, xmm0

0 commit comments

Comments
 (0)