繁体   English   中英

更改GCC中的指令集

[英]change instruction set in GCC

我想使用模拟器在已有的架构(x86)上测试一些架构更改。 但是为了正确测试它们并运行基准测试,我可能不得不对指令集进行一些更改,有没有办法将这些更改添加到GCC或任何其他编译器?

简单方案:

一种常见的方法是添加内联汇编,并直接编码指令字节。

例如:

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

所以只需用你的inst字节替换0x90即可。 当然你不会看到常规objdump上的实际指令,并且程序可能不会在你的系统上运行(除非你使用其中一个nop组合),但模拟器应该识别它,如果它在那里正确实现的话。

请注意,当您不知道此指令时,您不能指望编译器能够很好地为您进行优化,并且如果它改变状态(寄存器,内存),您应该注意并使用内联汇编clobber / input / output选项。确保正确。 仅在必要时才使用优化。


复杂的解决方案

另一种方法是在你的编译器中实现它 - 它可以在gcc中完成,但正如注释中所述,LLVM可能是最好的之一,因为它被设计为编译器开发平台,但它仍然非常复杂因为LLVM最适合IR优化阶段,并且在尝试修改特定于目标的后端时不太友好。
不过,它是可行的,如果您还计划让编译器决定何时发出此指令,则必须这样做。 我建议从第一个选项开始,看看你的模拟器是否适用于这个添加,然后只花时间在编译器方面。

如果你决定在LLVM中实现它,最好的办法是将它定义为一个内在函数,这里有相对更多的文档 - http://llvm.org/docs/ExtendingLLVM.html

您可以通过修改GCC中称为“机器描述”的文件组来添加新指令或更改现有指令。 <target>.md文件中的指令模式, <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 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM