相关疑难解决方法(0)

了解std :: isnan的编译结果

我一直认为,测试NANvia 之间几乎没有区别

  • x!=x

要么

  • std::isnan(x)

但是,gcc为这两个版本提供了不同的汇编程序(在godbolt.org上直播):

  ;x!=x:
  ucomisd %xmm0, %xmm0
  movl $1, %edx
  setne %al
  cmovp %edx, %eax
  ret

  ;std::isnan(x)
  ucomisd %xmm0, %xmm0
  setp %al
  ret
Run Code Online (Sandbox Code Playgroud)

但是,我很难理解这两个版本.我天真的尝试编译std::isnan(x)将是:

  ucomisd %xmm0, %xmm0
  setne %al   ;return true when not equal
  ret
Run Code Online (Sandbox Code Playgroud)

但我必须遗漏一些东西.

可能在x!=x-version中缺少优化(编辑:它可能是gcc-8.1中回归).

是,是我的问题,为什么奇偶标志(setp,PF=1(),而不是平等的标志setne,ZF=0)用在第二个版本?

c++ optimization x86 gcc ieee-754

9
推荐指数
1
解决办法
107
查看次数

标签 统计

c++ ×1

gcc ×1

ieee-754 ×1

optimization ×1

x86 ×1