@@ -171,6 +171,8 @@ static void* dasm_labels[zend_lb_MAX];
171
171
172
172
#define BP_JIT_IS 6
173
173
174
+ #define CAN_USE_AVX() (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX)
175
+
174
176
|.macro LOAD_ADDR, reg, addr
175
177
| .if X64
176
178
|| if (IS_32BIT(addr)) {
@@ -544,7 +546,7 @@ static void* dasm_labels[zend_lb_MAX];
544
546
|.endmacro
545
547
546
548
|.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() ) {
548
550
| avx_ins op1, op2
549
551
|| } else {
550
552
| sse_ins op1, op2
@@ -586,7 +588,7 @@ static void* dasm_labels[zend_lb_MAX];
586
588
587
589
|.macro SSE_GET_LONG, reg, lval
588
590
|| if (lval == 0) {
589
- || if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
591
+ || if (CAN_USE_AVX() ) {
590
592
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
591
593
|| } else {
592
594
| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
@@ -601,7 +603,7 @@ static void* dasm_labels[zend_lb_MAX];
601
603
|.else
602
604
| mov r0, lval
603
605
|.endif
604
- || if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
606
+ || if (CAN_USE_AVX() ) {
605
607
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
606
608
| vcvtsi2sd, xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), r0
607
609
|| } else {
@@ -615,15 +617,15 @@ static void* dasm_labels[zend_lb_MAX];
615
617
|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
616
618
| SSE_GET_LONG reg, Z_LVAL_P(Z_ZV(addr))
617
619
|| } 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() ) {
619
621
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
620
622
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
621
623
|| } else {
622
624
| xorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
623
625
| cvtsi2sd xmm(reg-ZREG_XMM0), aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
624
626
|| }
625
627
|| } 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() ) {
627
629
| vxorps xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0)
628
630
| vcvtsi2sd xmm(reg-ZREG_XMM0), xmm(reg-ZREG_XMM0), Ra(Z_REG(addr))
629
631
|| } else {
@@ -903,7 +905,7 @@ static void* dasm_labels[zend_lb_MAX];
903
905
|| if (Z_TYPE_P(zv) == IS_DOUBLE) {
904
906
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0;
905
907
|| 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() ) {
907
909
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
908
910
|| } else {
909
911
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
@@ -957,7 +959,7 @@ static void* dasm_labels[zend_lb_MAX];
957
959
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ?
958
960
|| Z_REG(dst_addr) : ((Z_MODE(res_addr) == IS_REG) ? Z_MODE(res_addr) : ZREG_XMM0);
959
961
|| 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() ) {
961
963
| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
962
964
|| } else {
963
965
| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
@@ -2847,12 +2849,12 @@ extern char *_tls_end;
2847
2849
2848
2850
static int zend_jit_setup(void)
2849
2851
{
2850
- if (!zend_cpu_supports(ZEND_CPU_FEATURE_SSE2 )) {
2852
+ if (!zend_cpu_supports_sse2( )) {
2851
2853
zend_error(E_CORE_ERROR, "CPU doesn't support SSE2");
2852
2854
return FAILURE;
2853
2855
}
2854
2856
allowed_opt_flags = 0;
2855
- if (zend_cpu_supports(ZEND_CPU_FEATURE_AVX )) {
2857
+ if (zend_cpu_supports_avx( )) {
2856
2858
allowed_opt_flags |= ZEND_JIT_CPU_AVX;
2857
2859
}
2858
2860
@@ -4128,13 +4130,13 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, uint32_t op
4128
4130
}
4129
4131
| SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
4130
4132
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() ) {
4132
4134
| vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
4133
4135
} else {
4134
4136
| addsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
4135
4137
}
4136
4138
} else {
4137
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
4139
+ if (CAN_USE_AVX() ) {
4138
4140
| vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
4139
4141
} else {
4140
4142
| subsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
@@ -4330,7 +4332,7 @@ static int zend_jit_math_long_long(dasm_State **Dst,
4330
4332
4331
4333
| SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
4332
4334
| 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() ) {
4334
4336
| AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
4335
4337
} else {
4336
4338
| SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
@@ -4366,13 +4368,13 @@ static int zend_jit_math_long_double(dasm_State **Dst,
4366
4368
4367
4369
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4368
4370
/* ASSIGN_DIM_OP */
4369
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
4371
+ if (CAN_USE_AVX() ) {
4370
4372
| AVX_MATH opcode, result_reg, result_reg, op2_addr, r1
4371
4373
} else {
4372
4374
| SSE_MATH opcode, result_reg, op2_addr, r1
4373
4375
}
4374
4376
} else {
4375
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
4377
+ if (CAN_USE_AVX() ) {
4376
4378
| AVX_MATH opcode, result_reg, result_reg, op2_addr, r0
4377
4379
} else {
4378
4380
| SSE_MATH opcode, result_reg, op2_addr, r0
@@ -4408,13 +4410,13 @@ static int zend_jit_math_double_long(dasm_State **Dst,
4408
4410
| SSE_GET_ZVAL_LVAL result_reg, op2_addr
4409
4411
if (Z_MODE(res_addr) == IS_MEM_ZVAL && Z_REG(res_addr) == ZREG_R0) {
4410
4412
/* ASSIGN_DIM_OP */
4411
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
4413
+ if (CAN_USE_AVX() ) {
4412
4414
| AVX_MATH opcode, result_reg, result_reg, op1_addr, r1
4413
4415
} else {
4414
4416
| SSE_MATH opcode, result_reg, op1_addr, r1
4415
4417
}
4416
4418
} else {
4417
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
4419
+ if (CAN_USE_AVX() ) {
4418
4420
| AVX_MATH opcode, result_reg, result_reg, op1_addr, r0
4419
4421
} else {
4420
4422
| SSE_MATH opcode, result_reg, op1_addr, r0
@@ -4433,7 +4435,7 @@ static int zend_jit_math_double_long(dasm_State **Dst,
4433
4435
result_reg = ZREG_XMM0;
4434
4436
tmp_reg = ZREG_XMM1;
4435
4437
}
4436
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
4438
+ if (CAN_USE_AVX() ) {
4437
4439
zend_reg op1_reg;
4438
4440
4439
4441
if (Z_MODE(op1_addr) == IS_REG) {
@@ -4495,7 +4497,7 @@ static int zend_jit_math_double_double(dasm_State **Dst,
4495
4497
result_reg = ZREG_XMM0;
4496
4498
}
4497
4499
4498
- if (JIT_G(opt_flags) & allowed_opt_flags & ZEND_JIT_CPU_AVX ) {
4500
+ if (CAN_USE_AVX() ) {
4499
4501
zend_reg op1_reg;
4500
4502
zend_jit_addr val_addr;
4501
4503
@@ -8424,7 +8426,7 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, uint32_
8424
8426
}
8425
8427
8426
8428
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() ) {
8428
8430
| vxorps xmm0, xmm0, xmm0
8429
8431
} else {
8430
8432
| xorps xmm0, xmm0
0 commit comments