>codedump 1 (len=0) >a=b+c-d 8b 05 58 0b 42 00 03 05 5c 0b 42 00 89 05 90 0a 42 00 8b 05 90 0a 42 00 2b 05 60 0b 42 00 89 05 94 0a 42 00 8b 05 94 0a 42 00 89 05 54 0b 42 00 (len=48)
8b 05 58 0b 42 00; // EAX = b; 03 05 5c 0b 42 00; // EAX += c; 89 05 90 0a 42 00; // _t0 = EAX; 8b 05 90 0a 42 00; // EAX = _t0; 2b 05 60 0b 42 00; // EAX -= d; 89 05 94 0a 42 00; // _t1 = EAX; 8b 05 94 0a 42 00; // EAX = _t1; 89 05 54 0b 42 00; // a = EAX;
8b 05 58 0b 42 00; // EAX = b; 03 05 5c 0b 42 00; // EAX += c; 2b 05 60 0b 42 00; // EAX -= d; 89 05 54 0b 42 00; // a = EAX;
>if (a+b<c-d) { x=0; }
8b 05 54 0b 42 00; // EAX = a;
03 05 58 0b 42 00; // EAX += b;
89 05 90 0a 42 00; // _t0 = EAX;
8b 05 5c 0b 42 00; // EAX = c;
2b 05 60 0b 42 00; // EAX -= d;
89 05 94 0a 42 00; // _t1 = EAX;
8b 05 90 0a 42 00; // EAX = _t0;
3b 05 94 0a 42 00; // if (EAX < _t1) { EAX = 1: } (SETL)
0f 9c c0;
0f b6 c0;
89 05 98 0a 42 00; // _t2 = EAX;
8b 05 98 0a 42 00; // EAX = _t2;
85 c0; // if (EAX == 0) goto skip;
0f 84 0c 00 00 00;
8b 05 0c 0a 42 00; // EAX = 0;
89 05 64 0b 42 00; // x = EAX;
skip: 8b 05 54 0b 42 00; // EAX = a;
03 05 58 0b 42 00; // EAX += b;
89 05 90 0a 42 00; // _t0 = EAX;
8b 05 5c 0b 42 00; // EAX = c;
2b 05 60 0b 42 00; // EAX -= d;
89 05 94 0a 42 00; // _t1 = EAX;
8b 05 90 0a 42 00; // EAX = _t0;
3b 05 94 0a 42 00; // if (EAX >= _t1) goto skip;
0f 8d 0c 00 00 00;
8b 05 0c 0a 42 00; // EAX = 0;
89 05 64 0b 42 00; // x = EAX;
skip:unsigned char *icq0, *icq1, *icqSet;
void optimizerX86()
{
int i;
if (icq0 != icq) {
if (icq0[0] == 0x0f && 0x90 <= icq0[1] && icq0[1] <= 0x9f) { // SETcc
icqSet = icq0;
}
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;
}
}void putIcX86_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++;
+ optimizerX86();
} else if (getHex(s[i]) >= 0 && getHex(s[i + 1]) >= 0) { // 16進数2桁.
(中略)
}void defLabel(int i)
{
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;
putIcX86("60; 83_ec_7c;", 0, 0, 0, 0); // PUSHAD(); SUB(ESP,124);
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 | 804 |
| maze.c | 2192 | 2192 | 2192 | 1914 |
| kcube.c | 4623 | 4623 | 4623 | 3779 |
| invader.c | 3260 | 3260 | 3260 | 2774 |
| コメント | お名前 | NameLink | |