msvc 2017 x64寄存器保留

问题描述 投票:-1回答:1

根据https://docs.microsoft.com/ru-ru/cpp/build/x64-software-conventions?view=vs-2017-xmm6:xmm15是非易失性的。但是,如果我不保留xmm6,xmm7,我的程序也不会崩溃。我不会从汇编中调用OS。在这种情况下是否需要保留寄存器?我正在Windows 7下运行。

windows assembly visual-c++ sse calling-convention
1个回答
3
投票

中断ABI不会保证错误,就像C中的UB可能会起作用一样。例如也许调用者保存/恢复(在进入/退出时)您销毁的XMM reg,但是在调用your函数时并不关心它们的值。例如也许它想通过printf调用而不是通过函数调用将FP值保留在寄存器中。

或者也许没有人使用它们,main和CRT启动代码不在乎。


ABI保证工作的方式是,如果您遵循这些保证,就可以保证[[no问题,而不是其他方法。

IDK,如果有一个调用约定的“检查器”包装函数,该函数将验证是否正确保留了所有保留调用的reg,并且您没有踩到影子空间和(如果有的话)堆栈arg之外的任何堆栈空间。大概有人在写这样的东西。例如Writing a thunk to verify SysV ABI compliance


最好避免保存这些寄存器,因为它会影响性能(虽然不多,但仍会影响)。

[如果您使用GCC或clang编译C,则可以使用x86-64 System V ABI声明asm函数的原型,其中所有xmm0..15都被称为调用(并且arg-passing使用不同的寄存器) ,使用GCC function attribute

__attribute__((sysv_abi)) extern "C" int myfunc(void);

然后,调用者将不得不保存/恢复xmm6..15的

all

,因为它必须假定被调用者将其全部销毁。对于在调用树上足够高的函数执行此操作,以使此开销在许多函数调用中摊销。

(或更好的是,

使用内在函数,以便您可以内联使用XMM regs并优化消除调用/ ret开销以及保存/恢复XMM reg开销。如果保存/恢复或调用开销很重要,则解决方案更加内联,因此功能不会那么小。)

请参见Work around windows calling convention preserving xmm registers?。请注意,ICC有问题,并且无法在调用System V ABI函数的周围保存/恢复XMM6..15,并且GCC在Windows上不正确地支持AVX(堆栈对齐问题)。
© www.soinside.com 2019 - 2024. All rights reserved.