竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU 16bit単位半可変長命令形式

<<   作成日時 : 2013/05/22 01:42   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

 機械語をデコードしやすい形でどう押し込めたらよいか。
RISCの固定長命令では大きな定数が扱いにくい。定数は書き込まれることはないので、ソースレジスタの指定とひとくくりにしてしまう。以前から考えていたプリフィックス命令に入れてしまおう。ここでは命令長を短くするのではなくデコードを楽にする方法を優先して考えている。
 前回考えたのは16bit命令長のサブセットだった。
 ぼくのかんがえたさいきょうCPU 16bit命令長実装
 が、16bit長単位でフルセットの機能を押し込められそうな感じがしてきた。

基本は三種:
・演算命令+ディスティネーションレジスタ
・メモリ操作命令+ソース(STOREの時)orディスティネーション(LOADの時)レジスタ
・制御命令+ディスティネーションレジスタ(Jump&Link、Conditional MOVEの時)

これにプレフィックス命令で即値またはソースレジスタを指定して1つの意味のある命令にする。

命令列は以下の様に定義する。BNFもどきでスマン。

[ ]内は省略可、{}内は|で区切ったものどれかを選択

命令=[プリフィックス命令…]{ ALU命令 | メモリ操作命令 | 分岐命令|特殊命令 }
プリフィックス命令={ 定数 [定数…] | [定数…] 定数、S1 [S2,S3] | [定数…] S1,S2 }

プリフィックス命令をつなげることにより、以下の表現ができる:
・なし
・定数のみ
・定数とソースレジスタ1
・定数とソースレジスタ1、ソースレジスタ2
・定数とソースレジスタ1、ソースレジスタ2、ソースレジスタ3

連続した定数はMSB側から順にならべ、符号付き整数とみなす。
プリフィックス命令で指定されなかったソースレジスタについては、ゼロとみなす。これにより少し制約はあるがゼロレジスタを特に用意しなくても'0'の利用ができる。
また、定数付きの4オペランド命令が利用できる。引数によって動作を変えられる。
通常の命令はソースレジスタを追い出した事により、命令種別+命令詳細+レジスタといった簡単なフォーマットになった。

定数,Rs1,Rs2のフォーマットは、定数部分がALU命令の動作を修飾する。
ALU命令での例:
・定数のみ+ALU命令 ADD 0,Rd # 0→Rd
・定数とソース1個+ALU命令 ADD 1,Rs,Rd # Rs+1→Rd
・定数とソース2個+ALU命令
 (定数=0のとき) ADD Rs1,Rs2,Rd # Rs1+Rs2→Rd
 (定数=1のとき) ADDC Rs1,Rs2,Rd # Rs1+Rs2+carry→Rd キャリー付き演算
・定数とソース3個は積和演算など

メモリ操作命令ではアドレッシングモードとして使える。
定数,Rs1,Rs2のフォーマットは、定数部分がメモリ操作命令の動作を修飾する。
ロード命令での例:
・定数のみ+ロード命令 ★禁止 LD 0,Rd # (0)→Rd
・定数とソース1個+ロード命令 LD 1,Rs,Rd # (Rs+1)→Rd
・定数とソース2個+ロード命令
 (定数=0のとき) LD Rs1,Rs2,Rd # (Rs1+Rs2)→Rd
 (定数=1のとき) LD Rs1,Rs2,Rd # (Rs1+Rs2)→Rd で(Rs1+Rs2)の下位bitエンディアン有効
・定数とソース3個 Reserved


汎用レジスタ長:制約なし(16〜256bit)
汎用レジスタ数:R0〜R63 64本


命令基本フォーマット:tt_rrrrrr_kkkkkkkk 16bit長

