4

私はコンパイラ用の x86 バックエンドを作成していますが、必要なアセンブリ命令ごとにマシン コードをエンコードするのは非常に面倒であり、明らかに車輪の再発明を行っています。この命令セットの宣言的表現はどこかにありますか? たとえば、命令操作とオペランドをバイトにマッピングする XML ファイルはありますか?

4

2 に答える 2

1

以下では、実行時に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

http://previous.unixdude.net/

https://github.com/probonopd/previous/blob/master/src/cpu/jit/codegen_x86.h

于 2020-12-22T15:25:10.780 に答える