summaryrefslogtreecommitdiff
path: root/ext/opcache/jit/zend_jit_x86.h
diff options
context:
space:
mode:
Diffstat (limited to 'ext/opcache/jit/zend_jit_x86.h')
-rw-r--r--ext/opcache/jit/zend_jit_x86.h196
1 files changed, 7 insertions, 189 deletions
diff --git a/ext/opcache/jit/zend_jit_x86.h b/ext/opcache/jit/zend_jit_x86.h
index d47c5be056..f811a1d520 100644
--- a/ext/opcache/jit/zend_jit_x86.h
+++ b/ext/opcache/jit/zend_jit_x86.h
@@ -99,58 +99,20 @@ typedef struct _zend_jit_registers_buf {
#define ZREG_RDI ZREG_R7
#ifdef _WIN64
-# define ZREG_FP ZREG_R14
-# define ZREG_IP ZREG_R15
-# define ZREG_RX ZREG_IP
-# define ZREG_FCARG1a ZREG_RCX
-# define ZREG_FCARG2a ZREG_RDX
+# define ZREG_FP ZREG_R14
+# define ZREG_IP ZREG_R15
#elif defined(__x86_64__)
-# define ZREG_FP ZREG_R14
-# define ZREG_IP ZREG_R15
-# define ZREG_RX ZREG_IP
-# define ZREG_FCARG1a ZREG_RDI
-# define ZREG_FCARG2a ZREG_RSI
+# define ZREG_FP ZREG_R14
+# define ZREG_IP ZREG_R15
#else
-# define ZREG_FP ZREG_RSI
-# define ZREG_IP ZREG_RDI
-# define ZREG_RX ZREG_IP
-# define ZREG_FCARG1a ZREG_RCX
-# define ZREG_FCARG2a ZREG_RDX
+# define ZREG_FP ZREG_RSI
+# define ZREG_IP ZREG_RDI
#endif
-extern const char *zend_reg_name[];
+#define ZREG_RX ZREG_IP
typedef uint32_t zend_regset;
-#define ZEND_REGSET_EMPTY 0
-
-#define ZEND_REGSET_IS_EMPTY(regset) \
- (regset == ZEND_REGSET_EMPTY)
-
-#define ZEND_REGSET(reg) \
- (1u << (reg))
-
-#define ZEND_REGSET_INTERVAL(reg1, reg2) \
- (((1u << ((reg2) - (reg1) + 1)) - 1) << (reg1))
-
-#define ZEND_REGSET_IN(regset, reg) \
- (((regset) & ZEND_REGSET(reg)) != 0)
-
-#define ZEND_REGSET_INCL(regset, reg) \
- (regset) |= ZEND_REGSET(reg)
-
-#define ZEND_REGSET_EXCL(regset, reg) \
- (regset) &= ~ZEND_REGSET(reg)
-
-#define ZEND_REGSET_UNION(set1, set2) \
- ((set1) | (set2))
-
-#define ZEND_REGSET_INTERSECTION(set1, set2) \
- ((set1) & (set2))
-
-#define ZEND_REGSET_DIFFERENCE(set1, set2) \
- ((set1) & ~(set2))
-
#ifdef _WIN64
# define ZEND_REGSET_FIXED \
(ZEND_REGSET(ZREG_RSP) | ZEND_REGSET(ZREG_R14) | ZEND_REGSET(ZREG_R15))
@@ -186,148 +148,4 @@ typedef uint32_t zend_regset;
(ZEND_REGSET(ZREG_RBX) | ZEND_REGSET(ZREG_RBP))
#endif
-#ifndef _WIN32
-#define ZEND_REGSET_FIRST(set) ((zend_reg)__builtin_ctz(set))
-#define ZEND_REGSET_LAST(set) ((zend_reg)(__builtin_clz(set)^31)))
-#else
-#include <intrin.h>
-uint32_t __inline __zend_jit_ctz( uint32_t value ) {
- DWORD trailing_zero = 0;
- if (_BitScanForward(&trailing_zero, value)) {
- return trailing_zero;
- }
- return 32;
-}
-uint32_t __inline __zend_jit_clz(uint32_t value) {
- DWORD leading_zero = 0;
- if (_BitScanReverse(&leading_zero, value)) {
- return 31 - leading_zero;
- }
- return 32;
-}
-#define ZEND_REGSET_FIRST(set) ((zend_reg)__zend_jit_ctz(set))
-#define ZEND_REGSET_LAST(set) ((zend_reg)(__zend_jit_clz(set)^31)))
-#endif
-
-#define ZEND_REGSET_FOREACH(set, reg) \
- do { \
- zend_regset _tmp = (set); \
- while (!ZEND_REGSET_IS_EMPTY(_tmp)) { \
- zend_reg _reg = ZEND_REGSET_FIRST(_tmp); \
- ZEND_REGSET_EXCL(_tmp, _reg); \
- reg = _reg; \
-
-#define ZEND_REGSET_FOREACH_END() \
- } \
- } while (0)
-
-typedef uintptr_t zend_jit_addr;
-
-#define IS_CONST_ZVAL 0
-#define IS_MEM_ZVAL 1
-#define IS_REG 2
-
-#define _ZEND_ADDR_MODE_MASK 0x3
-#define _ZEND_ADDR_REG_SHIFT 2
-#define _ZEND_ADDR_REG_MASK 0x3f
-#define _ZEND_ADDR_OFFSET_SHIFT 8
-#define _ZEND_ADDR_REG_STORE_BIT 8
-#define _ZEND_ADDR_REG_LOAD_BIT 9
-#define _ZEND_ADDR_REG_LAST_USE_BIT 10
-
-#define ZEND_ADDR_CONST_ZVAL(zv) \
- (((zend_jit_addr)(uintptr_t)(zv)) | IS_CONST_ZVAL)
-#define ZEND_ADDR_MEM_ZVAL(reg, offset) \
- ((((zend_jit_addr)(uintptr_t)(offset)) << _ZEND_ADDR_OFFSET_SHIFT) | \
- (((zend_jit_addr)(uintptr_t)(reg)) << _ZEND_ADDR_REG_SHIFT) | \
- IS_MEM_ZVAL)
-#define ZEND_ADDR_REG(reg) \
- ((((zend_jit_addr)(uintptr_t)(reg)) << _ZEND_ADDR_REG_SHIFT) | \
- IS_REG)
-
-#define Z_MODE(addr) (((addr) & _ZEND_ADDR_MODE_MASK))
-#define Z_ZV(addr) ((zval*)(addr))
-#define Z_OFFSET(addr) ((uint32_t)((addr)>>_ZEND_ADDR_OFFSET_SHIFT))
-#define Z_REG(addr) ((zend_reg)(((addr)>>_ZEND_ADDR_REG_SHIFT) & _ZEND_ADDR_REG_MASK))
-#define Z_STORE(addr) ((zend_reg)(((addr)>>_ZEND_ADDR_REG_STORE_BIT) & 1))
-#define Z_LOAD(addr) ((zend_reg)(((addr)>>_ZEND_ADDR_REG_LOAD_BIT) & 1))
-#define Z_LAST_USE(addr) ((zend_reg)(((addr)>>_ZEND_ADDR_REG_LAST_USE_BIT) & 1))
-
-#define OP_REG_EX(reg, store, load, last_use) \
- ((reg) | \
- ((store) ? (1 << (_ZEND_ADDR_REG_STORE_BIT-_ZEND_ADDR_REG_SHIFT)) : 0) | \
- ((load) ? (1 << (_ZEND_ADDR_REG_LOAD_BIT-_ZEND_ADDR_REG_SHIFT)) : 0) | \
- ((last_use) ? (1 << (_ZEND_ADDR_REG_LAST_USE_BIT-_ZEND_ADDR_REG_SHIFT)) : 0) \
- )
-
-#define OP_REG(ssa_op, op) \
- (ra && ssa_op->op >= 0 && ra[ssa_op->op] ? \
- OP_REG_EX(ra[ssa_op->op]->reg, \
- (ra[ssa_op->op]->flags & ZREG_STORE), \
- (ra[ssa_op->op]->flags & ZREG_LOAD), \
- zend_ival_is_last_use(ra[ssa_op->op], ssa_op - ssa->ops) \
- ) : ZREG_NONE)
-
-static zend_always_inline zend_jit_addr _zend_jit_decode_op(zend_uchar op_type, znode_op op, const zend_op *opline, zend_reg reg)
-{
- if (op_type == IS_CONST) {
-#if ZEND_USE_ABS_CONST_ADDR
- return ZEND_ADDR_CONST_ZVAL(op.zv);
-#else
- return ZEND_ADDR_CONST_ZVAL(RT_CONSTANT(opline, op));
-#endif
- } else {
- ZEND_ASSERT(op_type & (IS_CV|IS_TMP_VAR|IS_VAR));
- if (reg != ZREG_NONE) {
- return ZEND_ADDR_REG(reg);
- } else {
- return ZEND_ADDR_MEM_ZVAL(ZREG_FP, op.var);
- }
- }
-}
-
-#define OP_ADDR(opline, type, op) \
- _zend_jit_decode_op((opline)->type, (opline)->op, opline, ZREG_NONE)
-
-#define OP1_ADDR() \
- OP_ADDR(opline, op1_type, op1)
-#define OP2_ADDR() \
- OP_ADDR(opline, op2_type, op2)
-#define RES_ADDR() \
- OP_ADDR(opline, result_type, result)
-#define OP1_DATA_ADDR() \
- OP_ADDR(opline + 1, op1_type, op1)
-
-#define OP_REG_ADDR(opline, type, _op, _ssa_op) \
- _zend_jit_decode_op((opline)->type, (opline)->_op, opline, \
- OP_REG(ssa_op, _ssa_op))
-
-#define OP1_REG_ADDR() \
- OP_REG_ADDR(opline, op1_type, op1, op1_use)
-#define OP2_REG_ADDR() \
- OP_REG_ADDR(opline, op2_type, op2, op2_use)
-#define RES_REG_ADDR() \
- OP_REG_ADDR(opline, result_type, result, result_def)
-#define OP1_DATA_REG_ADDR() \
- OP_REG_ADDR(opline + 1, op1_type, op1, op1_use)
-
-#define OP1_DEF_REG_ADDR() \
- OP_REG_ADDR(opline, op1_type, op1, op1_def)
-#define OP2_DEF_REG_ADDR() \
- OP_REG_ADDR(opline, op2_type, op2, op2_def)
-#define RES_USE_REG_ADDR() \
- OP_REG_ADDR(opline, result_type, result, result_use)
-#define OP1_DATA_DEF_REG_ADDR() \
- OP_REG_ADDR(opline + 1, op1_type, op1, op1_def)
-
-static zend_always_inline bool zend_jit_same_addr(zend_jit_addr addr1, zend_jit_addr addr2)
-{
- if (addr1 == addr2) {
- return 1;
- } else if (Z_MODE(addr1) == IS_REG && Z_MODE(addr2) == IS_REG) {
- return Z_REG(addr1) == Z_REG(addr2);
- }
- return 0;
-}
-
#endif /* ZEND_JIT_X86_H */