我有一个需要尽可能快的函数,它只使用整数运算。它在 AMD64 架构上运行,我需要做一些推送/弹出操作才能有足够的寄存器来使用。现在我想知道,x64 ABI 声明前四个浮点寄存器(XMM0、XMM1、XMM2 和 XMM3)是易失性的,不需要在函数调用中保留。
所以我想我可以通过 movq(MMX 或 SSE 指令集)而不是使用堆栈来存储我需要保存在这些寄存器的低 64 位(即 MM0、MM1、...)中的 64 位寄存器,从而节省了自己一些内存加载/存储。此外,我不需要使用 EMMS 存储 FPU 状态——这会破坏目的——因为我实际上并没有操作浮点寄存器,而只是将它们用作存储(而且无论如何,x87 单元在x64,因为它基本上被 SSE 取代)
我已经完成了修改并且它可以工作(没有崩溃,并且性能显着提高了 4%),但我想知道,这个“hack”是否真的有效,或者它会引入我可能错过的任何特定副作用(比如 FPU 状态腐败,即使我不使用它,那种东西)。在任何当前架构上,加载/存储到 FPU 寄存器总是比内存加载/存储快吗?
而且,是的,确实需要这种优化。公平地说,这不会严重降低代码维护成本,一行注释就足以解释这个技巧。因此,如果我可以免费获得每个字节少几个时钟而不会产生意外后果,我会很乐意接受它们 :)
谢谢。