質問

シミュレータを使用して、すでに既存のアーキテクチャ(x86)でアーキテクチャの変更をテストしたいと思います。しかし、それらを適切にテストしてベンチマークを実行するには、命令セットにいくつかの変更を加える必要があるかもしれませんが、これらの変更をGCCまたは他のコンパイラに追加する方法はありますか?

役に立ちましたか?

解決

簡単な解決策:

一般的なアプローチの1つは、インラインアセンブリを追加し、命令バイトを直接エンコードすることです。

例えば:

int main()
{
    asm __volatile__ (".byte 0x90\n");
    return 0;
}

コンパイル(gcc -o3)に:

00000000004005a0 <main>:
  4005a0:       90                      nop
  4005a1:       31 c0                   xor    %eax,%eax
  4005a3:       c3                      retq

したがって、0x90をInstバイトに置き換えてください。もちろん、通常のobjdumpに関する実際の指示は見られず、プログラムはシステムで実行されない可能性があります(NOPの組み合わせのいずれかを使用しない限り)が、シミュレーターが適切に実装されている場合はそれを認識する必要があります。

コンパイラがこの命令を知らないときに最適化することを期待できないことに注意してください。また、状態(レジスタ、メモリ)を変更した場合、インラインアセンブリクラッバー/入出力オプションで注意して作業する必要があります。正しさを確保します。最適化を使用する必要がある場合にのみ使用します。


複雑な解決策

別のアプローチは、これをコンパイラに実装することです - GCCで実行できますが、コメントで述べたように、LLVMはおそらくコンパイラ開発プラットフォームとして設計されているため、おそらくプレイするのに最適なものの1つですが、それでも非常に複雑ですLLVMはIRの最適化段階に最適であり、ターゲット固有のバックエンドを変更しようとする場合、やや友好的ではありません。
それでも、それは実行可能であり、コンパイラにこの命令をいつ発行するかを決定させることを計画している場合は、それを行う必要があります。ただし、最初のオプションから始めて、シミュレーターがこの追加で動作するかどうかを確認することをお勧めします。

LLVMでこれを実装することを決定した場合、あなたの最善の策はそれを本質的な関数として定義することです。 http://llvm.org/docs/extendingllvm.html

他のヒント

「マシン説明」と呼ばれるGCCのファイルのグループを変更して、新しい指示を追加するか、存在することを変更できます。指示パターン <target>.md ファイル、いくつかのコード <target>.c ファイル、述語、制約など。これらのすべてが入ります $GCCHOME/gcc/config/<target>/ フォルダ。 RTLからの生成ASMコードのステップで使用するこれらすべてのもの。また、他の一般的なGCCソースファイルを変更したり、SSAツリー生成を変更したり、RTL生成を変更したりすることにより、エミシング命令のケースを変更することもできますが、これらはすべて複雑です。何が起こったのか簡単な説明:

https://www.cse.iitb.ac.in/grc/slides/cgotut-gcc/topic5-md-intro.pdf

それは実行可能で、私はそれをしましたが、それは退屈です。基本的に、既存のプラットフォームをモデルとして使用して、コンパイラを新しいプラットフォームに移植するプロセスです。 GCCのどこかに、命令セットを定義するファイルがあり、コンパイル中にさまざまなプロセスを経て、さらなるコードとデータを生成します。私がやったのは20年以上ですので、すべての詳細を忘れてしまいました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top