- HL-14は期待通りに速くなってくれて大変うれしいのですが、その生成コードの質はまだ「いまいち」になっています。具体的に見てみましょう。
>codedump 1
(len=0)
>regVar(0 i)
8b 1d 20 0b 42 00
(len=6)
>run hl3.txt
8b 05 0c 0a 42 00 89 c3 8b c3 40 89 c3 3b 05 28 0b 42 00 0f 8c ef ff ff ff e8 a9 22 f8 fd
(len=30)
- これは、1億回ループのプログラムをcodedump 1の状態でrunした結果です。このコードを見やすい形で書き直すとこうなります。
8b 05 0c 0a 42 00; // EAX = 0;
89 c3; // EBX = EAX;
label:
8b c3; // EAX = EBX;
40; // EAX++;
89 c3; // EBX = EAX;
3b 05 28 0b 42 00; // if (EAX < 1億) goto label;
0f 8c ef ff ff ff;
e8 a9 22 f8 fd; // call time
- まあこれは、HL-14のアルゴリズムを考えれば、こうなって当然なのですが、しかし「あちゃー」と言いたくなるような結果でもあるのです。
- どこが低品質なのかというと、EBXレジスタを使っているにもかかわらず(=メモリじゃないのに)、わざわざEAXに持ち替えてから処理をしているところがだめなのです。
- 理想を考えると以下のようになります。
8b 1d 0c 0a 42 00; // EBX = 0;
label:
43; // EBX++;
3b 1d 28 0b 42 00; // if (EBX < 1億) goto label;
0f 8c ef ff ff ff;
e8 a9 22 f8 fd; // call time
- 普通ならこのようにEBXをEBXのままで演算すべきなのです。これなら1ループ当たりの命令数は5→3となるので、高速化が期待できます。