これは私が最初に投稿したスタックオーバーフローです。 ;-)TriCoreエミュレータでオペランドをロードするタイミングは?
私はTriCoreエミュレータを開発しようとしていますが、命令のオペランドをロードするときの戦略を決めることはできません。 TriCoreは多分あまりにも曖昧な種類のマイクロコントローラなので、アーキテクチャを少し説明してください。
命令には、16ビットと32ビットの2種類があります。それが16ビットであろうと32ビットであろうと、最後のバイトのビット0によって決定されます。バイトオーダはリトルエンディアンであるため、常にメモリ内の最初のバイトです。問題はない。
これらの2つの命令タイプは、16ビットの場合は14、32ビットの命令の場合は25の複数のオペコード形式を持ちます。オペコードは2つの別々のオペコードフィールドに分割されますが、16ビットのほとんどのオペコードフィールドは1つしかありません。最初のオペコードフィールドは下位8ビットにあります。それは16ビット命令の命令を直接記述し、32ビット命令の多くについてはオペランドの符号化を記述するが、第2のフィールドは実際の命令を記述する(もちろん例外がある)。
私の計画では、常にすべての命令コード(すべての命令フォーマットでは第2フィールドの位置が同じでないため少し煩わしい)を抽出し、それらを一緒に16ビットの値に入れて、関数ポインタテーブル。
この値に応じて、オペランドを抽出したいと思います。例えば、32ビット命令で第1のオペコードが0x8B
であるとき、オペランドは2つのデータレジスタと1つの9ビット定数である。しかし、実際に面倒な例外があります。
ADD.A
とADDSC.A
命令はどちらもオペコード1 == 0x01
です。しかし、ADD.A
は3つのアドレスレジスタを使用し、ADDSC.A
は命令にエンコードされた2つのアドレスレジスタ、1つのデータレジスタとインデックスを使用します。
私の質問は最後です:命令を実行する前に、このようなアーキテクチャでオペランドをロードすることは可能でしょうか?または、命令関数を最初に呼び出してそこのオペランドを抽出する方がよいでしょうか?興味がある人々のために
は、命令セットのマニュアルはここにある:任意のヒントのhttp://www.infineon.com/dgdl/tc_v131_instructionset_v138.pdf?folderId=db3a304412b407950112b409b6cd0351&fileId=db3a304412b407950112b409b6dd0352
ありがとう!
BTW:選択する言語はCまたはC++です。
は(要求することで、私は私の元の質問に私の考えを挿入。)
まあ、私は私が持っているさまざまなオプションについて広く考えて、私は次のように落ち着くと思います。私は2つの部分に全体のプロセスを分割する
:最初のステップで
- プログラム解析とオペランド抽出
- 実行
、各命令は32ビットにロードされ、整列されます。次に、ロードされた命令はビットマスクのセットと比較され、最後に何が実行されるべきかだけでなくオペランドがどのようにロードされるかを示す正しいオペコードが決定されます。アドレスモード特有の関数では、オペランドはポインタにロードされます。命令の即値は必要に応じて記憶される。
これはこれに類似した構造体に集約:
struct instruction_t {
int32_t **operands;
int32_t *immediates;
};
これは基本的に(各命令のための最大の欠点割り当てられる:メモリ消費を私は(と最悪の場合のような構造体のための40バイトの周りに計算64ビットポインタ)、これは、通常は16メガバイトの命令からなるプログラムは、最終的には80メガバイトのメモリを占有することになりますが、実行速度はかなり速いと考えられます。
このアプローチでは、オペランドがどのようにロードされても問題ないので、各命令を一度だけ実装することができます。同じオペランドセットを使用して同じ命令を実行することは、コードの実行は、適切な構造体を選択し、それに応じて命令関数を呼び出すことによって、正しいオペランドセットをロードすることを意味するだけである。
私は他のアプローチがあることを知っています。特に動的再コンパイルが好きです。しかし、このシステムは、さまざまなオンチップコンポーネントとI/Oマップドレジスタがかなり複雑で、とにかに大量の定型コードを追加することになります。
私のアプローチについては、本当に感謝しています。多分あなたはそれを行うより良い方法を知っていますか?
ありがとうございました!
これは、独自の回答ではなく、元の質問の編集として、より効果的です。 –