Assembly 64位汇编中的计算能力

Assembly 64位汇编中的计算能力,assembly,floating-point,x86-64,sse,pow,Assembly,Floating Point,X86 64,Sse,Pow,我知道,在32位汇编中,可以使用x87指令FYL2X、F2XM1和FSCALE的组合来计算幂(相当于C中的pow(double,double)) 然而,在64位汇编中,我读到不推荐使用x87数学协处理器,而应该使用SSE2指令。虽然我能够找到像ADDSD、MULSD和DIVSD这样在XMM寄存器上运行的指令,但我无法找到任何与幂、指数或对数相关的指令(我找到的唯一接近的指令是SQRTSD,但它没有太大帮助)来帮助我计算幂 那么,如何使用SSE2指令计算幂(a^b,其中a和b都是浮点值)?甚至可以

我知道,在32位汇编中,可以使用x87指令
FYL2X
F2XM1
FSCALE
的组合来计算幂(相当于C中的
pow(double,double)

然而,在64位汇编中,我读到不推荐使用x87数学协处理器,而应该使用SSE2指令。虽然我能够找到像
ADDSD
MULSD
DIVSD
这样在XMM寄存器上运行的指令,但我无法找到任何与幂、指数或对数相关的指令(我找到的唯一接近的指令是
SQRTSD
,但它没有太大帮助)来帮助我计算幂


那么,如何使用SSE2指令计算幂(a^b,其中a和b都是浮点值)?甚至可以这样做,或者您需要借助软件计算或x87吗?

它是在软件中完成的,使用一系列SSE和SSE2指令,即使这样,它也比x87 FPU快。@IwillnotexistIdonotexist如何在软件中进行计算?我只是想从头开始做一个幂函数,因为我只是将我的项目与用于I/O的Win32库相链接,所以我无法访问其他库,如Microsoft C Runtime,以便使用pow,但在编写数学函数时,我是一个不速之客。我更感兴趣的是精度,而不是速度。@DarkAtom编写自己的
pow
最简单的方法是使用x87指令。它不会比软件实现慢很多,但是它更容易实现。软件实现有点棘手,因为它们需要非常小心地实现,以便在整个浮点数范围内都保持精确。@fuz:这取决于你在寻找什么样的速度/精度权衡。如果你不需要接近1 ulp(尾数一点)的精度,你不需要非常小心。自行滚动的一个优点是,您可以为您的用例选择折衷方案,例如,如果这对您的应用程序不重要,您可以忽略NaN或+-Inf输入。这是在软件中完成的,使用一系列SSE和SSE2指令,即使这样,它也比x87 FPU快。@IwillnotexistIdonotexist如何在软件中进行计算?我只是想从头开始做一个幂函数,因为我只是将我的项目与用于I/O的Win32库相链接,所以我无法访问其他库,如Microsoft C Runtime,以便使用pow,但在编写数学函数时,我是一个不速之客。我更感兴趣的是精度,而不是速度。@DarkAtom编写自己的
pow
最简单的方法是使用x87指令。它不会比软件实现慢很多,但是它更容易实现。软件实现有点棘手,因为它们需要非常小心地实现,以便在整个浮点数范围内都保持精确。@fuz:这取决于你在寻找什么样的速度/精度权衡。如果你不需要接近1 ulp(尾数一点)的精度,你不需要非常小心。自行滚动的一个优点是,您可以为您的用例选择折衷方案,例如,如果这对您的应用程序不重要,您可以忽略NaN或+-Inf输入。