unsigned char *icq0, *icq1, *icqSet;
int isConst(int i)
{
if ('0' <= ts[i][0] && ts[i][0] <= '9') return 1;
return 0;
}
int isConstM(unsigned char *p)
{
if ((*p & 0xc7) != 0x85) return 0;
return isConst(get32(p + 1) / 8);
}
AInt getConstM(unsigned char *p)
{
return var[get32(p + 1) / 8];
}
int is32bit(AInt i)
{
if (-0x80000000LL <= i && i <= 0x7fffffffLL) return 1;
return 0;
}
void putIcX64(String s, IntP p0, IntP p1, IntP p2, IntP p3); // プロトタイプ宣言.
void optimizerX64()
{
if (icq0 != icq) {
if (icq0[0] == 0x0f && 0x90 <= icq0[1] && icq0[1] <= 0x9f) { // SETcc
icqSet = icq0;
}
+ if (icq0[0] == 0x48 && icq0[1] == 0x8b && isConstM(&icq0[2])) { // 48_8b.
+ AInt reg = (icq0[2] >> 3) & 7, i = getConstM(&icq0[2]);
+ 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]);
+ 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]);
+ 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]);
+ 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]);
+ 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]);
+ 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 ((icq0[0] == 0x48 || icq0[0] == 0x49) && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xc0 && icq0[3] == 1) { // ADD 1 → INC.
+ icq = icq0;
+ putIcX64("%0c_ff_%1c", (IntP) (AInt) icq0[0], (IntP) (AInt) ((icq0[2] & 7) + 0xc0), 0, 0);
+ }
+ if ((icq0[0] == 0x48 || icq0[0] == 0x49) && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xe8 && icq0[3] == 1) { // SUB 1 → DEC.
+ icq = icq0;
+ putIcX64("%0c_ff_%1c", (IntP) (AInt) icq0[0], (IntP) (AInt) ((icq0[2] & 7) + 0xc8), 0, 0);
+ }
+ if (icq0[0] == 0x48 && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xf8 && icq0[3] == 0) { // CMP 0 → TEST.
+ icq = icq0;
+ putIcX64("48_85_%0c", (IntP) (AInt) ((icq0[2] & 7) * 9 + 0xc0), 0, 0, 0);
+ }
+ if (icq0[0] == 0x49 && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xf8 && icq0[3] == 0) { // CMP 0 → TEST.
+ icq = icq0;
+ putIcX64("4d_85_%0c", (IntP) (AInt) ((icq0[2] & 7) * 9 + 0xc0), 0, 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;
if (TcTmp0 <= i && i <= TcTmp9) {
icq = icq1; // 89命令も削除.
}
}
icq1 = icq0;
icq0 = icq;
}
if (icqSet + 15 == icq && memcmp(&icqSet[2], "\xc0\x0f\xb6\xc0\x48\x85\xc0\x0f", 8) == 0 && 0x84 <= icqSet[10] && icqSet[10] <= 0x85) {
memcpy(&icqSet[2], &icqSet[11], 4);
icqSet[1] -= 0x10; // SETcc → Jcc.
if (icqSet[10] == 0x84) {
icqSet[1] ^= 1; // 条件反転.
}
icq0 = icq = icqSet + 6;
icq1 = icqSet = 0;
jmps[jp - 1] = icq - 4 - ic;
}
}int isConst(int i)
{
if ('0' <= ts[i][0] && ts[i][0] <= '9') return 1;
return 0;
}
int isConstM(unsigned char *p)
{
if ((*p & 0xc7) != 0x85) return 0;
return isConst(get32(p + 1) / 8);
}
int getConstM(unsigned char *p)
{
return var[get32(p + 1) / 8];
}
int is32bit(AInt i)
{
if (-0x80000000LL <= i && i <= 0x7fffffffLL) return 1;
return 0;
}
+ if (icq0[0] == 0x48 && icq0[1] == 0x8b && isConstM(&icq0[2])) { // 48_8b.
+ AInt reg = (icq0[2] >> 3) & 7, i = getConstM(&icq0[2]);
+ 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]);
+ 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]);
+ 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]);
+ 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]);
+ 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]);
+ 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 ((icq0[0] == 0x48 || icq0[0] == 0x49) && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xc0 && icq0[3] == 1) { // ADD 1 → INC.
+ icq = icq0;
+ putIcX64("%0c_ff_%1c", (IntP) (AInt) icq0[0], (IntP) (AInt) ((icq0[2] & 7) + 0xc0), 0, 0);
+ }
+ if ((icq0[0] == 0x48 || icq0[0] == 0x49) && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xe8 && icq0[3] == 1) { // SUB 1 → DEC.
+ icq = icq0;
+ putIcX64("%0c_ff_%1c", (IntP) (AInt) icq0[0], (IntP) (AInt) ((icq0[2] & 7) + 0xc8), 0, 0);
+ }
+ if (icq0[0] == 0x48 && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xf8 && icq0[3] == 0) { // CMP 0 → TEST.
+ icq = icq0;
+ putIcX64("48_85_%0c", (IntP) (AInt) ((icq0[2] & 7) * 9 + 0xc0), 0, 0, 0);
+ }
+ if (icq0[0] == 0x49 && icq0[1] == 0x83 && (icq0[2] & 0xf8) == 0xf8 && icq0[3] == 0) { // CMP 0 → TEST.
+ icq = icq0;
+ putIcX64("4d_85_%0c", (IntP) (AInt) ((icq0[2] & 7) * 9 + 0xc0), 0, 0, 0);
+ }
| HL-19a | HL-20 | HL-20a | HL-20b | HL-21 | HL-21a | |
| mandel.c | 1200 | 1088 | 989 | 989 | 856 | 763 |
| maze.c | 2331 | 2331 | 2331 | 2331 | 2077 | 1829 |
| kcube.c | 5207 | 5207 | 5207 | 5207 | 4286 | 4052 |
| invader.c | 3567 | 3567 | 3567 | 3567 | 3029 | 2639 |
| コメント | お名前 | NameLink | |