首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >浮点型赋值是否算作使用fpu?

浮点型赋值是否算作使用fpu?
EN

Stack Overflow用户
提问于 2015-04-09 15:43:49
回答 1查看 63关注 0票数 1

由于fpu操作是非常昂贵的,我想尽可能少使用fpu操作。同时,我想知道浮点变量中的哪种操作会被算作fpu所涉及的操作?

例如下面的代码会涉及到fpu单元吗?

代码语言:javascript
复制
struct my_float_struct {
    int f;
} g;

void func(float a)
{
    g.f = a;
}

调用func会导致延迟的FPU上下文切换吗?

EN

回答 1

Stack Overflow用户

发布于 2015-04-09 18:41:20

在内核中,你根本不应该使用float (使用lookup tables和乘以系数来节省除法运算的精度)。在用户空间中,所有涉及RHS上的float类型的操作都会导致float指令的使用。如果你在RHS上有两个整数,但是将结果赋值给float (在LHS上) --你将结束整数操作,但也会转换成浮点指令(如cvtsi2ss)。

实际上,只要查看反汇编中相应的C代码,就可以很容易地回答您的问题。

C代码(使用gcc -Wall -O0 -g main.c构建):

代码语言:javascript
复制
int main(void)
{
    volatile float f1, f2;
    volatile int i;

    f1 = i * 356;
    f2 = f1 * f2;

    return 0;
}

反汇编(使用objdump -DS a.out):

代码语言:javascript
复制
int main(void)
{
  4004b6:       55                      push   %rbp
  4004b7:       48 89 e5                mov    %rsp,%rbp
        volatile float f1, f2;
        volatile int i;

        f1 = i * 356;
  4004ba:       8b 45 f4                mov    -0xc(%rbp),%eax
  4004bd:       69 c0 64 01 00 00       imul   $0x164,%eax,%eax
  4004c3:       66 0f ef d2             pxor   %xmm2,%xmm2
  4004c7:       f3 0f 2a d0             cvtsi2ss %eax,%xmm2
  4004cb:       66 0f 7e d0             movd   %xmm2,%eax
  4004cf:       89 45 fc                mov    %eax,-0x4(%rbp)
        f2 = f1 * f2;
  4004d2:       f3 0f 10 4d fc          movss  -0x4(%rbp),%xmm1
  4004d7:       f3 0f 10 45 f8          movss  -0x8(%rbp),%xmm0
  4004dc:       f3 0f 59 c8             mulss  %xmm0,%xmm1
  4004e0:       66 0f 7e c8             movd   %xmm1,%eax
  4004e4:       89 45 f8                mov    %eax,-0x8(%rbp)

        return 0;
  4004e7:       b8 00 00 00 00          mov    $0x0,%eax
}

从这里你可以看到:

  • 当整数乘以整数,但将结果赋给浮点数时,它会导致imul指令(整数乘法),也会导致cvtsi2ss (转换为浮点数)将2个浮点数相乘,它会导致mulss指令,该指令将浮点数与

相乘

基本上,您可以立即看到指令所涉及的浮点单元是否在浮点单元寄存器上操作,如%xmm0%xmm1等。

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

https://stackoverflow.com/questions/29532674

复制
相关文章

相似问题

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