Pro*_*oWi 3 compiler-construction x86 gcc instruction-set cpu-architecture
我想使用模拟器在已经存在的体系结构(x86)上测试一些体系结构更改。但是,要正确测试它们并运行基准测试,我可能必须对指令集进行一些更改,是否可以将这些更改添加到GCC或任何其他编译器中?
一种常见的方法是添加内联汇编,并直接对指令字节进行编码。
例如:
int main()
{
asm __volatile__ (".byte 0x90\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译(gcc -O3)为:
00000000004005a0 <main>:
4005a0: 90 nop
4005a1: 31 c0 xor %eax,%eax
4005a3: c3 retq
Run Code Online (Sandbox Code Playgroud)
因此,只需将0x90替换为您的inst字节即可。当然,您不会在常规objdump上看到实际的指令,并且该程序可能不会在您的系统上运行(除非您使用nop组合之一),但是如果在此处正确实现,模拟器应该会识别它。
请注意,当编译器不知道此指令时,就不能指望它为您优化,如果将状态(寄存器,内存)更改为以下内容,则应小心并使用内联汇编缓冲区/输入/输出选项:确保正确性。仅在必要时使用优化。
另一种方法是在编译器中实现该方法-可以在gcc中完成,但是正如注释中所述,LLVM可能是最好的方法之一,因为它被设计为编译器开发平台,但是仍然非常复杂因为LLVM最适合IR优化阶段,并且在尝试修改特定于目标的后端时不太友好。
仍然是可行的,如果您还打算让编译器决定何时发布此指令,则必须这样做。但是我建议从第一个选项开始,看看您的模拟器是否甚至可以使用此附加功能,然后才在编译器端花费时间。
如果确实要决定在LLVM中实现此功能,最好的选择是将其定义为内在函数,此处有相对更多的文档-http://llvm.org/docs/ExtendingLLVM.html
| 归档时间: |
|
| 查看次数: |
1063 次 |
| 最近记录: |