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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU 2009年夏のまとめ

<<   作成日時 : 2009/09/07 21:57   >>

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

 CPUはおおざっぱに言って次のように進化してきた。
LSI化されたCISC
↓ パイプライン、単純化
RISC 32ビットプロセッサ
↓ 集積度向上、IEEE754策定
浮動小数点コプロセッサ内蔵
↓ 命令セットの追加、コンパイラの補助
条件移動命令の追加
↓ 集積度向上、Alphaの登場
64ビット化、浮動小数点レジスタを使ったマルチメディア命令の追加(VIS,MMX,MAX)
↓ パイプライン段数増加、分岐予測、アウトオブオーダ実行
高速化
↓ AltiVec,SSEといった専用レジスタを使うSIMD演算
SIMD機能追加
↓ 少々のリソース追加で論理CPU増加
マルチスレッド
↓ 周波数向上頭打ち
マルチコア
↓ 集積度向上
メモリコントローラ内蔵


 集積度が向上すれば使える面積が増える。それを余らせないように色々な機能が追加されていく。その結果、増築を重ねた温泉旅館のような複雑な構造になってしまった。
ここらへんでいったん整理し、各プロセッサの勉強もしながら命令セットを再定義してみようと思ったのが「ぼくのかんがえたさいきょうCPU」のきっかけだった。まだユーザーモードの命令も定義しきれていないが、命令フォーマットはめどがついた。

全体の目標:
・ユーザモードでのアセンブリ言語の記述は簡潔に(コンパイラ屋さん向け)
・ハードウェアの実装は無理がないように(ハード屋さん向け)
・特権モードの割り込み動作は高速になるように(OS屋さん向け)
・教育用ではなく実用の命令セットにする。
・3オペランドをとるRISC系のレジスタマシン、ゼロレジスタを持つ。
・整数系で扱うデータは符号付きが基本。
・浮動小数点での積和命令(4オペランド)を持つ。
・最大256ビットアーキテクチャ、データアクセスは32ビット単位(バウンダリ)まで可能。
・ストア時にはバイトマスクを指定して任意のバイト位置をストアできる。
・1,2,4,8バイト単位でロード/ストア時に入れ換えを行うことができる。これによりバイエンディアンのサポートが可能。
・メモリ空間(メモリコンシステンシ:RMO)とI/O空間(〃SO)を分ける。それは下位機種ではMEM/IO信号かもしれないし、上位機種ではバスプロトコルの特定ビットかもしれない。

レジスタ:
・汎用レジスタ32/64/128/256ビット×64本、浮動小数点レジスタ32/64/128/256ビット×64本、レジスタ本数はそれぞれ128,256,512本まで拡張可能。
・汎用レジスタ、浮動小数点レジスタはそれぞれ条件フラグを持ち、命令のデスティネーションとして指定された時に更新される。ユーザーモードでは条件分岐命令で参照され、特権モードでアクセス可能。
・汎用レジスタ、浮動小数点レジスタは生存期間を表すライフフラグを持つ。デスティネーション指定でフラグが立ち、演算命令中のソースでEOL(End of Life)指定で落とすことができる。
・浮動小数点レジスタの0,1レジスタは廃止。代わりに浮動小数点定数設定命令を用意する。0,1,-1,π、マシンイプシロン等
・レジスタ長が32ビット、64ビットといった下方へのスケーラビリティを考慮。
・ステータスレジスタを32本持つ。ユーザーモードでアクセスできるレジスタは互換性を考え32ビット幅、特権モードでアクセスできるレジスタは実装依存。
・レジスタを連結して使用する命令は持たない。
※なぜ128/256ビットなのか - 最近のプロセッサは拡張仕様としてSIMD命令の処理に専用のレジスタを持っている。そのレジスタ長が128ビットであり、SIMD命令を汎用レジスタで同じように扱いたいため。
※実現方法はSPARCアーキのASI指定。アドレス空間の意味付けを拡張できる。特殊なレジスタ、診断系は特定のASI番号を付加したロード/ストア命令で参照する。ASI番号のフォーマットを決める。
※整数系と浮動小数点系レジスタを分ける理由 - 整数系は1サイクルで実行できるものが多く、浮動小数点系演算は複数サイクル必要。実装を簡単にするためにも整数系と浮動小数点系は分けて考える。

命令セット:
・依存関係が発生しにくい命令体系にする。レジスタ依存はしかたがないが、直前に変更したモードにより動作が変わるような仕組みはなるべく避ける。
・未定義命令はファームウェアによるエミュレーションで動作させることもできる。ハード実装とソフトのトレードオフができる。
・未実装命令トラップが簡単に処理できるよう、特権モードではRs1,Rs2,Rs3,Rd,AGenの結果にアクセスできる空間を用意する。

