ASM30におけるテーブル・メンバの増減処理

C言語でテーブル・メンバをインクリメントするとき


tbl->memb ++;
これをASM30で直接コードを記述すると

; tbl = w0
mov [w0 + MEMB_OFFSET], w1
inc w1, w1
mov w1, [w0 + MEMB_OFFSET]
となるが、以下のように記述すると効率がよい。

; tbl = w0
add w0, #MEMB_OFFSET, w1
inc [w1], [w1]
命令/実行サイクルともに1つ低減。ストールも無し(後続の命令次第)。
デクリメントなら「inc」を「dec」に変更する。
±1でなく、±2ならばinc2やdec2を利用する。
その他の増減値の場合、add/sub命令には格納元/先の両方でindirectが使用できないため利用できない。ただし増減値がレジスタに格納されていれば、add(増加)のとき以下のように記述できる。

; tbl = w0
; w2 = increasing number
add w0, #MEMB_OFFSET, w1
add w2, [w1], [w1]
;;; add [w1], w2, [w1] これはダメ(エラー)
add/sub命令の第1オペランドにはindirectが書けないので注意。コメントアウトした書き方ではなく、その直前のようにindirectを第2オペランドに記述する。
subの場合は「addの部分をsubで置き換える」という訳にはいかない。上記のような記述順の制約と、引き算では交換法則が成り立たないため。そこで引く値を予め符号反転(2の補数)しておき、addで処理すればよい。