PIC24FのCPSGT命令とCPSLT命令 こんな命令セット誰が考えた?!(その1)

PIC24FのCompare&Skip系(CPS〜)命令の中で、CPSGT命令は「Wb-Wn, Skip if Wb > Wn」(レジスタWbからWnを引くことにより、もしWb>Wnが成り立つなら次の命令をスキップ)。一方、CPSLT命令は「Wb-Wn, Skip if Wb < Wn」(レジスタWbからWnを引くことにより、もしWb < Wnが成り立つなら次の命令をスキップ)。比較と条件実行(条件ブランチ)を同時に処理してくれて結構使える。フラグが変化しない点について、善し悪しはケース・バイ・ケースだと思う。
しかし、なぜか「スキップする」条件を正論理にしているところがとても変。
CPSGT命令についてC言語的に書くと以下のようになる。


if( Wb > Wn ){
goto skip_next;
}
next_instraction
skip_next:
「goto文を使うな!制御構造ばんざい!」って人向けにはこうだ。

if( Wb > Wn ){
}else{
next_instraction
}
普通プログラマはこんなことを書かないはず。通常ならこうだ(もちろん論理が反転していて前者の方がすっきり書ける場合もある)。

if( ! (Wb > Wn) ){
next_instraction
}
「Wb <= Wn」とせず、論理反転の演算子(!)を使っている理由は「その2」で説明する。

CPEGT命令(およびCPELT命令)のように正論理で実行条件を記述できるようにすべきだ(Executeの「E」ね)。CPEGT命令があれば以下の通り素直に記述できる。

if( Wb > Wn ){
next_instraction
}
論理が反転していた方が記述しやすいケースもあるが、そういうケースは少ないと思う。私の場合、ほぼ毎回CPSGT命令とCPSLT命令の条件を脳内論理反転していて、デバッグがとても疲れる。
どうせハードウェア実装が条件成立時に次命令をスキップするから、素直に命名したんだろうが、ちょっと成立条件のロジックを変えればいいだけなのに、ユーザがどう利用するか考えなかったのは命令仕様作成の失敗だ。
「それを言うなら、ユーザがマクロを定義して片付ければいいじゃん」と思うかも知れないが、そうは問屋が卸さない。
「その2」へ続く。