2021:BKSC 命令の分類

 オペコードのビット列を考えるために、各命令を分類し何種類割り当てられるか検討する。頻出する命令は1バイトに割り当てたい。
1バイト=8bitで、オペコードとオペランドの識別に1bit使ったら残りは7bit。

オペコード 1xxxxxxx
オペランド 0xxxxxxx

 各命令は直前の命令の結果を参照し、オペランドで汎用レジスタとともにソースとして指定することができる。オペランドがなければ単項演算子のようにふるまい直前の命令の結果をもとに演算を行い結果を次の命令に渡すことができる。

・1_000 条件分岐命令 16種類(4bit) - 直前の演算結果の判定
 beq bne bgt bge blt ble brn bra ...
・1_001 算術演算命令 16種類(4bit) - 数値と数値を演算し結果は数値
 add sub mul div ...
・1_010 論理演算命令 16種類(4bit) - ビット列とビット列を演算し結果はビット列
 and or xor andn orn nor ...
・1_011 ビット演算命令 16種類(4bit) - ビット列を数値で操作し結果はビット列 / ビット列から数値の情報を得る
 sll srl ... popc clz ...

以上で6bit分を使った。残り6bit分 0_1xxxxxx の64個はどうするか。

・1_10x xxxx ロードストア命令 ロードとストアの2種だがアクセス幅の指定が必要

・1_11x xxxx SIMD操作命令 演算ではなくシャッフルなどを行う命令 未検討 2バイト命令にして領域だけ確保しておく
・レジスタ割当など

 ここでなぜロードストアにサイズ指定が必要か考える。レジスタの幅が決まっていれば、その幅分メモリにアクセスすればよいのだけれども、レジスタの幅指定は動的に決まるのでプロセッサが実行する分には問題なくてもコードを解析して追う側からすれば大変。そこでメモリとのやりとりではサイズ指定を必須とする。4bitあれば2の15乗=32768バイトまで指定可能。3bitでは128バイト、1024bitとなりAVXが512bitなので少し足らないのではないかな。メモリアクセスの方向に1bitとして:
・1_100 xxxx ロード
・1_101 xxxx ストア
とし、LL/SCやエンディアン指定は2バイト命令にしたときの命令フィールドかオペランドに埋め込むことにする。

 ビット演算命令は定義があまりそうだし、SIMD操作命令はまだよくわからないので2バイト命令への拡張の余地を用意しておく。
次回より各種類の命令について決めていく。

ブログ気持玉

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

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

→ログインへ

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

気持玉数 : 0

この記事へのコメント