[1]optimizerX86()関数を以下のものと差し替え
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) != 0x05) return 0;
return isConst(((AInt *) get32(p + 1)) - var);
}
int getConstM(unsigned char *p)
{
return *((AInt *) get32(p + 1));
}
void putIcX86(String s, IntP p0, IntP p1, IntP p2, IntP p3); // プロトタイプ宣言.
void optimizerX86()
{
int i;
if (icq0 != icq) {
if (icq0[0] == 0x0f && 0x90 <= icq0[1] && icq0[1] <= 0x9f) { // SETcc
icqSet = icq0;
}
+ if (icq0[0] == 0x8b && isConstM(&icq0[1])) { // 8b.
+ int reg = (icq0[1] >> 3) & 7, i = getConstM(&icq0[1]);
+ icq = icq0;
+ if (i == 0) { putIcX86("31_%0c", (IntP) (reg * 9 + 0xc0), 0, 0, 0); }
+ else { putIcX86("%0c_%1i", (IntP) (reg + 0xb8), (IntP) i, 0, 0); }
+ }
+ if (icq0[0] <= 0x3f && (icq0[0] & 7) == 3 && isConstM(&icq0[1])) { // 03, 0b, 13, 1b, 23, 2b, 33, 3b.
+ int reg = (icq0[1] >> 3) & 7, i = getConstM(&icq0[1]);
+ icq = icq0;
+ if (-0x80 <= i && i <= 0x7f) { putIcX86("83_%0c_%1c", (IntP) ((icq0[0] & 0x38) + reg + 0xc0), (IntP) i, 0, 0); }
+ else { putIcX86("81_%0c_%1i", (IntP) ((icq0[0] & 0x38) + reg + 0xc0), (IntP) i, 0, 0); }
+ }
+ if (icq0[0] == 0x0f && icq0[1] == 0xaf && isConstM(&icq0[2])) { // 0f_af.
+ int reg = (icq0[2] >> 3) & 7, i = getConstM(&icq0[2]);
+ icq = icq0;
+ if (-0x80 <= i && i <= 0x7f) { putIcX86("6b_%0c_%1c", (IntP) (reg * 9 + 0xc0), (IntP) i, 0, 0); }
+ else { putIcX86("69_%0c_%1i", (IntP) (reg * 9 + 0xc0), (IntP) i, 0, 0); }
+ }
+ if (icq0[0] == 0x83 && (icq0[1] & 0xf8) == 0xc0 && icq0[2] == 1) { // ADD 1 → INC.
+ icq = icq0;
+ putIcX86("%0c", (IntP) ((icq0[1] & 7) + 0x40), 0, 0, 0);
+ }
+ if (icq0[0] == 0x83 && (icq0[1] & 0xf8) == 0xe8 && icq0[2] == 1) { // SUB 1 →DEC.
+ icq = icq0;
+ putIcX86("%0c", (IntP) ((icq0[1] & 7) + 0x48), 0, 0, 0);
+ }
+ if (icq0[0] == 0x83 && (icq0[1] & 0xf8) == 0xf8 && icq0[2] == 0) { // CMP 0 → TEST.
+ icq = icq0;
+ putIcX86("85_%0c", (IntP) ((icq0[1] & 7) * 9 + 0xc0), 0, 0, 0);
+ }
if (icq0[0] == 0x8b && icq1 != 0 && icq1[0] == 0x89 && icq0[1] == 0x05 && icq1[1] == 0x05 && get32(icq0 + 2) == get32(icq1 + 2)) {
icq = icq0; // 8b命令は削除.
i = (IntP) get32(icq1 + 2) - var;
if (TcTmp0 <= i && i <= TcTmp9) {
icq = icq1; // 89命令も削除.
}
}
icq1 = icq0;
icq0 = icq;
}
if (icqSet + 14 == icq && memcmp(&icqSet[2], "\xc0\x0f\xb6\xc0\x85\xc0\x0f", 7) == 0 && 0x84 <= icqSet[9] && icqSet[9] <= 0x85) {
memcpy(&icqSet[2], &icqSet[10], 4);
icqSet[1] -= 0x10; // SETcc → Jcc.
if (icqSet[9] == 0x84) {
icqSet[1] ^= 1; // 条件反転.
}
icq0 = icq = icqSet + 6;
icq1 = icqSet = 0;
jmps[jp - 1] = icq - 4 - ic;
}
}
[2]defLabel()関数を以下のものと差し替え
int align;
void defLabel(int i)
{
+ if (align > 0) {
+ int j = (icq - ic) & 15; // 0-15.
+ if (j > 0 && j <= 7) {
+ putIcX86("66_0f_1f_84_00_00_00_00_00", 0, 0, 0, 0);
+ j = (j + 9) & 15;
+ }
+ if (j > 0) { // 8-15.
+ static char *table[8] = {
+ "0f_1f_84_00_00_00_00_00", "0f_1f_80_00_00_00_00",
+ "66_0f_1f_44_00_00", "0f_1f_44_00_00", "0f_1f_40_00", "0f_1f_00", "66_90", "90"
+ };
+ putIcX86(table[j - 8], 0, 0, 0, 0);
+ }
+ align--;
+ }
var[i] = icq - ic;
icq1 = icqSet = 0;
}