>codedump 1 (len=0) >a=b+c-d 48 8b 85 d0 02 00 00 48 03 85 d8 02 00 00 48 89 85 20 01 00 00 48 8b 85 20 01 00 00 48 2b 85 e0 02 00 00 48 89 85 28 01 00 00 48 8b 85 28 01 00 00 48 89 85 c8 02 00 00 (len=56)
48 8b 85 d0 02 00 00; // RAX = b; 48 03 85 d8 02 00 00; // RAX += c; 48 89 85 20 01 00 00; // _t0 = RAX; 48 8b 85 20 01 00 00; // RAX = _t0; 48 2b 85 e0 02 00 00; // RAX -= d; 48 89 85 28 01 00 00; // _t1 = RAX; 48 8b 85 28 01 00 00; // RAX = _t1; 48 89 85 c8 02 00 00; // a = RAX;
48 8b 85 d0 02 00 00; // RAX = b; 48 03 85 d8 02 00 00; // RAX += c; 48 2b 85 e0 02 00 00; // RAX -= d; 48 89 85 c8 02 00 00; // a = RAX;
>if (a+b<c-d) { x=0; }
48 8b 85 c8 02 00 00; // RAX = a;
48 03 85 d0 02 00 00; // RAX += b;
48 89 85 20 01 00 00; // _t0 = RAX;
48 8b 85 d8 02 00 00; // RAX = c;
48 2b 85 e0 02 00 00; // RAX -= d;
48 89 85 28 01 00 00; // _t1 = RAX;
48 8b 85 20 01 00 00; // RAX = _t0;
48 3b 85 28 01 00 00; // if (RAX < _t1) { RAX = 1: } else { RAX = 0; } (SETL)
0f 9c c0;
0f b6 c0;
48 89 85 30 01 00 00; // _t2 = RAX;
48 8b 85 30 01 00 00; // RAX = _t2;
48 85 c0; // if (RAX == 0) goto skip;
0f 84 0e 00 00 00;
48 8b 85 18 00 00 00; // RAX = 0;
48 89 85 e8 02 00 00; // x = RAX;
skip: 48 8b 85 c8 02 00 00; // RAX = a;
48 03 85 d0 02 00 00; // RAX += b;
48 89 85 20 01 00 00; // _t0 = RAX;
48 8b 85 d8 02 00 00; // RAX = c;
48 2b 85 e0 02 00 00; // RAX -= d;
48 89 85 28 01 00 00; // _t1 = RAX;
48 8b 85 20 01 00 00; // RAX = _t0;
48 3b 85 28 01 00 00; // if (EAX >= _t1) goto skip;
0f 8d 0e 00 00 00;
48 8b 85 18 00 00 00; // RAX = 0;
48 89 85 e8 02 00 00; // x = RAX;
skip:unsigned char *icq0, *icq1, *icqSet;
void optimizerX64()
{
int i;
if (icq0 != icq) {
if (icq0[0] == 0x0f && 0x90 <= icq0[1] && icq0[1] <= 0x9f) { // SETcc
icqSet = icq0;
}
if (icq0[0] == 0x48 && icq0[1] == 0x8b && icq1 != 0 && icq1[0] == 0x48 && icq1[1] == 0x89 && icq0[2] == 0x85 && icq1[2] == 0x85 && get32(icq0 + 3) == get32(icq1 + 3)) {
icq = icq0; // 8b命令は削除.
i = get32(icq1 + 3) / sizeof (AInt);
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;
}
}void putIcX64_sub(String s, IntP a[])
{
int i, j, k;
unsigned char addVal = 0, r = 0;
for (i = 0; s[i] != 0; ) {
! if (s[i] == ' ' || s[i] == '\t' || s[i] == '_' || s[i] == ':') {
i++;
+ } else if (s[i] == ';') {
+ i++;
+ optimizerX64();
} else if (getHex(s[i]) >= 0 && getHex(s[i + 1]) >= 0) { // 16進数2桁.
(中略)
}void defLabel(int i)
{
if (align > 0) {
int j = (icq - ic) & 15; // 0-15.
if (j > 0 && j <= 7) {
putIcX64("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"
};
putIcX64(table[j - 8], 0, 0, 0, 0);
}
align--;
}
var[i] = icq - ic;
+ icq1 = icqSet = 0;
}int compile(String s)
{
int pc, pc1, i, j;
unsigned char *icq1, *icp;
pc1 = lexer(s, tc);
tc[pc1++] = TcSemi; // 末尾に「;」を付け忘れることが多いので、付けてあげる.
tc[pc1] = tc[pc1 + 1] = tc[pc1 + 2] = tc[pc1 + 3] = TcDot; // エラー表示用のために末尾にピリオドを登録しておく.
! icq = icq0 = ic;
jp = 0;
+ icq1 = icqSet = 0;
putIcX64("41_57; 41_56; 41_55; 41_54; 41_53; 41_52;", 0, 0, 0, 0);
putIcX64("41_51; 41_50; 57; 56; 55; 54; 53; 52; 51; 50;", 0, 0, 0, 0);
putIcX64("%R_81_ec_f8_01_00_00; %R_bd_%0q;", var, 0, 0, 0);
regVarSaveLoad(RvLoad);
dump0 = icq;
(中略)
}>a=b+c-d 8b 05 30 0b 42 00 03 05 34 0b 42 00 2b 05 38 0b 42 00 89 05 2c 0b 42 00 (len=24)
>if (a+b<c-d) { x=0; }
8b 05 2c 0b 42 00 03 05 30 0b 42 00 89 05 a0 0a 42 00 8b 05 34 0b 42 00 2b 05 38 0b 42 00 89 05 a4 0a 42 00
8b 05 a0 0a 42 00 3b 05 a4 0a 42 00 0f 9c c0 83 e0 01 85 c0 0f 84 0c 00 00 00 8b 05 1c 0a 42 00
89 05 60 0b 42 00
(len=74)| HL-13a | HL-14 | HL-14a | HL-15 | |
| mandel.c | 1087 | 1007 | 942 | 768 |
| maze.c | 2192 | 2192 | 2192 | 1770 |
| kcube.c | 4623 | 4623 | 4623 | 3695 |
| invader.c | 3260 | 3260 | 3260 | 2750 |
| コメント | お名前 | NameLink | |