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

アクセスカウンタ

zoom RSS 各種プロセッサ 整数演算の条件付き分岐命令について

<<   作成日時 : 2009/08/25 21:49   >>

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

各種プロセッサの以下について調べてみた。
・分岐条件
・分岐の実行方法
・分岐先のアドレス指定
・条件移動命令(Conditional MOV)
・分岐ヒント

・分岐条件
 通常、条件分岐フラグはC(Carry),Z(Zero),N(Negative),V(Overflow)を持っている。
□SPARC V9ニーモニックによる分類
BE ゼロ
BNE 非ゼロ
BGEU 符号なし>= (キャリークリア)
BLU 符号なし< (キャリーセット)
BLEU 符号なし<=
BGU 符号なし>
GE 符号付き>=
BL 符号付き<
BLE 符号付き<=
BG 符号付き>
BNEG 符号付き負数 <0
BPOS 符号付き非負数 >=0
BVS 符号付きオーバーフロー
BVC 符号付きオーバーフローなし
BA 常に分岐
BN 常に非分岐

・分岐の実行方法
□SPARC V9
 コンディションコードフラグによる分岐判定。32bit用の%iccと64bit用の%xccコンディションコードレジスタを参照する。
 コンディションコードをセットする命令としない命令がある。(例:addとaddcc)
 分岐命令に修飾子a(annul bit)があると、分岐条件成立時にディレイドスロットを実行、非成立時にはディレイドスロットを実行しない。
 レジスタの内容を符号付きで直接判定して分岐する命令(brz,brlez,brlz,brnz,brgz,brgez)を持つ。
□SH-3/4
 1bitのTフラグしか持たないが、キャリーやオーバーフロー、比較命令で大小比較の結果を1/0で保存する。BT,BF命令でTフラグを見て分岐する。
 (BT,BF命令は遅延分岐でない。BT/S,BF/S命令は遅延分岐する)
□MIPS
 コンディションコードフラグは持たない。2つのレジスタを比較、または0と比較して、条件分岐する。
 分岐非成立時にはディレイドスロットを実行しない分岐命令を持つ。SPARCのannul bit相当。
□68000
 演算命令、比較命令で常にコンディションコードフラグは更新される。コンディションコードフラグによる分岐判定をし、分岐する命令を持つ。
□V850
 演算命令、比較命令で常にコンディションコードフラグは更新される。コンディションコードフラグによる分岐判定をし、分岐する命令を持つ。
 演算結果の飽和による分岐条件も持つ。
□x86
 演算命令、比較命令で常にコンディションコードフラグは更新される。コンディションコードフラグによる分岐判定をし、分岐する命令を持つ。
 パリティによる分岐条件も持つ。
□ARM
 コンディションコードフラグによる分岐判定。分岐の条件についてはSPARCとまったく同じ。オペコード拡張子Sを付けることによりコンディションコードをセットする命令になる。(例:addとadds)
 条件分岐に加え、ほぼすべての命令が条件付きで実行する/しないを指定できる。
□Alpha
 レジスタを64bit符号付き整数とみなして判断し、分岐する。
 Bxx Ra,ADDR
 条件判断は以下のとおり。
 BEQ(Ra==0), BGE(Ra>=0), BGT(Ra>0), BLE(Ra<=0), BLT(Ra<0), BNE(Ra!=0), BLBC(Ra[0]==0), BLBS(Ra[0]==1)
 2レジスタ間またはレジスタと定数の比較は、CMPxx命令で行い、条件が成立すればデスティネーションレジスタに1を、成立しなければ0を代入する。
 符号なしの数値比較ができる。(U付き) CMPEQ,CMPLT,CMPLE,CMPULT,CMPULE → GE,GT等が無いのは比較するレジスタを入れ換えればいいから。
 バイト単位の比較命令がある CMPBGE (Alphaは意外とバイト操作命令が充実している)
□PowerPC
 CR(ConditionRegister)を持つ。整数(固定小数点)も浮動小数点も同じビットを使っている。固定小数点比較命令の結果と固定小数点演算命令の結果でフラグの意味合いが異なる。
 CR[0] lt より小さい/負
 CR[1] gt より大きい/正
 CR[2] eq 等しい/ゼロ
 CR[3] so サマリー・オーバーフロー
 また、XER(固定小数点例外レジスタ)を持つ。
 XER[0] SO Summary Overflow → OVビットが1にセットされると明示的にクリアされないかぎり1のまま
 XER[1] OV Overflow
 XER[2] CA Carry
 分岐命令はblt,ble,beq,bne,bge,bgt,bnl(以上),bng(以下),bso(サマリーオーバーフロー),bns(サマリーオーバーフローでない)
