我想知道以下几点:
是否可以创建一小组汇编指令,它们可以一起完成所有可能的操作?或者可能会问不同的问题,关于任何架构的必备汇编指令是什么?
(例如,任何事情都需要 Jump 和 Add)
我希望你们能帮助我!
提供一些背景信息:我正在尝试为我的编译器设计一种中间语言,并且我想使用尽可能少的指令(然后,这些指令中的一堆指令可以代替特定架构的一个复杂指令)。当然,IL 本身应该是可移植的。
我想知道以下几点:
是否可以创建一小组汇编指令,它们可以一起完成所有可能的操作?或者可能会问不同的问题,关于任何架构的必备汇编指令是什么?
(例如,任何事情都需要 Jump 和 Add)
我希望你们能帮助我!
提供一些背景信息:我正在尝试为我的编译器设计一种中间语言,并且我想使用尽可能少的指令(然后,这些指令中的一堆指令可以代替特定架构的一个复杂指令)。当然,IL 本身应该是可移植的。
我想你想要相反的。与其制作一个尽可能简单的 IL,不如打造一个极具表现力的 IL。IL 越具有表现力,就越容易针对特定架构进行优化。
将一个复杂的 IL 操作扩展为许多单独的指令比将许多简单的 IL 操作合并为一个复杂的指令更容易。您可能不需要乘法,因为它可以通过跳转和添加指令来完成。但是,当您为具有硬件乘法的芯片进行编译时,您必须分析 IL 以确定这是一个“加法循环”并将其转换回乘法。这比遇到乘法并说“嗯,这种架构不能做到这一点,我想我们必须使它成为一个加法循环”要多得多。
另一个例子,你可能认为你的 IL 不需要浮点运算,因为一些 ARM 芯片无论如何都必须在软件中进行浮点运算。但是一些 ARM 芯片不必这样做,如果您的 IL 不支持 FP 操作,那么您需要将复杂的软件 FP IL 转换回单个硬件指令。
最好将您的 IL 与最先进和最复杂的硬件功能相匹配,然后在没有这些功能的处理器上“回退”到这些功能的“软件仿真”。
虽然只有一个就足够了,但实际上它比你想象的要复杂得多,而且通常需要更多的指令来完成同样的工作。如果您需要芯片的速度“可用”,那么 IMO 它应该至少有一些通用指令:
使用子指令或按位指令,您可以移动数据,因此取决于您的架构和操作码大小,您可以删除 MOV 或加载/存储以进一步简化它。