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

その1では、CPSGT命令とCPSLT命令について「スキップ条件ではなく実行条件で書かせろ」的な話をした。次命令のスキップ条件と実行条件は論理的に反転しているので、マクロで疑似命令を作成すれば解決できそうにも思える。しかしC言語等の高級言語と異なり、アセンブラニーモニックと1対1の関係にあり、「!」ひとつ付ければよいとは行かない。そもそもこれらCPS〜命令はレジスタ間比較なので実行時に処理する必要がある。
そしてCPS〜系命令には致命的な問題がある。命令が足りないのだ。



比較演算は6種類あり、C言語的に書くと==、!=、<、>、<=、>=だ。
CPS〜系命令およびスキップ条件と実行条件を並べて表にする。

該当CPS〜系命令 スキップ条件 実行条件
(論理反転)
CPSEQ Wb==Wn Wb!=Wn
CPSNE Wb!=Wn Wb==Wn
CPSGT Wb>Wn Wb<=Wn
CPSLT Wb<Wn Wb>=Wn
- Wb>=Wn Wb<Wn
- Wb<=Wn Wb>Wn

一目瞭然でCPSGE(Compare & Skip Greater Equal)命令やCPSLE(Compare & Skip Little Equal)命令のようなものが無い。当然それらを使って作成する実行条件によるマクロ疑似命令も作成不可能である。例えばCPSGTを実行条件で記述できるマクロ疑似命令を作成するには<=(あるいは>=)の比較が必要だがニーモニックがないので無理である。CPSEQとCPSNEのみがマクロを使用して実行条件疑似命令を作成できる。
例えば「>=」は、CPSEQとCPSGTの2つで代用可能だが、そのためには4命令を記述し、4〜6サイクルを消費することになり、それならCompare命令と条件付きBranch命令で記述した方が簡潔で高速だ。
ついでに書くと、CPSGT(>)とCPSLT(<)の両命令は第1、第2オペランドを入れ替えれば同一のものである。それこそどちらか一方のみで、もう一方を定義済みマクロ疑似命令にしても問題はない。
これは>=や<=でも同様である。
つまり本来必要な比較は「==、!=、>、>=」等の組み合わせなのに、不適切な命令が採用されているということである。
例えばCPSLT(<)を削除して、>=としてCPSGEを採用していれば良かったのだ(命令を増やさなければ、の話で6種類すべてサポートすればなお良かった)。
削除したCPSLT(<)のデコード回路を使い、サポートされているCPSEQ(==)とCPSGT(>)の条件判定のORを取ればCPSGE(>=)が出来上がるはずなので、チップ面積もほとんど増加せずに済むはず。後はアセンブラでいくつかの疑似命令をサポートするだけだ。



以上が「こんな命令セット誰が考えた?!」の理由である。よく考えて仕様を作ろうよ〜〜〜。
ユーザによっては「そんな命令使わない」という人もいるだろうが、私は良く使用するし、実行条件でソースを記述したいので、上記のようにCPSGE(>=)命令をサポート(CPSLTを削除)してPIC25Fとして売り出して欲しい位なのだ。