Revisión | 4d5d6fa61ff576ba035ee4bd882e8476f2ceeb2b (tree) |
---|---|
Tiempo | 2014-03-16 21:04:29 |
Autor | hikarupsp <hikarupsp@user...> |
Commiter | hikarupsp |
アライメントエラーはポインタレジスタ構造体をコピーする際のmovdqaのせいだと判明。
応急処置をして、Macでも動作するようになった。
@@ -1,69 +1,82 @@ | ||
1 | -#include "osecpu.h" | |
2 | -#include "jitc.h" | |
3 | - | |
4 | -// | |
5 | -// JITC common functions (architecture not dependent) | |
6 | -// | |
7 | - | |
8 | -void errorHandler(HOSECPU_RuntimeEnvironment *r) | |
9 | -{ | |
10 | - puts("security error! abort..."); | |
11 | - printf("debugInfo0=%d, debugInfo1=%d\n", r->debugInfo0, r->debugInfo1); | |
12 | -#if (USE_DEBUGGER != 0) | |
13 | - dbgrMain(r); | |
14 | -#endif | |
15 | - exit(1); | |
16 | -} | |
17 | - | |
18 | -int jitCompCmdLen(const unsigned char *src) | |
19 | -{ | |
20 | - //BCode命令長を取得する | |
21 | - int i = 1; | |
22 | - | |
23 | - if (0x01 <= *src && *src < 0x04){ | |
24 | - // LB, LIMM, PLIMM | |
25 | - i = 6; | |
26 | - } else if (*src == 0x04){ | |
27 | - // CND | |
28 | - i = 2; | |
29 | - } else if (0x08 <= *src && *src < 0x0d){ | |
30 | - // LMEM, SMEM, ??, ??, ?? | |
31 | - i = 8 + src[7] * 4; | |
32 | - } else if (0x0e <= *src && *src < 0x10){ | |
33 | - // PADD, PDIF | |
34 | - i = 8; | |
35 | - } else if (0x10 <= *src && *src < 0x1c){ | |
36 | - // CP/OR, XOR, AND, ADD, SUB, MUL, SHL, SAR, DIV, MOD, | |
37 | - i = 4; | |
38 | - } else if (0x1c <= *src && *src < 0x1f){ | |
39 | - // ??, ??, PCP | |
40 | - i = 3; | |
41 | - } else if (*src == 0x1f){ | |
42 | - // ?? | |
43 | - i = 11; | |
44 | - } else if(0x20 <= *src && *src < 0x2e){ | |
45 | - // CMPE, CMPNE, CMPL, CMPGE, CMPLE, CMPG, TSTZ, TSTNZ, | |
46 | - // PCMPE, PCMPNE, PCMPL, PCMPGE, PCMPLE, PCMPG, | |
47 | - i = 4; | |
48 | - } else if (*src == 0x2f){ | |
49 | - // ?? | |
50 | - i = 4 + src[1]; | |
51 | - } else if (0x30 <= *src && *src < 0x34){ | |
52 | - // ??, ??, MALLOC, ?? | |
53 | - i = 4; | |
54 | - } else if (0x3c <= *src && *src < 0x3e){ | |
55 | - // ??, ?? | |
56 | - i = 7; | |
57 | - } else if (*src == 0xfe){ | |
58 | - // REMARK | |
59 | - i = 2 + src[1]; | |
60 | - } | |
61 | - | |
62 | - return i; | |
63 | -} | |
64 | - | |
65 | - | |
66 | - | |
67 | - | |
68 | - | |
69 | - | |
1 | +#include "osecpu.h" | |
2 | +#include "jitc.h" | |
3 | + | |
4 | +// | |
5 | +// JITC common functions (architecture not dependent) | |
6 | +// | |
7 | + | |
8 | +void errorHandler(HOSECPU_RuntimeEnvironment *r) | |
9 | +{ | |
10 | + puts("security error! abort..."); | |
11 | + printf("debugInfo0=%d, debugInfo1=%d\n", r->debugInfo0, r->debugInfo1); | |
12 | +#if (USE_DEBUGGER != 0) | |
13 | + dbgrMain(r); | |
14 | +#endif | |
15 | + exit(1); | |
16 | +} | |
17 | + | |
18 | +int jitCompCmdLen(const unsigned char *src) | |
19 | +{ | |
20 | + //BCode命令長を取得する | |
21 | + int i = 1; | |
22 | + | |
23 | + if (0x01 <= *src && *src < 0x04){ | |
24 | + // LB, LIMM, PLIMM | |
25 | + i = 6; | |
26 | + } else if (*src == 0x04){ | |
27 | + // CND | |
28 | + i = 2; | |
29 | + } else if (0x08 <= *src && *src < 0x0d){ | |
30 | + // LMEM, SMEM, ??, ??, ?? | |
31 | + i = 8 + src[7] * 4; | |
32 | + } else if (0x0e <= *src && *src < 0x10){ | |
33 | + // PADD, PDIF | |
34 | + i = 8; | |
35 | + } else if (0x10 <= *src && *src < 0x1c){ | |
36 | + // CP/OR, XOR, AND, ADD, SUB, MUL, SHL, SAR, DIV, MOD, | |
37 | + i = 4; | |
38 | + } else if (0x1c <= *src && *src < 0x1f){ | |
39 | + // ??, ??, PCP | |
40 | + i = 3; | |
41 | + } else if (*src == 0x1f){ | |
42 | + // ?? | |
43 | + i = 11; | |
44 | + } else if(0x20 <= *src && *src < 0x2e){ | |
45 | + // CMPE, CMPNE, CMPL, CMPGE, CMPLE, CMPG, TSTZ, TSTNZ, | |
46 | + // PCMPE, PCMPNE, PCMPL, PCMPGE, PCMPLE, PCMPG, | |
47 | + i = 4; | |
48 | + } else if (*src == 0x2f){ | |
49 | + // ?? | |
50 | + i = 4 + src[1]; | |
51 | + } else if (0x30 <= *src && *src < 0x34){ | |
52 | + // ??, ??, MALLOC, ?? | |
53 | + i = 4; | |
54 | + } else if (0x3c <= *src && *src < 0x3e){ | |
55 | + // ??, ?? | |
56 | + i = 7; | |
57 | + } else if (*src == 0xfe){ | |
58 | + // REMARK | |
59 | + i = 2 + src[1]; | |
60 | + } | |
61 | + | |
62 | + return i; | |
63 | +} | |
64 | + | |
65 | +void PRegCopy(HOSECPU_PointerRegisterEntry *dst, HOSECPU_PointerRegisterEntry *src) | |
66 | +{ | |
67 | + // なんか直接代入するとMacではアライメントエラーで落ちるのです... | |
68 | + // dst = src; | |
69 | + | |
70 | + dst->p = src->p; | |
71 | + dst->typ = src->typ; | |
72 | + dst->p0 = src->p0; | |
73 | + dst->p1 = src->p1; | |
74 | + dst->liveSign = src->liveSign; | |
75 | + dst->pls = src->pls; | |
76 | + dst->flags = src->flags; | |
77 | + dst->dummy = src->dummy; | |
78 | +} | |
79 | + | |
80 | + | |
81 | + | |
82 | + |
@@ -59,10 +59,11 @@ int jitCompCmdLen(const unsigned char *src); | ||
59 | 59 | // |
60 | 60 | #define IA32_OP_RM32_MOD00_ADDR_DISP32 5 |
61 | 61 | // |
62 | -#define envOffset_DBGINFO0 (2304 + 0) | |
63 | -#define envOffset_DBGINFO1 (2304 + 4) | |
64 | -#define envOffset_PTRCTRL (2320) | |
65 | -#define PRegOffset(regid) (256 + 32 * regid) | |
62 | +#define envOffset_DBGINFO0 (2304 + 0) | |
63 | +#define envOffset_DBGINFO1 (2304 + 4) | |
64 | +#define envOffset_DBGCURRENTCODE (2304 + 8) | |
65 | +#define envOffset_PTRCTRL (2320) | |
66 | +#define PRegOffset(regid) (256 + 32 * regid) | |
66 | 67 | // |
67 | 68 | #define jitCompPutImm32(p, i) jitCompPutByte4(p, ((i) & 0xff), (((i) >> 8) & 0xff), (((i) >> 16) & 0xff), (((i) >> 24) & 0xff)) |
68 | 69 | // |
@@ -77,9 +78,11 @@ int jitCompCmdLen(const unsigned char *src); | ||
77 | 78 | #define jitCompPutOp_CALL_Relative(p, diff) jitCompPutByte1(p, 0xe8); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対コールする*/ |
78 | 79 | #define jitCompPutOp_JMPnear(p, diff) jitCompPutByte1(p, 0xe9); jitCompPutImm32(p, diff); /*次の命令との相対オフセットだけ相対ジャンプする*/ |
79 | 80 | #define jitCompPutOp_JMPshort(p, diff) jitCompPutByte2(p, 0xeb, diff & 0xff);/*次の命令との相対オフセットだけ相対ジャンプする*/ |
81 | +#define jitCompPutOp_INT3(p) jitCompPutByte1(p, 0xCC); | |
80 | 82 | // |
81 | 83 | #define jitCompPutOp_MOV_EAX_ZERO(p) jitCompPutOp_XOR_GReg_GReg(p, IA32_REG0_EAX, IA32_REG0_EAX); |
82 | - | |
84 | +// | |
85 | +#define DEBUGCode(work, code) jitCompPutOp_MOV_GReg_Imm32((work)->dst, IA32_REG0_EAX, code); jitCompPutOp_MOV_EBPDisp_GReg(work, envOffset_DBGCURRENTCODE, IA32_REG0_EAX); | |
83 | 86 | // Optimization settings |
84 | 87 | // 他のCPUへ移植する人へ: |
85 | 88 | // 以下の定数は最適化のためのものなので、すべて0として簡単に移植しても問題ありません |
@@ -54,6 +54,9 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
54 | 54 | timecount -= 64; |
55 | 55 | /* 未完成(timeoutチェックコードを入れる) */ |
56 | 56 | } |
57 | + if(*src != 0x00 && *src != 0x01 && *src != 0x34){ | |
58 | + DEBUGCode(&w, *src); | |
59 | + } | |
57 | 60 | prefix_continue: |
58 | 61 | // CND命令コンパイル後ここに戻る |
59 | 62 | switch (*src) { |
@@ -72,45 +75,52 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
72 | 75 | // ・timecount++し、timecountのチェックをする。 |
73 | 76 | // ・ラベル位置を登録する。 |
74 | 77 | // ・割り込みがある場合、このタイミングで割り込みを発生させる。 |
78 | + // Encode: | |
79 | + // 0 1 2345 | |
80 | + // 01 opt imm32 | |
75 | 81 | // |
76 | - // 1 2 3 456 | |
77 | - // LB 01 opt imm32 | |
78 | - // | |
79 | - if (enter0 == NULL && (src[6] == 0x3c /* 多数のレジスタをスタックに退避 */ || (src[6] == 0xfe/* REMARK */ && src[7] == 0x01 && src[9] == 0x3c))) { //beginFunc()中のLB | |
82 | + if (enter0 == NULL && (src[6] == 0x3c /* 多数のレジスタをスタックに退避 */ || (src[6] == 0xfe/* REMARK */ && src[7] == 0x01 && src[9] == 0x3c))) { | |
83 | + //beginFunc()中のLB | |
80 | 84 | // LB命令の後に0x3C命令・・・beginFunc() |
81 | - enter0 = w.dst + 1; | |
85 | + enter0 = w.dst; | |
82 | 86 | jitCompPutOp_JMPnear(w.dst, 0); |
83 | 87 | } |
88 | + | |
84 | 89 | if (src[6] == 0x34) { |
85 | - // LBの次の命令がDATA ・・・DAT_SA0(label, typ32, length) ・・・メモリ確保命令 | |
86 | - tmp_ucp = w.dst; | |
87 | - i = jitCompGetImm32(&src[7]); // type32 を取得 | |
90 | + // 後続命令はDATA | |
91 | + // なので、DATA部分をJMPですっとばすコードを生成 | |
92 | + // DAT_SA0(label, typ32, length) ・・・メモリ確保命令 | |
93 | + | |
94 | + i = jitCompGetImm32(&src[6 + 1]); // type32 を取得 | |
88 | 95 | j = 32; |
96 | + | |
89 | 97 | if (i != 1) { |
90 | 98 | i = jitCompA000_convTyp(i); |
91 | 99 | j = 0; |
92 | - switch (i) { | |
93 | - case 2: | |
94 | - case 3: | |
100 | + switch (i >> 1) { | |
101 | + case 1: | |
95 | 102 | j = 1; |
96 | 103 | break; |
97 | - case 4: | |
98 | - case 5: | |
104 | + case 2: | |
99 | 105 | j = 2; |
100 | 106 | break; |
101 | - case 6: | |
102 | - case 7: | |
107 | + case 3: | |
103 | 108 | j = 4; |
104 | 109 | break; |
105 | 110 | } |
106 | 111 | } |
107 | - j *= jitCompGetImm32(&src[11]); | |
112 | + // jはデータサイズになる | |
113 | + j *= jitCompGetImm32(&src[6 + 5]); // len32 | |
108 | 114 | if (j <= 0){ |
109 | 115 | w.err = JITC_ERR_BADTYPE; |
110 | 116 | } |
117 | + // DATA部分を飛び越すジャンプ | |
118 | + tmp_ucp = w.dst; | |
111 | 119 | jitCompPutOp_JMPnear(w.dst, j); |
120 | + | |
112 | 121 | #if (jitCompA0001_OPTIMIZE_JMP != 0) |
113 | - if (j <= 127 - jitCompA0001_OPTIMIZE_ALIGN) { | |
122 | + if (j < 127 - jitCompA0001_OPTIMIZE_ALIGN) { | |
123 | + //飛び先が十分近いので | |
114 | 124 | // 今書いたのはなかったことにして、 |
115 | 125 | w.dst -= 5; |
116 | 126 | // よりサイズの小さな書き方にする |
@@ -120,25 +130,23 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
120 | 130 | } |
121 | 131 | #if (jitCompA0001_OPTIMIZE_ALIGN != 0) |
122 | 132 | // アラインを jitCompA0001_OPTIMIZE_ALIGNにそろえる |
123 | - for (;;) { | |
124 | - i = ((int)w.dst) & (jitCompA0001_OPTIMIZE_ALIGN - 1); /* ALIGNで割ったあまりを計算 */ | |
125 | - if (i == 0){ | |
126 | - // Already alligned. | |
127 | - break; | |
128 | - } | |
129 | - i = jitCompA0001_OPTIMIZE_ALIGN - i; | |
130 | - if (i == 1) { jitCompPutByte1(w.dst, 0x90); j += i; } /* NOP(); */ | |
131 | - if (i == 2) { jitCompPutByte2(w.dst, 0x89, 0xc0); j += i; } /* MOV(EAX, EAX); */ | |
132 | - if (i == 3) { jitCompPutByte3(w.dst, 0x8d, 0x76, 0x00); j += i; } /* LEA(ESI, [ESI+0]); */ | |
133 | - if (i == 4) { jitCompPutByte4(w.dst, 0x8d, 0x74, 0x26, 0x00); j += i; } /* LEA(ESI, [ESI*1+0]); */ | |
134 | - if (i == 5) { jitCompPutByte1(w.dst, 0x0d); jitCompPutImm32(w.dst, 0); j += i; } /* OR(EAX, 0); */ | |
135 | - if (i == 6) { jitCompPutByte2(w.dst, 0x8d, 0xb6); jitCompPutImm32(w.dst, 0); j += i; } /* LEA(ESI, [ESI+0]); */ | |
136 | - if (i >= 7) { jitCompPutByte3(w.dst, 0x8d, 0xb4, 0x26); jitCompPutImm32(w.dst, 0); j += 7; } /* LEA(ESI, [ESI*1+0]); */ | |
137 | - } | |
133 | + | |
134 | + i = ((int)w.dst + 1) & (jitCompA0001_OPTIMIZE_ALIGN - 1); /* ALIGNで割ったあまりを計算 */ | |
135 | + i = jitCompA0001_OPTIMIZE_ALIGN - i; | |
136 | + if (i == 1) { jitCompPutByte1(w.dst, 0x90); j += i; } /* NOP(); */ | |
137 | + if (i == 2) { jitCompPutByte2(w.dst, 0x89, 0xc0); j += i; } /* MOV(EAX, EAX); */ | |
138 | + if (i == 3) { jitCompPutByte3(w.dst, 0x8d, 0x76, 0x00); j += i; } /* LEA(ESI, [ESI+0]); */ | |
139 | + if (i == 4) { jitCompPutByte4(w.dst, 0x8d, 0x74, 0x26, 0x00); j += i; } /* LEA(ESI, [ESI*1+0]); */ | |
140 | + if (i == 5) { jitCompPutByte1(w.dst, 0x0d); jitCompPutImm32(w.dst, 0); j += i; } /* OR(EAX, 0); */ | |
141 | + if (i == 6) { jitCompPutByte2(w.dst, 0x8d, 0xb6); jitCompPutImm32(w.dst, 0); j += i; } /* LEA(ESI, [ESI+0]); */ | |
142 | + if (i == 7) { jitCompPutByte3(w.dst, 0x8d, 0xb4, 0x26); jitCompPutImm32(w.dst, 0); j += 7; } /* LEA(ESI, [ESI*1+0]); */ | |
138 | 143 | #endif |
139 | 144 | if (src[6] == 0x34) { |
145 | + // 後続命令はDATA | |
146 | + // パディングに合わせて一個前の相対ジャンプを修正 | |
140 | 147 | tmp_ucp[1] = j & 0xff; |
141 | 148 | if (*tmp_ucp == 0xe9) { |
149 | + // Near jump so imm is DWORD | |
142 | 150 | tmp_ucp[2] = (j >> 8) & 0xff; |
143 | 151 | tmp_ucp[3] = (j >> 16) & 0xff; |
144 | 152 | tmp_ucp[4] = (j >> 24) & 0xff; |
@@ -167,7 +175,8 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
167 | 175 | |
168 | 176 | case 0x02: |
169 | 177 | // LIMM : 定数即値代入命令(6byte) |
170 | - // 1 2 3456 | |
178 | + // Encode: | |
179 | + // 0 1 2345 | |
171 | 180 | // 02 reg0R imm32 |
172 | 181 | // |
173 | 182 | // reg3F は条件比較慣用句指定用&演算命令即値慣用句指定用。よってCND命令の直後では使用できない。 |
@@ -209,8 +218,8 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
209 | 218 | |
210 | 219 | case 0x03: /* 未完成(plsまで対応) */ |
211 | 220 | // PLIMM : ラベル番号代入命令(6byte) |
212 | - // | |
213 | - // 1 2 3456 | |
221 | + // Encode: | |
222 | + // 0 1 2345 | |
214 | 223 | // 03 PXX imm32 |
215 | 224 | // |
216 | 225 | // ・P28 はAPI用 |
@@ -305,7 +314,7 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
305 | 314 | case 0x04: |
306 | 315 | // CND (prefix) |
307 | 316 | // 与えられたRxxの最下位ビットが1であれば後続の命令を実行、そうでなければ飛ばす。 |
308 | - // | |
317 | + | |
309 | 318 | if (src[1] >= 0x40){ |
310 | 319 | // R00-R3F 以外のレジスタは比較対象にできない |
311 | 320 | w.err = JITC_ERR_REGNUM; |
@@ -1181,13 +1190,21 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
1181 | 1190 | break; |
1182 | 1191 | |
1183 | 1192 | case 0x34: /* data (暫定) */ |
1193 | + // 0 1234 5678 9 | |
1194 | + // 34 typ32 len32 data... | |
1195 | + // len32 is NOT byte size! | |
1196 | + | |
1184 | 1197 | cmp0reg = -1; |
1185 | 1198 | if (w.prefix != 0) { |
1186 | 1199 | w.err = JITC_ERR_PREFIX; |
1187 | 1200 | goto err_w; |
1188 | 1201 | } |
1189 | - int k = jitCompGetImm32(&src[1]), tmpData, bitCount, dataWidth = jitCompA000_dataWidth(k); | |
1202 | + int k, tmpData, bitCount, dataWidth; | |
1203 | + // kはtyp32 | |
1204 | + k = jitCompGetImm32(&src[1]); | |
1205 | + dataWidth = jitCompA000_dataWidth(k); | |
1190 | 1206 | if (lastlabel >= 0 && label[lastlabel].typ == 0){ |
1207 | + //直前のラベルタイプを設定 | |
1191 | 1208 | label[lastlabel].typ = k; |
1192 | 1209 | } |
1193 | 1210 | if (k != 1) { |
@@ -1197,24 +1214,31 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
1197 | 1214 | goto err_w; |
1198 | 1215 | } |
1199 | 1216 | } |
1217 | + // jはlen32 | |
1200 | 1218 | j = jitCompGetImm32(&src[5]); |
1201 | 1219 | oldsrc = src; |
1202 | 1220 | src += 9; |
1221 | + | |
1222 | + // srcはdata本体を指す | |
1203 | 1223 | if (k != 1) { |
1224 | + // 一般データ | |
1204 | 1225 | bitCount = 7; |
1205 | 1226 | while (j > 0) { |
1206 | 1227 | if (src >= src1) { |
1228 | + // バイトコードを末端を超えて読もうとした | |
1207 | 1229 | w.err = JITC_ERR_SRC1; |
1208 | 1230 | src = oldsrc; |
1209 | 1231 | goto err_w; |
1210 | 1232 | } |
1211 | 1233 | if (w.dst + 256 > dst1) { |
1234 | + // 書き込み先の残り容量が256Bytesを切った | |
1212 | 1235 | w.err = JITC_ERR_DST1; |
1213 | 1236 | src = oldsrc; |
1214 | 1237 | goto err_w; |
1215 | 1238 | } |
1216 | 1239 | tmpData = 0; |
1217 | 1240 | for (k = 0; k < dataWidth; k++) { |
1241 | + // dataWidthビットごとに切り出してtmpDataに入れる | |
1218 | 1242 | tmpData = tmpData << 1 | ((*src >> bitCount) & 1); |
1219 | 1243 | bitCount--; |
1220 | 1244 | if (bitCount < 0) { |
@@ -1223,27 +1247,34 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
1223 | 1247 | } |
1224 | 1248 | } |
1225 | 1249 | if ((i & 1) == 0 && dataWidth <= 31 && (tmpData >> (dataWidth - 1)) != 0) { |
1250 | + // 符号あり型で、かつtmpDataの符号ビットが1なので、マイナスにする | |
1226 | 1251 | tmpData -= 1 << dataWidth; |
1227 | 1252 | } |
1228 | 1253 | if (i == 2 || i == 3) { |
1254 | + // BYTE | |
1229 | 1255 | jitCompPutByte1(w.dst, tmpData & 0xff); |
1230 | 1256 | } |
1231 | 1257 | if (i == 4 || i == 5) { |
1258 | + // WORD | |
1232 | 1259 | jitCompPutByte2(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff); |
1233 | 1260 | } |
1234 | 1261 | if (i == 6 || i == 7) { |
1262 | + // DWORD | |
1235 | 1263 | jitCompPutByte4(w.dst, tmpData & 0xff, (tmpData >> 8) & 0xff, (tmpData >> 16) & 0xff, (tmpData >> 24) & 0xff); |
1236 | 1264 | } |
1237 | 1265 | j--; |
1238 | 1266 | } |
1239 | 1267 | } else{ |
1268 | + // VPtr型 | |
1240 | 1269 | while (j > 0) { |
1241 | 1270 | if (src >= src1) { |
1271 | + // バイトコードを末端を超えて読もうとした | |
1242 | 1272 | w.err = JITC_ERR_SRC1; |
1243 | 1273 | src = oldsrc; |
1244 | 1274 | goto err_w; |
1245 | 1275 | } |
1246 | 1276 | if (w.dst + 256 > dst1) { |
1277 | + // 書き込み先の残り容量が256Bytesを切った | |
1247 | 1278 | w.err = JITC_ERR_DST1; |
1248 | 1279 | src = oldsrc; |
1249 | 1280 | goto err_w; |
@@ -1251,7 +1282,9 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
1251 | 1282 | i = jitCompGetImm32(src); |
1252 | 1283 | src += 4; |
1253 | 1284 | if ((flags & JITC_PHASE1) != 0 && w.err == 0) { |
1285 | + // Only in phase1 | |
1254 | 1286 | if (label[i].opt == 0) { |
1287 | + // ローカルラベルはだめです... | |
1255 | 1288 | w.err = JITC_ERR_LABELNODEF; |
1256 | 1289 | goto err_w; |
1257 | 1290 | } |
@@ -1346,6 +1379,11 @@ int jitCompiler(unsigned char *dst, unsigned char *dst1, const unsigned char *sr | ||
1346 | 1379 | if (w.err != 0) { |
1347 | 1380 | goto err_w; |
1348 | 1381 | } |
1382 | + | |
1383 | + if(*src != 0x00 && *src != 0x01 && *src != 0x34){ | |
1384 | + DEBUGCode(&w, 315315); | |
1385 | + } | |
1386 | + | |
1349 | 1387 | src += jitCompCmdLen(src); |
1350 | 1388 | } |
1351 | 1389 | if (enter0 != NULL) { |
@@ -1457,11 +1495,15 @@ void func3c(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int | ||
1457 | 1495 | pp = (void *)r->junkStack; |
1458 | 1496 | r->junkStack += p1 * 32; |
1459 | 1497 | for (i = 0; i < p1; i++){ |
1460 | - pp[i] = r->preg[i]; | |
1498 | + //pp[i] = r->preg[i]; | |
1499 | + PRegCopy(&pp[i], &r->preg[i]); | |
1500 | + // | |
1461 | 1501 | } |
1462 | 1502 | pp = (void *)r->junkStack; |
1463 | 1503 | r->junkStack += 32; |
1464 | - *pp = r->preg[0x30]; | |
1504 | + //*pp = r->preg[0x30]; | |
1505 | + PRegCopy(pp, &r->preg[0x30]); | |
1506 | + // | |
1465 | 1507 | pi = (void *)r->junkStack; |
1466 | 1508 | r->junkStack += 4; |
1467 | 1509 | *pi = opt << 16 | r1 << 8 | p1; |
@@ -1481,13 +1523,20 @@ void func3d(char *ebp, int opt, int r1, int p1, int lenR, int lenP, int r0, int | ||
1481 | 1523 | r->junkStack -= 4; |
1482 | 1524 | r->junkStack -= 32; |
1483 | 1525 | HOSECPU_PointerRegisterEntry *pp = (void *)r->junkStack; |
1484 | - r->preg[0x30] = *pp; | |
1526 | + | |
1527 | + //r->preg[0x30] = *pp; | |
1528 | + PRegCopy(&r->preg[0x30], pp); | |
1529 | + // | |
1485 | 1530 | r->junkStack -= p1 * 32; pp = (void *)r->junkStack; |
1486 | - for (i = 0; i < p1; i++) | |
1487 | - r->preg[i] = pp[i]; | |
1531 | + for (i = 0; i < p1; i++){ | |
1532 | + //r->preg[i] = pp[i]; | |
1533 | + PRegCopy(&r->preg[i], &pp[i]); | |
1534 | + // | |
1535 | + } | |
1488 | 1536 | r->junkStack -= r1 * 4; int *pi = (void *)r->junkStack; |
1489 | - for (i = 0; i < r1; i++) | |
1537 | + for (i = 0; i < r1; i++){ | |
1490 | 1538 | r->ireg[i] = pi[i]; |
1539 | + } | |
1491 | 1540 | return; |
1492 | 1541 | } |
1493 | 1542 |
@@ -197,9 +197,17 @@ int jitCompA000_selectPRegCache(int pxx, int reg) | ||
197 | 197 | |
198 | 198 | int jitCompA000_convTyp(int t) |
199 | 199 | { |
200 | + // 指定されたタイプのデータ幅を返す。 | |
201 | + // unsigned なら奇数(1bit目がOn) | |
202 | + // retv = 1 : VPtr | |
203 | + // retv = 2 or 3: BYTE ( 8, 4, 2, 1 bit) | |
204 | + // retv = 4 or 5: WORD (16, 12 bit) | |
205 | + // retv = 6 or 7: DWORD(32, 20, 24, 28 bit) | |
206 | + // -1はエラー | |
200 | 207 | int r = -1; |
201 | 208 | |
202 | 209 | if (1 <= t && t <= 7){ |
210 | + // 1 - 7はそのままでOK | |
203 | 211 | r = t; |
204 | 212 | } else if (8 <= t && t <= 13){ |
205 | 213 | r = 2 | (t & 1); |
@@ -213,6 +221,7 @@ int jitCompA000_convTyp(int t) | ||
213 | 221 | |
214 | 222 | int jitCompA000_dataWidth(int t) |
215 | 223 | { |
224 | + // 指定されたタイプのビット数を返す | |
216 | 225 | int r = -1; |
217 | 226 | if (t == 0x0001) r = 256; |
218 | 227 | t >>= 1; |
@@ -4,6 +4,7 @@ int *keybuf, keybuf_r, keybuf_w, keybuf_c; | ||
4 | 4 | HOSECPU_Device_Window mainWindow; |
5 | 5 | //デバッグ用。プログラム中の随所で加算される変数 |
6 | 6 | int di1_serial; |
7 | +HOSECPU_RuntimeEnvironment *dbg_env; | |
7 | 8 | |
8 | 9 | |
9 | 10 |
@@ -22,6 +23,7 @@ void putKeybuf(int i) | ||
22 | 23 | |
23 | 24 | int HeavyOSECPUMain(int argc, char **argv) |
24 | 25 | { |
26 | + HOSECPU_RuntimeEnvironment env; | |
25 | 27 | FILE *fp; |
26 | 28 | unsigned char *jitbuf, *sysjit00, *sysjit; |
27 | 29 | unsigned char *systmp0, *systmp1, *systmp2; |
@@ -33,25 +35,26 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
33 | 35 | unsigned char *syslib; |
34 | 36 | int argDebug = 0, stacksiz = 1; |
35 | 37 | const char *cp; |
36 | - HOSECPU_RuntimeEnvironment env; | |
37 | 38 | void(*jitfunc)(char *); |
38 | 39 | unsigned char *jp; |
39 | 40 | |
40 | - //Initialize mainWindow | |
41 | + // For debug | |
42 | + dbg_env = &env; | |
43 | + | |
44 | + // Initialize mainWindow | |
41 | 45 | mainWindow.vram = NULL; |
42 | 46 | mainWindow.xsize = 0; |
43 | 47 | mainWindow.ysize = 0; |
44 | 48 | di1_serial = 0; |
45 | 49 | |
46 | - //実行環境初期化 | |
50 | + // 実行環境初期化 | |
47 | 51 | env.mainArgc = argc; |
48 | 52 | env.mainArgv = (const char **)argv; |
49 | 53 | env.appBin = malloc(APPSIZ1); |
50 | 54 | env.executionLevel = JITC_LV_SLOWEST; |
51 | - jitbuf = mallocRWE(1024 * 1024); /* とりあえず1MBで */ | |
52 | - //unsigned char *sysjit0 = mallocRWE(SJITSIZ1), *sysjit1 = sysjit0, *sysjit00 = sysjit0; | |
55 | + jitbuf = mallocRWE(APPJITSIZE); /* とりあえず1MBで */ | |
53 | 56 | // syslib.oseのjitc結果を格納する領域を確保。 |
54 | - sysjit00 = mallocRWE(SJITSIZ1); | |
57 | + sysjit00 = mallocRWE(SYSJITSIZ1); | |
55 | 58 | sysjit = sysjit00; |
56 | 59 | // 現在の、jitc結果を格納するメモリへの書き込み位置のアドレス |
57 | 60 | // sysjit: 現在のjitc書き込み位置 |
@@ -80,7 +83,7 @@ int HeavyOSECPUMain(int argc, char **argv) | ||
80 | 83 | sysjit = jitCompInit(sysjit); |
81 | 84 | sysjit00 = sysjit; |
82 | 85 | // labelはjitc0()内で初期化される。 |
83 | - i = jitc0(&sysjit, sysjit00 + SJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label); | |
86 | + i = jitc0(&sysjit, sysjit00 + SYSJITSIZ1, syslib + 32, syslib + SYSLIBSIZ1, JITC_LV_SLOWEST+9, label); | |
84 | 87 | if (i != 0){ |
85 | 88 | fputs("syslib-file JITC error.\n", stderr); |
86 | 89 | return 1; |
@@ -67,8 +67,8 @@ | ||
67 | 67 | #define PTRCTRLSIZ 4096 |
68 | 68 | |
69 | 69 | #define APPSIZ1 1 * 1024 * 1024 /* 1MB for now */ |
70 | -#define JITSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
71 | -#define SJITSIZ1 1 * 1024 * 1024 /* 1MB for now */ | |
70 | +#define APPJITSIZE 1 * 1024 * 1024 /* 1MB for now */ | |
71 | +#define SYSJITSIZ1 2 * 1024 * 1024 /* 1MB for now */ | |
72 | 72 | #define SYSLIBSIZ1 1 * 1024 * 1024 /* 1MB for now */ |
73 | 73 | #define SYSTMP0SIZ 1 * 1024 * 1024 /* 1MB for now */ |
74 | 74 | #define SYSTMP1SIZ 2 * 1024 * 1024 /* 1MB for now */ |
@@ -138,7 +138,8 @@ struct Regs { | ||
138 | 138 | // |
139 | 139 | int debugInfo0; // 2304 |
140 | 140 | int debugInfo1; // 2308 |
141 | - int dmy[2]; // 2312, 2316 | |
141 | + int dbg_currentCode; // 2312 | |
142 | + int dmy; // 2316 | |
142 | 143 | // |
143 | 144 | HOSECPU_PointerControlTag *ptrCtrl; // 2320 |
144 | 145 | char winClosed, autoSleep; |
@@ -197,7 +198,7 @@ void devFunc(HOSECPU_RuntimeEnvironment *r); // junkApiを処理する関数 | ||
197 | 198 | |
198 | 199 | // @jitc.c |
199 | 200 | void errorHandler(HOSECPU_RuntimeEnvironment *r); |
200 | - | |
201 | +void PRegCopy(HOSECPU_PointerRegisterEntry *dst, HOSECPU_PointerRegisterEntry *src); | |
201 | 202 | // @jitcx86.c |
202 | 203 | int jitc0(unsigned char **qq, unsigned char *q1, const unsigned char *p0, const unsigned char *p1, int level, HOSECPU_LabelListTag *label); |
203 | 204 | 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); |