Skip to content

Commit 9234446

Browse files
committed
Merge branch 'PHP-8.0'
* PHP-8.0: Avoid direct calls to zend_cpu_supports() Assert that cpuinfo is initialized before use Move avx check into a macro
2 parents d56e255 + 2772f7c commit 9234446

File tree

5 files changed

+27
-24
lines changed

5 files changed

+27
-24
lines changed

Zend/zend_cpuinfo.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ void zend_cpu_startup(void)
9999
}
100100

101101
ZEND_API int zend_cpu_supports(zend_cpu_feature feature) {
102+
ZEND_ASSERT(cpuinfo.initialized);
102103
if (feature & ZEND_CPU_EDX_MASK) {
103104
return (cpuinfo.edx & (feature & ~ZEND_CPU_EDX_MASK));
104105
} else if (feature & ZEND_CPU_EBX_MASK) {

Zend/zend_cpuinfo.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,9 @@ static zend_always_inline int zend_cpu_supports_sse42() {
164164
ZEND_NO_SANITIZE_ADDRESS
165165
static zend_always_inline int zend_cpu_supports_pclmul() {
166166
#if PHP_HAVE_BUILTIN_CPU_INIT
167-
__builtin_cpu_init();
167+
__builtin_cpu_init();
168168
#endif
169-
return __builtin_cpu_supports("pclmul");
169+
return __builtin_cpu_supports("pclmul");
170170
}
171171
#endif
172172

@@ -208,7 +208,7 @@ static zend_always_inline int zend_cpu_supports_sse42() {
208208
}
209209

210210
static zend_always_inline int zend_cpu_supports_pclmul() {
211-
return zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ);
211+
return zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ);
212212
}
213213

214214
static zend_always_inline int zend_cpu_supports_avx() {

ext/opcache/jit/zend_jit_x86.dasc

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -171,6 +171,8 @@ static void* dasm_labels[zend_lb_MAX];
171171

172172
#define BP_JIT_IS 6
173173

174+
#define CAN_USE_AVX() (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX)
175+
174176
|.macro LOAD_ADDR, reg, addr
175177
| .if X64
176178
|| if (IS_32BIT(addr)) {
@@ -544,7 +546,7 @@ static void* dasm_labels[zend_lb_MAX];
544546
|.endmacro
545547

546548
|.macro SSE_AVX_INS, sse_ins, avx_ins, op1, op2
547-
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
549+
|| if (CAN_USE_AVX()) {
548550
| avx_ins op1, op2
549551
|| } else {
550552
| sse_ins op1, op2
@@ -586,7 +588,7 @@ static void* dasm_labels[zend_lb_MAX];
586588

587589
|.macro SSE_GET_LONG, reg, lval
588590
|| if (lval == 0) {
589-
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
591+
|| if (CAN_USE_AVX()) {
590592
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
591593
|| } else {
592594
| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
@@ -601,7 +603,7 @@ static void* dasm_labels[zend_lb_MAX];
601603
|.else
602604
| mov r0, lval
603605
|.endif
604-
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
606+
|| if (CAN_USE_AVX()) {
605607
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
606608
| vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), r0
607609
|| } else {
@@ -615,15 +617,15 @@ static void* dasm_labels[zend_lb_MAX];
615617
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
616618
| SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr))
617619
|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
618-
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
620+
|| if (CAN_USE_AVX()) {
619621
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
620622
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
621623
|| } else {
622624
| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
623625
| cvtsi2sd xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
624626
|| }
625627
|| } else if (Z_MODE(addr) == IS_REG) {
626-
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
628+
|| if (CAN_USE_AVX()) {
627629
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
628630
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(Z_REG(addr))
629631
|| } else {
@@ -903,7 +905,7 @@ static void* dasm_labels[zend_lb_MAX];
903905
|| if (Z_TYPE_P(zv) == IS_DOUBLE) {
904906
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0;
905907
|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
906-
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
908+
|| if (CAN_USE_AVX()) {
907909
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
908910
|| } else {
909911
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
@@ -957,7 +959,7 @@ static void* dasm_labels[zend_lb_MAX];
957959
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ?
958960
|| Z_REG(dst_addr) : ((Z_MODE(res_addr) == IS_REG) ? Z_MODE(res_addr) : ZREG_XMM0);
959961
|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
960-
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
962+
|| if (CAN_USE_AVX()) {
961963
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
962964
|| } else {
963965
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
@@ -2847,12 +2849,12 @@ extern char *_tls_end;
28472849

28482850
static int zend_jit_setup(void)
28492851
{
2850-
if (!zend_cpu_supports(ZEND_CPU_FEATURE_SSE2)) {
2852+
if (!zend_cpu_supports_sse2()) {
28512853
zend_error(E_CORE_ERROR, "CPU doesn't support SSE2");
28522854
return FAILURE;
28532855
}
28542856
allowed_opt_flags = 0;
2855-
if (zend_cpu_supports(ZEND_CPU_FEATURE_AVX)) {
2857+
if (zend_cpu_supports_avx()) {
28562858
allowed_opt_flags |= ZEND_JIT_CPU_AVX;
28572859
}
28582860

@@ -4128,13 +4130,13 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
41284130
}
41294131
| SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
41304132
if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) {
4131-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4133+
if (CAN_USE_AVX()) {
41324134
| vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
41334135
} else {
41344136
| addsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
41354137
}
41364138
} else {
4137-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4139+
if (CAN_USE_AVX()) {
41384140
| vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
41394141
} else {
41404142
| subsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
@@ -4330,7 +4332,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
43304332

43314333
| SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
43324334
| SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
4333-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4335+
if (CAN_USE_AVX()) {
43344336
| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
43354337
} else {
43364338
| SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
@@ -4366,13 +4368,13 @@ static int zend_jit_math_long_double(dasm_State **Dst,
43664368

43674369
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
43684370
/* ASSIGN_DIM_OP */
4369-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4371+
if (CAN_USE_AVX()) {
43704372
| AVX_MATH opcode, result_reg, result_reg, op2_addr, r1
43714373
} else {
43724374
| SSE_MATH opcode, result_reg, op2_addr, r1
43734375
}
43744376
} else {
4375-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4377+
if (CAN_USE_AVX()) {
43764378
| AVX_MATH opcode, result_reg, result_reg, op2_addr, r0
43774379
} else {
43784380
| SSE_MATH opcode, result_reg, op2_addr, r0
@@ -4408,13 +4410,13 @@ static int zend_jit_math_double_long(dasm_State **Dst,
44084410
| SSE_GET_ZVAL_LVAL result_reg, op2_addr
44094411
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
44104412
/* ASSIGN_DIM_OP */
4411-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4413+
if (CAN_USE_AVX()) {
44124414
| AVX_MATH opcode, result_reg, result_reg, op1_addr, r1
44134415
} else {
44144416
| SSE_MATH opcode, result_reg, op1_addr, r1
44154417
}
44164418
} else {
4417-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4419+
if (CAN_USE_AVX()) {
44184420
| AVX_MATH opcode, result_reg, result_reg, op1_addr, r0
44194421
} else {
44204422
| SSE_MATH opcode, result_reg, op1_addr, r0
@@ -4433,7 +4435,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
44334435
result_reg = ZREG_XMM0;
44344436
tmp_reg = ZREG_XMM1;
44354437
}
4436-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4438+
if (CAN_USE_AVX()) {
44374439
zend_reg op1_reg;
44384440

44394441
if (Z_MODE(op1_addr) == IS_REG) {
@@ -4495,7 +4497,7 @@ static int zend_jit_math_double_double(dasm_State **Dst,
44954497
result_reg = ZREG_XMM0;
44964498
}
44974499

4498-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
4500+
if (CAN_USE_AVX()) {
44994501
zend_reg op1_reg;
45004502
zend_jit_addr val_addr;
45014503

@@ -8424,7 +8426,7 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_
84248426
}
84258427

84268428
if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
8427-
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
8429+
if (CAN_USE_AVX()) {
84288430
| vxorps xmm0, xmm0, xmm0
84298431
} else {
84308432
| xorps xmm0, xmm0

ext/standard/crc32_x86.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ size_t crc32_x86_simd_update(X86_CRC32_TYPE type, uint32_t *crc, const unsigned
339339
/* {{{ PHP_MINIT_FUNCTION */
340340
PHP_MINIT_FUNCTION(crc32_x86_intrin)
341341
{
342-
if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42) && zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ)) {
342+
if (zend_cpu_supports_sse42() && zend_cpu_supports_pclmul()) {
343343
crc32_x86_simd_ptr = crc32_sse42_pclmul_update;
344344
}
345345
return SUCCESS;

ext/standard/string.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3615,7 +3615,7 @@ PHPAPI void php_stripslashes(zend_string *str) {
36153615
/* {{{ PHP_MINIT_FUNCTION */
36163616
PHP_MINIT_FUNCTION(string_intrin)
36173617
{
3618-
if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42)) {
3618+
if (zend_cpu_supports_sse42()) {
36193619
php_addslashes_ptr = php_addslashes_sse42;
36203620
php_stripslashes_ptr = php_stripslashes_sse42;
36213621
} else {

0 commit comments

Comments
 (0)