gpt4 book ai didi

assembly - 推送到浮点寄存器而不是堆栈

转载 作者:行者123 更新时间:2023-12-04 15:35:36 27 4
gpt4 key购买 nike

我有一个需要尽可能快的函数,它只使用整数运算。它在 AMD64 架构上运行,我需要做一些推送/弹出操作才能有足够的寄存器来使用。现在我想知道,x64 ABI 声明前四个浮点寄存器(XMM0、XMM1、XMM2 和 XMM3)是 volatile 的,不需要跨函数调用保留。

所以我想我可以通过 movq(MMX 或 SSE 指令集)而不是使用堆栈将我需要保留的 64 位寄存器存储在这些寄存器的低 64 位(即 MM0、MM1 等)中,从而节省我自己一些内存加载/存储。此外,我不需要使用 EMMS 存储 FPU 状态——这会破坏目的——因为我实际上并没有操纵浮点寄存器,而只是将它们用作存储(无论如何,x87 单元在x64,因为它基本上被 SSE 取代)

我已经完成了修改并且它有效(没有崩溃,并且性能明显提高了 4%),但我想知道,这个“hack”真的有效还是会引入我可能错过的任何特定副作用(比如 FPU 状态)腐败,即使我不使用它,诸如此类)。并且在任何当前架构上加载/存储到 FPU 寄存器总是比内存加载/存储更快吗?

而且,是的,确实需要这种优化。公平地说,这不会严重降低代码维护成本,一行注释就足以解释这个技巧。因此,如果我可以免费获得每字节少几个时钟而没有意外后果,我会很乐意接受它们:)

谢谢。

最佳答案

EMMS 指令只需要在 MMX 操作后清除状态。 SSE 指令不需要它。所以这肯定不会冲突。

当然,您应该记住,不同的编译器和操作系统使用不同的调用约定,有些可能会以不同的方式对待这四个寄存器。

但是,只要牢记这一点,我认为这种方法没有问题。您正在按照 ABI 应使用的方式使用所有寄存器。

假设这是用汇编编写的,则无需考虑这是否会妨碍编译器优化(C/C++ 函数深入 ASM 并开始讨论特定寄存器使编译器更难优化代码)

关于assembly - 推送到浮点寄存器而不是堆栈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11485169/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com