相关疑难解决方法(0)

发出 DIV 指令,而不是 __udivti3

考虑以下代码:

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上述代码?

编辑:假设商适合 …

c optimization gcc x86-64 clang

5
推荐指数
1
解决办法
1148
查看次数

标签 统计

c ×1

clang ×1

gcc ×1

optimization ×1

x86-64 ×1