首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86/x64处理器使用哪些寄存器进行浮点运算?

x86/x64处理器使用哪些寄存器进行浮点运算?
EN

Stack Overflow用户
提问于 2013-08-09 08:23:27
回答 2查看 4.1K关注 0票数 1

x86/x64使用SIMD寄存器进行高精度浮点运算还是使用专用FP寄存器?

我指的是高精度版本,而不是常规的double精度。

EN

回答 2

Stack Overflow用户

发布于 2016-05-01 22:59:31

正如@EricPostpischil指出的那样,FPU堆栈仍然可用,并公开了一个80位精度的算术(不确定处理器是否仍然具有完整的逻辑,或者这部分是否在硬件级别得到了仿真)。它以long double类型提供给了GCC的开发人员。例如,生成的程序集For方法

代码语言:javascript
运行
复制
long double f(long double a, long double b)
{
    return a*b ;
}

将会是

代码语言:javascript
运行
复制
    fldt    16(%rbp)
    fldt    32(%rbp)
    fmulp   %st, %st(1)

archive email为使用此类数据提供了有用的元素,例如:

long double my_logl(long double x) { long double y;__asm__ volatile( "fldln2\n“”fldl%1\n“"fyl2x”:"=t“(y):"m”(x));__asm__ y;}

在编译没有SSE、AVX或其他向量扩展的代码时,您的代码可能会使用80位FPU生成这样的指令,并且可能会输出不同的值。下面是一个示例代码来说明:

代码语言:javascript
运行
复制
double epstest(long double a, long double b)
{
        long double y ;
        y = a + b ;
        y = y - a ;
        return y ;
}

#include <cstdio>

int main()
{
        double x = 1.0 ;
        double y = 1e-17 ;
        double z = x + y ;
        z = z - x ;
        printf ("double: %lf + %le - %lf = %le\n",  x, y, x, z);
        double res = epstest (x, y) ;
        printf ("long double: %lf + %le - %lf = %le\n",  x, y, x, res);
        return 0 ;
}

和输出:

代码语言:javascript
运行
复制
double: 1.000000 + 1.000000e-17 - 1.000000 = 0.000000e+00
long double: 1.000000 + 1.000000e-17 - 1.000000 = 9.974660e-18

在x86_64的软件中实现了更高的精度(超出long double)。

票数 1
EN

Stack Overflow用户

发布于 2013-08-09 09:21:16

FPU (浮点单元)具有80位浮点值的寄存器( Intel格式,略有更改的IEEE 754格式)。

各种SIMD单元(SSE、AVX等)具有更大的寄存器,可用于许多事情,但仅有用于32位和64位浮点的指令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18138382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档