Low Overhead Branch Extension

これはHeliumと組み合わせることで、より効率よくデータ処理が可能(もちろんHelium以外でも利用可能)な命令拡張である。要するにDSPで実装されているZero Overhead Loopに相当する命令である。

Photo05はこれを判りやすく示した例である。この例だと、最初にWLS(While Loop Start)命令を実行したあと、1回目のLDR/STRの後に1回だけLE(Loop End)を実行し、その後はずっとLDR/STRを連続して実行できるのが判る。

  • Low Overhead Branch Extension

    Photo05:Reference Manualを見るとWhileとDoの違いは、分岐先アドレスを記述できるか否か(Whileではループ終了後にloopend_1に飛ぶ様になっているのが判る)の模様。

これを従来の命令で書くと、ループカウンタを減算してゆきながらループを回し、カウンタが0になったらループ脱出するというコードになるので、

    MOVS  R0, #10       ; Counter Initial Value
Loop:
    LDR R1, [R2], #4    ; Memory Copy
    STR R1, [R2], #4    ; Memory Copy
        SUB  R0, R0, #1     ; Decrement Counter
        CMP  R0, #0     ; Compare Counter
        BLE  Loop       ; Loop if not finished
    B label_x       ; branch to somewhere

となり、実行は

MOVS
LDR
STR
SUB
CMP
BLE
LDR
STR
SUB
CMP
BLE
:
:
:
LDR
STR
SUB
CMP
B

という具合になる。要するに1回のループの中の命令が3つほど増える訳だ。これをZero Overhead BranchではなくLow Overhead Branchとしたのは、ループの中に1つだけLEが入ってるからというあたりではないかと思うが、いずれにせよ相当なオーバーヘッド削減になるだろう。

ちなみにこの命令群、Loop Startに関してはWHS以外にDLS(Do Loop Start)/WLSTP(While Loop Start with Tail Predication)/DLSTP(Do Loop with Tail Predication)が、Loop End以外にはLETP(Loop End with Tail Predication)が用意されている。WHSとDLSはLEと組み合わせて、WLSTPとDLSTPはLETPと組み合わせて使う形になっている。

(次回は2月23日に掲載します)