交叉编译是否会创建与本机编译完全相同的输出?

Fed*_*dor 5 c++ x86-64 cross-compiling visual-studio

我有一个基于 Visual C++ 的 Intel/AMD x64 架构项目。我在最新的 Visual Studio 2022 版本 17.6 中使用 x86 构建工具进行交叉编译。(实际上,Microsoft 支持人员建议解决本机 x64 构建工具经常发生的error C3859: Failed to create virtual memory for PCH问题: https://developercommunity.visualstudio.com/t/error-C3859 :-Failed-to-create-virtual-me/10056333 )fatal error C1076: compiler limit: internal heap limit

我预计用于交叉编译的本机 x64 工具链和 x86 工具链将生成完全相同的汇编代码。但事实上似乎并非总是如此。

我能得到的最小的例子如下:

constexpr float foo(size_t itemCount) {
    return ( 10 - 4.0f * ( itemCount - 1 ) ) / float ( itemCount );
}

int main() {
    constexpr float a = foo(3);
    const float & b = foo(3);
    printf( "%g %g", a, b );
}
Run Code Online (Sandbox Code Playgroud)

在使用本机 x64 工具链的发布配置(/O2命令行开关)中<PreferredToolArchitecture>x64</PreferredToolArchitecture>,程序打印0.666667 0.666667,汇编代码为

00007FF7785E1014  movsd       xmm1,mmword ptr [__real@3fe5555560000000 (07FF7785E2228h)]  
00007FF7785E101C  lea         rcx,[string "%g %g" (07FF7785E2220h)]  
00007FF7785E1023  movaps      xmm2,xmm1  
00007FF7785E1026  movq        r8,xmm1  
00007FF7785E102B  movq        rdx,xmm1  
00007FF7785E1030  call        printf (07FF7785E1040h)  
Run Code Online (Sandbox Code Playgroud)

使用 x86 构建工具进行交叉编译,<PreferredToolArchitecture>x86</PreferredToolArchitecture>使程序打印0.666667 1出汇编代码:

00007FF689721014  movsd       xmm2,mmword ptr [__real@3ff0000000000000 (07FF689722230h)]  
00007FF68972101C  lea         rcx,[string "%g %g" (07FF689722220h)]  
00007FF689721023  movsd       xmm1,mmword ptr [__real@3fe5555560000000 (07FF689722228h)]  
00007FF68972102B  movq        r8,xmm2  
00007FF689721030  movq        rdx,xmm1  
00007FF689721035  call        printf (07FF689721050h)  
Run Code Online (Sandbox Code Playgroud)

可以看出,这两个值都是在编译期间计算的,但现在它们不同了。

为了简化复制,只需克隆这个GitHub 存储库即可。

使用交叉编译生成的机器代码是否可以不同,或者应该与本机构建工具生成的机器代码完全相同?

Min*_*SFT 1

来自 Fedor 提交的报告:

https://developercommunity.visualstudio.com/t/x86-build-tools-create-wrong-x64-code/10394622

此问题的修复已在内部实施,并正在准备发布。