【发布时间】:2019-05-17 15:06:22
【问题描述】:
在 Windows 上是否有任何方法可以解决 XMM 寄存器保留在函数调用中的要求?(除了将其全部写入汇编)
不幸的是,我有许多 AVX2 内在函数因此而臃肿。
作为一个例子,编译器(MSVC)将把它放在函数的顶部:
00007FF9D0EBC602 vmovaps xmmword ptr [rsp+1490h],xmm6
00007FF9D0EBC60B vmovaps xmmword ptr [rsp+1480h],xmm7
00007FF9D0EBC614 vmovaps xmmword ptr [rsp+1470h],xmm8
00007FF9D0EBC61D vmovaps xmmword ptr [rsp+1460h],xmm9
00007FF9D0EBC626 vmovaps xmmword ptr [rsp+1450h],xmm10
00007FF9D0EBC62F vmovaps xmmword ptr [rsp+1440h],xmm11
00007FF9D0EBC638 vmovaps xmmword ptr [rsp+1430h],xmm12
00007FF9D0EBC641 vmovaps xmmword ptr [rsp+1420h],xmm13
00007FF9D0EBC64A vmovaps xmmword ptr [rsp+1410h],xmm14
00007FF9D0EBC653 vmovaps xmmword ptr [rsp+1400h],xmm15
然后在函数的最后..
00007FF9D0EBD6E6 vmovaps xmm6,xmmword ptr [r11-10h]
00007FF9D0EBD6EC vmovaps xmm7,xmmword ptr [r11-20h]
00007FF9D0EBD6F2 vmovaps xmm8,xmmword ptr [r11-30h]
00007FF9D0EBD6F8 vmovaps xmm9,xmmword ptr [r11-40h]
00007FF9D0EBD6FE vmovaps xmm10,xmmword ptr [r11-50h]
00007FF9D0EBD704 vmovaps xmm11,xmmword ptr [r11-60h]
00007FF9D0EBD70A vmovaps xmm12,xmmword ptr [r11-70h]
00007FF9D0EBD710 vmovaps xmm13,xmmword ptr [r11-80h]
00007FF9D0EBD716 vmovaps xmm14,xmmword ptr [r11-90h]
00007FF9D0EBD71F vmovaps xmm15,xmmword ptr [r11-0A0h]
这是 20 条指令,因为我不需要保留 XMM 的状态,所以什么都不做。我有 100 个这样的函数,编译器会像这样膨胀。它们都是通过函数指针从同一个调用站点调用的。
我尝试更改调用约定(__vectorcall/cdecl/fastcall),但这似乎没有任何作用。
【问题讨论】:
-
通常,这些内在函数是内联的。为什么你的代码不是这样?
-
您确定编译器优化已打开吗? “虚拟机”是什么意思?如果功能不小,保存和恢复寄存器有什么问题?
-
调用代码假定寄存器被保留。如果你不保留它们,调用函数(或者它的调用者,或者它的调用者的调用者,......)可能会出现异常。
-
@Froglegs 我不对你的心理能力做任何假设。但是鉴于您在问题中提供了零细节并且没有minimal reproducible example,我不得不猜测实际情况是什么。也许下次尝试问一个更好的问题,而不是因为别人试图帮助你而感到侮辱。
-
大多数解释器不会执行您的代码正在执行的操作,因为从单个调用站点调用数百个可能的函数通常会导致几乎每个调用都被分支预测错误预测,从而导致巨大的停顿。因此,大多数解释器至少会尝试部分内联函数并使用诸如使用计算机 goto 的所谓“线程代码”之类的技巧来改进预测。此时担心保存这些寄存器的成本可能还为时过早。
标签: windows assembly sse calling-convention abi