OSDN Git Service

HeavyOSECPUMainの各変数名を適切なものへ変更。
[heavyosecpu/HeavyOSECPU.git] / jitc.h
diff --git a/jitc.h b/jitc.h
index 7e49a4a..bf136ae 100644 (file)
--- a/jitc.h
+++ b/jitc.h
@@ -2,6 +2,8 @@
 #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
@@ -48,12 +50,41 @@ int jitCompCmdLen(const unsigned char *src);
 #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
+#define IA32_MOD_R_M(mod, reg, rm)               ((mod << 6) | reg << 3 | rm)\r
 //\r
-#define jitCompPutOp_PUSHAD(p) jitCompPutByte1(p, 0x60);\r
-\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
@@ -64,8 +95,8 @@ int jitCompCmdLen(const unsigned char *src);
 #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
+#define        jitCompA0001_OPTIMIZE_ALIGN             8       /* 0-8を想定 */\r
+#define        jitCompA0001_EBP128                             128 // 0にもできる\r
 \r
 struct JitCompWork {\r
        unsigned char *dst, *dst0;\r
@@ -76,12 +107,12 @@ struct JitCompWork {
        char prefix;    //CND命令の値を記録(初期値=0)\r
 };\r
 \r
-void jitCompPutImm32(struct JitCompWork *w, int i);\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 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
@@ -101,6 +132,9 @@ int jitCompA000_dataWidth(int t);
 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
@@ -120,14 +154,6 @@ void dbgrMain(HOSECPU_RuntimeEnvironment *r);
 \r
 \r
 \r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
 #endif\r
 \r
 #endif\r