比較命令と分岐命令

比較命令

レジスタとレジスタ、またはレジスタと数値を比較する命令です。 比較した結果は条件レジスタの対応するビットが変化します。


PowerPCの比較命令は、比較する整数が符号付整数と符号無整数で命令が分かれているところが特徴です。 ほかのCPU、たとえば x86 や ARM では、符号付整数と符号無整数の比較では同じ命令を使用し、 PowerPCより多い条件フラグを設定します。そして条件分岐する場合に符号付整数と符号無整数では 異なる命令を使用します。 PowerPCでは比較する場合に符号付整数と符号無整数で別の命令を使用して、分岐命令は同じ命令を使います。

符号付無符号
比較対象ニーモニックニーモニックの意味ニーモニックニーモニックの意味
レジスタとレジスタcmpCoMParecmplCoMPare Logical
レジスタと数値cmpiCoMPare ImmediatecmpliCoMPare Logical Immediate

拡張ニーモニック

比較命令には次のような拡張ニーモニックが用意されています。

拡張ニーモニック標準ニーモニックニーモニックの意味
cmpwi crD,rA,SIMM cmpi crD,0,rA,SIMMCompare Word Immediate
cmpw crD,rA,rB cmp crD,0,rA,rBCompare Word
cmplwi crD,rA,UIMM cmpli crD,0,rA,UIMMCompare Logical Word Immediate
cmplw crD,rA,rB cmpl crD,0,rA,rBCompare Logical Word

数値との比較には「cmpwi r3, 10」、レジスタ同士の比較には「cmpw r3,r4」のように使います。

分岐命令

分岐命令はプログラムの流れ(上から下の順)を変化させる重要な役目があります。 関数呼び出しや呼び出し元への戻り、条件判断に使用します。 PowerPCの分岐命令は非常に多くの組合せが可能で標準ニーモニックでは複雑で読みにくいため、 より分かりやすい拡張ニーモニックを使うと良いでしょう。

標準ニーモニック

分岐命令

単純に分岐する命令です。「bl」はサブルーチンコールに使用します。 「bl」命令の次のアドレスをリンクレジスタ(LR)に保存して分岐します。 「スタック」に保存するのではない事に注意してください。 サブルーチンからサブルーチンを多重に呼び出すためには、呼び出し前に リンクレジスタをスタックかレジスタに保存する必要があります。 分岐先からは「blr」命令(条件分岐命令の1種)で戻ります。

命令ニーモニックの意味分岐可能範囲
b[l][a]Branch+/-32MB

    b      target_addr
    ba     target_addr
    bl     target_addr
    bla    target_addr

条件分岐命令

演算命令や比較命令の結果、変化した条件レジスタ(CR)によって分岐したり、 分岐しないで次の命令の実行を指定する命令です。 PowerPCの条件分岐命令は条件の指定に無数の組合せ (8x32x17通り) が可能です。

命令ニーモニックの意味分岐可能範囲
bc[l][a] Branch Conditional+/-32KB
bcctr[l] Branch Conditional to CounT Register4GB
bclr[l]Branch Conditional Link Register4GB

    bc     BO, BI, target_addr
    bca    BO, BI, target_addr
    bcl    BO, BI, target_addr
    bcla   BO, BI, target_addr

    bcctr  BO, BI             
    bcctrl BO, BI             

    bclr   BO,BI              
    bclrl  BO,BI              

BO説明
0000y CTR をデクリメントし、デクリメント後にCTR≠0 で条件が偽なら分岐。
0001y CTR をデクリメントし、デクリメント後にCTR=0 で条件が偽なら分岐。
0010y 条件が偽なら分岐。
0100y CTR をデクリメントし、デクリメント後にCTR≠0 で条件が真なら分岐。
0101y CTR をデクリメントし、デクリメント後にCTR=0 で条件が真なら分岐。
0110y 条件が真なら分岐。
1000y CTR をデクリメントし、デクリメント後にCTR≠0 なら分岐。
1001y CTR をデクリメントし、デクリメント後にCTR=0 なら分岐。
10100 常に分岐。

分岐予測

上の表の「y」は分岐予測のヒントに使用します。 PowerPCは次のように分岐を予測します(静的分岐予測)。

