在GCC中更改指令集

5

我希望在已有的x86架构上使用模拟器测试某些架构变更。但是,为了正确测试并运行基准测试,我可能需要对指令集进行一些更改。是否有一种方法可以将这些更改添加到GCC或任何其他编译器中呢?


2
我建议您使用LLVM而不是gcc。LLVM更加模块化,因此应该更容易修改。 - Claudio
3个回答

7

简单的解决方案:

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

例如:

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

只需将0x90替换为您的指令字节。当然,您在常规objdump上不会看到实际指令,并且该程序可能不会在您的系统上运行(除非使用其中一种nop组合),但是如果在模拟器中正确实现,则模拟器应该能够识别它。

请注意,当编译器不知道此指令时,您不能指望编译器为您进行优化,并且如果它更改状态(寄存器,内存),则应通过内联汇编破坏/输入/输出选项来确保正确性。仅在必要时使用优化。

复杂解决方案

另一种方法是在编译器中实现此功能-可以在gcc中完成,但正如评论中所述,LLVM可能是最适合玩耍的编译器开发平台之一,但在修改特定于目标的后端时,它还是有些复杂。
尽管如此,这是可行的,并且如果您计划让编译器决定何时发出此指令,则必须这样做。我建议首先从第一个选项开始,以查看您的模拟器是否与此添加一起工作,然后才花时间处理编译器方面的问题。

如果您决定在LLVM中实现此功能,最好的选择是将其定义为内部函数,在此处有相对较多的文档-http://llvm.org/docs/ExtendingLLVM.html


2
你可以通过修改GCC中名为“机器描述”的文件组来添加新指令或更改现有指令。指令模式在<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

0

这是可行的,我已经做过了,但是很繁琐。基本上就是将编译器移植到一个新平台上,使用现有平台作为模型的过程。在GCC中,有一个文件定义了指令集,并且在编译过程中经过各种处理生成更多的代码和数据。由于我已经做了20多年,所以我忘记了所有的细节,抱歉。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接