mirror of
https://github.com/php/php-src.git
synced 2024-09-22 10:27:25 +00:00
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
This commit is contained in:
commit
9234446ca0
@ -99,6 +99,7 @@ void zend_cpu_startup(void)
|
||||
}
|
||||
|
||||
ZEND_API int zend_cpu_supports(zend_cpu_feature feature) {
|
||||
ZEND_ASSERT(cpuinfo.initialized);
|
||||
if (feature & ZEND_CPU_EDX_MASK) {
|
||||
return (cpuinfo.edx & (feature & ~ZEND_CPU_EDX_MASK));
|
||||
} else if (feature & ZEND_CPU_EBX_MASK) {
|
||||
|
@ -164,9 +164,9 @@ static zend_always_inline int zend_cpu_supports_sse42() {
|
||||
ZEND_NO_SANITIZE_ADDRESS
|
||||
static zend_always_inline int zend_cpu_supports_pclmul() {
|
||||
#if PHP_HAVE_BUILTIN_CPU_INIT
|
||||
__builtin_cpu_init();
|
||||
__builtin_cpu_init();
|
||||
#endif
|
||||
return __builtin_cpu_supports("pclmul");
|
||||
return __builtin_cpu_supports("pclmul");
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -208,7 +208,7 @@ static zend_always_inline int zend_cpu_supports_sse42() {
|
||||
}
|
||||
|
||||
static zend_always_inline int zend_cpu_supports_pclmul() {
|
||||
return zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ);
|
||||
return zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ);
|
||||
}
|
||||
|
||||
static zend_always_inline int zend_cpu_supports_avx() {
|
||||
|
@ -171,6 +171,8 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
|
||||
#define BP_JIT_IS 6
|
||||
|
||||
#define CAN_USE_AVX() (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX)
|
||||
|
||||
|.macro LOAD_ADDR, reg, addr
|
||||
| .if X64
|
||||
|| if (IS_32BIT(addr)) {
|
||||
@ -544,7 +546,7 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
|.endmacro
|
||||
|
||||
|.macro SSE_AVX_INS, sse_ins, avx_ins, op1, op2
|
||||
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
|| if (CAN_USE_AVX()) {
|
||||
| avx_ins op1, op2
|
||||
|| } else {
|
||||
| sse_ins op1, op2
|
||||
@ -586,7 +588,7 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
|
||||
|.macro SSE_GET_LONG, reg, lval
|
||||
|| if (lval == 0) {
|
||||
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
|| if (CAN_USE_AVX()) {
|
||||
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
|
||||
|| } else {
|
||||
| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
|
||||
@ -601,7 +603,7 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
|.else
|
||||
| mov r0, lval
|
||||
|.endif
|
||||
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
|| if (CAN_USE_AVX()) {
|
||||
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
|
||||
| vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), r0
|
||||
|| } else {
|
||||
@ -615,7 +617,7 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
|
||||
| SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr))
|
||||
|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
|
||||
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
|| if (CAN_USE_AVX()) {
|
||||
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
|
||||
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
|
||||
|| } else {
|
||||
@ -623,7 +625,7 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
| cvtsi2sd xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
|
||||
|| }
|
||||
|| } else if (Z_MODE(addr) == IS_REG) {
|
||||
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
|| if (CAN_USE_AVX()) {
|
||||
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
|
||||
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(Z_REG(addr))
|
||||
|| } else {
|
||||
@ -903,7 +905,7 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
|| if (Z_TYPE_P(zv) == IS_DOUBLE) {
|
||||
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0;
|
||||
|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
|
||||
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
|| if (CAN_USE_AVX()) {
|
||||
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|
||||
|| } else {
|
||||
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|
||||
@ -957,7 +959,7 @@ static void* dasm_labels[zend_lb_MAX];
|
||||
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ?
|
||||
|| Z_REG(dst_addr) : ((Z_MODE(res_addr) == IS_REG) ? Z_MODE(res_addr) : ZREG_XMM0);
|
||||
|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
|
||||
|| if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
|| if (CAN_USE_AVX()) {
|
||||
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|
||||
|| } else {
|
||||
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|
||||
@ -2847,12 +2849,12 @@ extern char *_tls_end;
|
||||
|
||||
static int zend_jit_setup(void)
|
||||
{
|
||||
if (!zend_cpu_supports(ZEND_CPU_FEATURE_SSE2)) {
|
||||
if (!zend_cpu_supports_sse2()) {
|
||||
zend_error(E_CORE_ERROR, "CPU doesn't support SSE2");
|
||||
return FAILURE;
|
||||
}
|
||||
allowed_opt_flags = 0;
|
||||
if (zend_cpu_supports(ZEND_CPU_FEATURE_AVX)) {
|
||||
if (zend_cpu_supports_avx()) {
|
||||
allowed_opt_flags |= ZEND_JIT_CPU_AVX;
|
||||
}
|
||||
|
||||
@ -4128,13 +4130,13 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
|
||||
}
|
||||
| SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
|
||||
if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) {
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
|
||||
} else {
|
||||
| addsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
|
||||
}
|
||||
} else {
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
|
||||
} else {
|
||||
| subsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
|
||||
@ -4330,7 +4332,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
|
||||
|
||||
| SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
|
||||
| SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
|
||||
} else {
|
||||
| SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
|
||||
@ -4366,13 +4368,13 @@ static int zend_jit_math_long_double(dasm_State **Dst,
|
||||
|
||||
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
|
||||
/* ASSIGN_DIM_OP */
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| AVX_MATH opcode, result_reg, result_reg, op2_addr, r1
|
||||
} else {
|
||||
| SSE_MATH opcode, result_reg, op2_addr, r1
|
||||
}
|
||||
} else {
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| AVX_MATH opcode, result_reg, result_reg, op2_addr, r0
|
||||
} else {
|
||||
| SSE_MATH opcode, result_reg, op2_addr, r0
|
||||
@ -4408,13 +4410,13 @@ static int zend_jit_math_double_long(dasm_State **Dst,
|
||||
| SSE_GET_ZVAL_LVAL result_reg, op2_addr
|
||||
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
|
||||
/* ASSIGN_DIM_OP */
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| AVX_MATH opcode, result_reg, result_reg, op1_addr, r1
|
||||
} else {
|
||||
| SSE_MATH opcode, result_reg, op1_addr, r1
|
||||
}
|
||||
} else {
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| AVX_MATH opcode, result_reg, result_reg, op1_addr, r0
|
||||
} else {
|
||||
| SSE_MATH opcode, result_reg, op1_addr, r0
|
||||
@ -4433,7 +4435,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
|
||||
result_reg = ZREG_XMM0;
|
||||
tmp_reg = ZREG_XMM1;
|
||||
}
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
zend_reg op1_reg;
|
||||
|
||||
if (Z_MODE(op1_addr) == IS_REG) {
|
||||
@ -4495,7 +4497,7 @@ static int zend_jit_math_double_double(dasm_State **Dst,
|
||||
result_reg = ZREG_XMM0;
|
||||
}
|
||||
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
zend_reg op1_reg;
|
||||
zend_jit_addr val_addr;
|
||||
|
||||
@ -8424,7 +8426,7 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_
|
||||
}
|
||||
|
||||
if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
|
||||
if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX) {
|
||||
if (CAN_USE_AVX()) {
|
||||
| vxorps xmm0, xmm0, xmm0
|
||||
} else {
|
||||
| xorps xmm0, xmm0
|
||||
|
@ -339,7 +339,7 @@ size_t crc32_x86_simd_update(X86_CRC32_TYPE type, uint32_t *crc, const unsigned
|
||||
/* {{{ PHP_MINIT_FUNCTION */
|
||||
PHP_MINIT_FUNCTION(crc32_x86_intrin)
|
||||
{
|
||||
if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42) && zend_cpu_supports(ZEND_CPU_FEATURE_PCLMULQDQ)) {
|
||||
if (zend_cpu_supports_sse42() && zend_cpu_supports_pclmul()) {
|
||||
crc32_x86_simd_ptr = crc32_sse42_pclmul_update;
|
||||
}
|
||||
return SUCCESS;
|
||||
|
@ -3615,7 +3615,7 @@ PHPAPI void php_stripslashes(zend_string *str) {
|
||||
/* {{{ PHP_MINIT_FUNCTION */
|
||||
PHP_MINIT_FUNCTION(string_intrin)
|
||||
{
|
||||
if (zend_cpu_supports(ZEND_CPU_FEATURE_SSE42)) {
|
||||
if (zend_cpu_supports_sse42()) {
|
||||
php_addslashes_ptr = php_addslashes_sse42;
|
||||
php_stripslashes_ptr = php_stripslashes_sse42;
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user