[15:14] tt 命令種別
00 ALU
01 メモリ操作
10 分岐
11 ソース指定/特殊命令
[13:8] Destinationレジスタ R0〜R63、ストア命令ではSourceレジスタ R0〜R63
[7:0] kkkkkkkk 命令詳細
各命令種別ごとに定義
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
□11…プリフィックス命令 ソース指定/特殊命令
11_0_ccccccccccccc
[12:0] ccccccccccccc 13bit定数

11_10_bbbbbb_aaaaaa
[11:6] bbbbbb ソースレジスタb
[5:0] aaaaaa ソースレジスタa

11_110_ccccc_aaaaaa
[10:6] ccccc 5bit定数 [5:0] レジスタa
11_111_sssss_aaaaaa
[10:6] 特殊命令 32種
[5:0] レジスタaaaaaa (必要なら)
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
□ALU
00_dddddd_kkkkkkkk
[13:8] Destinationレジスタ R0〜R63
[7:0] ALU命令種別(256種類)
ALU命令詳細
[7] Float
[6] SIMD
[5:0] 6bit 命令64種類
うち、[5:4]で種類を分類する。
00_xxxx 論理演算命令
01_xxxx 固定小数点演算命令
10_xxxx シフト、ビット操作命令
11_xxxx その他の命令

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
□メモリ操作
01_dddddd_kkkkkkkk
[13:8] dddddddd Destinationレジスタ R0〜R63、またはSourceレジスタR0〜R63(ストア系)
[7:0] kkkkkkkk メモリ操作命令種別(256種類)
メモリ操作命令詳細
[7] Float
[6:4] Width 8/16/32/64/128/256/512/1024
[3:0] 4bit 命令16種類

[7:4] Float/Int組み合わせ
I-8 Byte
I-16 W(2バイト)
I-32 S(4バイト)
I-64 D(8バイト)
I-128 Q(16バイト)
I-256 O(32バイト)
I-512 H(64バイト)
I-1024 T(128バイト)
F-8 ×なし 特別に使用
F-16 ×なし 特別に使用
F-32 単精度(4バイト)
F-64 倍精度(8バイト)
F-128 四倍精度(16バイト)
F-256 SIMD256(32バイト)
F-512 SIMD512(64バイト)
F-1024 SIMD1024(128バイト)

[3:0] 4bit 命令
LD Rd ロード/ST Rs ストア
0フィル/ロードデータ符号拡張
下位bitエンディアン指示/無視→アドレッシングモードで対応
LL/SC
LEA
(LD from I$)

[3] 0... LD命令(レジスタ指定がRd) 1…ST命令(レジスタ指定がRs)

0xxx ロード命令詳細
[2:0]
000… 通常ロード,ロードデータ0フィル
001… 通常ロード,ロードデータ符号拡張
010… LEA
011… LL

1xxx ストア命令詳細
000… 通常ストア
001
010
011… SC
100
101
110
111

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
□分岐
01_dddddd_kkkkkkkk
[13:8] dddddddd Destinationレジスタ R0〜R63 Jump&LinkのLinkレジスタや制御転送
[7:0] kkkkkkkk 分岐命令種別(256種類)
または
01_kkkkk_bbbbbbbbb
[13:9] 分岐条件
[8:0] bbbbbbbbb 相対分岐オフセット
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
エントリポイントを考慮した命令フォーマット、プリフィックス廃止
 命令長は16bit単位の可変長で、分岐命令から参照されることを明示するエントリポイントを追加するにはどうしたらよいか。プリフィックスによる修飾だと定数のbit幅などが減り、プリフィックスなしの命令にもエントリポイントの1bitが必要となり効率が悪い。そこで本命令+ポストフィックス命令の形式に変更し、本命令のみエントリポイントを示すビットを追加することにした。  変わってくるのは命令の後ろに修飾が付くので次の命令がデコードされるまで前命令が発行できないということ。だがパイプライン実行前提... ...続きを見る
竹下世界塔の計算機よもやま話
2013/12/31 06:27

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU 16bit単位半可変長命令形式 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる