summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ext/opcache/jit/zend_jit_x86.dasc603
1 files changed, 201 insertions, 402 deletions
diff --git a/ext/opcache/jit/zend_jit_x86.dasc b/ext/opcache/jit/zend_jit_x86.dasc
index 49a25343da..85af2ad12c 100644
--- a/ext/opcache/jit/zend_jit_x86.dasc
+++ b/ext/opcache/jit/zend_jit_x86.dasc
@@ -42,7 +42,6 @@
|.define FCARG2d, CARG2d
|.define SPAD, 0x08 // padding for CPU stack alignment
|.define NR_SPAD, 0x58 // padding for CPU stack alignment
- |.define SSE, 1
|.define T3, [r4+0x50] // Used to store old value of IP
|.define T2, [r4+0x48] // Used to store old value of FP
|.define T1, [r4+0x40]
@@ -71,7 +70,6 @@
|.define FCARG2d, CARG2d
|.define SPAD, 0x08 // padding for CPU stack alignment
|.define NR_SPAD, 0x18 // padding for CPU stack alignment
- |.define SSE, 1
|.define T3, [r4+0x10] // Used to store old value of IP (CALL VM only)
|.define T2, [r4+0x08] // Used to store old value of FP (CALL VM only)
|.define T1, [r4]
@@ -86,7 +84,6 @@
|.define FCARG2d, edx
|.define SPAD, 12 // padding for CPU stack alignment
|.define NR_SPAD, 12 // padding for CPU stack alignment
- |.define SSE, 1
|.define T3, [r4+0x10] // Used to store old value of IP (CALL VM only)
|.define T2, [r4+0x08] // Used to store old value of FP (CALL VM only)
|.define T1, [r4]
@@ -516,42 +513,6 @@ static void* dasm_labels[zend_lb_MAX];
| SET_Z_TYPE_INFO FP + r0, IS_UNDEF
|.endmacro
-|.macro FPU_OP, fp_ins, addr
-|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
-| MEM_OP1 fp_ins, qword, Z_ZV(addr), r0
-|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
-| fp_ins qword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
-|| } else {
-|| ZEND_ASSERT(0);
-|| }
-|.endmacro
-
-|.macro FPU_GET_ZVAL_DVAL, addr
-| FPU_OP fld, addr
-|.endmacro
-
-|.macro FPU_MATH, opcode, addr
-|| switch (opcode) {
-|| case ZEND_ADD:
-| FPU_OP fadd, addr
-|| break;
-|| case ZEND_SUB:
-| FPU_OP fsub, addr
-|| break;
-|| case ZEND_MUL:
-| FPU_OP fmul, addr
-|| break;
-|| case ZEND_DIV:
-| FPU_OP fdiv, addr
-|| break;
-|| }
-|.endmacro
-
-|.macro FPU_SET_ZVAL_DVAL, addr
-|| ZEND_ASSERT(Z_MODE(addr) == IS_MEM_ZVAL);
-| fstp qword [Ra(Z_REG(res_addr))+Z_OFFSET(res_addr)]
-|.endmacro
-
|.macro SSE_AVX_INS, sse_ins, avx_ins, op1, op2
|| if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
| avx_ins op1, op2
@@ -887,69 +848,25 @@ static void* dasm_labels[zend_lb_MAX];
|| }
|.endmacro
-|.macro FPU_LONG_OP, fp_ins, addr
-|| if (Z_MODE(addr) == IS_CONST_ZVAL) {
-| MEM_OP1 fp_ins, aword, Z_ZV(addr), r0
-|| } else if (Z_MODE(addr) == IS_MEM_ZVAL) {
-| fp_ins aword [Ra(Z_REG(addr))+Z_OFFSET(addr)]
-|| } else if (Z_MODE(addr) == IS_REG) {
-| fp_ins Ra(Z_REG(addr))
-|| } else {
-|| ZEND_ASSERT(0);
-|| }
-|.endmacro
-
-|.macro FPU_GET_ZVAL_LVAL, addr
-| FPU_LONG_OP fild, addr
-|.endmacro
-
-|.macro FPU_MATH_REG, opcode, reg
-|| switch (opcode) {
-|| case ZEND_ADD:
-| fadd reg
-|| break;
-|| case ZEND_SUB:
-| fsub reg
-|| break;
-|| case ZEND_MUL:
-| fmul reg
-|| break;
-|| case ZEND_DIV:
-| fdiv reg
-|| break;
-|| }
-|.endmacro
-
|.macro ZVAL_COPY_CONST, dst_addr, dst_info, zv, tmp_reg
|| if (Z_TYPE_P(zv) > IS_TRUE) {
|| if (Z_TYPE_P(zv) == IS_DOUBLE) {
|| zend_reg dst_reg = (Z_MODE(dst_addr) == IS_REG) ? Z_REG(dst_addr) : ZREG_XMM0;
-| .if X64 or SSE
-|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
-|| if (zend_jit_x86_flags & ZEND_JIT_CPU_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)
-|| }
-| .if X64
-|| } else if (!IS_32BIT(zv)) {
-| mov64 tmp_reg, ((uintptr_t)zv)
-| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [tmp_reg]
-| .endif
+|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
+|| if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|| } else {
-| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [((uint32_t)(uintptr_t)zv)]
-|| }
-| SSE_SET_ZVAL_DVAL dst_addr, dst_reg
-| .else
-|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
-| fldz
-|| } else if (Z_DVAL_P(zv) == 1.0) {
-| fld1
-|| } else {
-| fld qword [zv]
+| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|| }
-| FPU_SET_ZVAL_DVAL dst_addr
-| .endif
+| .if X64
+|| } else if (!IS_32BIT(zv)) {
+| mov64 tmp_reg, ((uintptr_t)zv)
+| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [tmp_reg]
+| .endif
+|| } else {
+| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [((uint32_t)(uintptr_t)zv)]
+|| }
+| SSE_SET_ZVAL_DVAL dst_addr, dst_reg
|| } else if (Z_LVAL_P(zv) == 0 && Z_MODE(dst_addr) == IS_REG) {
| xor Ra(Z_REG(dst_addr)), Ra(Z_REG(dst_addr))
|| } else {
@@ -981,41 +898,22 @@ 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) : ((Z_MODE(res_addr) == IS_REG) ? Z_MODE(res_addr) : ZREG_XMM0);
-| .if X64 or SSE
-|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
-|| if (zend_jit_x86_flags & ZEND_JIT_CPU_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)
-|| }
-| .if X64
-|| } else if (!IS_32BIT(zv)) {
-| mov64 tmp_reg, ((uintptr_t)zv)
-| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [tmp_reg]
-| .endif
+|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
+|| if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+| vxorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|| } else {
-| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [((uint32_t)(uintptr_t)zv)]
-|| }
-| SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0
-| SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0
-| .else
-|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
-| fldz
-|| } else if (Z_DVAL_P(zv) == 1.0) {
-| fld1
-|| } else {
-| fld qword [zv]
-|| }
-| FPU_SET_ZVAL_DVAL dst_addr
-|| if (Z_DVAL_P(zv) == 0.0 && !is_signed(Z_DVAL_P(zv))) {
-| fldz
-|| } else if (Z_DVAL_P(zv) == 1.0) {
-| fld1
-|| } else {
-| fld qword [zv]
+| xorps xmm(dst_reg-ZREG_XMM0), xmm(dst_reg-ZREG_XMM0)
|| }
-| FPU_SET_ZVAL_DVAL res_addr
-| .endif
+| .if X64
+|| } else if (!IS_32BIT(zv)) {
+| mov64 tmp_reg, ((uintptr_t)zv)
+| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [tmp_reg]
+| .endif
+|| } else {
+| SSE_AVX_INS movsd, vmovsd, xmm(dst_reg-ZREG_XMM0), qword [((uint32_t)(uintptr_t)zv)]
+|| }
+| SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0
+| SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0
|| } else if (Z_LVAL_P(zv) == 0 && (Z_MODE(dst_addr) == IS_REG || Z_MODE(res_addr) == IS_REG)) {
|| if (Z_MODE(dst_addr) == IS_REG) {
| xor Ra(Z_REG(dst_addr)), Ra(Z_REG(dst_addr))
@@ -1087,19 +985,14 @@ static void* dasm_labels[zend_lb_MAX];
| SET_ZVAL_LVAL dst_addr, Ra(tmp_reg2)
|| }
|| } else if ((src_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
-| .if X64 or SSE
-|| if (Z_MODE(src_addr) == IS_REG) {
-| SSE_SET_ZVAL_DVAL dst_addr, Z_REG(src_addr)
-|| } else if (Z_MODE(dst_addr) == IS_REG) {
-| SSE_GET_ZVAL_DVAL Z_REG(dst_addr), src_addr
-|| } else {
-| SSE_GET_ZVAL_DVAL ZREG_XMM0, src_addr
-| SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0
-|| }
-| .else
-| FPU_GET_ZVAL_DVAL src_addr
-| FPU_SET_ZVAL_DVAL dst_addr
-| .endif
+|| if (Z_MODE(src_addr) == IS_REG) {
+| SSE_SET_ZVAL_DVAL dst_addr, Z_REG(src_addr)
+|| } else if (Z_MODE(dst_addr) == IS_REG) {
+| SSE_GET_ZVAL_DVAL Z_REG(dst_addr), src_addr
+|| } else {
+| SSE_GET_ZVAL_DVAL ZREG_XMM0, src_addr
+| SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0
+|| }
|| } else if (!(src_info & MAY_BE_DOUBLE)) {
| GET_ZVAL_PTR Ra(tmp_reg2), src_addr
| SET_ZVAL_PTR dst_addr, Ra(tmp_reg2)
@@ -1160,27 +1053,20 @@ static void* dasm_labels[zend_lb_MAX];
| SET_ZVAL_LVAL res_addr, Ra(tmp_reg2)
|| }
|| } else if ((src_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
-| .if X64 or SSE
-|| if (Z_MODE(src_addr) == IS_REG) {
-| SSE_SET_ZVAL_DVAL dst_addr, Z_REG(src_addr)
-| SSE_SET_ZVAL_DVAL res_addr, Z_REG(src_addr)
-|| } else if (Z_MODE(dst_addr) == IS_REG) {
-| SSE_GET_ZVAL_DVAL Z_REG(dst_addr), src_addr
-| SSE_SET_ZVAL_DVAL res_addr, Z_REG(dst_addr)
-|| } else if (Z_MODE(res_addr) == IS_REG) {
-| SSE_GET_ZVAL_DVAL Z_REG(res_addr), src_addr
-| SSE_SET_ZVAL_DVAL dst_addr, Z_REG(res_addr)
-|| } else {
-| SSE_GET_ZVAL_DVAL ZREG_XMM0, src_addr
-| SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0
-| SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0
-|| }
-| .else
-| FPU_GET_ZVAL_DVAL src_addr
-| FPU_STROE dst_addr
-| FPU_GET_ZVAL_DVAL src_addr
-| FPU_SET_ZVAL_DVAL res_addr
-| .endif
+|| if (Z_MODE(src_addr) == IS_REG) {
+| SSE_SET_ZVAL_DVAL dst_addr, Z_REG(src_addr)
+| SSE_SET_ZVAL_DVAL res_addr, Z_REG(src_addr)
+|| } else if (Z_MODE(dst_addr) == IS_REG) {
+| SSE_GET_ZVAL_DVAL Z_REG(dst_addr), src_addr
+| SSE_SET_ZVAL_DVAL res_addr, Z_REG(dst_addr)
+|| } else if (Z_MODE(res_addr) == IS_REG) {
+| SSE_GET_ZVAL_DVAL Z_REG(res_addr), src_addr
+| SSE_SET_ZVAL_DVAL dst_addr, Z_REG(res_addr)
+|| } else {
+| SSE_GET_ZVAL_DVAL ZREG_XMM0, src_addr
+| SSE_SET_ZVAL_DVAL dst_addr, ZREG_XMM0
+| SSE_SET_ZVAL_DVAL res_addr, ZREG_XMM0
+|| }
|| } else if (!(src_info & MAY_BE_DOUBLE)) {
| GET_ZVAL_PTR Ra(tmp_reg2), src_addr
| SET_ZVAL_PTR dst_addr, Ra(tmp_reg2)
@@ -2490,17 +2376,15 @@ extern char *_tls_end;
static int zend_jit_setup(void)
{
- |.if SSE
- if (!zend_cpu_supports(ZEND_CPU_FEATURE_SSE2)) {
- zend_error(E_CORE_ERROR, "CPU doesn't support SSE2");
- return FAILURE;
- }
- if (zend_jit_cpu_flags & ZEND_JIT_CPU_AVX) {
- if (zend_cpu_supports(ZEND_CPU_FEATURE_AVX)) {
- zend_jit_x86_flags |= ZEND_JIT_CPU_AVX;
- }
+ if (!zend_cpu_supports(ZEND_CPU_FEATURE_SSE2)) {
+ zend_error(E_CORE_ERROR, "CPU doesn't support SSE2");
+ return FAILURE;
+ }
+ if (zend_jit_cpu_flags & ZEND_JIT_CPU_AVX) {
+ if (zend_cpu_supports(ZEND_CPU_FEATURE_AVX)) {
+ zend_jit_x86_flags |= ZEND_JIT_CPU_AVX;
}
- |.endif
+ }
#if ZTS
# ifdef _WIN64
@@ -2881,11 +2765,7 @@ static int zend_jit_spill_store(dasm_State **Dst, zend_jit_addr src, zend_jit_ad
| SET_ZVAL_TYPE_INFO dst, IS_LONG
}
} else if ((info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
- | .if SSE
- | SSE_SET_ZVAL_DVAL dst, Z_REG(src)
- | .else
- || ZEND_ASSERT(0);
- | .endif
+ | SSE_SET_ZVAL_DVAL dst, Z_REG(src)
if (set_type) {
| SET_ZVAL_TYPE_INFO dst, IS_DOUBLE
}
@@ -2903,11 +2783,7 @@ static int zend_jit_load_reg(dasm_State **Dst, zend_jit_addr src, zend_jit_addr
if ((info & MAY_BE_ANY) == MAY_BE_LONG) {
| GET_ZVAL_LVAL Z_REG(dst), src
} else if ((info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
- | .if SSE
- | SSE_GET_ZVAL_DVAL Z_REG(dst), src
- | .else
- || ZEND_ASSERT(0);
- | .endif
+ | SSE_GET_ZVAL_DVAL Z_REG(dst), src
} else {
ZEND_ASSERT(0);
}
@@ -2961,11 +2837,7 @@ static int zend_jit_update_regs(dasm_State **Dst, zend_jit_addr src, zend_jit_ad
if ((info & MAY_BE_ANY) == MAY_BE_LONG) {
| mov Ra(Z_REG(dst)), Ra(Z_REG(src))
} else if ((info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
- | .if SSE
- | SSE_AVX_INS movsd, vmovaps, xmm(Z_REG(dst)-ZREG_XMM0), xmm(Z_REG(src)-ZREG_XMM0)
- | .else
- || ZEND_ASSERT(0);
- | .endif
+ | SSE_AVX_INS movsd, vmovaps, xmm(Z_REG(dst)-ZREG_XMM0), xmm(Z_REG(src)-ZREG_XMM0)
} else {
ZEND_ASSERT(0);
}
@@ -3151,39 +3023,28 @@ static int zend_jit_inc_dec(dasm_State **Dst, const zend_op *opline, zend_op_arr
| ZVAL_COPY_VALUE res_addr, res_use_info, op1_addr, MAY_BE_DOUBLE, ZREG_R0, ZREG_R2
}
}
- |.if SSE
- if (Z_MODE(op1_def_addr) == IS_REG) {
- tmp_reg = Z_REG(op1_def_addr);
- } else if (Z_MODE(op1_addr) == IS_REG && zend_ssa_is_last_use(op_array, ssa, ssa->ops[opline-op_array->opcodes].op1_use, opline-op_array->opcodes)) {
- tmp_reg = Z_REG(op1_addr);
- } else {
- tmp_reg = ZREG_XMM0;
- }
- | SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
- if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) {
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- | vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
- } else {
- | addsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
- }
+ if (Z_MODE(op1_def_addr) == IS_REG) {
+ tmp_reg = Z_REG(op1_def_addr);
+ } else if (Z_MODE(op1_addr) == IS_REG && zend_ssa_is_last_use(op_array, ssa, ssa->ops[opline-op_array->opcodes].op1_use, opline-op_array->opcodes)) {
+ tmp_reg = Z_REG(op1_addr);
+ } else {
+ tmp_reg = ZREG_XMM0;
+ }
+ | SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
+ if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) {
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ | vaddsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
} else {
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- | vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
- } else {
- | subsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
- }
+ | addsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
}
- | SSE_SET_ZVAL_DVAL op1_def_addr, tmp_reg
- |.else
- | FPU_GET_ZVAL_DVAL op1_addr
- | fld1
- if (opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_POST_INC) {
- | fadd
+ } else {
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ | vsubsd xmm(tmp_reg-ZREG_XMM0), xmm(tmp_reg-ZREG_XMM0), qword [->one]
} else {
- | fsub
+ | subsd xmm(tmp_reg-ZREG_XMM0), qword [->one]
}
- | FPU_SET_ZVAL_DVAL op1_def_addr
- |.endif
+ }
+ | SSE_SET_ZVAL_DVAL op1_def_addr, tmp_reg
}
if ((opline->opcode == ZEND_PRE_INC || opline->opcode == ZEND_PRE_DEC) &&
opline->result_type != IS_UNUSED) {
@@ -3262,24 +3123,17 @@ static int zend_jit_math_long_long(dasm_State **Dst,
| jo >1
|.cold_code
|1:
- |.if SSE
- zend_reg tmp_reg1 = ZREG_XMM0;
- zend_reg tmp_reg2 = ZREG_XMM1;
-
- | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
- | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- | AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
- } else {
- | SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
- }
- | SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
- |.else
- | FPU_GET_ZVAL_LVAL op2_addr
- | FPU_GET_ZVAL_LVAL op1_addr
- | FPU_MATH_REG opcode, st1
- | FPU_SET_ZVAL_DVAL res_addr
- |.endif
+ zend_reg tmp_reg1 = ZREG_XMM0;
+ zend_reg tmp_reg2 = ZREG_XMM1;
+
+ | SSE_GET_ZVAL_LVAL tmp_reg1, op1_addr
+ | SSE_GET_ZVAL_LVAL tmp_reg2, op2_addr
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ | AVX_MATH_REG opcode, tmp_reg1, tmp_reg1, tmp_reg2
+ } else {
+ | SSE_MATH_REG opcode, tmp_reg1, tmp_reg2
+ }
+ | SSE_SET_ZVAL_DVAL res_addr, tmp_reg1
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_DOUBLE) {
| SET_ZVAL_TYPE_INFO res_addr, IS_DOUBLE
}
@@ -3314,22 +3168,16 @@ static int zend_jit_math_long_double(dasm_State **Dst,
zend_jit_addr res_addr,
uint32_t res_use_info)
{
- |.if SSE
- zend_reg result_reg =
- (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0;
+ zend_reg result_reg =
+ (Z_MODE(res_addr) == IS_REG) ? Z_REG(res_addr) : ZREG_XMM0;
- | SSE_GET_ZVAL_LVAL result_reg, op1_addr
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- | AVX_MATH opcode, result_reg, result_reg, op2_addr
- } else {
- | SSE_MATH opcode, result_reg, op2_addr
- }
- | SSE_SET_ZVAL_DVAL res_addr, result_reg
- |.else
- | FPU_GET_ZVAL_LVAL op1_addr
- | FPU_MATH opcode, op2_addr
- | FPU_SET_ZVAL_DVAL res_addr
- |.endif
+ | SSE_GET_ZVAL_LVAL result_reg, op1_addr
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ | AVX_MATH opcode, result_reg, result_reg, op2_addr
+ } else {
+ | SSE_MATH opcode, result_reg, op2_addr
+ }
+ | SSE_SET_ZVAL_DVAL res_addr, result_reg
if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
if ((res_use_info & (MAY_BE_ANY|MAY_BE_UNDEF|MAY_BE_REF)) != MAY_BE_DOUBLE) {
@@ -3350,62 +3198,51 @@ static int zend_jit_math_double_long(dasm_State **Dst,
zend_jit_addr res_addr,
uint32_t res_use_info)
{
- |.if SSE
- zend_reg result_reg;
+ zend_reg result_reg;
- if (zend_is_commutative(opcode)) {
- if (Z_MODE(res_addr) == IS_REG) {
- result_reg = Z_REG(res_addr);
- } else {
- result_reg = ZREG_XMM0;
- }
- | SSE_GET_ZVAL_LVAL result_reg, op2_addr
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- | AVX_MATH opcode, result_reg, result_reg, op1_addr
- } else {
- | SSE_MATH opcode, result_reg, op1_addr
- }
+ if (zend_is_commutative(opcode)) {
+ if (Z_MODE(res_addr) == IS_REG) {
+ result_reg = Z_REG(res_addr);
} else {
- zend_reg tmp_reg;
+ result_reg = ZREG_XMM0;
+ }
+ | SSE_GET_ZVAL_LVAL result_reg, op2_addr
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ | AVX_MATH opcode, result_reg, result_reg, op1_addr
+ } else {
+ | SSE_MATH opcode, result_reg, op1_addr
+ }
+ } else {
+ zend_reg tmp_reg;
- if (Z_MODE(res_addr) == IS_REG) {
- result_reg = Z_REG(res_addr);
- tmp_reg = ZREG_XMM0;
- } else if (Z_MODE(op1_addr) == IS_REG && zend_ssa_is_last_use(op_array, ssa, ssa->ops[opline-op_array->opcodes].op1_use, opline-op_array->opcodes)) {
- result_reg = Z_REG(op1_addr);
- tmp_reg = ZREG_XMM0;
- } else {
- result_reg = ZREG_XMM0;
- tmp_reg = ZREG_XMM1;
- }
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- zend_reg op1_reg;
+ if (Z_MODE(res_addr) == IS_REG) {
+ result_reg = Z_REG(res_addr);
+ tmp_reg = ZREG_XMM0;
+ } else if (Z_MODE(op1_addr) == IS_REG && zend_ssa_is_last_use(op_array, ssa, ssa->ops[opline-op_array->opcodes].op1_use, opline-op_array->opcodes)) {
+ result_reg = Z_REG(op1_addr);
+ tmp_reg = ZREG_XMM0;
+ } else {
+ result_reg = ZREG_XMM0;
+ tmp_reg = ZREG_XMM1;
+ }
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ zend_reg op1_reg;
- if (Z_MODE(op1_addr) == IS_REG) {
- op1_reg = Z_REG(op1_addr);
- } else {
- | SSE_GET_ZVAL_DVAL result_reg, op1_addr
- op1_reg = result_reg;
- }
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
- | AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg
+ if (Z_MODE(op1_addr) == IS_REG) {
+ op1_reg = Z_REG(op1_addr);
} else {
| SSE_GET_ZVAL_DVAL result_reg, op1_addr
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
- | SSE_MATH_REG opcode, result_reg, tmp_reg
+ op1_reg = result_reg;
}
- }
- | SSE_SET_ZVAL_DVAL res_addr, result_reg
- |.else
- | FPU_GET_ZVAL_LVAL op2_addr
- if (zend_is_commutative(opcode)) {
- | FPU_MATH opcode, op1_addr
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
+ | AVX_MATH_REG opcode, result_reg, op1_reg, tmp_reg
} else {
- | FPU_GET_ZVAL_DVAL op1_addr
- | FPU_MATH_REG opcode, st1
+ | SSE_GET_ZVAL_DVAL result_reg, op1_addr
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
+ | SSE_MATH_REG opcode, result_reg, tmp_reg
}
- | FPU_SET_ZVAL_DVAL res_addr
- |.endif
+ }
+ | SSE_SET_ZVAL_DVAL res_addr, result_reg
if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
@@ -3429,64 +3266,57 @@ static int zend_jit_math_double_double(dasm_State **Dst,
uint32_t res_use_info)
{
zend_bool same_ops = zend_jit_same_addr(op1_addr, op2_addr);
+ zend_reg result_reg;
- |.if SSE
- zend_reg result_reg;
+ if (Z_MODE(res_addr) == IS_REG) {
+ result_reg = Z_REG(res_addr);
+ } else if (Z_MODE(op1_addr) == IS_REG && zend_ssa_is_last_use(op_array, ssa, ssa->ops[opline-op_array->opcodes].op1_use, opline-op_array->opcodes)) {
+ result_reg = Z_REG(op1_addr);
+ } else {
+ result_reg = ZREG_XMM0;
+ }
- if (Z_MODE(res_addr) == IS_REG) {
- result_reg = Z_REG(res_addr);
- } else if (Z_MODE(op1_addr) == IS_REG && zend_ssa_is_last_use(op_array, ssa, ssa->ops[opline-op_array->opcodes].op1_use, opline-op_array->opcodes)) {
- result_reg = Z_REG(op1_addr);
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ zend_reg op1_reg;
+ zend_jit_addr val_addr;
+
+ if (Z_MODE(op1_addr) == IS_REG) {
+ op1_reg = Z_REG(op1_addr);
+ val_addr = op2_addr;
+ } else if (Z_MODE(op2_addr) == IS_REG && zend_is_commutative(opcode)) {
+ op1_reg = Z_REG(op2_addr);
+ val_addr = op1_addr;
} else {
- result_reg = ZREG_XMM0;
+ | SSE_GET_ZVAL_DVAL result_reg, op1_addr
+ op1_reg = result_reg;
+ val_addr = op2_addr;
}
-
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- zend_reg op1_reg;
- zend_jit_addr val_addr;
-
- if (Z_MODE(op1_addr) == IS_REG) {
- op1_reg = Z_REG(op1_addr);
- val_addr = op2_addr;
- } else if (Z_MODE(op2_addr) == IS_REG && zend_is_commutative(opcode)) {
- op1_reg = Z_REG(op2_addr);
- val_addr = op1_addr;
- } else {
- | SSE_GET_ZVAL_DVAL result_reg, op1_addr
- op1_reg = result_reg;
- val_addr = op2_addr;
- }
- if ((opcode == ZEND_MUL) &&
- Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) {
- | AVX_MATH_REG ZEND_ADD, result_reg, op1_reg, op1_reg
- } else {
- | AVX_MATH opcode, result_reg, op1_reg, val_addr
- }
+ if ((opcode == ZEND_MUL) &&
+ Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) {
+ | AVX_MATH_REG ZEND_ADD, result_reg, op1_reg, op1_reg
} else {
- zend_jit_addr val_addr;
+ | AVX_MATH opcode, result_reg, op1_reg, val_addr
+ }
+ } else {
+ zend_jit_addr val_addr;
- if (Z_MODE(op1_addr) != IS_REG && Z_MODE(op2_addr) == IS_REG && zend_is_commutative(opcode)) {
- | SSE_GET_ZVAL_DVAL result_reg, op2_addr
- val_addr = op1_addr;
- } else {
- | SSE_GET_ZVAL_DVAL result_reg, op1_addr
- val_addr = op2_addr;
- }
- if (same_ops) {
- | SSE_MATH_REG opcode, result_reg, result_reg
- } else if ((opcode == ZEND_MUL) &&
- Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) {
- | SSE_MATH_REG ZEND_ADD, result_reg, result_reg
- } else {
- | SSE_MATH opcode, result_reg, val_addr
- }
+ if (Z_MODE(op1_addr) != IS_REG && Z_MODE(op2_addr) == IS_REG && zend_is_commutative(opcode)) {
+ | SSE_GET_ZVAL_DVAL result_reg, op2_addr
+ val_addr = op1_addr;
+ } else {
+ | SSE_GET_ZVAL_DVAL result_reg, op1_addr
+ val_addr = op2_addr;
+ }
+ if (same_ops) {
+ | SSE_MATH_REG opcode, result_reg, result_reg
+ } else if ((opcode == ZEND_MUL) &&
+ Z_MODE(val_addr) == IS_CONST_ZVAL && Z_DVAL_P(Z_ZV(val_addr)) == 2.0) {
+ | SSE_MATH_REG ZEND_ADD, result_reg, result_reg
+ } else {
+ | SSE_MATH opcode, result_reg, val_addr
}
- | SSE_SET_ZVAL_DVAL res_addr, result_reg
- |.else
- | FPU_GET_ZVAL_DVAL op1_addr
- | FPU_MATH opcode, op2_addr
- | FPU_SET_ZVAL_DVAL res_addr
- |.endif
+ }
+ | SSE_SET_ZVAL_DVAL res_addr, result_reg
if (Z_MODE(res_addr) == IS_MEM_ZVAL) {
if (Z_MODE(op1_addr) != IS_MEM_ZVAL || Z_REG(op1_addr) != Z_REG(res_addr) || Z_OFFSET(op1_addr) != Z_OFFSET(res_addr)) {
@@ -5800,63 +5630,39 @@ static int zend_jit_cmp_double_common(dasm_State **Dst, const zend_op *opline, i
static int zend_jit_cmp_long_double(dasm_State **Dst, const zend_op *opline, int b, zend_op_array *op_array, zend_ssa *ssa, zend_jit_addr op1_addr, zend_jit_addr op2_addr)
{
- |.if SSE
- zend_reg tmp_reg = ZREG_XMM0;
+ zend_reg tmp_reg = ZREG_XMM0;
- | SSE_GET_ZVAL_LVAL tmp_reg, op1_addr
- | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op2_addr
- |.else
- | FPU_GET_ZVAL_DVAL op2_addr
- | FPU_GET_ZVAL_LVAL op1_addr
- | fucomip st1
- | fstp st0
- |.endif
+ | SSE_GET_ZVAL_LVAL tmp_reg, op1_addr
+ | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op2_addr
return zend_jit_cmp_double_common(Dst, opline, b, op_array, ssa, 0);
}
static int zend_jit_cmp_double_long(dasm_State **Dst, const zend_op *opline, int b, zend_op_array *op_array, zend_ssa *ssa, zend_jit_addr op1_addr, zend_jit_addr op2_addr)
{
- zend_bool swap = 0;
-
- |.if SSE
- zend_reg tmp_reg = ZREG_XMM0;
+ zend_reg tmp_reg = ZREG_XMM0;
- | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
- | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op1_addr
- swap = 1;
- |.else
- | FPU_GET_ZVAL_LVAL op2_addr
- | FPU_GET_ZVAL_DVAL op1_addr
- | fucomip st1
- | fstp st0
- |.endif
+ | SSE_GET_ZVAL_LVAL tmp_reg, op2_addr
+ | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op1_addr
- return zend_jit_cmp_double_common(Dst, opline, b, op_array, ssa, swap);
+ return zend_jit_cmp_double_common(Dst, opline, b, op_array, ssa, /* swap */ 1);
}
static int zend_jit_cmp_double_double(dasm_State **Dst, const zend_op *opline, int b, zend_op_array *op_array, zend_ssa *ssa, zend_jit_addr op1_addr, zend_jit_addr op2_addr)
{
zend_bool swap = 0;
- |.if SSE
- if (Z_MODE(op1_addr) == IS_REG) {
- | SSE_AVX_OP ucomisd, vucomisd, Z_REG(op1_addr), op2_addr
- } else if (Z_MODE(op2_addr) == IS_REG) {
- | SSE_AVX_OP ucomisd, vucomisd, Z_REG(op2_addr), op1_addr
- swap = 1;
- } else {
- zend_reg tmp_reg = ZREG_XMM0;
+ if (Z_MODE(op1_addr) == IS_REG) {
+ | SSE_AVX_OP ucomisd, vucomisd, Z_REG(op1_addr), op2_addr
+ } else if (Z_MODE(op2_addr) == IS_REG) {
+ | SSE_AVX_OP ucomisd, vucomisd, Z_REG(op2_addr), op1_addr
+ swap = 1;
+ } else {
+ zend_reg tmp_reg = ZREG_XMM0;
- | SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
- | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op2_addr
- }
- |.else
- | FPU_GET_ZVAL_DVAL op2_addr
- | FPU_GET_ZVAL_DVAL op1_addr
- | fucomip st1
- | fstp st0
- |.endif
+ | SSE_GET_ZVAL_DVAL tmp_reg, op1_addr
+ | SSE_AVX_OP ucomisd, vucomisd, tmp_reg, op2_addr
+ }
return zend_jit_cmp_double_common(Dst, opline, b, op_array, ssa, swap);
}
@@ -6790,19 +6596,12 @@ static int zend_jit_bool_jmpznz(dasm_State **Dst, const zend_op *opline, int b,
}
if ((op1_info & MAY_BE_ANY) == MAY_BE_DOUBLE) {
- |.if SSE
- if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
- | vxorps xmm0, xmm0, xmm0
- } else {
- | xorps xmm0, xmm0
- }
- | SSE_AVX_OP ucomisd, vucomisd, ZREG_XMM0, op1_addr
- |.else
- | FPU_GET_ZVAL_DVAL op1_addr
- | fldz
- | fucomip st1
- | fstp st0
- |.endif
+ if (zend_jit_x86_flags & ZEND_JIT_CPU_AVX) {
+ | vxorps xmm0, xmm0, xmm0
+ } else {
+ | xorps xmm0, xmm0
+ }
+ | SSE_AVX_OP ucomisd, vucomisd, ZREG_XMM0, op1_addr
if (set_bool) {
if (false_label != (uint32_t)-1) { // JMPZ_EX