Low Overhead Branch Extension
これはHeliumと組み合わせることで、より効率よくデータ処理が可能(もちろんHelium以外でも利用可能)な命令拡張である。要するにDSPで実装されているZero Overhead Loopに相当する命令である。
Photo05はこれを判りやすく示した例である。この例だと、最初にWLS(While Loop Start)命令を実行したあと、1回目のLDR/STRの後に1回だけLE(Loop End)を実行し、その後はずっとLDR/STRを連続して実行できるのが判る。
これを従来の命令で書くと、ループカウンタを減算してゆきながらループを回し、カウンタが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日に掲載します)