- 今回の最適化は、a = b + c - d; みたいな式に関するものです。HL-14aでは、こうなります。
>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;
- はい、これはひどいです。_t0や_t1に書いたり読み込んだり、そんなの全然必要ないことです。掛け算や割り算など、異なる優先順位の演算がまざってもいいように問答無用で一時変数に代入するようにしていることが、この無駄の原因になっています。
- これに対して、理想形はこうなります。
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;
- っていうか、普通こうなるべきですよね。