- [1]opBin[]を以下の記述に差し替え
String opBin[] = { // 二項演算子のための機械語.
! "%1L11; 3b_&8:%2m0; 0f_94_c0; 0f_b6_c0; 89_%0m0;", // TcEEq ==
! "%1L11; 3b_&8:%2m0; 0f_95_c0; 0f_b6_c0; 89_%0m0;", // TcNEq !=
! "%1L11; 3b_&8:%2m0; 0f_9c_c0; 0f_b6_c0; 89_%0m0;", // TcLt <
! "%1L11; 3b_&8:%2m0; 0f_9d_c0; 0f_b6_c0; 89_%0m0;", // TcGe >=
! "%1L11; 3b_&8:%2m0; 0f_9e_c0; 0f_b6_c0; 89_%0m0;", // TcLe <=
! "%1L11; 3b_&8:%2m0; 0f_9f_c0; 0f_b6_c0; 89_%0m0;", // TcGt >
! "%1L02; 03_&8:%2m0; %0S;", // TcPlus +
! "%1L02; 2b_&8:%2m0; %0S;", // TcMinus -
! "%1L02; 0f_af_&8:%2m0; %0S;", // TcAster *
"8b_%1m0; 99; f7_%2m7; 89_%0m0;", // TcSlash /
"8b_%1m0; 99; f7_%2m7; 89_%0m2;", // TcPerce %
! "%1L02; 23_%2m0; %0S;", // TcAnd &
! "%1L02; 8b_%2m1; d3_f8; %0S;" // TcShr >>
};
- [2]putIcX86_sub()関数に書き足し&変更
void putIcX86_sub(String s, IntP a[])
{
int i, j, k;
+ unsigned char addVal = 0, r = 0;
for (i = 0; s[i] != 0; ) {
! if (s[i] == ' ' || s[i] == '\t' || s[i] == '_' || s[i] == ';' || s[i] == ':') {
i++;
} else if (getHex(s[i]) >= 0 && getHex(s[i + 1]) >= 0) { // 16進数2桁.
! *icq = getHex(s[i]) * 16 + getHex(s[i + 1]) + addVal;
i += 2;
icq++;
+ addVal = 0;
+ } else if (s[i] == '&') {
+ addVal = r * (s[i + 1] - '0');
+ i += 2;
} else if (s[i] == '%') {
j = s[i + 1] - '0';
if (s[i + 2] == 'm') { // mod r/m.
k = s[i + 3] - '0';
+ i += 4;
+subcmd_m:
if (regVar(a[j]) < 0) {
! *icq = 0x05 + k * 8 + addVal;
put32(icq + 1, (int) a[j]);
icq += 5;
} else {
! *icq = 0xc0 + regVarNo[regVar(a[j])] + k * 8 + addVal;
icq++;
}
+ addVal = 0;
continue;
}
+ if (s[i + 2] == 'L') {
+ int l = s[i + 4] - '0';
+ k = s[i + 3] - '0';
+ i += 5;
+ if (regVar(a[j]) >= 0 && a[j] == a[k]) {
+ r = regVarNo[regVar(a[j])];
+ } else if (regVar(a[k]) >= 0 && a[k] != a[l]) {
+ k = r = regVarNo[regVar(a[k])];
+ *icq = 0x8b;
+ icq++;
+ goto subcmd_m;
+ } else {
+ k = r = 0; // EAX.;
+ *icq = 0x8b;
+ icq++;
+ goto subcmd_m;
+ }
+ continue;
+ }
+ if (s[i + 2] == 'S') {
+ if (r == 0) {
+ k = 0;
+ *icq = 0x89;
+ icq++;
+ i += 3;
+ goto subcmd_m;
+ }
+ }
if (s[i + 2] == 'i') { // int.
put32(icq, (int) a[j]);
icq += 4;
}
(中略)
} else {
printf("putIcX86: error: '%s'(%s)\n", s, &s[i]);
exit(1);
}
}
}
- [3]ifgoto()関数のうちの2行を差し替え
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("%2L22; 3b_&8:%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("%2L22; 85_&9:c0; 0f_%0c_%1l;", (IntP) (0x85 - not), &var[label], &var[i], 0);
tmpFree(i);
}
}
- [3]phrCmpPutIcX86()関数の一部を差し替え
for (i = 0; i < lenExpr; i++) {
! putIcX86("%0L00; 89_&8:44_24_%1c;", &var[e[i]], (IntP) (i * 4), 0, 0);
}
- [4]compile()関数の一部を差し替え(1)
if (phrCmp( 1, "!!*0 = !!*1;", pc)) { // 単純代入.
+ if (regVar(&var[tc[wpc[0]]]) < 0) {
! putIcX86("%1L11; 89_&8:%0m0;", &var[tc[wpc[0]]], &var[tc[wpc[1]]], 0, 0);
+ } else {
+ putIcX86("%0L00; 8b_&8:%1m0;", &var[tc[wpc[0]]], &var[tc[wpc[1]]], 0, 0);
+ }
} else if (phrCmp(10, "!!*0 = !!*1 + 1; if (!!*2 < !!*3) goto !!*4;", pc) && tc[wpc[0]] == tc[wpc[1]] && tc[wpc[0]] == tc[wpc[2]]) {
! putIcX86("%1L11; &1:40; %1S; 3b_&8:%2m0; 0f_8c_%0l;", &var[tc[wpc[4]]], &var[tc[wpc[0]]], &var[tc[wpc[3]]], 0);
} else if (phrCmp( 9, "!!*0 = !!*1 + 1;", pc) && tc[wpc[0]] == tc[wpc[1]]) { // 高速化のために+1専用の命令を用意(せこくてすみません).
! putIcX86("%0L00; &1:40; %0S;", &var[tc[wpc[0]]], 0, 0, 0);
- [5]compile()関数の一部を差し替え(2)
} 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("%1L11; &1:40; %1S; 3b_&8:%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;
- [6]compile()関数に2行を追加
+ } else if (phrCmp(38, "!!*3 = mul64shr(!!*0, !!*1, !!*2);", pc) && strtol(ts[tc[wpc[2]]], 0, 0) > 0) {
+ putIcX86("8b_%0m0; f7_%1m5; 0f_ac_d0_%2c; 89_%3m0", &var[tc[wpc[0]]], &var[tc[wpc[1]]], (IntP) strtol(ts[tc[wpc[2]]], 0, 0), &var[tc[wpc[3]]]);