| ページ名 | 名前 | 行数 | .exeの大きさ | 説明 | 速度のめやす1 | 速度のめやす2 |
| [ a21_txt01 ] | HL-1~HL-9a | 49行~772行 | 6.0KB~20.0KB | 「10日くらいでできる!プログラミング言語自作入門」 | 1520倍~5.5倍 | 6.4倍 |
| a21_txt02 | HL-11 | 692行 | 14.5KB | JITコンパイラ版1号 | 計測不能 | 計測不能 |
| a21_txt02_1a | HL-11a | 707行 | 15.0KB | 簡単な演算もサポート | 計測不能 | 計測不能 |
| a21_txt02_2 | HL-12 | 746行 | 16.0KB | ループ速度の測定ができるところまで | 5.3倍 | 計測不能 |
| a21_txt02_2a | HL-12a | 767行 | 16.5KB | codedumpコマンドと、codeコマンドの追加 | 5.3倍 | 計測不能 |
| a21_txt02_3 | HL-13 | 828行 | 21.0KB | 配列以外は全部JITコンパイラ対応させる(mandel.cで速さを実感!) | 5.3倍 | 2.0倍 |
| a21_txt02_3a | HL-13a | 820行 | 21.0KB | 配列もJITコンパイラ対応させる(ついに機能的にはHL-9a相当に!) | 5.3倍 | 2.0倍 |
regVar(0, x); regVar(1, y); regVar(2, z);
regVar(0, x, y, z);
#define regVar(...)
IntP regVarTbl[4]; // レジスタ変数の割り当て状況を記憶.
int regVarNo[4] = { 3, 5, 6, 7 }; // レジスタ変数番号から、レジスタ番号に変換.
int regVar(IntP v) // もし変数vがレジスタに割り当てられていれば、0~3を返す. そうでなければ-1を返す.
{
int i;
for (i = 0; i < 4; i++) {
if (regVarTbl[i] == v)
return i;
}
return -1;
}
enum { RvSave = 0x89, RvLoad = 0x8b };
void regVarSaveLoad(int op) // レジスタ変数を準備するor書き戻す.
{
int i;
for (i = 0; i < 4; i++) {
if (regVarTbl[i] != 0) {
putIcX86("%0c_%1c_%2i;", (IntP) op, (IntP) (0x05 + regVarNo[i] * 8), regVarTbl[i], 0);
}
}
} if (s[i + 2] == 'm') { // mod r/m.
k = s[i + 3] - '0';
+ if (regVar(a[j]) < 0) {
*icq = 0x05 + k * 8;
put32(icq + 1, (int) a[j]);
icq += 5;
+ } else {
+ *icq = 0xc0 + regVarNo[regVar(a[j])] + k * 8;
+ icq++;
+ }
i += 4;
continue;
} icq = ic;
jp = 0;
putIcX86("60; 83_ec_7c;", 0, 0, 0, 0); // PUSHAD(); SUB(ESP,124);
+ regVarSaveLoad(RvLoad);
dump0 = icq;+ } else if (phrCmp(37, "regVar(!!*0", pc)) {
+ i = tc[wpc[0]] - Tc0;
+ for (pc = ppc1; tc[pc] != TcBrCls; pc++) {
+ if (tc[pc] == TcComma) continue;
+ if (0 <= i && i <= 3) {
+ regVarSaveLoad(RvSave);
+ regVarTbl[i] = &var[tc[pc]];
+ if (tc[pc] == Tc0)
+ regVarTbl[i] = 0;
+ regVarSaveLoad(RvLoad);
+ }
+ i++;
+ }
+ ppc1 = pc + 2; defLabel(toExit);
dump1 = icq;
+ regVarSaveLoad(RvSave);
putIcX86("83_c4_7c; 61; c3;", 0, 0, 0, 0); // ADD(ESP,124); POPAD(); RET();
icq1 = icq; if (s[i + 2] == 'm') { // mod r/m.
k = s[i + 3] - '0';
+ if (regVar(a[j]) < 0) {
*icq = 0x05 + k * 8;
put32(icq + 1, (int) a[j]);
icq += 5;
+ } else {
+ *icq = 0xc0 + regVarNo[regVar(a[j])] + k * 8;
+ icq++;
+ }
i += 4;
continue;
}| ページ名 | 名前 | 行数 | .exeの大きさ | 説明 | 速度のめやす1 | 速度のめやす2 |
| [ a21_txt01 ] | HL-1~HL-9a | 49行~772行 | 6.0KB~20.0KB | 「10日くらいでできる!プログラミング言語自作入門」 | 1520倍~5.5倍 | 6.4倍 |
| a21_txt02 | HL-11 | 692行 | 14.5KB | JITコンパイラ版1号 | 計測不能 | 計測不能 |
| a21_txt02_1a | HL-11a | 707行 | 15.0KB | 簡単な演算もサポート | 計測不能 | 計測不能 |
| a21_txt02_2 | HL-12 | 746行 | 16.0KB | ループ速度の測定ができるところまで | 5.3倍 | 計測不能 |
| a21_txt02_2a | HL-12a | 767行 | 16.5KB | codedumpコマンドと、codeコマンドの追加 | 5.3倍 | 計測不能 |
| a21_txt02_3 | HL-13 | 828行 | 21.0KB | 配列以外は全部JITコンパイラ対応させる(mandel.cで速さを実感!) | 5.3倍 | 2.0倍 |
| a21_txt02_3a | HL-13a | 820行 | 21.0KB | 配列もJITコンパイラ対応させる(ついに機能的にはHL-9a相当に!) | 5.3倍 | 2.0倍 |
| a21_txt02_4 | HL-14 | 866行 | 21.5KB | レジスタ変数の導入(46行しか増えない簡単な改造だけど、結構な効果がある) | 2.0倍 | 1.2倍 |
| コメント | お名前 | NameLink | |