比較命令と分岐命令
比較命令
レジスタとレジスタ、またはレジスタと数値を比較する命令です。 比較した結果は条件レジスタの対応するビットが変化します。
PowerPCの比較命令は、比較する整数が符号付整数と符号無整数で命令が分かれているところが特徴です。 ほかのCPU、たとえば x86 や ARM では、符号付整数と符号無整数の比較では同じ命令を使用し、 PowerPCより多い条件フラグを設定します。そして条件分岐する場合に符号付整数と符号無整数では 異なる命令を使用します。 PowerPCでは比較する場合に符号付整数と符号無整数で別の命令を使用して、分岐命令は同じ命令を使います。
| 符号付 | 無符号 | |||
|---|---|---|---|---|
| 比較対象 | ニーモニック | ニーモニックの意味 | ニーモニック | ニーモニックの意味 |
| レジスタとレジスタ | cmp | CoMPare | cmpl | CoMPare Logical |
| レジスタと数値 | cmpi | CoMPare Immediate | cmpli | CoMPare Logical Immediate |
拡張ニーモニック
比較命令には次のような拡張ニーモニックが用意されています。
| 拡張ニーモニック | 標準ニーモニック | ニーモニックの意味 |
|---|---|---|
| cmpwi crD,rA,SIMM | cmpi crD,0,rA,SIMM | Compare Word Immediate |
| cmpw crD,rA,rB | cmp crD,0,rA,rB | Compare Word |
| cmplwi crD,rA,UIMM | cmpli crD,0,rA,UIMM | Compare Logical Word Immediate |
| cmplw crD,rA,rB | cmpl crD,0,rA,rB | Compare 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 Register | 4GB |
| bclr[l] | Branch Conditional Link Register | 4GB |
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
- [a]は絶対アドレス指定。
- [l] を付加するとはリンクレジスタに分岐命令直後のアドレスをセットして分岐。
- BI は分岐条件として使用する条件レジスタのビット番号を指定 (0-31)。
- BO は次のように指定して分岐の動作を指定。
| 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は次のように分岐を予測します(静的分岐予測)。
- 上方への分岐は分岐する。
- 下方への分岐は分岐しない。
- CTR や LR を分岐先とする場合は分岐しない。
ニーモニックの最後に「+」や「-」を付加することで上記の予測を変更することができます。
- 「+」分岐すると予測させる。
- 「-」分岐しないと予測させる。
拡張ニーモニック
条件分岐の標準ニーモニックで指定する必要のあるBO、BIフィールドは複雑なため、 拡張ニーモニックとして以下のような条件が用意されています。
| 動作 | 説明 | |
|---|---|---|
| lt | Less than | より小さい |
| le | Less than or equal (= ng) | より小さいか等しい |
| eq | Equal | 等しい |
| ge | Greater than or equal (= nl) | より大きいか等しい |
| gt | Greater than | より大きい |
| nl | Not less than (= ge) | より小さくない |
| ne | Not equal | 等しくない |
| ng | Not greater than (= le) | より大きくない |
| so | Summary overflow | サマリ・オーバフロー |
| ns | Not summary overflow | サマリ・オーバフローなし |
| un | Unordered | 比較不能(浮動小数点比較後) |
| nu | Not unordered | 比較可能(浮動小数点比較後) |
bcの拡張ニーモニックの例です。次のように組み合わせて使います。 crS は条件レジスタですが、cr0 の場合は省略可能です。
| 動作 | 例 |
|---|---|
| Branch if less than | blt crS,target |
| Branch if less than or equal | ble crS,target |
| Branch if not greater than | bng crS,target |
| Branch if equal | beq crS,target |
| Branch if greater than or equal | bge crS,target |
| Branch if not less than | bnl crS,target |
| Branch if greater than | bgt crS,target |
| Branch if not equal | bne crS,target |
| Branch if summary overflow | bso crS,target |
| Branch if unordered | bun crS,target |
| Branch if not summary overflow | bns crS,target |
| Branch if not unordered | bnu 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 | より大きければ分岐 |