int vc[MAX_TC + 1];
if (icq0[0] == 0x48 && icq0[1] == 0x8b && isConstM(&icq0[2])) { // 48_8b.
AInt reg = (icq0[2] >> 3) & 7, i = getConstM(&icq0[2]);
+ vc[get32(&icq0[3]) / 8]--;
icq = icq0;
if (i == 0) { putIcX64("31_%0c", (IntP) (reg * 9 + 0xc0), 0, 0, 0); }
else if (i >> 32 == 0) { putIcX64("%0c_%1i", (IntP) (reg + 0xb8), (IntP) i, 0, 0); }
else if (is32bit(i)) { putIcX64("48_c7_%0c_%1i", (IntP) (reg + 0xc0), (IntP) i, 0, 0); }
else { putIcX64("48_%0c_%1q", (IntP) (reg + 0xb8), (IntP) i, 0, 0); }
}
if (icq0[0] == 0x4c && icq0[1] == 0x8b && isConstM(&icq0[2])) { // 4c_8b.
AInt reg = (icq0[2] >> 3) & 7, i = getConstM(&icq0[2]);
+ vc[get32(&icq0[3]) / 8]--;
icq = icq0;
if (i == 0) { putIcX64("4d_31_%0c", (IntP) (reg * 9 + 0xc0), 0, 0, 0); }
else if (i >> 32 == 0) { putIcX64("41_%0c_%1i", (IntP) (reg + 0xb8), (IntP) i, 0, 0); }
else if (is32bit(i)) { putIcX64("49_c7_%0c_%1i", (IntP) (reg + 0xc0), (IntP) i, 0, 0); }
else { putIcX64("49_%0c_%1q", (IntP) (reg + 0xb8), (IntP) i, 0, 0); }
}
if (icq0[0] == 0x48 && icq0[1] <= 0x3f && (icq0[1] & 7) == 3 && isConstM(&icq0[2]) && is32bit(getConstM(&icq0[2]))) { // 03, 0b, 13, 1b, 23, 2b, 33, 3b.
AInt reg = (icq0[2] >> 3) & 7, i = getConstM(&icq0[2]);
+ vc[get32(&icq0[3]) / 8]--;
icq = icq0;
if (-0x80 <= i && i <= 0x7f) { putIcX64("48_83_%0c_%1c", (IntP) ((icq0[1] & 0x38) + reg + 0xc0), (IntP) i, 0, 0); }
else { putIcX64("48_81_%0c_%1i", (IntP) ((icq0[1] & 0x38) + reg + 0xc0), (IntP) i, 0, 0); }
}
if (icq0[0] == 0x4c && icq0[1] <= 0x3f && (icq0[1] & 7) == 3 && isConstM(&icq0[2]) && is32bit(getConstM(&icq0[2]))) { // 03, 0b, 13, 1b, 23, 2b, 33, 3b.
AInt reg = (icq0[2] >> 3) & 7, i = getConstM(&icq0[2]);
+ vc[get32(&icq0[3]) / 8]--;
icq = icq0;
if (-0x80 <= i && i <= 0x7f) { putIcX64("49_83_%0c_%1c", (IntP) ((icq0[1] & 0x38) + reg + 0xc0), (IntP) i, 0, 0); }
else { putIcX64("49_81_%0c_%1i", (IntP) ((icq0[1] & 0x38) + reg + 0xc0), (IntP) i, 0, 0); }
}
if (icq0[0] == 0x48 && icq0[1] == 0x0f && icq0[2] == 0xaf && isConstM(&icq0[3]) && is32bit(getConstM(&icq0[3]))) { // 0f_af.
AInt reg = (icq0[3] >> 3) & 7, i = getConstM(&icq0[3]);
+ vc[get32(&icq0[4]) / 8]--;
icq = icq0;
if (-0x80 <= i && i <= 0x7f) { putIcX64("48_6b_%0c_%1c", (IntP) (reg * 9 + 0xc0), (IntP) i, 0, 0); }
else { putIcX64("48_69_%0c_%1i", (IntP) (reg * 9 + 0xc0), (IntP) i, 0, 0); }
}
if (icq0[0] == 0x4c && icq0[1] == 0x0f && icq0[2] == 0xaf && isConstM(&icq0[3]) && is32bit(getConstM(&icq0[3]))) { // 0f_af.
AInt reg = (icq0[3] >> 3) & 7, i = getConstM(&icq0[3]);
+ vc[get32(&icq0[4]) / 8]--;
icq = icq0;
if (-0x80 <= i && i <= 0x7f) { putIcX64("4d_6b_%0c_%1c", (IntP) (reg * 9 + 0xc0), (IntP) i, 0, 0); }
else { putIcX64("4d_69_%0c_%1i", (IntP) (reg * 9 + 0xc0), (IntP) i, 0, 0); }
} if (icq1 != 0 && memcmp(icq0, "\x48\x8b\x85", 3) == 0 && memcmp(icq1, "\x48\x89\x85", 3) == 0 && get32(icq0 + 3) == get32(icq1 + 3)) {
icq = icq0; // 8b命令は削除.
i = get32(icq1 + 3) / 8;
+ vc[i]--;
if (TcTmp0 <= i && i <= TcTmp9) {
icq = icq1; // 89命令も削除.
+ vc[i]--;
}
} if (s[i + 2] == 'm') { // mod r/m.
k = s[i + 3] - '0';
if (s[i + 3] >= 'a') { // もしかしたらこの記述は最後まで出番がないかも.
k = s[i + 3] - 'a' + 10;
}
i += 4;
subcmd_m: ;
int rv = regVar(a[j]);
if (k >= 8) {
*putIcX64_rex += 4;
k -= 8;
}
if (rv < 0) {
*icq = 0x85 + k * 8 + addVal;
put32(icq + 1, (a[j] - var) * 8);
+ vc[a[j] - var]++;
icq += 5;
} else {
rv = regVarNo[rv];
if (rv >= 8) {
*putIcX64_rex += 1;
rv -= 8;
}
*icq = 0xc0 + rv + k * 8 + addVal;
icq++;
}
addVal = 0;
continue;
}int compile(String s)
{
(中略)
for (i = 0; i < 10; i++) {
tmp_flag[i] = 0;
}
tmpLabelNo = 0;
+ for (i = 0; i < MAX_TC + 1; i++) {
+ vc[i] = 0;
+ }
bd = lbd = 0;
toExit = tmpLabelAlloc();
for (pc = 0; pc < pc1; ) { // コンパイル開始.
(中略)
}int run(String s)
{
if (compile(s) < 0)
return 1;
if (codedump == 0) {
void (*func)() = (void (*)()) ic;
t0 = clock();
func();
if (win != 0) {
aFlushAll(win);
}
} else {
int i, i1 = dump1 - dump0;
for (i = 0; i < i1; i++) {
printf("%02x ", dump0[i]);
}
printf("\n(len=%d)\n", i1);
+ for (i = 0; i < MAX_TC + 1; i++) {
+ if (vc[i] != 0) {
+ printf("#%04d: %06d: %s\n", i, vc[i], ts[i])
+ }
+ }
}
return 0;
}>codedump 1 (len=0) >run maze.c b8 f0 02 00 ... (len=1533) #0036(00421aa0): 000024: _t0 #0037(00421aa4): 000010: _t1 #0038(00421aa8): 000008: _t2 #0071(00421b2c): 000001: w #0072(00421b30): 000003: i #0073(00421b34): 000009: x #0074(00421b38): 000009: y #0075(00421b3c): 000014: xx #0076(00421b40): 000014: yy #0077(00421b44): 000004: d0 #0078(00421b48): 000004: d1 #0079(00421b4c): 000004: d2 #0080(00421b50): 000004: d3 #0081(00421b54): 000002: d #0082(00421b58): 000013: dd #0093(00421b84): 000001: 23 #0094(00421b88): 000001: 15
>regVar(0 xx yy dd x) 8b 1d 3c 1b ... (len=96) >run maze.c b8 f0 02 00 ... (len=1265) #0036(00421aa0): 000024: _t0 #0037(00421aa4): 000010: _t1 #0038(00421aa8): 000008: _t2 #0071(00421b2c): 000001: w #0072(00421b30): 000003: i #0074(00421b38): 000009: y #0077(00421b44): 000004: d0 #0078(00421b48): 000004: d1 #0079(00421b4c): 000004: d2 #0080(00421b50): 000004: d3 #0081(00421b54): 000002: d #0093(00421b84): 000001: 23 #0094(00421b88): 000001: 15
| HL-19a | HL-20 | HL-20a | HL-20b | HL-21 | HL-21a | HL-22 | HL-22a | 備考 | |
| mandel.c | 1200 | 1088 | 989 | 989 | 814 | 719 | 670 | 670 | regVar(0,zx,zy,xx,yy,t,cx,cy)[HL-14以降] |
| maze.c | 2331 | 2331 | 2331 | 2331 | 1909 | 1654 | 1638 | 1289 | regVar(0,xx,yy,x,y,dd,d0,d1)[HL-16a以降] |
| kcube.c | 5207 | 5207 | 5207 | 5207 | 4188 | 3949 | 3948 | 3401 | regVar(0,i,l,squar,x,y,p1x,p1y)[HL-16a以降] |
| invader.c | 3567 | 3567 | 3567 | 3567 | 3001 | 2593 | 2532 | 1977 | regVar(0,i,j,ly,ix,pnt,iy,score)[HL-16a以降] |
| コメント | お名前 | NameLink | |