int condCode[6] = { 0x84, 0x85, 0x8c, 0x8d, 0x8e, 0x8f }; [この行追加]
void ifgoto(int i, int not, int label)
{
int j = wpc[i];
if (j + 3 == wpc1[i] && TcEEq <= tc[j + 1] && tc[j + 1] <= TcGt) { // 条件式の長さが3トークンで、真ん中が比較演算子だったら.
! putIcX86("8b_%2m0; 3b_%3m0; 0f_%0c_%1l;", (IntP) condCode[(tc[j + 1] - TcEEq) ^ not], &var[label], &var[tc[j]], &var[tc[j + 2]]);
} else {
i = expr(i);
! putIcX86("8b_%2m0; 85_c0; 0f_%0c_%1l;", (IntP) (0x85 - not), &var[label], &var[i], 0);
tmpFree(i);
}
} tmpLabelNo = 0;
bd = lbd = 0;
+ int toExit = tmpLabelAlloc();
for (pc = 0; pc < pc1; ) { // コンパイル開始. } else if (phrCmp( 5, "goto !!*0;", pc)) { // goto.
! putIcX86("e9_%0l;", &var[tc[wpc[0]]], 0, 0, 0); } else if (phrCmp(12, "} else {", pc) && binf[bd] == BlkIf) {
binf[bd + IfLabel1] = tmpLabelAlloc(); // else節の終端.
! putIcX86("e9_%0l;", &var[binf[bd + IfLabel1]], 0, 0, 0);
! defLabel(binf[bd + IfLabel0]); // ラベルに対応するicqを記録しておく.
} else if (phrCmp( 13, "}", pc) && binf[bd] == BlkIf) {
if (binf[bd + IfLabel1] == 0) {
! defLabel(binf[bd + IfLabel0]); // ラベルに対応するicqを記録しておく.
} else {
! defLabel(binf[bd + IfLabel1]); // ラベルに対応するicqを記録しておく.
}
bd -= BInfSiz;
} else if (phrCmp(14, "for (!!***0; !!***1; !!***2) {", pc)) { // for文
bd += BInfSiz;
binf[bd] = BlkFor; // ブロックのタイプ.
binf[bd + ForLopBgn] = tmpLabelAlloc(); // ループの頭に戻る用.
binf[bd + ForCont ] = tmpLabelAlloc(); // continue用.
binf[bd + ForBrk ] = tmpLabelAlloc(); // break用.
binf[bd + ForLbd0 ] = lbd; // 古い値を保存.
binf[bd + ForWpc01 ] = wpc [1];
binf[bd + ForWpc11 ] = wpc1[1];
binf[bd + ForWpc02 ] = wpc [2];
binf[bd + ForWpc12 ] = wpc1[2];
lbd = bd;
e0 = expr(0);
if (wpc[1] < wpc1[1]) { // !!***1に何らかの式が書いてあった.
ifgoto(1, IfFalse, binf[bd + ForBrk]); // 最初から条件不成立ならbreakへ.
}
! defLabel(binf[bd + ForLopBgn]); // ラベルに対応するicqを記録しておく.
} else if (phrCmp(15, "}", pc) && binf[bd] == BlkFor) {
! defLabel(binf[bd + ForCont]); // ラベルに対応するicqを記録しておく.
i = binf[bd + ForWpc01];
j = binf[bd + ForWpc02];
if (i + 3 == binf[bd + ForWpc11] && j + 2 == binf[bd + ForWpc12] && tc[i] == tc[j] && tc[i + 1] == TcLt && tc[j + 1] == TcPlPlus) {
// !!***1が「i < ?」かつ、!!***2が「i++」だったら(変数名はiじゃなくてもいいけど、共通である必要がある).
! putIcX86("8b_%1m0; 40; 89_%1m0; 3b_%2m0; 0f_8c_%0l;", &var[binf[bd + ForLopBgn]], &var[tc[i]], &var[tc[i + 2]], 0);
} else {
wpc [1] = binf[bd + ForWpc01];
wpc1[1] = binf[bd + ForWpc11];
wpc [2] = binf[bd + ForWpc02];
wpc1[2] = binf[bd + ForWpc12];
e2 = expr(2);
if (wpc[1] < wpc1[1]) { // !!***1に何らかの式が書いてあった.
ifgoto(1, 0, binf[bd + ForLopBgn]);
} else {
! putIcX86("e9_%0l;", &var[binf[bd + ForLopBgn]], 0, 0, 0);
}
}
! defLabel(binf[bd + ForBrk]); // ラベルに対応するicqを記録しておく.
lbd = binf[bd+ ForLbd0]; // 以前の値を復元.
bd -= BInfSiz;
} else if (phrCmp(16, "continue;", pc) && lbd > 0) {
! putIcX86("e9_%0l;", &var[binf[lbd + ForCont]], 0, 0, 0);
} else if (phrCmp(17, "break;", pc) && lbd > 0) {
! putIcX86("e9_%0l;", &var[binf[lbd + ForBrk ]], 0, 0, 0);! } else if (phrCmpPutIcX86(20, "prints !!**0;", pc, 0, 1, sub_prints, &e0)) { // prints.! } else if (phrCmpPutIcX86(23, "aSetPix0(!!***8, !!**0, !!**1, !!**2);", pc, 0, 3, sub_aSetPix0, &e0)) {
! } else if (phrCmpPutIcX86(24, "aWait(!!**0);", pc, 0, 1, sub_aWait, &e0)) {
+ putIcX86("85_c0; 0f_85_%0l;", &var[toExit], 0, 0, 0);
! } else if (phrCmpPutIcX86(25, "aFillRect0(!!***8, !!**0, !!**1, !!**2, !!**3, !!**4);", pc, 0, 5, sub_aFilRct0, &e0)) {
! } else if (phrCmpPutIcX86(26, "aDrawStr0(!!***8, !!**0, !!**1, !!**2, !!**3, !!**4);", pc, 0, 5, sub_aDrwStr0, &e0)) {
! } else if (phrCmpPutIcX86(27, "gprintDec(!!***8, !!**0, !!**1, !!**2, !!**3, !!**4, !!**5);", pc, 0, 6, sub_gprDec, &e0)) {
! } else if (phrCmpPutIcX86(28, "bitblt(!!***8, !!**0, !!**1, !!**2, !!**3, !!**4);", pc, 0, 5, sub_bitblt, &e0)) {
! } else if (phrCmpPutIcX86(29, "printTime();", pc, 0, 0, sub_time, &e0)) { // time;と同じ(C言語っぽく書けるようにした) if (bd > 0) {
printf("block nesting error (bd=%d, lbd=%d, pc=%d, pc1=%d\n", bd, lbd, pc, pc1);
return -1;
}
! defLabel(toExit);
dump1 = icq;
putIcX86("83_c4_7c; 61; c3;", 0, 0, 0, 0); // ADD(ESP,124); POPAD(); RET();
icq1 = icq;
for (i = 0; i < jp; i++) { // ジャンプ命令の最適化.単純代入:
(HL-9a) putIc (OpCpy, &var[tc[wpc[0]]], &var[tc[wpc[1]]], 0, 0);
(HL-13) putIcX86("8b_%1m0; 89_%0m0;", &var[tc[wpc[0]]], &var[tc[wpc[1]]], 0, 0);
print命令:
(HL-9a) phrCmpPutIc ( 4, "print !!**0;", pc, 0, 1, OpPrint, &e0)
(HL-13) phrCmpPutIcX86( 4, "print !!**0;", pc, 0, 1, sub_print, &e0)
+1する命令:
(HL-9a) putIc (OpAdd1, &var[tc[wpc[0]]], 0, 0, 0);
(HL-13) putIcX86("8b_%0m0; 40; 89_%0m0;", &var[tc[wpc[0]]], 0, 0, 0);
各種二項演算子:
いずれも基本形は以下の通り
(HL-9a) putIc (op, &var[tc[wpc[0]]], &var[tc[wpc[1]]], &var[tc[wpc[3]]], 0);
(HL-13) putIcX86(op, &var[tc[wpc[0]]], &var[tc[wpc[1]]], &var[tc[wpc[3]]], 0);
演算子 (HL-9a) (HL-13)
+ OpAdd "8b_%1m0; 03_%2m0; 89_%0m0;"
- OpSub "8b_%1m0; 2b_%2m0; 89_%0m0;"
* OpMul "8b_%1m0; 0f_af_%2m0; 89_%0m0;"
/ OpDiv "8b_%1m0; 99; f7_%2m7; 89_%0m0;"
% OpMod "8b_%1m0; 99; f7_%2m7; 89_%0m2;"
& OpAnd "8b_%1m0; 23_%2m0; 89_%0m0;"
>> OpShr "8b_%1m0; 8b_%2m1; d3_f8; 89_%0m0;"
== OpCeq "8b_%1m0; 3b_%2m0; 0f_94_c0; 83_e0_01; 89_%0m0;"
!= OpCne "8b_%1m0; 3b_%2m0; 0f_95_c0; 83_e0_01; 89_%0m0;"
< OpClt "8b_%1m0; 3b_%2m0; 0f_9c_c0; 83_e0_01; 89_%0m0;"
>= OpCge "8b_%1m0; 3b_%2m0; 0f_9d_c0; 83_e0_01; 89_%0m0;"
<= OpCle "8b_%1m0; 3b_%2m0; 0f_9e_c0; 83_e0_01; 89_%0m0;"
> OpCgt "8b_%1m0; 3b_%2m0; 0f_9f_c0; 83_e0_01; 89_%0m0;"
ループ命令:
(HL-9a) putIc (OpLop, &var[tc[wpc[4]]], &var[tc[wpc[0]]], &var[tc[wpc[3]]], 0);
(HL-13) putIcX86("8b_%1m0; 40; 89_%1m0; 3b_%2m0; 0f_8c_%0l;", &var[tc[wpc[4]]], &var[tc[wpc[0]]], &var[tc[wpc[3]]], 0);| コメント | お名前 | NameLink | |