整数演算の比較結果はcr0に格納される。比較方法は符合つき比較である。addやsubfなどは、命令にoをつけることで、演算がオーバーフローしたかどうかを、整数例外レジスタのオーバーフロービットに反映させることができる。
論理演算の比較結果はcr0に格納される。比較方法は符合つき比較である。
浮動小数演算と同時に比較結果を出した場合、cr1に格納される。ただし、その内容は演算結果の例外状態なので注意。浮動小数同士の値の大小を比べる場合は比較命令を使うこと。
また、浮動小数から整数への変換命令はあるが、整数から浮動小数への変換命令は存在しない。
PowerPCでは、メモリアクセスを行う命令はアラインが正しい(4byteメモリアクセスの場合、アクセス先のアドレスは4の倍数なら、アラインが正しい)方がメモリアクセス効率がいい。別にアラインが正しくなくても、メモリアクセス効率が悪くなるものの、アクセスは可能。
レジスタや即値の内容を比較し、その結果を状態レジスタに格納する命令。PowerPCには状態レジスタが8つあるので、比較結果を複数持つことができる。
PowerPCには状態レジスタが8つある上に、それらの内容同士で論理演算を行う事ができる。条件分岐は分岐予測が失敗した時、コストが大きくなってしまうため、小さな分岐条件(例えば、if(x == 0 && y == 1))をばらばらに実行するより、論理演算で分岐条件をまとめ、1つの分岐命令だけ実行する方が、分岐回数が減って効率がよくなる可能性がある。
1つの条件レジスタは4つの状態(等しい(eq)=2、未満(lt)=0、より大きい(gt)=1、オーバーフロー(so)=3)を持っているのだが、条件論理演算はその状態同士で論理演算するものである。
条件演算のソース/デスティネーションには数値しか使用できない。
例えば、cr1のeqの値が入っているのは、4 * 1 + 2。cr2のltの値が入っているのは4 * 2 + 0。cr7のgtの値が入っているのは4 * 7 + 1の場所である。
if(x > 0 && y <= 0) を一つにまとめようと思った場合、
cmpwi cr0, x, 0 ;xの比較 cmpwi cr1, y, 0 ;yの比較 crandc 2,1,5 ;cr0[eq] = cr0[gt] & ~cr1[gt] bne cr0, ...と書く。
汎用レジスタと、状態制御などの役割を持つ特殊なレジスタとの間でデータを交換する命令。いくつかのレジスタはスーパバイザでなければアクセスできない。
分岐命令には4つの分岐先指定方法と、たくさんの分岐条件の組み合わせがある。また、分岐成功時にリンクレジスタにジャンプ前アドレスを保存するかしないかも決められる。条件分岐命令の場合はさらに、分岐のヒント(静的分岐予測)フラグもセットできる。
ちなみに、分岐命令は大量に組み合わせられるので、bgtctrl(条件が『超える』を満たしている場合、カウンタレジスタのアドレスへジャンプし、さらにリンクレジスタに現在のアドレスを格納)やらbdnzne(カウンタレジスタの値を1引き、その値が0でなければ条件を見、条件が『等しくない』であれば相対アドレスジャンプ)やらと、非常にややこしい分岐条件も書ける。全くもって、RISCプロセッサとは思えんな(w
PowerPCの分岐方法は、
PowerPCの命令のサイズは4byte(32bit)で、それらは必ず4の倍数のアドレスにセットされているため、PowerPCの即値分岐命令は、target_addrの値を4倍した値にアドレスジャンプを行う。
無条件即値分岐命令の場合、24bit符号付き即値の4倍のアドレスまでジャンプできるので、ほぼあらゆる場所にジャンプできる。
条件つきの場合は、ジャンプ幅は14bit符号付き即値の4倍なので、無条件の時と比べるとややジャンプ可能距離が狭い。
リンクレジスタやカウンタレジスタの格納されているアドレスへ直接ジャンプする命令。
前述のように、条件つき分岐命令はジャンプ幅は14bit符号付き即値の4倍なので、無条件の時と比べるとややジャンプ可能距離が狭い。ただ、条件の組み合わせは無数にある。
なお、条件分岐の場合は、ニーモニックの末尾に+や-をつけることで、分岐のヒント(静的分岐予測)を与えることができる。+なら、分岐することを想定して命令実行、-なら、分岐しないことを想定して命令実行となる。例えばループの分岐は、ほとんどの確率で分岐して前に戻るので、分岐のヒントには+を与えたほうがよい。何も書かない場合、-の場合と同じとみなされる。
なお、これらの命令はbcやbcctr、bclrといった命令を簡略にしたものである。
b[カウンタレジスタ条件分岐...dnz, dz][状態レジスタ条件分岐条件…eq, ge, gh, le, lt, ne][レジスタまたは、絶対アドレス分岐…ctr, lr, a][条件分岐の場合、分岐ヒント…+, -]
ble cr2, 10 ;cr2の内容が『以下』を満たしているなら、10命令先に分岐 beq- EXIT_FUNC ;cr0の内容が『等しい』を満たしているなら、EXIT_FUNCラベルの位置に分岐。分岐を期待しない。 bdnz+ CONTINUE_LOOP ;カウンタレジスタの内容を1引き、その値が0以外なら、CONTINUE_LOOPに戻る。分岐を期待する。 bl _abs ;この命令のアドレスをリンクレジスタに格納してから、_absラベルへジャンプする。 blr ;リンクレジスタの内容のアドレスへジャンプする。
キャッシュ制御や割り込み制御などの命令。大抵は通常は使用しない/できない命令である。
厳密には、分岐と同時にリンクレジスタにアドレスを保存する命令で、リンクレジスタに保存されるアドレスは、その分岐命令+4のアドレスです。ちょうど分岐命令の次の命令にあたります。