命令セットアーキテクチャを考える(番外編) 条件付き分岐
前の記事で、RISC Vの条件分岐命令について書きました。
今度はopenRISCについても調べてみました。
https://raw.githubusercontent.com/openrisc/doc/master/openrisc-arch-1.2-rev0.pdf
openRISCでは、条件分岐はbf(Branch if Flag)命令とbnf(Branch if Not Flag)命令があります。特殊レジスタのF(flag)ビットによって、分岐するかどうかを決めるようです。
ではFビットはどうやってセットされるかというと、さまざまな(※)Set Flag命令があり、条件分岐前に、sf*命令を使ってFビットをセットまたはクリアしておいて、bfまたはbnf命令で分岐する、という仕組みになります。
※ sf*命令には、大小イコール比較、符号付き/なし、第二オペランドがレジスタ/即値などのバリエーションがあります。
条件分岐以外にも、Fビットの値によってRaまたはRbの値がRdにセットされるという、cmov(Conditional MOVe)命令もあります。使い方によっては、分岐しないでパイプラインの乱れがなくてよさそうです。
例えば、先日の記事のmax/min命令相当の処理ならば、分岐命令を使わずに以下のように2命令で実装できます。
sfgts Ra,Rb : set flag greater than signed
cmov Rd,Ra,Rb : conditional move
| 固定リンク
この記事へのコメントは終了しました。


コメント