- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
编译时
double isnan(double x){
return x!=x
}
两者都是clang and gcc utilize奇偶校验标志 PF
:
_Z6is_nand: # @_Z6is_nand
ucomisd %xmm0, %xmm0
setp %al
retq
然而,the comparison 的两种可能结果是:
NaN Not-Nan
ZF 1 1
PF 1 0
CF 1 0
这意味着也可以使用 CF
标志作为替代,即 setb
而不是 setp
.
与 setb
相比,使用 setp
是否有任何优势,或者这两种编译器都使用奇偶校验标志是巧合吗?
最佳答案
优点是编译器自然发出这段代码,不需要特殊情况来识别 x!=x
并将其转换为 !(x >= x)
。
如果没有 -ffast-math,x != y
必须检查 PF 以查看比较是否有序,然后检查 ZF 是否相等。在两个输入相同的特殊情况下,大概像 CSE 这样的正常优化机制可以摆脱 ZF 检查,只留下 PF。
在这种情况下,setb
不会更糟,但它绝对没有优势,而且对人类来说更容易混淆,并且它可能需要更多特殊情况的代码供编译器使用发出它。
您建议的转换仅在将结果与使用 CF 的特殊指令一起使用时才有用,例如 adc
。例如,nan_counter += arr[i] != arr[i]
。自动矢量化很简单 (cmp_unord_ps
/psubd
),但标量清理(或非数组输入的标量用例)可以使用 ucomiss
/adc $0, %eax
而不是 ucomiss
/setp
/add
。
这在 Broadwell 和更高版本以及 AMD 上保存了一条指令和一个 uop。 (早期的 Intel CPU 有 2 uop adc,除非它们是特殊情况 $0
,因为它们不支持 3 输入 uops)
关于c - 使用 `setp` 而不是 `setb` 有优势吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51368746/
编译时 double isnan(double x){ return x!=x } 两者都是clang and gcc utilize奇偶校验标志 PF: _Z6is_nand: # @_Z6i
这里有两个整数集,比如A和B我们可以得到另一个集合C,其中每个元素都是A中的元素a和B中的元素b之和。 例如,A = {1,2},B = {3,4},我们得到 C = {4, 5, 6} 其中 4=1
这是我应该翻译的汇编代码:f1: subl $97, %edi xorl %eax, %eax cmpb $25, %dil setbe %al ret 这是我编写的我认为等效的
我是一名优秀的程序员,十分优秀!