現在地

RXの命令を眺めて


カテゴリー:

アセンブラを書いているとどんな命令があるのか全体が見えてきます。

アセンブリ言語で書いても同じではと思うかもしれませんが、その場合はこんな命令無いのかなと探しに行くことはあってもどんな命令があるのか見ることはあまりないように思います。少なくとも私はそうで、新しいプロセッサを初めて触るときはニーモニック一覧を眺めて使い慣れたプロセッサの命令に相当するのはどれかといった探し方をしてしまいます。

そうすると汎用的な命令はわかりますが、知らなくてもプログラムは書けるけど使えば便利(速い)命令は置き去りになります。

一方でアセンブラを書いていると全部の命令に一通り目を通すことになります。動作は知らなくても書けますが、マニュアルに一緒に載っていれば目に入りますし、今回のRXのように別になっていても気になって調べてしまいます。まぁ好奇心の少ない人が仕事として黙々とやったらだめかもしれませんが......

そんなわけでRXの命令を見ているとつくづくC言語(とその派生)を意識した命令セットだなぁと思えるものがあります。

レジスタが32ビット固定

これはSuperHのところでも書きましたが、レジスタが32ビット長で16ビット×2や8ビット×4などに分割して使用することができません。メモリには16ビットや8ビットで書き込むことはできますが、メモリから16ビットや8ビットで読んだ値は32ビットに符号拡張かゼロ拡張されます。演算等も原則として32ビット(メモリへ書き込む命令ではそのビット数)で行なわれます。

拡張は自動的に行われるためメモリから読む命令では何ビットで読むか選択でき、ゼロ拡張のための符号無し命令(通常は符号拡張)が存在します。

5ビットディスプレースメントのレジスタ相対アドレッシング

一部の命令ではディスプレースメントが5ビットのレジスタ相対アドレッシングが使えます。これはR8R15が使用できないという制限はありますが、通常の8ビットディスプレースメントを使用するより1バイト短くできるというものです。

最初こんな限られた命令を短くしても意味無いのではと思っていたのですが......

フレームポインタ相対で自動変数にアクセスする場合に非常に有効だと気付きました。ディスプレースメントはスケーリングされる(これもC言語向きですね)ので5ビットもあれば多くの関数で十分です。

8ビット・16ビットの変数をポインタ寄りに配置するなどの工夫は必要です。

仮に足りなくなっても使用頻度の高いものを優先して、残りは通常の8ビットのディスプレースメントを使えば良いだけです。

SCCnd命令

これはフラグを参照する条件命令なのですが、条件に合ったら1を合わなかったら0をレジスタかメモリに書き込むというものです。そう比較演算子の動作そのものです。

同様に1ビット単位で1か0を書き込むBMCnd命令というのもあります。こちらはビットフィールドを意識したのかな。

RTSD命令

スタックフレームを解放し、必要に応じてレジスタを復帰後、リターンするというものです。

まぁこの辺りはC言語に限らず高級言語のコンパイルでは必要になるものではあります。

参考文献・関連図書: 
『RXファミリ RXv1命令セットアーキテクチャ ユーザーズマニュアル ソフトウェア編』, ルネサスエレクトロニクス.

コメントを追加

Plain text

  • HTMLタグは利用できません。
  • ウェブページアドレスとメールアドレスは、自動的にハイパーリンクに変換されます。
  • 行と段落は自動的に折り返されます。
※ コメントは原則公開です。個別のご相談などは「ご意見・ご要望」からお願いします。