命令フォーマット:
・32ビット長が基本で、32ビットのプレフィックス命令を指定することができる。これは最小のデータアクセスが32ビット単位なので合わせるため。
・演算(ALU)命令、ロードストア(LDST)命令、分岐(BRA)命令、プレフィックス命令に分類できる。

必須命令グループ:
・整数演算(除算を除く)
・論理演算
・ビット演算
・整数系SIMD命令(グラフィックス系SIMD命令)
・整数レジスタロード/ストア アドレッシングモード
・プリフェッチ命令
・メモリバリア命令
・Jump&Link
・条件分岐 分岐予測指示
・同期命令(Compare&Swap,Read modify Write,Test&Set等)
・トラップ
・外部割り込み/CPU間割り込み

追加命令グループ:
・浮動小数点演算(除算と平方根を除く)
・浮動小数点レジスタロード/ストア
・浮動小数点SIMD命令
・整数除算
・浮動小数点除算、平方根
・メモリ管理(MMU)
・浮動小数点超越関数
・パフォーマンス測定
・マルチスレッド制御
・特権モード命令拡張(電源管理など)
・ハイパーバイザ支援機能
・RASサポート

□アドレッシングモード
LD [GRb+GRx],Rd ベースレジスタ+インデックスレジスタ
LD [GRb+imm],Rd ベースレジスタ+符号付き即値
LD [PC+GRx],Rd PC相対 レジスタ
LD [PC+imm],Rd PC相対 符号付き即値
LD [GRb+GRx]+,Rd インデックスレジスタ ポストインクリメント
LD -[GRb+GRx],Rd インデックスレジスタ プリデクリメント
LD [PC+GRx]+,Rd PC相対 インデックスレジスタ ポストインクリメント
LD -[PC+GRx],Rd PC相対 インデックスレジスタ プリデクリメント
※GRbにゼロレジスタを指定するとPC扱い。ただしASI空間アクセス時は診断用途が多いためPCではなくゼロレジスタとして扱う。

BNE LABEL 分岐命令 PC相対 符号付き即値

□分岐条件
 5ビット32パターン用意。汎用レジスタ条件24、浮動小数点レジスタ条件8の予定。

□命令フォーマット
・ALU命令
00fsnnnnnnnnnnR22222R11111Rddddd
[31:30] ..0 ALU命令
[29] f .. 浮動小数点命令
[28] s .. SIMD命令
[27:18] .. nnnnnnnnnn 整数演算命令(10bit)
[17:12] .. GRs2
[11:6] .. GRs1
[5:0] .. GRd

・積和浮動小数点命令(4オペランド命令)
00fsDTnnF33333F22222F11111Fddddd
[29] f .. 浮動小数点命令 = 1
[28] s .. SIMD命令
[27] D .. 0 単精度 1 倍精度
[26] T .. 浮動小数点4オペランド命令 = 1
[25:24] nn .. 演算命令
 00 FMADD Fd= FRs1×FRs2+FRs3
 01 FMSUB Fd= FRs1×FRs2ーFRs3
 10 FNMADD Fd= ーFRs1×FRs2+FRs3
 11 FNMSUB Fd= ーFRs1×FRs2ーFRs3
[23:18] .. FRs3
[17:12] .. FRs2
[11:6] .. FRs1
[5:0] .. FRd

s .. SIMD命令が1だと、例えば128ビット幅レジスタで倍精度演算ならレジスタの上位64ビット、下位64ビットをそれぞれ計算する。
→コンディションコードが1つの状態につき最大256ビット長レジスタ÷単精度32ビット=8組必要。

・浮動小数点命令
00fsDTnnnnnnnnF22222F11111Fddddd
[29] f .. 浮動小数点命令 = 1
[28] s .. SIMD命令
[27] D .. 0 単精度 1 倍精度
[26] T .. 浮動小数点4オペランド命令 = 0
[25:18] nnnnnnnn .. 浮動小数点演算命令(8bit)
[17:12] .. FRs2
[11:6] .. FRs1
[5:0] .. FRd

・分岐命令
10condfmhh----Rccccc------------
[31:30] .. 10 分岐命令
[29:25] condf .. 条件
[24] m .. 1なら条件転送命令 0なら分岐命令
[23:22] hh .. m=0のとき分岐ヒント 10 強い非分岐 00 弱い非分岐 11 強い分岐 01 弱い分岐
m=1のとき転送元指定 1なら即値,0なら汎用レジスタ番号 m=1,f=1,h=1は未定義
[17:12] .. Gcc or Fcc番号
[21:18][11:0] 符号付き16ビットPC相対値、命令長は32ビットなので"00"をゲタはかせ。

