OSDN Git Service

HeavyOSECPUMainの各変数名を適切なものへ変更。
[heavyosecpu/HeavyOSECPU.git] / jitc.h
diff --git a/jitc.h b/jitc.h
index 82ef48d..bf136ae 100644 (file)
--- a/jitc.h
+++ b/jitc.h
-
-#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
+\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 IA32_MOD_R_M(mod, reg, rm)               ((mod << 6) | reg << 3 | rm)\r
+//\r
+#define IA32_OP_MOD_INDEXONLY          0\r
+#define IA32_OP_MOD_INDEX_AND_DISP_BYTE        1\r
+#define IA32_OP_MOD_INDEX_AND_DISP_FULL        2\r
+#define IA32_OP_MOD_REGISTER           3\r
+//\r
+#define IA32_OP_RM32_MOD00_ADDR_DISP32 5\r
+//\r
+#define envOffset_DBGINFO0              (2304 + 0)\r
+#define envOffset_DBGINFO1              (2304 + 4)\r
+#define envOffset_DBGCURRENTCODE        (2304 + 8)\r
+#define envOffset_DBGCURRENTCODEADDR    (2304 + 12)\r
+#define envOffset_PTRCTRL               (2320)\r
+#define PRegOffset(regid)               (256 + 32 * regid)\r
+//\r
+#define jitCompPutImm32(p, i)                                  jitCompPutByte4(p, ((i) & 0xff), (((i) >> 8) & 0xff), (((i) >> 16) & 0xff), (((i) >> 24) & 0xff))\r
+//\r
+#define jitCompPutOp_ADD_GReg_Imm8(p, dReg, i) jitCompPutByte3(p, 0x83, 0xc0 | dReg, i);               /* ADD(reg0, imm8);  == [1000 0011] [11000 reg] imm8 */\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, imm32);  == [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_PUSH_Imm8(p, i)                           jitCompPutByte2(p, 0x6a, i);\r
+#define jitCompPutOp_POP_GReg(p, reg)                  jitCompPutByte1(p, 0x58 | (reg));\r
+#define jitCompPutOp_CALL_Relative(p, diff)            jitCompPutByte1(p, 0xe8); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対コールする*/\r
+#define jitCompPutOp_JMPnear(p, diff)                  jitCompPutByte1(p, 0xe9); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対ジャンプする*/\r
+#define jitCompPutOp_JMPshort(p, diff)                 jitCompPutByte2(p, 0xeb, diff & 0xff);/*次の命令との相対オフセットだけ相対ジャンプする*/\r
+#define jitCompPutOp_INT3(p)                                   jitCompPutByte1(p, 0xCC);\r
+//\r
+#define jitCompPutOp_MOV_EAX_ZERO(p)                           jitCompPutOp_XOR_GReg_GReg(p, IA32_REG0_EAX, IA32_REG0_EAX);\r
+//\r
+#define DEBUGCode(work, code)                   jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, code); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODE, IA32_REG0_EAX);\r
+#define DEBUGCodeAddress(work, addr)            jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, addr); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODEADDR, IA32_REG0_EAX);\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             8       /* 0-8を想定 */\r
+#define        jitCompA0001_EBP128                             128 // 0にもできる\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 jitCompPutModRM_Disp_BaseEBP(struct JitCompWork *w, int disp, int opReg);\r
+void jitCompPutOp_MOV_EBPDisp_GReg(struct JitCompWork *w, int disp, int reg32);\r
+void jitCompPutOp_MOV_GReg_EBPDisp(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