2021:ビット操作

 ビット操作命令は入力をビット列とみなし、数値を指定して加工を行い、結果をビット列として返す。

 シフト命令は指定した数分MSB側(左)またはLSB側(右)にビットをシフトする。シフトして空いた部分には0を挿入する。シフト操作はビット列を2進数の数値とみなした場合、左シフトは2のn乗の乗算、右シフトは2のn乗での除算ができる。また、ビット列の幅から最後にはみ出した部分を条件フラグに格納すれば、特定の位置のビットを取り出すことができる。右シフトではビット列のMSBの値をシフトして空いた部分に埋める事により、ビット列を2の補数表現とみなしたときの除算ができる。論理シフト/算術シフトと区別して呼ぶことがある。
 ローテート命令はシフト命令で空いた部分にシフト命令で余った部分を順次挿入した結果になる。ローテート命令は算術的な動作はない。このため、シフト命令はあってもローテート命令は省略されているプロセッサもある。

https://keisanki.at.webry.info/200910/article_11.html

 入力、数値指定を複数使うビット操作命令もある。EXTRACT命令は入力ビット列の任意の位置(開始ビット位置、サイズ)からビット列を取り出し、右詰めで結果を返す。必要なら符号拡張も行う。INSERT命令は入力ビット列に対して任意の位置(開始ビット位置、サイズ)に指定したビット列を挿入する。

https://keisanki.at.webry.info/201410/article_3.html


 ビット列の任意の位置のビットをMSB側にコピーすることにより、ビット列をレジスタの最大幅まで2の補数として拡張できる符号拡張命令も考えられる。これはロード命令の動作として、1バイトのデータを読み込んだ時に汎用レジスタの幅に合わせて符号拡張する場合もある。

 ビット列の順序を入れ替える、またはバイト単位などのかたまりで入れ替えるシャッフル命令はエンディアンの違いを変換できる。入力されたビット列に対して入れ替えの指示は次のように定義できる。入れ替え指示のbit0が1ならば、入力ビット列のbit0とMSBを入れ替え、入れ替え指示のbit1が1ならば、入力ビット列のbit1とMSB-1の位置を入れ替え、……とこのようにすればビットのシャッフルが可能になる。

 機能としてはこれくらいだが、実現するには回路規模の問題がある。バレルシフタは指定した任意のシフト量を出力する組み合わせ回路だが、ビット幅が増えると規模も増大し、1サイクルでの実行には間に合わないかもしれない。そこでシフトする単位を加味してみる。2のn乗バイト(n≧0)単位で0~8シフトすることを考えると、n=0で1bit単位のシフトで8bit、n=1で8bit単位のシフトで64bit、n=2で16bit単位のシフトで128bit…の様に指定する。シフトに指定する数値はシフト単位とシフト量にすれば、これらの複数の組み合わせで任意ビットのシフトが実現できる。この部分はプロセッサの内部実装に隠すこともできるが、命令として指定できれば(演算器が別なら)同時に実行できるなど柔軟性が増す。


以上から考えた必要なもの:
・シフト命令必須
・ローテート命令はついで
・INSERT/DEPOSIT命令があれば便利
・シャッフル同盟いやシャッフル命令
・シフト量の調整

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント