命令セットアーキテクチャを考える11 (分岐命令)
ようやく終わりに近づいてきました。分岐命令です。
[Jump/Branch]:4命令
条件付き分岐はbranch(br)、無条件分岐はjump(jmp)と称する
brl [pc] Rs,=imm,Rd
・CCR0/CCR1の状態がimmで指定される条件に合致する場合に、Rsで指定したアドレスに分岐し、Rdには戻りアドレスとして現在のPCの値が格納される(branch and link)。
・pcモードの場合は、PCの内容とRsの内容を加算したアドレスに分岐する。
・CCR0/CCR1は変化しない。
・imm(10bit)による分岐条件の詳細は以下の通り。
・bit9:CCR0かCCR1を指定(どちらか一方のみ)
・bit8:bit0-bit7が、CCR0/CCR1の各ビットと複数マッチした場合に、その論理積(and)をとるか論理和(or)をとるかを指定
・bit7-bit0:CCR0またはCCR1の対応するビットが"1"である場合に条件成立とする
・ここで、CCR0とCCR1の内容を再掲しておきます。
[CCR0]
bit4: Overflow/Carryover(o) : Overflow
bit3: Underflow/Borrow(u) : Underflow
bit2: positive/plus(p) : Positive
bit1: zero(z) : Zero
bit0: negative/minus(m) : Minus
[CCR1]
bit7: 非正規化数(s) : Subnormal number
bit6: 無限大(i) : Infinite number
bit5: NaN(n) : Not a number
bit4: Overflow : Overflow
bit3: Underflow : Underflow
bit2: positive/plus(p) : Positive
bit1: zero(z) : Zero
bit0: negative/minus(m) : Minus
・戻りアドレスを格納しない(branch and linkではない)branch命令はない。戻りアドレスが不要な場合はRdとしてR0を指定する。
jmpl [pc] Rs,{Rt|=offset},Rd
・Rs及びRtまたはoffsetで指定したアドレスに分岐し、Rdには戻りアドレスとして現在のPCの値が格納される(jump and link)。
・分岐先アドレスの計算は、RsとRtの和、またはRsと(offset値の4倍)の和となる。
・アセンブラ言語ソースプログラムではoffsetの値はそのまま記述し、アセンブラが1/4してoffset領域に設定する。
・pcモードの場合は、さらにPCの内容を加算したアドレスに分岐する。
・CCR0/CCR1は変化しない。
・戻りアドレスを格納しない(jump and linkではない)jump命令はない。戻りアドレスが不要な場合はRdとしてR0を指定する。
# 命令コードに余裕がありましたので、loop命令を追加しました。(2018/03/21)
loop [pc] Rs,{Rt|=offset},Rd
・Rdの内容を1減算し、0でなければRs及びRtまたはoffsetで指定したアドレスに分岐する。
・1減算後のRdの内容が0であれば、なにもしない。
・分岐先アドレスの計算は、RsとRtの和、またはRsと(offset値の4倍)の和となる。
・アセンブラ言語ソースプログラムではoffsetの値はそのまま記述し、アセンブラが1/4してoffset領域に設定する。
・pcモードの場合は、さらにPCの内容を加算したアドレスに分岐する。
・CCR0/CCR1は変化しない。
lea Rs,{Rt|=offset},Rd
・分岐ではないが、おなじようにアドレス計算するということで、ここの括りに入っています。
・PCとRsとRtの和、またはPCとRsと(offset値の4倍)の和を計算し、Rdに格納する。
・アセンブラ言語ソースプログラムではoffsetの値はそのまま記述し、アセンブラが1/4してoffset領域に設定する。
[擬似命令]
nop → jmpl pc R0,R0,R0
・PCの指すアドレス(次の実行番地)にジャンプするのでnop(No Operation)となる。
・そもそも、すべて固定長命令フォーマットであり、かつ遅延スロットもないのでnopは不要なような気もしますが…
・copy R0,R0,R0でも代用可能。但し、condition codeが変化する
opfch → brl Rs,=#3ff,R0 :
・opfch(operation code fetch)命令は、必ず不成立となる条件付き分岐命令に変換される。
・分岐は必ず失敗するが、分岐先アドレスの命令データfetch処理が途中まで進むため、L1命令キャッシュが読み込まれる。
br [r] Rs,=imm → brl [pc] Rs,=imm,R0
jmp [r] Rs,Rt → jmpl [pc] Rs,Rt,R0
・戻りリンク無しの分岐命令はないが、アセンブラ言語ソースプログラムの見やすさのため、リンク無し分岐命令のような擬似命令を用意した。アセンブラがリンクアドレス格納レジスタをR0と設定する。
branch命令の条件コードをimm値として記述するのはややこしいため、アセンブラで以下のような擬似命令を備える。
brleq Rs,Rd → brl Rs,=#102,Rd : z-flg on
brlne Rs,Rd → brl Rs,=#005,Rd : p-flg on or m-flg on
brlge Rs,Rd → brl Rs,=#006,Rd : p-flg on or z-flg on
...
breqf Rs → br Rs,=#302 : z-flg on
brnef Rs → br Rs,=#105 : p-flg on or m-flg on
brgef Rs → br Rs,=#106 : p-flg on or z-flg on
...
| 固定リンク
この記事へのコメントは終了しました。


コメント