実レジスタ活用
もくてき
- 実レジスタをもっと使ったら速くなるんじゃないかという話。
こうさつ
- (1) x86の32bitモードは、32bitレジスタが8本しかない。しかもそのうちの1つはスタックポインタで、自由には使えない。
- まずR00-R3F,P00-P1Fへのアクセスのためには、すくなくとも2つの作業用のレジスタが必要になる。LIMMとかADDとかだけならEAXだけで何とかなるけど、LMEMとかSMEMとかをやるときにはどうしてもEAXだけではうまくいかない。もう一つレジスタが必要になる。それにシフト演算のときもCLを使う必要がある。
- 実はosecpu027aでは、レジスタを結構雑に使っていて、他にもいろんなレジスタを汚してしまっている。反省。
- (2) いくつかのよく使う仮想レジスタを実レジスタに固定で割り振れるとしたら、なんかとっても速くなりそうな気はする。
- まあ実際のところは試してみないと分からないんだけど。
- ということで、思いっきりレジスタを節約する方向で考えてみる。
- まず、現在EBP上に展開しているレジスタイメージを、スタック上にコピーしてしまおう。そうすれば、EBPがあく。
- OSECPUは関数callなどをしても実CPUのスタックにリターンアドレスを積んだりはしないので、ESPが変化しない。だからこそできるテクニックだ。
- 次にECXを必要とする命令は少数なので、これを特別扱いにして、それらの命令のときだけECXを仮想レジスタ域に退避して、そしてECXを使って目的を達して、その後にECXを復元する。
- これで結局、EAXとESP以外のレジスタが使えて、ECXもまあまあ使えるということになる。5.5レジスタくらいというところかな。
- (3) この5.5レジスタを、どのように割り振るべきかは意見の分かれるところだろうなあ。
- やっぱり使用頻度の高いレジスタに割り当てるべきなんだろうな。
- というかむしろ発想は逆で、実レジスタに割り当てることになったものを積極的に使えばいいわけだ。OSECPUのアセンブラで。
- コンパイラとか使う人は、速度が大して重要じゃなくてとにかく楽して作ることを優先している人だから、その人のことを考える必要はない。もし速度が出したくなったらそこだけアセンブラで書いてうまいレジスタを使い方をすればいいだけなんだから。
こめんと欄
- このページにこめんと欄はありません。このページの内容にコメントしたいときはimpressionsにお願いします。