- [1]getConstM()関数の後に以下の記述を追加
int calcConst1(int op, int a)
{
int v = 0, va = var[a];
char s[100];
if (isConst(a) == 0) return 0;
switch (op) {
case TcMinus: v = - va; break;
}
sprintf(s, "%d", v);
return getTc(s, strlen(s));
}
int calcConst2(int op, int a, int b)
{
int v = 0, va = var[a], vb = var[b];
char s[100];
if (isConst(a) == 0 || isConst(b) == 0) return 0;
switch (op) {
case TcEEq: v = va == vb; break;
case TcNEq: v = va != vb; break;
case TcLt: v = va < vb; break;
case TcGe: v = va >= vb; break;
case TcLe: v = va <= vb; break;
case TcGt: v = va > vb; break;
case TcPlus: v = va + vb; break;
case TcMinus: v = va - vb; break;
case TcAster: v = va * vb; break;
case TcSlash: v = va / vb; break;
case TcPerce: v = va % vb; break;
case TcAnd: v = va & vb; break;
case TcShr: v = va >> vb; break;
}
sprintf(s, "%d", v);
return getTc(s, strlen(s));
}
- [2]exprSub1()関数に3行追加
int exprSub1(int i, int priority, int op) // 二項演算子の処理の標準形.
{
int j, k;
epc++;
j = exprSub(priority);
+ k = calcConst2(op, i, j);
+ if (k == 0) {
k = tmpAlloc();
putIcX86(opBin[op - TcEEq], &var[k], &var[i], &var[j], 0);
+ }
tmpFree(i);
tmpFree(j);
if (i < 0 || j < 0) return -1;
return k;
}
- [3]exprSub()関数に3行追加
} else if (tc[epc] == TcMinus) { // 単項マイナス.
epc++;
e0 = exprSub(2);
+ i = calcConst1(TcMinus, e0);
+ if (i == 0) {
i = tmpAlloc();
putIcX86("8b_%1m0; f7_d8; 89_%0m0;", &var[i], &var[e0], 0, 0);
+ }
- [4]compile()関数に3行追加
} else if (phrCmp( 2, "!!*0 = !!*1 !!*2 !!*3;", pc) && TcEEq <= tc[wpc[2]] && tc[wpc[2]] <= TcShr) { // 加算, 減算など.
+ i = calcConst2(tc[wpc[2]], tc[wpc[1]], tc[wpc[3]]);
+ if (i == 0) {
putIcX86(opBin[tc[wpc[2]] - TcEEq], &var[tc[wpc[0]]], &var[tc[wpc[1]]], &var[tc[wpc[3]]], 0);
+ } else {
+ if (regVar(&var[tc[wpc[0]]]) < 0) {
+ putIcX86("%1L11; 89_&8:%0m0;", &var[tc[wpc[0]]], &var[i], 0, 0);
+ } else {
+ putIcX86("%0L00; 8b_&8:%1m0;", &var[tc[wpc[0]]], &var[i], 0, 0);
+ }
+ }