ニーモニックの最後に「+」や「-」を付加することで上記の予測を変更することができます。

拡張ニーモニック

条件分岐の標準ニーモニックで指定する必要のあるBO、BIフィールドは複雑なため、 拡張ニーモニックとして以下のような条件が用意されています。

動作説明
ltLess than より小さい
leLess than or equal (= ng) より小さいか等しい
eqEqual 等しい
geGreater than or equal (= nl)より大きいか等しい
gtGreater than より大きい
nlNot less than (= ge) より小さくない
neNot equal 等しくない
ngNot greater than (= le) より大きくない
soSummary overflow サマリ・オーバフロー
nsNot summary overflow サマリ・オーバフローなし
unUnordered 比較不能(浮動小数点比較後)
nuNot unordered 比較可能(浮動小数点比較後)

bcの拡張ニーモニックの例です。次のように組み合わせて使います。 crS は条件レジスタですが、cr0 の場合は省略可能です。

動作
Branch if less thanblt crS,target
Branch if less than or equalble crS,target
Branch if not greater thanbng crS,target
Branch if equalbeq crS,target
Branch if greater than or equalbge crS,target
Branch if not less thanbnl crS,target
Branch if greater thanbgt crS,target
Branch if not equalbne crS,target
Branch if summary overflowbso crS,target
Branch if unorderedbun crS,target
Branch if not summary overflowbns crS,target
Branch if not unorderedbnu crS,target

条件分岐一覧

動作相対分岐絶対LR分岐CTR分岐ニーモニックの意味
常に分岐--blr[l]bctr[l]Branch unconditionally
より小さければ分岐blt[l]blta[l]bltlr[l]bltctr[l]Branch if less than
より小さいか等しければble[l]blea[l]blelr[l]blectr[l]Branch if less than or equal
等しければ分岐beq[l]beqa[l]beqlr[l]beqctr[l]Branch if equal
より大きいか等しければbge[l]bgea[l]bgelr[l]bgectr[l]Branch if greater than or equal
より大きければ分岐bgt[l]bgta[l]bgtlr[l]bgtctr[l]Branch if greater than
より小さくなければ分岐bnl[l]bnla[l]bnllr[l]bnlctr[l]Branch if not less than
等しくなければ分岐bne[l]bnea[l]bnelr[l]bnectr[l]Branch if not equal
より大きくなければ分岐bng[l]bnga[l]bnglr[l]bngctr[l]Branch if not greater than
サマリ・オーバフローなら分岐bso[l]bsoa[l]bsolr[l]bsoctr[l]Branch if summary overflow
サマリ・オーバフローでなければ分岐bns[l]bnsa[l]bnslr[l]bnsctr[l]Branch if not summary overflow
比較不能なら分岐bun[l]buna[l]bunlr[l]bunctr[l]Branch if unordered
比較不能でなければ分岐bnu[l]bnua[l]bnulr[l]bnuctr[l]Branch if not unordered

CTRをデクリメント(1を減算)して、条件にしたがって分岐

CTRをカウンタとして用いる繰り返し(ループ)の終了条件判定に使用します。

アドレス指定LR分岐ニーモニックの意味
bdz[l][a]bdzlr[l]Branch if the Decremented CTR=0(Zero)
bdnzf[l][a]bdnzflr[l]Branch if the Decremented CTR≠0(Not Zero)
bdzt[l][a]bdztlr[l]Branch if the Decremented CTR=0(Zero) and condition is TRUE
bdzf[l][a]bdzflr[l]Branch if the Decremented CTR=0(Zero) and condition is FALSE
bdnzt[l][a]bdnztlr[l]Branch if the Decremented CTR≠0(Not Zero) and condition is TRUE
bdnz[l][a]bdnzlr[l]Branch if the Decremented CTR≠0(Not Zero) and condition is FALSE

最小限の分岐命令

拡張ニーモニックでも数が多く複雑に感じます。 以下の9種類をまず覚えておけば困ることはないでしょう。

命令説明
b常に分岐
blサブルーチンに分岐
blrサブルーチンから戻る
beq等しければ分岐
bne等しくなければ分岐
bltより小さければ分岐
bleより小さいか等しければ分岐
bgeより大きいか等しければ分岐
bgtより大きければ分岐