私はコンパイラ用の x86 バックエンドを作成していますが、必要なアセンブリ命令ごとにマシン コードをエンコードするのは非常に面倒であり、明らかに車輪の再発明を行っています。この命令セットの宣言的表現はどこかにありますか? たとえば、命令操作とオペランドをバイトにマッピングする XML ファイルはありますか?
2 に答える
以下では、実行時にLLVMのような巨大なものに依存したくないと仮定しています。
私がこの質問を調査した理由は、サイズが 2000 ~ 3000 LoC 程度のセルフホスティング Lispにマシン コード エミッターを追加したいからです。現在の LLVM への依存、または Gnu アセンブラーへの依存に甘んじることは、このプロジェクトの背後にあるまさに理想である、可能な限り少ないコードからの自己ホストを無効にすることになります。
これが私が今のところ見つけたものです:
LLVM の TableGen もあります
これは簡単なことではなく、宣言型の記述から独自のコードを生成するには、C++ コードを記述する必要があります (その形式を自分で解析して処理する準備ができていない場合)。これは包括的ですが、最も単純ではありません。
https://llvm.org/docs/TableGen/index.html
lib/Target/X86/X86InstrInfo.td
llvm-tblgen-10 --help
前のNEXTエミュレーターにはもっと簡単なものがあります
これは基本的に、#define
比較的簡単に処理できる C マクロの網です ( Lisp の例を参照してください)。
オンラインで見つけたコピー/バージョンは次のとおりです。
https://github.com/cebix/macemu/blob/master/BasiliskII/src/uae_cpu/compiler/codegen_x86.h
https://unix.superglobalmegacorp.com/previous/newsrc/src/cpu/jit/codegen_x86.h.html
https://github.com/probonopd/previous/blob/master/src/cpu/jit/codegen_x86.h