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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU テスト・レジスタ(プレディケート・レジスタ)

<<   作成日時 : 2010/01/22 22:38   >>

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

 IA-64にはプレディケート・ビットが64個あり、まとめてプレディケート・レジスタとして参照できる。プレディケート・ビットは条件判断の結果が真か偽かを格納するビットで、ほとんどの命令は指定されたプレディケート・ビットの内容で実行するかどうか決まる。pr0は常に"1"で、通常の命令は暗黙のうちにpr0が指定されていることになっており、実行される。実行に条件判断が付く点はARMに似ているが、IA-64は64個も条件判断済みのフラグを持っており、かつpr16〜pr63はローテーション可能である。
 単純な1bitのみの実装としてはSHシリーズがある。TフラグにTST命令の結果やシフト命令で押し出された部分が格納され、分岐命令は基本的にTフラグが0の時と1の時に分岐する命令しかない。
 ARMやIA-64のような条件判断を命令実行に反映させるものを除き、多くのプロセッサは決められた条件で分岐する命令かデータを移動する命令くらいしか持たない。これまで私もSPARC/ARM準拠の条件判断を組み込むことを考えていたのだが、条件の数に限りがあること(4bitで16種類)、ステータスレジスタにコンディションコードを残すと強い依存関係が生じることが問題となった。ステータスレジスタの件に関しては各レジスタにコンディションコードを持たせることで解決できそうだが、それでも条件判断が済むまではレジスタの値は書き換えられない。つまり、条件を判断するまでそのレジスタは掴まれたままになるのだ。

 そこで、IA-64とSHの折衷案のようなテスト・レジスタというのを考えてみた。
SR.test - 比較命令の結果が格納されるレジスタ。SR.test[31]〜SR.test[2]が自由に使える。SR.test[0]は常に"0"、SR.test[1]は常に"1"。条件分岐命令/条件移動命令は指定されたSR.testのビットが"1"かどうかを見て実行する。

基本
CMPE /CMPNE - ゼロ/非ゼロ
CMPGEU / CMPLU - >=キャリークリア / <キャリーセット Unsigned
CMPLEU / CMPGU - <= / > Unsigned
CMPGE / CMPL - >= / < Signed
CMPLE / CMPG - <= / > Signed
CMPNEG / CMPPOS - 負数 / 非負数 Signed
CMPVS / CMPVC - オーバーフローあり / オーバーフローなし Signed

飽和
CMPSNEG / CMPSPOS - 負の方向への飽和 / 正の方向への飽和 Signed
CMPSZ / CMPSI - ゼロ方向への飽和/ 無限大方向への飽和 Unsigned

その他
CMPB0 / CMPB1 - 指定したレジスタのビット位置の 0 / 1 テスト
CMPTAG - TAG部の不一致あり
浮動小数点関係(まだ定義していない)

例:
CMP GRa,GE,T[2]
CMP GRb NEG,T[3]
(この後、GRa,GRbは別の用途に)

MOV T[3],GRc,GRd
BR T[2],label

 比較命令が必要になるのがデメリットだが、これは必要な条件をいくらでも追加できるというメリットにもなる。比較条件はGRs2のフィールドに埋め込めると考えたら6bit、64種類の定義が可能。
 テストレジスタSR.testはステータスレジスタとしてアクセスできるので直接セット・クリアもできる。ただしbit[1]とbit[0]は固定。

 もし組み込むとしたら分岐命令の大幅な改修が必要だ。
※いま思いついたがCMP命令で条件をレジスタの値で指定することも可能だなあ。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




ぼくのかんがえたさいきょうCPU テスト・レジスタ(プレディケート・レジスタ) 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる