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

アクセスカウンタ

zoom RSS ぼくのかんがえたさいきょうCPU BOOLEAN命令

<<   作成日時 : 2012/01/28 23:58   >>

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

 前回まとめた条件判断の方式で最強なのはIA-64のプレディケイトレジスタ。条件判断の結果を0/1で保存する。

 IA-64のプレディケイトレジスタPR0〜PR63で、PR0は'1'固定。命令の頭でプレディケイトレジスタの番号を指定でき、'1'ならば実行、そうでなければスキップする。デフォルトはPR0で常に実行。

 で、この仕組みを、と思ったら以前考えていたので整理してみた。(ぼくのかんがえたさいきょうCPU テスト・レジスタによる分岐命令の改変/LOOP命令

 BOOLEAN命令で使用するフラグB0〜B63、B0は常に'0'、B1は常に'1'。
 B2〜B31は自由に使用できる。B32〜B63の32本はSIMD演算条件判断の保存用。
 以前はSR.testというステータスレジスタで一括アクセスできるように考えていたが廃止。あまりまとめてアクセスする必要性はなく、64bit幅にしたことでSIMD演算の結果を保存しつつ'0'、'1'固定のビットも用意できる。まとめてアクセスしようとするとすべてのフラグへの書き込みが完了するまで待たなくてはならないので制御がやや面倒。

□Bフラグに書きこむ命令(ALU命令)
・比較命令 RaからRbを引き、ZNVCフラグから判断。
CMPEQ/NE (Zフラグ、=/≠)
CMPGEU/LTU (Cフラグ、符号なし>=、<)
CMPLEU/GTU (符号なし<=、>)
CMPGE/LT (符号付き>=、<)
CMPLE/GT (符号付き<=、>)
CMPNEG/POS (Nフラグ、負/非負)
CMPVS/VC (Vフラグ、オーバーフロー有無)

例:CMPEQ GRa,GRb,Bd

※比較命令はRaとRbを入れ替えることで対応づけができるが、Rbのフィールドのみ即値指定可能なので対称性が損なわれる。よって比較命令を増やすことで対処。

・SIMD命令 256bit長レジスタで8bit単位のデータ32個を同時に計算し8bit単位のデータ32個を保存する場合、32個の条件判断の結果を保存できる。B32〜B63が保存先。

例:
SADD8 GRa,GRb,GRd # SIMD演算でGRaの1バイト×32個のデータをGRbの対応するフィールドと加算し、GRdに保存。
SADD8B GRa,GRb,GRd # 同上。32個のデータに対応したB32〜B63に飽和した場合'1'、そうでなければ'0'を保存する。

・浮動小数点比較命令/SIMD浮動小数点比較命令
FCMPGE FRs,FRb,Bd 等

□Bフラグを使う命令(分岐命令)
・分岐命令
・2オペランド命令の制御

□Bフラグ同士の演算
・1bit同士の論理演算
BAND/BOR
BNAND/BNOR
BXOR/BEQ
BANDN/BORN

例:BAND Ba,Bb,Bd

※フラグのセット/クリアにはB1/B0との演算を組み合わせる

・1サーチ、0サーチ
BALL0 Bs,Be,Bd # BsからBeの範囲がすべて0ならばBd=1
BALL1 Bs,Bw,Bd # BsからBeの範囲がすべて1ならばBd=1

□おまけ
・直接汎用レジスタを判定するCMOV命令
CMOVNZ Ra,Rs,Rd # Ra!=0のときRd=Rs
CMOVZ Ra,Rs,Rd # Ra==0のときRd=Rs
FCMOVNZ Ra,Fs,Fd # Ra!=0のときFd=Fs
FCMOVZ Ra,Fs,Fd # Ra==0のときFd=Fs

・LOOP命令
LOOPNZ LABEL,Rd - Rdを1デクリメントし、Rdが0以外の時分岐
LOOPZ LABEL,Rd - Rdを1デクリメントし、が0の時分岐

□分岐命令のフォーマット
・[31:30]='10'が分岐命令のカテゴリ

・[29:28]=bb 分岐命令種類
 00 条件分岐
 01 Junp&Link
 10 LOOP
 11 CMOV

・相対アドレスは実装しやすいように[26:12]を下位の桁として他のフィールドを頭に連結するように定義した。
・GR/FRのソースは1つしか指定しない。GR/FRのディスティネーションも1つしか指定しない。実際にはALU/FPUに対する転送の指示を出す。

10bbh---------------BBBBBB------
条件分岐命令
BRA #boolean,LABEL - LABELへ相対分岐
[29:28] bb = 00
[27] h 分岐ヒント 1 分岐 0 非分岐
[11:6] BBBBBB BOOLEANフラグ番号
[26:12][5:0] 21bit 相対アドレス 実際は[5:0][26:12]のように連結

10bbh---------------BBBBBBAddddd
条件Jump&Link命令
BLR #BOOLEAN,LABEL,Ad - アドレスレジスタAdへ本命令の次のアドレスを格納してLABELへ相対分岐
[29:28] bb = 01
[27] h 分岐ヒント 1 分岐 0 非分岐
[26:12] 15bit 相対アドレス
[11:6] BBBBBB BOOLEANフラグ番号
[5:0] Rd

※無条件Jump&Linkでは他のアドレッシングモードもある。ロードストア命令扱い

10bbh---------------------Rddddd
LOOP命令
LOOPNZ LABEL,Rd - Rdを1デクリメントし、Rdが0以外の時分岐
LOOPZ LABEL,Rd - Rdを1デクリメントし、が0の時分岐
[29:28] bb = 10 loop
[27] h = 1 LOOPNZ(分岐方向) , 0 LOOPZ(非分岐方向)
[26:6] 21bit 相対アドレス 実際は[11:6][26:12]のように連結

10bbh000000000RsssssBBBBBBRddddd
10bbh000000000FsssssBBBBBBFddddd
10bbh01nnnnnnnBaaaaaBbbbbbBddddd
条件移動命令&BOOLEAN論理演算命令
CMOV #BOOLEAN,GRs,GRd
FCMOV #BOOLEAN,FRs,FRd
BAND Ba,Bb,Bd

[29:28] bb = 11 CMOV系
[27] h = 0 GR指定 1 FR指定
[26:18] Reseved 9bit
h=0(整数系)の時
000000000 CMOV #BOOLEAN,GRs,GRd
0nnnnnnnn CMOV #BOOLEAN,const,GRd # nnnnnnnn!=0の時 定数セット
100000000 BAND Ba,Bb,Bd
100000001 BOR Ba,Bb,Bd
100000010 BNAND Ba,Bb,Bd
100000011 BNOR Ba,Bb,Bd
100000100 BXOR Ba,Bb,Bd
100000101 BEQ Ba,Bb,Bd
100000110 BANDN Ba,Bb,Bd
100000111 BORN Ba,Bb,Bd
h=1(浮動小数点)の時
000000000 FCMOV #BOOLEAN,FRs,FRd
100000000 FCMOV #BOOLEAN,FRconst,FRd # 浮動小数点定数ロード

[17:12] Rs/Ba
[11:6] BBBBBB BOOLEANフラグ番号 / Bb
[5:0] Rd/Bd


 ここで得られる効果は、1/0の判定に汎用レジスタを使わなくても済むこと。その分汎用レジスタが浮くことになる。1bitのFFを使うのでレジスタファイルを扱うよりも軽くて済む。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




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