・条件移動命令
10condfmhh----RcccccRsssssRddddd
[24] m .. 1 条件移動
[23:22] hh .. m=1のとき転送元指定 00 汎用レジスタ 01 整数即値 10 転送元/先とも浮動小数点レジスタ 11 未定義
[21:18] .. レジスタ間転送命令の時未定義(浮動小数点-汎用レジスタ間の転送が指定できるだろうか?要検討) →ライフフラグ?SIMD?
[11:6] .. 転送元レジスタ
[5:0] .. 転送先レジスタ

10condfmhh----Rccccc------Rddddd
[23:22] hh .. 01 即値
[21:18][11:6] 符号付き10ビット即値

・ロード/ストア命令
01fsnnwwppLLLLRxxxxxRbbbbbRddddd
[31:30] ..01 ロード/ストア命令
[29:26] fsnn .. ロード/ストア命令(4bit)
浮動小数点(FLD/FST) / ロード/ストア / 汎用レジスタロードの符号拡張あり/なし / 特殊命令(セマフォ、LEA,サブルーチンコール)
浮動小数点ロード 浮動小数点ストア
汎用ロード符号拡張なし 汎用ロード符号拡張 汎用ストア
汎用ロードASI 汎用ストアASI - ASI番号はステータスレジスタで指定できないか?
バイト入れ換え不要な命令は LLLL がデコードに使える
[25:24] ww .. ビット幅 00..S(32bit) 01..D(64bit) 10..Q(128bit) 11..O(256bit)
[23:22] pp .. 00..即値指定 01..GRx指定 10..ポストインクリメント 11..プリデクリメント
[21:18] LLLL .. バイト入れ換え/ASI番号レジスタ [21]..8バイト [20]..4バイト [19]..2バイト [18]..1バイト
[18:12] 符号付き即値7ビット "00" ゲタはかせ
[17:12] GRx インデックス
[11:6] GRb ベース
[5:0] Rd ロード/ストアするレジスタ
w={S,D,Q,O}それぞれ4バイト(32ビット)、8バイト(64ビット)、16バイト(128ビット)、32バイト(256ビット)幅のアクセス
浮動小数点レジスタの場合は単精度(32ビット)、倍精度 or 単精度×2(64ビット)、倍精度×2 or 単精度×4(128ビット)、倍精度×4 or 単精度×8(256ビット)

・ロード命令 コンディションコードは変化する。(ゼロ、負のみ)
LDw 汎用レジスタロード 符号拡張
LDUw 汎用レジスタロード 符号拡張なし ※LDUOは意味なし
FLDw 浮動小数点レジスタロード コンディションコードは変化する。(未定義)
・ストア命令 レジスタのビット数が多い場合はLSB側から数えたビット数の幅でストアする。
STw 汎用レジスタストア
FSTw 浮動小数点レジスタストア
・セマフォ命令
未定
以下、バイト入れ換え不要の命令
BLR サブルーチン分岐
BLRI 割り込みからの復帰
LEA 実効アドレスロード
PREFETCH プリフェッチヒント

・プリフィックス命令フォーマット
11ppaaabbbcccdddsssssssseeeeeeee
[31:30] 11 .. プリフィックス命令である
[29:28] pp .. プリフックス命令分類
[29]=0 ロング即値 [28:0] .. 29ビット符号付き即値 後続命令の即値の前半に追加される。PC相対即値、インデックス即値の場合は"00"がゲタはかせされる。
 10 レジスタ拡張+ミドル即値 [15:0] .. 16ビット符号付き即値 後続命令の即値の前半に追加される。PC相対即値、インデックス即値の場合は"00"がゲタはかせされる。
 11 レジスタ拡張+デスティネーション範囲指定
 レジスタ拡張がある場合 3ビット増えてレジスタはR0〜R511まで指定可能
[27:25] aaa .. Rs1の拡張ビット
[24:22] bbb .. Rs2の拡張ビット
[21:19] ccc .. Rs3の拡張ビット(3オペランドの場合) または、コンディションコード番号(Gcc,Fcc)
[18:16] ddd .. Rdの拡張ビット
 デスティネーション範囲指定がある場合
[15:8] ssssssss .. 範囲指定 開始ビット位置
[7:0] eeeeeeee .. 範囲指定 終了ビット位置 ssssssss >= eeeeeeee でないといけない。
レジスタは256ビット幅まで対応できる。

とりあえず、以上。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
URL(任意)
本 文




ぼくのかんがえたさいきょうCPU 2009年夏のまとめ 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる