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

アクセスカウンタ

zoom RSS 条件分岐について各アーキ分類

<<   作成日時 : 2014/09/27 00:58   >>

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

追記:SPARC T4/M5はCompare&Branch命令があるので追加

 計算機の条件判断について分類した。

 ある数値AとBを数値として比較するときにはA-Bの結果から判断する。演算結果がレジスタのビット幅からはみ出て表現できなくなった時にはCフラグ(符号なし)、Vフラグ(符号付き/2の補数)が立つ。他には負の数を表すNフラグ、ゼロを表すZフラグがある。

 2の補数 Vフラグ 演算結果を保証しない
 2の補数 Nフラグ 負の数(最上位ビット)
 符号なし Cフラグ 加算でのキャリー/減算でのボロー発生
 共通 Zフラグ ゼロ(All 0)

 これらを使うと大小関係がわかる。EQ,NE,GE,LT,GT,LEはニーモニックでもよく使われる。HI,LS,HS,LOは68系のニーモニックを参考にした。

・一致/不一致

A=B EQ(Equal) : Z=1
A≠B NE(Not Equal) : Z=0

・符号付き 大小関係

A≧B GE(Greater or Equal) : (N xor V) = 0
A<B LT(Less Than) : (N xor V) = 1
A>B GT(Greater Than) : (Z or (N xor V)) = 0
A≦B LE(Less or Equal) : (Z or (N xor V)) = 1

・符号なし 大小関係

A>B HI(Higher) : C or Z = 0
A≦B LS(Lower or Same) : C or Z = 1
A≧B HS(Higher or Same) : C = 0
A<B LO(Lower) : C = 1


 さて、これらのフラグとフラグ同士の論理演算で大小関係が判断できるが各プロセッサではどのように扱っているか整理した。


(1)条件フラグを直接参照するもの - ほとんどのCISCアーキ、SPARCなど

 条件フラグレジスタからZ,N,V,Cを参照できる。演算命令は条件フラグを更新し、分岐命令は条件フラグを参照して分岐する。


(2)比較結果を特別なレジスタに格納するもの - PA-RISC,POWER,SHシリーズ,Itanium


・PA-RISC PSWレジスタに比較結果を格納。Z,N,Vフラグを演算済で大小関係が1bitでわかる。

0 never;nothing
1 all bits are 0 (=Z)
2 (MSB=1) xor (signed overflow) = N xor V
3 all bits are 0 or (MSB=1 xor signed overflow) = Z or (N xor V)
4
adds no unsigned overflow = C
subs/compares !C
5
adds all bits are 0 or no unsigned overflow = Z or !C
subs/compares = Z or C
6 signed overflow =V
7 rightmost bit is 1 =Parity

分岐命令はPSWを参照して動作。

MOV(I)B レジスタのコピー&分岐
COM(I)Bx
COMBT cond 条件が真なら分岐
COMBF cond 条件が偽なら分岐
ADD(I)Bx
ADDBT cond 加算、条件が真なら分岐
ADDBF cond 加算、条件が偽なら分岐

BVB 任意ビットをテストして分岐
BB ある位置のビットをテストして分岐


・POWER CR0〜CR7の8セットの4bit長フラグに比較結果を格納。

暗黙の使用:
CR0は固定小数点演算の結果
CR1は(十進)浮動小数点の結果
CR6はベクター演算の結果

CRn[0] Negative(LT)
CRn[1] Positive(GT)
CRn[2] Zero(EQ)
CRn[3] SummaryOverflow(SO) - オーバーフロー発生の蓄積

これら8セットのCRn同士を論理演算することができる。これはif (0<x and x<9)のような条件を分岐なしでできる。

詳しい解説:

Power アーキテクチャーのためのアセンブリー言語: 第 3 回: PowerPC 分岐プロセッサーでのプログラミング

PowerPCの比較命令は、比較する整数が符号付整数と符号無整数で命令が分かれている。
玄箱でアセンブリ 7 - 比較命令と分岐命令


・SHシリーズ
 比較結果を1bitのTフラグに格納。分岐命令はTフラグを参照して分岐/非分岐。

・IA-64(Itanium)
 プレディケート・レジスタ pr0〜pr63を持ち、比較結果を格納する。pr0は常に真。
命令は暗黙のうちにpr0が指定されている。プレディケートの指定でその命令を実行するかどうかが決まる。


(3)比較結果を汎用レジスタに格納する。専用の条件フラグを持たない。 - MIPS,Alpha,RISC-V,SPARC T4/M5

・MIPS 条件判断と分岐が一緒
演算のオーバーフローはトラップ発生させることもできる

レジスタ2個比較
BEQ Rs=Rtなら分岐
BNE Rs≠Rtなら分岐

レジスタ1個判断
BGEZ(AL) Rs≧0なら分岐
BGTZ Rs>0なら分岐
BLEZ Rs≦0なら分岐
BLTZ(AL) Rs<0なら分岐

トラップ命令 2つのレジスタを比較。符号なし比較がある。
TEQ
TGE
TGEU
TLT
TLTU
TNE


・Alpha 比較命令と条件分岐命令を組み合わせる。
演算のオーバーフローはトラップ発生させることもできる

比較命令:真ならRc=1、偽ならRc=0にする
RaとRbを入れ替えれば>,≧もできる
CMPEQ Ra=Rb
CMPLT Ra<Rb 符号付き比較
CMPLE Ra≦Rb 符号付き比較
CMPULT Ra<Rb 符号なし比較
CMPULE Ra<Rb 符号なし比較

条件分岐命令はレジスタ1個について

BEQ Rs=0なら分岐
BNE Rs≠0なら分岐
BGE Rs≧0なら分岐
BGT Rs>0なら分岐
BLE Rs≦0なら分岐
BLT Rs<0なら分岐
BLBC Rsの最下位bitが0なら分岐
BLBS Rsの最下位bitが1なら分岐


・RISC-V
2レジスタの比較と分岐命令が一緒。

BEQ Rs1,Rs2,target_address
BNE Rs1,Rs2,target_address
BLT Rs1,Rs2,target_address
BGE Rs1,Rs2,target_address

BLTU Rs1,Rs2,target_address
BGEU Rs1,Rs2,target_address

大小比較は符号付きと符号なし(U)がある。
Rs1とRs2を入れ替えればBLE,BGTも可能。


・Oracle SPARC T4 / SPARC M5
Compare&Branch命令が追加されている。これにより条件コードを書き換えずに比較と条件分岐が可能。

CWBcc 32bit幅でのコンペア&ブランチ
CXBcc 64bit幅でのコンペア&ブランチ
ccは通常の条件分岐命令と同じ

☆命令フォーマット不明だがレジスタ2本で5bit×2、条件で4bitは必要。分岐範囲をimm13とすると分岐できる範囲は狭いのではないか?


***

 条件フラグがそのまま見える形式が一番実装は楽だが、それもプロセッサの状態のひとつなのでサブルーチンコールやスレッドの切り替えなどでは退避の対象となる。比較結果を汎用レジスタに格納するものはそのまま退避させればよい。MIPSはゼロかどうかだけ直接比較して分岐できるが大小関係はいったん演算結果を格納してからでないと判断できない。RISC-Vはここが徹底していて条件分岐のための中間結果を保持する必要がない。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(0件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文




条件分岐について各アーキ分類 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる