-\r
-#ifndef HeavyOSECPU_jitc_h\r
-#define HeavyOSECPU_jitc_h\r
-\r
-\r
-\r
-// Error flags\r
-#define JITC_ERR_MASK 255\r
-#define JITC_ERR_PHASE0ONLY 256\r
-#define JITC_ERR_REGNUM (1 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_DST1 (2 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_OPECODE (3 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_LABELNUM (4 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_LABELREDEF (5 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_PREFIX (6 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_LABELNODEF 7\r
-#define JITC_ERR_LABELTYP 8\r
-#define JITC_ERR_IDIOM 9\r
-#define JITC_ERR_PREGNUM (10 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_SRC1 (11 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_BADTYPE (12 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_PREFIXFAR (13 | JITC_ERR_PHASE0ONLY)\r
-#define JITC_ERR_INTERNAL 99\r
-\r
-// Byte operations\r
-#define jitCompPutByte1(p, c0) *p++ = c0\r
-#define jitCompPutByte2(p, c0, c1) *p++ = c0; *p++ = c1\r
-#define jitCompPutByte3(p, c0, c1, c2) *p++ = c0; *p++ = c1; *p++ = c2\r
-#define jitCompPutByte4(p, c0, c1, c2, c3) *p++ = c0; *p++ = c1; *p++ = c2; *p++ = c3\r
-\r
-//\r
-// functions (jitc internal)\r
-//\r
-\r
-// @jitc.c\r
-void errorHandler(HOSECPU_RuntimeEnvironment *r);\r
-int jitCompCmdLen(const unsigned char *src);\r
-\r
-// @jitcx86.c\r
-#if (JITC_ARCNUM == 0x0001)\r
-//\r
-// for x86-32bit\r
-//\r
-#define IA32_REG0_EAX 0\r
-#define IA32_REG1_ECX 1\r
-#define IA32_REG2_EDX 2\r
-#define IA32_REG3_EBX 3\r
-#define IA32_REG4_ESP 4\r
-#define IA32_REG5_EBP 5\r
-#define IA32_REG6_ESI 6\r
-#define IA32_REG7_EDI 7\r
-//\r
-#define envOffset_DBGINFO0 (2304 + 0)\r
-#define envOffset_DBGINFO1 (2304 + 4)\r
-//\r
-#define jitCompPutImm32(p, i) jitCompPutByte4(p, ((i) & 0xff), (((i) >> 8) & 0xff), (((i) >> 16) & 0xff), (((i) >> 24) & 0xff))\r
-#define jitCompPutOp_XOR_GReg_GReg(p, d, s) jitCompPutByte2(w.dst, 0x31, 0xc0 | (s) << 3 | (d));\r
-#define jitCompPutOp_MOV_GReg_Imm32(p, dReg, i) jitCompPutByte1(p, 0xb8 | dReg); jitCompPutImm32(p, i); /* MOV(reg0, ?); == [1011 1 reg] imm32 */\r
-#define jitCompPutOp_PUSHAD(p) jitCompPutByte1(p, 0x60);\r
-#define jitCompPutOp_POPAD(p) jitCompPutByte1(p, 0x61);\r
-#define jitCompPutOp_PUSH_GReg(p, reg) jitCompPutByte1(p, 0x50 | (reg));\r
-#define jitCompPutOp_POP_GReg(p, reg) jitCompPutByte1(p, 0x58 | (reg));\r
-#define jitCompPutOp_CALL_Relative(p, diff) jitCompPutByte1(w.dst, 0xe8); jitCompPutImm32(&w, j);\r
-//\r
-#define jitCompPutOp_MOV_EAX_ZERO(p) jitCompPutOp_XOR_GReg_GReg(p, IA32_REG0_EAX, IA32_REG0_EAX);\r
-\r
-// Optimization settings\r
-// 他のCPUへ移植する人へ:\r
-// 以下の定数は最適化のためのものなので、すべて0として簡単に移植しても問題ありません\r
-#define jitCompA0001_USE_R3F_CMPJMP 1*1\r
-#define jitCompA0001_USE_R3F_IMM32 1*1\r
-#define jitCompA0001_USE_R3F_IMM8 1*1\r
-#define jitCompA0001_USE_R3F_INCDEC 1*1\r
-#define jitCompA0001_OPTIMIZE_JMP 1*1\r
-#define jitCompA0001_OPTIMIZE_MOV 1*1 /* 1にすると速度低下する? */\r
-#define jitCompA0001_OPTIMIZE_CMP 1*1\r
-#define jitCompA0001_OPTIMIZE_ALIGN 4*1 /* 0-8を想定 */\r
-#define jitCompA0001_EBP128 128*1\r
-\r
-struct JitCompWork {\r
- unsigned char *dst, *dst0;\r
- int err, maxLabels;\r
-#if (jitCompA0001_USE_R3F_IMM32 != 0)\r
- int r3f;\r
-#endif\r
- char prefix; //CND命令の値を記録(初期値=0)\r
-};\r
-\r
-// @jitcx86a.c\r
-int jitCompGetImm32(const unsigned char *src);\r
-int jitCompGetLabelNum(struct JitCompWork *w, const unsigned char *src);\r
-void jitCompA0001_85DispN(struct JitCompWork *w, int disp, int n);\r
-void jitCompA0001_movEbpDispReg32(struct JitCompWork *w, int disp, int reg32);\r
-void jitCompA0001_movReg32EbpDisp(struct JitCompWork *w, int reg32, int disp);\r
-void jitCompA0001_movEaxRxx(struct JitCompWork *w, int rxx);\r
-void jitCompA0001_movRxxEax(struct JitCompWork *w, int rxx);\r
-void jitCompA0001_fixPrefix(struct JitCompWork *w);\r
-void jitCompA0001_checkCompPtr(struct JitCompWork *w, int p0, int p1);\r
-void jitCompA000_loadRegCacheAll(struct JitCompWork *w);\r
-void jitCompA000_storeRegCacheAll(struct JitCompWork *w);\r
-void jitCompA000_loadRegCacheEcx(struct JitCompWork *w);\r
-void jitCompA000_storeRegCacheEcx(struct JitCompWork *w);\r
-void jitCompA000_loadRegCacheEdx(struct JitCompWork *w);\r
-void jitCompA000_storeRegCacheEdx(struct JitCompWork *w);\r
-int jitCompA000_selectRegCache(int rxx, int reg);\r
-void jitCompA000_loadPRegCacheAll(struct JitCompWork *w);\r
-void jitCompA000_storePRegCacheAll(struct JitCompWork *w);\r
-int jitCompA000_selectPRegCache(int pxx, int reg);\r
-int jitCompA000_convTyp(int t);\r
-int jitCompA000_dataWidth(int t);\r
-void jitCompA0001_checkType0(struct JitCompWork *w, int pxx, int typ, int ac);\r
-void jitCompA0001_checkType(struct JitCompWork *w, int pxx, int typ, int ac);\r
-void jitCompA0001_checkLimit(struct JitCompWork *w, int reg, int pxx);\r
-\r
-// @jitcx86.c\r
-extern unsigned char *errfnc;\r
-int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *src, const unsigned char *src1, const unsigned char *src0, HOSECPU_LabelListTag *label, int maxLabels, int level, int debugInfo1, int flags);\r
-unsigned char *jitCompCallFunc(unsigned char *dst, void *func);\r
-unsigned char *jitCompInit(unsigned char *dst);\r
-void func3c(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);\r
-void func3d(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);\r
-void funcf4(char *ebp, int pxx, int typ, int len);\r
-void funcf5(char *ebp, int pxx, int typ, int len);\r
-void funcf6(char *ebp, int pxx, int typ, int len);\r
-void funcf7(char *ebp, int pxx, int typ, int len);\r
-void errHndl(HOSECPU_RuntimeEnvironment *r);\r
-int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);\r
-#if (USE_DEBUGGER != 0)\r
-int dbgrGetRegNum(const char *p);\r
-void dbgrMain(HOSECPU_RuntimeEnvironment *r);\r
-#endif\r
-\r
-\r
-\r
-\r
-#endif\r
-\r
-#endif\r
+
+#ifndef HeavyOSECPU_jitc_h
+#define HeavyOSECPU_jitc_h
+
+
+
+// Error flags
+#define JITC_ERR_MASK 255
+#define JITC_ERR_PHASE0ONLY 256
+#define JITC_ERR_REGNUM (1 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_DST1 (2 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_OPECODE (3 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_LABELNUM (4 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_LABELREDEF (5 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_PREFIX (6 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_LABELNODEF 7
+#define JITC_ERR_LABELTYP 8
+#define JITC_ERR_IDIOM 9
+#define JITC_ERR_PREGNUM (10 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_SRC1 (11 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_BADTYPE (12 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_PREFIXFAR (13 | JITC_ERR_PHASE0ONLY)
+#define JITC_ERR_INTERNAL 99
+
+// Byte operations
+#define jitCompPutByte1(p, c0) *p++ = c0
+#define jitCompPutByte2(p, c0, c1) *p++ = c0; *p++ = c1
+#define jitCompPutByte3(p, c0, c1, c2) *p++ = c0; *p++ = c1; *p++ = c2
+#define jitCompPutByte4(p, c0, c1, c2, c3) *p++ = c0; *p++ = c1; *p++ = c2; *p++ = c3
+
+//
+// functions (jitc internal)
+//
+
+// @jitc.c
+void errorHandler(HOSECPU_RuntimeEnvironment *r);
+int jitCompCmdLen(const unsigned char *src);
+
+// @jitcx86.c
+#if (JITC_ARCNUM == 0x0001)
+//
+// for x86-32bit
+//
+#define IA32_REG0_EAX 0
+#define IA32_REG1_ECX 1
+#define IA32_REG2_EDX 2
+#define IA32_REG3_EBX 3
+#define IA32_REG4_ESP 4
+#define IA32_REG5_EBP 5
+#define IA32_REG6_ESI 6
+#define IA32_REG7_EDI 7
+//
+#define IA32_MOD_R_M(mod, reg, rm) ((mod << 6) | reg << 3 | rm)
+//
+#define IA32_OP_MOD_INDEXONLY 0
+#define IA32_OP_MOD_INDEX_AND_DISP_BYTE 1
+#define IA32_OP_MOD_INDEX_AND_DISP_FULL 2
+#define IA32_OP_MOD_REGISTER 3
+//
+#define IA32_OP_RM32_MOD00_ADDR_DISP32 5
+//
+#define envOffset_DBGINFO0 (2304 + 0)
+#define envOffset_DBGINFO1 (2304 + 4)
+#define envOffset_DBGCURRENTCODE (2304 + 8)
+#define envOffset_PTRCTRL (2320)
+#define PRegOffset(regid) (256 + 32 * regid)
+//
+#define jitCompPutImm32(p, i) jitCompPutByte4(p, ((i) & 0xff), (((i) >> 8) & 0xff), (((i) >> 16) & 0xff), (((i) >> 24) & 0xff))
+//
+#define jitCompPutOp_ADD_GReg_Imm8(p, dReg, i) jitCompPutByte3(p, 0x83, 0xc0 | dReg, i); /* ADD(reg0, imm8); == [1000 0011] [11000 reg] imm8 */
+#define jitCompPutOp_XOR_GReg_GReg(p, d, s) jitCompPutByte2(w.dst, 0x31, 0xc0 | (s) << 3 | (d));
+#define jitCompPutOp_MOV_GReg_Imm32(p, dReg, i) jitCompPutByte1(p, 0xb8 | dReg); jitCompPutImm32(p, i); /* MOV(reg0, imm32); == [1011 1 reg] imm32 */
+#define jitCompPutOp_PUSHAD(p) jitCompPutByte1(p, 0x60);
+#define jitCompPutOp_POPAD(p) jitCompPutByte1(p, 0x61);
+#define jitCompPutOp_PUSH_GReg(p, reg) jitCompPutByte1(p, 0x50 | (reg));
+#define jitCompPutOp_PUSH_Imm8(p, i) jitCompPutByte2(p, 0x6a, i);
+#define jitCompPutOp_POP_GReg(p, reg) jitCompPutByte1(p, 0x58 | (reg));
+#define jitCompPutOp_CALL_Relative(p, diff) jitCompPutByte1(p, 0xe8); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対コールする*/
+#define jitCompPutOp_JMPnear(p, diff) jitCompPutByte1(p, 0xe9); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対ジャンプする*/
+#define jitCompPutOp_JMPshort(p, diff) jitCompPutByte2(p, 0xeb, diff & 0xff);/*次の命令との相対オフセットだけ相対ジャンプする*/
+#define jitCompPutOp_INT3(p) jitCompPutByte1(p, 0xCC);
+//
+#define jitCompPutOp_MOV_EAX_ZERO(p) jitCompPutOp_XOR_GReg_GReg(p, IA32_REG0_EAX, IA32_REG0_EAX);
+//
+#define DEBUGCode(work, code) jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, code); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODE, IA32_REG0_EAX);
+// Optimization settings
+// 他のCPUへ移植する人へ:
+// 以下の定数は最適化のためのものなので、すべて0として簡単に移植しても問題ありません
+#define jitCompA0001_USE_R3F_CMPJMP 1*1
+#define jitCompA0001_USE_R3F_IMM32 1*1
+#define jitCompA0001_USE_R3F_IMM8 1*1
+#define jitCompA0001_USE_R3F_INCDEC 1*1
+#define jitCompA0001_OPTIMIZE_JMP 1*1
+#define jitCompA0001_OPTIMIZE_MOV 1*1 /* 1にすると速度低下する? */
+#define jitCompA0001_OPTIMIZE_CMP 1*1
+#define jitCompA0001_OPTIMIZE_ALIGN 8 /* 0-8を想定 */
+#define jitCompA0001_EBP128 128 // 0にもできる
+
+struct JitCompWork {
+ unsigned char *dst, *dst0;
+ int err, maxLabels;
+#if (jitCompA0001_USE_R3F_IMM32 != 0)
+ int r3f;
+#endif
+ char prefix; //CND命令の値を記録(初期値=0)
+};
+
+// @jitcx86a.c
+int jitCompGetImm32(const unsigned char *src);
+int jitCompGetLabelNum(struct JitCompWork *w, const unsigned char *src);
+void jitCompPutModRM_Disp_BaseEBP(struct JitCompWork *w, int disp, int opReg);
+void jitCompPutOp_MOV_EBPDisp_GReg(struct JitCompWork *w, int disp, int reg32);
+void jitCompPutOp_MOV_GReg_EBPDisp(struct JitCompWork *w, int reg32, int disp);
+void jitCompA0001_movEaxRxx(struct JitCompWork *w, int rxx);
+void jitCompA0001_movRxxEax(struct JitCompWork *w, int rxx);
+void jitCompA0001_fixPrefix(struct JitCompWork *w);
+void jitCompA0001_checkCompPtr(struct JitCompWork *w, int p0, int p1);
+void jitCompA000_loadRegCacheAll(struct JitCompWork *w);
+void jitCompA000_storeRegCacheAll(struct JitCompWork *w);
+void jitCompA000_loadRegCacheEcx(struct JitCompWork *w);
+void jitCompA000_storeRegCacheEcx(struct JitCompWork *w);
+void jitCompA000_loadRegCacheEdx(struct JitCompWork *w);
+void jitCompA000_storeRegCacheEdx(struct JitCompWork *w);
+int jitCompA000_selectRegCache(int rxx, int reg);
+void jitCompA000_loadPRegCacheAll(struct JitCompWork *w);
+void jitCompA000_storePRegCacheAll(struct JitCompWork *w);
+int jitCompA000_selectPRegCache(int pxx, int reg);
+int jitCompA000_convTyp(int t);
+int jitCompA000_dataWidth(int t);
+void jitCompA0001_checkType0(struct JitCompWork *w, int pxx, int typ, int ac);
+void jitCompA0001_checkType(struct JitCompWork *w, int pxx, int typ, int ac);
+void jitCompA0001_checkLimit(struct JitCompWork *w, int reg, int pxx);
+
+// @jitcx86.c
+extern unsigned char *errfnc;
+int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *src, const unsigned char *src1, const unsigned char *src0, HOSECPU_LabelListTag *label, int maxLabels, int level, int debugInfo1, int flags);
+unsigned char *jitCompCallFunc(unsigned char *dst, void *func);
+unsigned char *jitCompInit(unsigned char *dst);
+void func3c(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);
+void func3d(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int p0);
+void funcf4(char *ebp, int pxx, int typ, int len);
+void funcf5(char *ebp, int pxx, int typ, int len);
+void funcf6(char *ebp, int pxx, int typ, int len);
+void funcf7(char *ebp, int pxx, int typ, int len);
+void errHndl(HOSECPU_RuntimeEnvironment *r);
+int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label);
+#if (USE_DEBUGGER != 0)
+int dbgrGetRegNum(const char *p);
+void dbgrMain(HOSECPU_RuntimeEnvironment *r);
+#endif
+
+
+
+
+#endif
+
+#endif