考虑以下代码:
unsigned long long div(unsigned long long a, unsigned long long b, unsigned long long c) {
unsigned __int128 d = (unsigned __int128)a*(unsigned __int128)b;
return d/c;
}
Run Code Online (Sandbox Code Playgroud)
当使用 x86-64 gcc 10 或 clang 10 编译时,两者都带有-O3,它会发出 __udivti3, 而不是DIVQ指令:
div:
mov rax, rdi
mov r8, rdx
sub rsp, 8
xor ecx, ecx
mul rsi
mov r9, rax
mov rsi, rdx
mov rdx, r8
mov rdi, r9
call __udivti3
add rsp, 8
ret
Run Code Online (Sandbox Code Playgroud)
至少在我的测试中,前者比后者(已经)慢得多,因此问题是:有没有办法让现代编译器发出DIVQ上述代码?
编辑:假设商适合 …