現在地

RX用のコードジェネレータ


カテゴリー:

先日買っちゃったRX621ボード、Universal Monitorの移植するにはアセンブラASが使いたいところですが対応していません。どうしようかと思っていましたが......

結局コードジェネレータを書き始めてしまいました。

IM6100対応のような難しさはありませんが、ただひたすらに面倒くさいというのが正直な感想です。

ASのコードジェネレータを書く場合はニーモニック毎にデコーダを用意する必要がありますが、それでは大変なのでオペランドやオブジェクトのビット構成のパターンが似ているものをまとめて楽をするのが一般的です。このまとめたグループ毎にデコーダを書くわけですが、この数がやたらに多いんですね。

私がこれまでに書いたものでは以下のようになります。

プロセッサ デコーダルーチン
MN1610/1613 28
CP-1600 15
Nanoprocessor 9
IM6100 5
RX Family 33

MN1610/1613とあまり変わらないように見えますが、RXではこれでも無理をして減らしているので実際は40ぐらいになります。さらにこれはRXv1と呼ばれる命令セットだけで、拡張されたRXv2, RXv3を追加すればさらに増えると思われます。

RXでは各デコードルーチンの中身も問題で、アドレッシングモード毎に処理が分かれるうえに、即値やディスプレースメントの必要ビット数によっても分かれるので分岐だらけになります。まぁ力ずくで書くだけ(だから難しくはないけど面倒)なのですが......

とりあえず約1週間でRXv1命令のデコーダが書けたので今はテスト(とデバッグ)を進めています。が、この分岐がやたら多いことが原因でなかなか進みませんね。

一通りテストが終わったらRXv2, RXv3の追加命令も対応する予定です。そもそものRX621はRXv1命令セットなので必要はないのですが......

現時点のASの最新版である asl-1.42bld239 に対するパッチをhttps://electrelic.com/asl-patchに置いておきます。

アドレスの確定について(補足)

ASのIM6100対応(その2)で「アドレスの確定について」として書きましたが、今回もう少しわかったので書いておきます。

前回、アドレスチェックを以下のようにしていると書きました。

	if (!mFirstPassUnknownOrQuestionable(Flags))

これは実は2つのフラグを参照しています。

一つはFirstPassUnknownで、これは1パス目で値が不明ということです。

もう一つはSymbolQuestionableで、これは前のパスから値が変化した可能性があるということです。

IM6100にはありませんでしたが分岐命令には長さの異なるフォーマットがあるプロセッサ(このRXもそうです)があります。1パス目では飛び先が遠いのか近いのかもわからない(前者)ので長いフォーマットにしておきます。2パス目で短いフォーマットでも届くことがわかれば切り替えますが、命令長が変わってしまうので他に影響する(後者)かもしれません。

後者の場合は正確ではないが概ね正しいので、範囲チェックをしてはいけません(エラーにすると次のパスが実行されない)が相対分岐が届くかの参考にはできます。さらにこの状況が解消(前パスと命令長が一致してアドレスが変わらなくなる)するまでパスを繰り返すことになります。

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

コメントを追加

Plain text

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