□PA-RISC2.0
 比較命令と分岐命令が一体化している。
 BB Branch on Bit ビット位置を即値またはSAR(ShiftAmountRegister)で指定し、テストする。
 ADDB,ADDIB 加算後、条件を判定し分岐。
 CMPB,CMPIB 比較後、条件を判定し分岐。
 MOVB,MOVIB 移動後、条件を判定し分岐。
 条件は以下のとおり。c(3bit)
 0 never;nothing
 1 全ビット0
 2 (leftmost bit is 1) xor signed overflow
 3 all bits are 0 or (leftmost bit is 1 xor signed overflow)
 4 addの時 no unsigned overflow / sub/cmpの時 unsigned overflow
 5 addの時 all bits are 0 or no unsigned overflow / sub/cmpの時 all bits are 0 or unsigned overflow
 6 signed overflow
 7 rightmost bit is 1
 fビットというのがあり、これがcの意味を反転させる。
 c f=0 / f=1
 0 never / always
 1 == / !=
 2 < / >= (signed)
 3 <= / > (signed)
 4 < / >= (unsigned)
 5 <= / > (unsigned)
 6 SV(signed overflow) / NSV(not signed overflow)
 7 odd /even
 また、演算命令は条件を指定することができる。条件を満たせば PSW[N]=1で後続1命令をスキップする。
□IA-64
 比較命令による結果をプレディケート・レジスタ(pr0-pr63)に格納する。
 例:cmp.eq p1,p2 = r1,r2
 r1がr2と同じ値ならばp1=1,違うならp1=0、2番目に指定したプレディケート・レジスタp2はp1と反対の値。ただしpr0の値は常に1。
 比較条件
 eq ==
 ne !=
 lt < 符号付き
 le <= 符号付き
 gt > 符号付き
 ge >= 符号なし
 ltu < 符号なし
 leu <= 符号なし
 gtu > 符号なし
 geu >= 符号なし
 分岐命令は指定したプレディケート・レジスタの値が1ならば分岐する。
 例: (p1) br.cond LABEL

☆ディレイドスロットを持つアーキテクチャ(遅延分岐)
 MIPS,SPARC V8/V9,PA-RISC,SH-3/4

・分岐先のアドレス指定
☆PC相対
 SPARC V8/V9,SH-3/4,MIPS,68000,V850,x86,ARM,Alpha,PowerPC,PA-RISC,IA-64
☆分岐レジスタによる分岐
 IA-64 br0-br7の8本を使用
☆絶対番地
 PowerPC
☆その他
 PowerPCはリンクレジスタへ現PCを保存することにより条件付きサブルーチンコールができる。

・条件移動命令(Conditional MOV)
□MIPS MIPS IVより追加 MOVZ,MOVN命令を持ち、指定したレジスタの内容がゼロ/非ゼロの時に転送する。 
□SPARC V9より追加 MOVcc命令 転送条件は分岐条件と同じ。
□V850 MOVcc命令で条件成立時と非成立時に別々のレジスタ(即値)の値をセットできる。
□68000 条件移動命令はないが、条件によりレジスタ/アドレス参照先をall1/all0にするScc命令を持つ。
□x86 PentiumProよりCMOVcc命令がある。
□ARM 条件付き実行命令で任意の演算が可能。
□Alpha CMOVxx命令がある。条件は分岐命令と同じ。
□PowerPC ない
□PA-RISC ない。が、条件付き演算命令と次命令のスキップの組み合わせで実現可能。
□IA-64 プレディケート・レジスタを指定することによりほとんどの命令は条件実行が可能。

・分岐ヒント
□SPARC V9
 pt,pnという修飾子を持っている。(ptで分岐する、pnで分岐しないと予測させる) 
例:
be,pt ADDR1
nop
bne,pn ADDR2
nop
□Alpha
 前方条件分岐(正の変位)は分岐しない、後方条件分岐(負の変位)は分岐する、と予測される。
□PowerPC
 分岐命令に+を付けると分岐する可能性が高い、-を付けると分岐しない可能性が高い、と指示できる。
□IA-64
 命令を修飾するコンプリータで指示する。
 .spnt 静的に非分岐 /.sptk 静的に分岐 /.dpnt 動的に非分岐 /.dptk 動的に分岐

整理:
・コンディションコードを持ち、条件分岐する 68000,x86,V850,SPARC,PowerPC,ARM
 比較命令に条件を持たせ、フラグに格納し、フラグの真偽で分岐する SH-3/4,IA-64
 比較結果を汎用レジスタに入れ、その内容で分岐する MIPS,Alpha
 汎用レジスタを直接判断し分岐する Alpha
 特定の演算後の結果を判断し分岐する PA-RISC
・すべてのプロセッサは条件分岐でのアドレス指定はPC相対(PowerPC/IA-64は別の指定方法あり)


※補足
 68000はMOV命令(メモリからのロード命令)でもフラグは変化する。ただしアドレスレジスタに対するMOV命令は変化しない。x86はMOV命令ではフラグは変化しない。これは8bitの68系、80系の頃から変わらない。メモリからのロード命令については、RISC系ではフラグが変化しないのが一般的。

thanks @finalfusion

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(2件)

タイトル (本文) ブログ名/日時
条件判断の方法
 計算機では計算結果の妥当性や比較結果による処理の切り換えも重要。ほとんどのプロセッサはCCR(Condition Code Register)を使用する。 ...続きを見る
竹下世界塔の計算機よもやま話
2012/01/26 16:52
遅延分岐命令の分類
 パイプライン実行が前提のRISCアーキには遅延分岐命令を持つものがある。分岐命令の直後の命令を実行してから分岐先へと制御を移す。遅延分岐命令の後にある実行される命令の場所を遅延スロットと呼ぶ。 ...続きを見る
竹下世界塔の計算機よもやま話
2014/10/07 00:45

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

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




各種プロセッサ 整数演算の条件付き分岐命令について 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる