我正在为编译器编写一个 x86 后端,并且发现为我需要的每条汇编指令编码机器代码真的很乏味,而且我显然是在重新发明轮子。在任何地方是否有该指令集的声明性表示,例如将指令操作和操作数映射到字节的 XML 文件?
2 回答
我强烈建议为此使用DynASM。它不是声明性描述,但它使您可以绝对控制发出的指令,并且比声明性描述更容易使用。这是编写特定于平台的代码生成 IMO 的理想方式。
它也非常小且不显眼:运行时完全包含在几百行.h
文件中。
有关使用 DynASM编写非常简单的代码生成器的示例,请参阅我的DynASM 教程。
即使您不相信 DynASM,您也会在 DynASM 代码库中找到对 x86 指令的非常简洁的声明性描述,您可能会发现它很有用。
我在下面假设您不想在运行时依赖于像 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
在 Previous 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