2021:BKSC 論理演算命令

1_010_xxxx 論理演算命令

 まずは簡単そうな論理演算命令から。ビット列とビット列の演算16種類で結果はビット列。引数はオペランドで指定する。ここでは2つの引数をA,Bとあらわす。

0000 ALL0 - A,Bを無視してall0を返す
0001 ALL1 - A,Bを無視してall1を返す
0010 SELA - Aを返す
0011 NSELA - !A
0100 SELB - Bを返す
0101 NSELB - !B
0110 XOR - A xor B
0111 NXOR - !(A xor B)
1000 AND - A and B
1001 NAND - !(A and B)
1010 ANDN - !A and B
1011 NANDN - !(!A and B)
1100 OR - A or B
1101 NOR - !(A or B)
1110 ORN - !A or B
1111 NORN - !(!A or B)

 何もしないような冗長な演算が入っているように見えるが、この4bitの演算指示はSIMD命令などで使用するパターンになる。このためSIMD演算での要素を次にスルーしたり0にしたりもできる。

 オペランドのない単項演算としての定義は以下のとおり。

0000 ALL0 - Aを無視してall0を返す
0001 ALL1 - Aを無視してall1を返す
0010 SELA - Aを返す
0011 NOT - !Aを返す

POPC、CLZ、CTZも入力は1つなのでここに含めてもいいのだが、これらはビット列から数値を得る命令なのでビット演算命令に分類する。行き場がなかったらここに含める。余ったパターンは未定。上位2bitをdon't careにするかもしれない。

 論理演算命令は汎用レジスタの全体に対して適用する。入力A,Bは同じサイズを期待しており、出力はAと同じサイズ。Bのサイズが大きければAのサイズに合わせてBの下位バイトから選択される。Bのサイズが小さければAのサイズに一致するまで繰り返し適用される。

 オペコードは入力Aのみ、A,B入力のうちAは直前の命令の結果と汎用レジスタ、Bは汎用レジスタと即値の組み合わせがある。直前の命令の結果を%P、汎用レジスタを%A,%B、即値を#nであらわすと以下の通り。

AND %P,%B
AND %P,#n
AND %A,%B
AND %A,#n

2bit必要なのでオペコードをあらわすMSB=0を差し引くと5bitが汎用レジスタや即値の指定に使える。オペコード詳細はすべての演算命令を考えてから決めてみよう。

ブログ気持玉

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

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

→ログインへ

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

気持玉数 : 0

この記事へのコメント