ぼくのかんがえたさいきょうCPU:ローテート/シフト命令

シフト命令:ビット単位
ROR 右ローテート
ROL 左ローテート
SHR 右シフト
SHL 左シフト

シフト命令:バイト単位
RORB 右ローテート
ROLB 左ローテート
SHRB 右シフト
SHLB 左シフト

ぼくのかんがえたさいきょうCPU 2018命令フォーマットメモ

 シフト命令は対象となるビット列のデータを指定した数分右または左にずらすビット操作命令の一種。右方向とはMSBからLSBに向かって、左方向とはLSBからMSBに向かって。ローテート命令は対象となるビット列をシフトしてデータ幅を越えた部分のデータが、シフトしてできた空いた領域にはいる。

 ローテート動作を基本に、シフト命令はローテート後に0マスクされると考える。SHR右シフトはROR右ローテート後、MSBから指示したシフト量分0で埋める。SHL左シフトはROL左ローテート後、LSBから指示したシフト量分0で埋める。

 さて、算術シフト命令だがこれは2の補数による符号付き整数に対する特別な操作と考える。本来なら乗算/除算命令で扱うべきところを2のべき乗の乗数/除数のときにかぎり高速にできるということで存在する。浮動小数点などを四則演算で一緒くたに扱えるプロセッサでは特別な演算となってしまうのだが、従来存在するプロセッサとの互換性を考えるとビット操作命令の一種として存在させたほうがよさそう。
 算術左シフト命令はそのままSHLB左シフト命令が適用できる。算術右シフト命令はSHRB右シフト命令後にMSBのビットをLSB側に向かって指定数分埋めるSEXT符号拡張命令を適用する。

 シフト量の指定について。データサイズが非常に大きい場合にそれを扱えるバレルシフタを用意するのはコストに見合わないし、シフタが対応するビット数分ハードウェアの制御で複数サイクルで対応させるのは実装が大変そうだ。そこでハードウェアでサポートする最低限のシフト量指示を3bitとする。これにより0〜7bitのシフトは即実行し、これより大きいシフト量はトラップを発生してそちらで処理する。もちろん3bit分よりも大きいシフト量をハードウェアでサポートしてもよい。シフト量が即値指示の場合はビットシフトとバイトシフトを組み合わせることでトラップを発生させることなくシフト操作が可能。バイトシフトとビットシフトをひとつづつの組み合わせで0~63bitのシフトが可能。これ以上はバイトシフトの複数回適用か、またはバイトシフト命令のオペランドにバイト数のマルチプライヤ(×64、×512…)を検討する。

 TRONCHIPではシフト量を符号付き整数で指定してシフト方向を変えることができるが、上記のシフト量の拡張性を考えた場合は符号なし整数としてシフト量を指定したほうが簡単になりそうなのでそうしてみた。

 レジスタを分割して使用するレーンについてもこのシフト命令/ローテート命令と同様な操作を検討する。ほとんどの場合有用なのはローテート操作と思われる。


アズワン1-5181-02チューブローテーター3~50rpmスチール
アズワン1-5181-02チューブローテーター3~50rpmスチール

"ぼくのかんがえたさいきょうCPU:ローテート/シフト命令" へのコメントを書く

お名前
メールアドレス
ホームページアドレス
コメント