« 自作PCの電源交換 | トップページ | デジカメが欲しい »

2018/03/24

命令セットアーキテクチャを考える(番外編) 条件付き分岐

前の記事で、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

|

« 自作PCの電源交換 | トップページ | デジカメが欲しい »

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: 命令セットアーキテクチャを考える(番外編) 条件付き分岐:

« 自作PCの電源交換 | トップページ | デジカメが欲しい »