【发布时间】:2019-06-23 14:37:21
【问题描述】:
我注意到 Clang 为以下 sn-p 做了一个有趣的除法优化技巧
int64_t s2(int64_t a, int64_t b)
{
return a/b;
}
如果将 march 指定为 Sandy Bridge 或更高版本,则以下是程序集输出
mov rax, rdi
mov rcx, rdi
or rcx, rsi
shr rcx, 32
je .LBB1_1
cqo
idiv rsi
ret
.LBB1_1:
xor edx, edx
div esi
ret
这里是 the signed version 和 the unsigned version 的 Godbolt 链接
据我了解,它检查两个操作数的高位是否为零,如果是,则进行 32 位除法
我检查了this table,发现 Core2 和 Nehalem 上 32/64 位除法的延迟分别为 40/116 和 26/89。因此,如果操作数确实通常不宽,那么通过进行 32 位除法而不是 64 位除法所节省的成本可能与 SnB 上的一样值得
那么为什么它只对 SnB 和更高版本的微架构启用呢?为什么 GCC 或 ICC 等其他编译器不这样做?
【问题讨论】:
标签: assembly optimization clang x86-64 division