jitCompA000_loadPRegCacheAll(&w);\r
}\r
if (level <= JITC_LV_SLOWER) {\r
- // debugInfo0 <- 0;\r
- // \r
+ // env.debugInfo0 <- 0;\r
+ // env.debugInfo1 <- debugInfo1;\r
jitCompPutOp_MOV_EAX_ZERO(w.dst);\r
// MOV(debugInfo0, EAX);\r
jitCompA0001_movEbpDispReg32(&w, envOffset_DBGINFO0, IA32_REG0_EAX);\r
w.prefix = 0; //0x04 CND 命令で変更される\r
if (w.dst + 256 > dst1) {\r
// 書き込み領域が残り256バイト未満ならエラー\r
- w.err = JITC_ERR_DST1; goto err_w;\r
+ w.err = JITC_ERR_DST1;\r
+ goto err_w;\r
}\r
timecount++;\r
if (timecount >= 64) {\r
// NOP\r
if (w.prefix != 0) {\r
// 「条件付きでNOPを実行」するなんて、矛盾している!\r
- w.err = JITC_ERR_PREFIX; goto err_w;\r
+ w.err = JITC_ERR_PREFIX;\r
+ goto err_w;\r
}\r
break;\r
\r
case 0x33: /* mfree(old:F7) */\r
jitCompA000_storeRegCacheAll(&w); // 手抜き.\r
jitCompA000_storePRegCacheAll(&w); // 手抜き.\r
- jitCompPutByte2(w.dst, 0x6a, src[3]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[2]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[1]); /* PUSH(?); */\r
- jitCompPutByte1(w.dst, 0x55); /* PUSH(EBP); */\r
- jitCompPutByte1(w.dst, 0xe8);\r
- if (*src == 0x30) j = ((unsigned char *)&funcf4) - (w.dst + 4);\r
- if (*src == 0x31) j = ((unsigned char *)&funcf5) - (w.dst + 4);\r
- if (*src == 0x32) j = ((unsigned char *)&funcf6) - (w.dst + 4);\r
- if (*src == 0x33) j = ((unsigned char *)&funcf7) - (w.dst + 4);\r
- jitCompPutImm32(w.dst, j);\r
- jitCompPutByte3(w.dst, 0x83, 0xc4, 0x10); /* ADD(ESP,16); */\r
+ \r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[3]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[2]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[1]);\r
+ jitCompPutOp_PUSH_GReg(w.dst, IA32_REG5_EBP);\r
+ \r
+ switch (*src) {\r
+ case 0x30:\r
+ j = ((unsigned char *)&funcf4) - (w.dst + 1 + 4);\r
+ break;\r
+ case 0x31:\r
+ j = ((unsigned char *)&funcf5) - (w.dst + 1 + 4);\r
+ break;\r
+ case 0x32:\r
+ j = ((unsigned char *)&funcf6) - (w.dst + 1 + 4);\r
+ break;\r
+ case 0x33:\r
+ j = ((unsigned char *)&funcf7) - (w.dst + 1 + 4);\r
+ break;\r
+ }\r
+ jitCompPutOp_CALL_Relative(w.dst, j);\r
+ jitCompPutOp_ADD_GReg_Imm8(w.dst, IA32_REG4_ESP, 16);\r
+ \r
jitCompA000_loadRegCacheAll(&w); // 手抜き.\r
jitCompA000_loadPRegCacheAll(&w); // 手抜き.\r
cmp0reg = -1;\r
case 0x3c: /* ENTER */\r
jitCompA000_storeRegCacheAll(&w); // 手抜き.\r
jitCompA000_storePRegCacheAll(&w); // 手抜き.\r
- jitCompPutByte2(w.dst, 0x6a, src[6]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[5]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[4] & 0x0f); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, (src[4] >> 4) & 0x0f); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[3]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[2]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[1]); /* PUSH(?); */\r
- jitCompPutByte1(w.dst, 0x55); /* PUSH(EBP); */\r
- jitCompPutByte1(w.dst, 0xe8);\r
- j = ((unsigned char *)&func3c) - (w.dst + 4);\r
- jitCompPutImm32(w.dst, j);\r
- jitCompPutByte3(w.dst, 0x83, 0xc4, 0x20); /* ADD(ESP,32); */\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[6]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[5]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[4] & 0x0f);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, (src[4] >> 4) & 0x0f);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[3]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[2]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[1]);\r
+ jitCompPutOp_PUSH_GReg(w.dst, IA32_REG5_EBP);\r
+ j = ((unsigned char *)&func3c) - (w.dst + 1 + 4);\r
+ jitCompPutOp_CALL_Relative(w.dst, j)\r
+ jitCompPutOp_ADD_GReg_Imm8(w.dst, IA32_REG4_ESP, 32);\r
jitCompA000_loadRegCacheAll(&w); // 手抜き.\r
jitCompA000_loadPRegCacheAll(&w); // 手抜き.\r
cmp0reg = -1;\r
case 0x3d: /* LEAVE */\r
jitCompA000_storeRegCacheAll(&w); // 手抜き.\r
jitCompA000_storePRegCacheAll(&w); // 手抜き.\r
- jitCompPutByte2(w.dst, 0x6a, src[6]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[5]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[4] & 0x0f); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, (src[4] >> 4) & 0x0f); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[3]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[2]); /* PUSH(?); */\r
- jitCompPutByte2(w.dst, 0x6a, src[1]); /* PUSH(?); */\r
- jitCompPutByte1(w.dst, 0x55); /* PUSH(EBP); */\r
- jitCompPutByte1(w.dst, 0xe8);\r
- j = ((unsigned char *)&func3d) - (w.dst + 4);\r
- jitCompPutImm32(w.dst, j);\r
- jitCompPutByte3(w.dst, 0x83, 0xc4, 0x20); /* ADD(ESP,32); */\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[6]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[5]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[4] & 0x0f);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, (src[4] >> 4) & 0x0f);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[3]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[2]);\r
+ jitCompPutOp_PUSH_Imm8(w.dst, src[1]);\r
+ jitCompPutOp_PUSH_GReg(w.dst, IA32_REG5_EBP);\r
+ j = ((unsigned char *)&func3d) - (w.dst + 1 + 4);\r
+ jitCompPutOp_CALL_Relative(w.dst, j)\r
+ jitCompPutOp_ADD_GReg_Imm8(w.dst, IA32_REG4_ESP, 32);\r
jitCompA000_loadRegCacheAll(&w); // 手抜き.\r
jitCompA000_loadPRegCacheAll(&w); // 手抜き.\r
cmp0reg = -1;\r
\r
unsigned char *jitCompCallFunc(unsigned char *dst, void *func)\r
{\r
+ //この関数の中では結局w->dstしか参照していない\r
struct JitCompWork w;\r
w.dst = dst;\r
jitCompA000_storeRegCacheAll(&w);\r
jitCompA000_storePRegCacheAll(&w);\r
jitCompPutOp_PUSHAD(w.dst);\r
jitCompPutOp_PUSH_GReg(w.dst, IA32_REG0_EAX); /* for 16Byte-align(Mac OSX) */\r
- jitCompPutOp_PUSH_GReg(w.dst, IA32_REG5_EBP); /* PUSH(EBP); */\r
- jitCompPutByte1(w.dst, 0xe8); /* CALL(func); */\r
- int j = ((unsigned char *)func) - (w.dst + 4);\r
+ jitCompPutOp_PUSH_GReg(w.dst, IA32_REG5_EBP);\r
\r
- //この関数の中では結局w->dstしか参照していない\r
- jitCompPutImm32(w.dst, j);\r
+ int j = ((unsigned char *)func) - (w.dst + 1 + 4);\r
+ jitCompPutOp_CALL_Relative(w.dst, j);\r
\r
- jitCompPutOp_POP_GReg(w.dst, IA32_REG0_EAX); /* for 16Byte-align (Mac OSX) */\r
jitCompPutOp_POP_GReg(w.dst, IA32_REG0_EAX);\r
+ jitCompPutOp_POP_GReg(w.dst, IA32_REG0_EAX); /* for 16Byte-align (Mac OSX) */\r
jitCompPutOp_POPAD(w.dst);\r
jitCompA000_loadRegCacheAll(&w);\r
jitCompA000_loadPRegCacheAll(&w);\r
int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label)\r
{\r
unsigned char *q = *qq;\r
- if (p0[0] != 0x05 || p0[1] != SIGN1) // OSECPUのヘッダ (05E1) を確認\r
+ int i;\r
+ \r
+ if (p0[0] != 0x05 || p0[1] != SIGN1){\r
+ // OSECPUのヘッダ (05E1) を確認\r
return 1;\r
+ }\r
\r
- *q++ = 0x55; /* PUSH(EBP); */\r
+ jitCompPutOp_PUSH_GReg(q, IA32_REG5_EBP);\r
*q++ = 0x8b; *q++ = 0x6c; *q++ = 0x24; *q++ = 0x08; /* MOV(EBP,[ESP+8]); */\r
\r
- int i;\r
- for (i = 0; i < JITC_MAXLABELS; i++)\r
+ for (i = 0; i < JITC_MAXLABELS; i++){\r
label[i].opt = 0;\r
+ }\r
\r
// 以下のjitCompile()呼び出しでは第二引数をq1-2にした方がよいのではないか?\r
i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, 0);\r
- if (i != 0) return 2;\r
+ if (i != 0){\r
+ return 2;\r
+ }\r
i = jitCompiler(q, q1, p0 + 2, p1, p0, label, JITC_MAXLABELS, level, di1_serial, JITC_PHASE1 + 0);\r
- if (i < 0) return 2;\r
+ if (i < 0){\r
+ return 2;\r
+ }\r
q += i;\r
\r
- *q++ = 0x5d; /* POP(EBP); */\r
+ jitCompPutOp_POP_GReg(q, IA32_REG5_EBP);\r
*q++ = 0xc3; /* RET(); */\r
- \r
*qq = q;\r
return 0;\r
}\r