【发布时间】:2018-09-03 00:22:12
【问题描述】:
我有一个简单的program:
int main()
{
return 2*7;
}
打开优化的 GCC 和 clang 都可以生成 2 条指令二进制文件,但 icc 会给出奇怪的输出。
push rbp #2.1
mov rbp, rsp #2.1
and rsp, -128 #2.1
sub rsp, 128 #2.1
xor esi, esi #2.1
mov edi, 3 #2.1
call __intel_new_feature_proc_init #2.1
stmxcsr DWORD PTR [rsp] #2.1
mov eax, 14 #3.12
or DWORD PTR [rsp], 32832 #2.1
ldmxcsr DWORD PTR [rsp] #2.1
mov rsp, rbp #3.12
pop rbp #3.12
ret
【问题讨论】:
-
如果您将函数名称更改为
main2(或任何其他名称),则代码将更改 - 变得正常。这意味着main是 icc 编译器的特殊名称,它会在此处生成额外的特殊代码 -
ICC 可能会为
main生成模板代码,作为未优化的托管环境的一部分。将main重命名为其他名称或尝试使用-ffreestanding。main得到特殊待遇。 -
谢谢。如果你们两个中的任何一个想把你的评论变成 A 并解释为什么 icc 对待 main 的方式不同,我会接受 A。
-
@OrenIshShalom:问题是关于 C++ 程序的。 Godbolt 链接显示该源代码正在编译为 C++,而不是 C。ICC 会为此发出与 C 程序相同的 asm(例如传递
-xc),但将标签任意更改为 C 是不合适的。我的回答已经提到了调用main的程序的C++ 标准规则。 (ISO C 具有相同的规则,但您没有编辑我的答案以匹配您对问题的更改。) -
@OrenIsh:不过,您编辑的其余部分都很好。
标签: c++ assembly x86 code-generation icc