4 #if (JITC_ARCNUM == 0x0001)
\r
8 int jitCompGetImm32(const unsigned char *src)
\r
10 return (src[0] << 24) | (src[1] << 16) | (src[2] << 8) | src[3];
\r
13 int jitCompGetLabelNum(struct JitCompWork *w, const unsigned char *src)
\r
15 int i = jitCompGetImm32(src);
\r
16 if (i < 0 || i >= w->maxLabels) {
\r
17 w->err = JITC_ERR_LABELNUM;
\r
23 void jitCompPutModRM_Disp_BaseEBP(struct JitCompWork *w, int disp, int opReg)
\r
25 // EBPをベースとするアドレスオペランドとレジスタオペランドを出力する
\r
26 disp -= jitCompA0001_EBP128;
\r
27 if (-128 <= disp && disp <= 127) {
\r
29 jitCompPutByte1(w->dst, IA32_MOD_R_M(IA32_OP_MOD_INDEX_AND_DISP_BYTE, opReg, IA32_REG5_EBP));
\r
30 jitCompPutByte1(w->dst, disp & 0xff);
\r
33 jitCompPutByte1(w->dst, IA32_MOD_R_M(IA32_OP_MOD_INDEX_AND_DISP_FULL, opReg, IA32_REG5_EBP));
\r
34 jitCompPutImm32(w->dst, disp);
\r
39 void jitCompPutOp_MOV_EBPDisp_GReg(struct JitCompWork *w, int disp, int reg32)
\r
41 // MOV([EBP + disp] <- reg32);
\r
43 // [1000 100 1] [mod reg r/m]
\r
44 jitCompPutByte1(w->dst, 0x89);
\r
45 jitCompPutModRM_Disp_BaseEBP(w, disp, reg32);
\r
49 void jitCompPutOp_MOV_GReg_EBPDisp(struct JitCompWork *w, int reg32, int disp)
\r
51 // MOV (reg32 <- [EBP + disp])
\r
53 // [1000 101 1] [mod reg r/m]
\r
54 jitCompPutByte1(w->dst, 0x8b);
\r
55 jitCompPutModRM_Disp_BaseEBP(w, disp, reg32);
\r
59 void jitCompA0001_movEaxRxx(struct JitCompWork *w, int rxx)
\r
61 #if (jitCompA0001_USE_R3F_IMM32 != 0)
\r
63 jitCompPutByte1(w->dst, 0xb8); /* MOV(EAX, ?); */
\r
64 jitCompPutImm32(w->dst, w->r3f);
\r
68 if (rxx >= 0x40 || rxx < 0){
\r
69 w->err = JITC_ERR_REGNUM;
\r
71 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG0_EAX, rxx * 4);
\r
75 void jitCompA0001_movRxxEax(struct JitCompWork *w, int rxx)
\r
77 if (rxx >= 0x40 || rxx < 0){
\r
78 w->err = JITC_ERR_REGNUM;
\r
80 jitCompPutOp_MOV_EBPDisp_GReg(w, rxx * 4, IA32_REG0_EAX);
\r
84 void jitCompA0001_fixPrefix(struct JitCompWork *w)
\r
86 if (w->prefix != 0) {
\r
87 if (w->dst - w->dst0 > 127){
\r
88 w->err = JITC_ERR_REGNUM;
\r
90 w->dst0[-1] = (unsigned char)((w->dst - w->dst0) & 0xff);
\r
95 void jitCompA0001_checkCompPtr(struct JitCompWork *w, int p0, int p1)
\r
97 if (p0 >= 0x3f || p0 < 0){
\r
98 w->err = JITC_ERR_PREGNUM;
\r
100 if (p1 >= 0x3f || p1 < 0){
\r
101 w->err = JITC_ERR_PREGNUM;
\r
103 /* 比較可能可能なのかのチェックのコードを出力 */ /* 未完成 */
\r
107 void jitCompA000_loadRegCacheAll(struct JitCompWork *w)
\r
109 //保存されたレジスタキャッシュをメモリからロード
\r
110 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG3_EBX, 4 * 0); /* EBX = R00; */
\r
111 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG1_ECX, 4 * 1); /* ECX = R01; */
\r
112 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG2_EDX, 4 * 2); /* EDX = R02; */
\r
116 void jitCompA000_storeRegCacheAll(struct JitCompWork *w)
\r
119 jitCompPutOp_MOV_EBPDisp_GReg(w, 0 * 4, IA32_REG3_EBX); /* R00 = EBX; */
\r
120 jitCompPutOp_MOV_EBPDisp_GReg(w, 1 * 4, IA32_REG1_ECX); /* R01 = ECX; */
\r
121 jitCompPutOp_MOV_EBPDisp_GReg(w, 2 * 4, IA32_REG2_EDX); /* R02 = EDX; */
\r
125 void jitCompA000_loadRegCacheEcx(struct JitCompWork *w)
\r
127 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG1_ECX, 1 * 4); /* ECX = R01; */
\r
131 void jitCompA000_storeRegCacheEcx(struct JitCompWork *w)
\r
133 jitCompPutOp_MOV_EBPDisp_GReg(w, 1 * 4, IA32_REG1_ECX); /* R01 = ECX; */
\r
137 void jitCompA000_loadRegCacheEdx(struct JitCompWork *w)
\r
139 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG2_EDX, 2 * 4); /* EDX = R02; */
\r
143 void jitCompA000_storeRegCacheEdx(struct JitCompWork *w)
\r
145 jitCompPutOp_MOV_EBPDisp_GReg(w, 2 * 4, IA32_REG2_EDX); /* R02 = EDX; */
\r
149 int jitCompA000_selectRegCache(int rxx, int reg)
\r
151 // OSECPUレジスタ番号をIA32レジスタ番号へ変換
\r
152 // 対応するキャッシュレジスタがない場合regが返る
\r
155 reg = IA32_REG3_EBX;
\r
158 reg = IA32_REG1_ECX;
\r
161 reg = IA32_REG2_EDX;
\r
167 void jitCompA000_loadPRegCacheAll(struct JitCompWork *w)
\r
169 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG6_ESI, PRegOffset(0x01) + 0); /* ESI = P01; */
\r
170 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG7_EDI, PRegOffset(0x02) + 0); /* EDI = P02; */
\r
174 void jitCompA000_storePRegCacheAll(struct JitCompWork *w)
\r
176 jitCompPutOp_MOV_EBPDisp_GReg(w, PRegOffset(0x01) + 0, IA32_REG6_ESI); /* P01 = ESI; */
\r
177 jitCompPutOp_MOV_EBPDisp_GReg(w, PRegOffset(0x02) + 0, IA32_REG7_EDI); /* P02 = EDI; */
\r
181 int jitCompA000_selectPRegCache(int pxx, int reg)
\r
183 // if (pxx == 0) reg = 5; /* EBP */
\r
198 int jitCompA000_convTyp(int t)
\r
200 // 指定されたタイプのデータ幅を返す。
\r
201 // unsigned なら奇数(1bit目がOn)
\r
203 // retv = 2 or 3: BYTE ( 8, 4, 2, 1 bit)
\r
204 // retv = 4 or 5: WORD (16, 12 bit)
\r
205 // retv = 6 or 7: DWORD(32, 20, 24, 28 bit)
\r
209 if (1 <= t && t <= 7){
\r
212 } else if (8 <= t && t <= 13){
\r
214 } else if (14 <= t && t <= 15){
\r
216 } else if (16 <= t && t <= 21){
\r
222 int jitCompA000_dataWidth(int t)
\r
224 // 指定されたタイプのビット数を返す
\r
226 if (t == 0x0001) r = 256;
\r
228 if (t == 0x0002 / 2) r = 8;
\r
229 if (t == 0x0004 / 2) r = 16;
\r
230 if (t == 0x0006 / 2) r = 32;
\r
231 if (t == 0x0008 / 2) r = 4;
\r
232 if (t == 0x000a / 2) r = 2;
\r
233 if (t == 0x000c / 2) r = 1;
\r
234 if (t == 0x000e / 2) r = 12;
\r
235 if (t == 0x0010 / 2) r = 20;
\r
236 if (t == 0x0012 / 2) r = 24;
\r
237 if (t == 0x0014 / 2) r = 28;
\r
241 unsigned char *errfnc;
\r
243 void jitCompA0001_checkType0(struct JitCompWork *w, int pxx, int typ, int ac)
\r
246 w->err = JITC_ERR_BADTYPE;
\r
249 w->err = JITC_ERR_INTERNAL;
\r
251 jitCompPutOp_MOV_GReg_EBPDisp(w, IA32_REG0_EAX, PRegOffset(pxx) + 4); /* MOV(EAX, pReg[pxx].typ); */
\r
252 jitCompPutByte3(w->dst, 0x83, 0xf8, typ & 0x7f); /* CMP(EAX, typ); */
\r
253 jitCompPutByte2(w->dst, 0x0f, 0x85); /* JNE */
\r
254 jitCompPutImm32(w->dst, errfnc - (w->dst + 4));
\r
258 void jitCompA0001_checkType(struct JitCompWork *w, int pxx, int typ, int ac)
\r
261 // 将来的にはaliveやアクセス権チェックも入れる
\r
262 jitCompA0001_checkType0(w, pxx, typ, ac);
\r
266 void jitCompA0001_checkLimit(struct JitCompWork *w, int reg, int pxx)
\r
268 jitCompPutByte1(w->dst, 0x3b); /* CMP(reg, [EBP+?]); */
\r
269 jitCompPutModRM_Disp_BaseEBP(w, PRegOffset(pxx) + 8, reg); /* p0 */
\r
270 jitCompPutByte2(w->dst, 0x0f, 0x82); /* JB */
\r
271 jitCompPutImm32(w->dst, errfnc - (w->dst + 4));
\r
272 jitCompPutByte1(w->dst, 0x3b); /* CMP(reg, [EBP+?]); */
\r
273 jitCompPutModRM_Disp_BaseEBP(w, PRegOffset(pxx) + 12, reg); /* p1 */
\r
274 jitCompPutByte2(w->dst, 0x0f, 0x83); /* JAE */
\r
275 jitCompPutImm32(w->dst, errfnc - (w->dst + 4));
\r