#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 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
#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
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
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
\r
\r
\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
-\r
#endif\r
\r
#endif\r