/ 与 / ]

问题描述 投票:2回答:1
的差异

编译以下代码时:

int f(int i1,int i2)
{
    long l1=i1;
    long l2=i2;
    return l1*l2;
}

对于x86-64使用clang 10.1,使用-O3,我得到

    mov     eax, edi
    imul    eax, esi
    ret

编译器认识到,不需要完整的64位操作。

但是,当我用除法代替乘法:

int f(int i1,int i2)
{
    long l1=i1;
    long l2=i2;
    return l1/l2;
}

它编译成

    movsx   rax, edi
    movsx   rsi, esi
    cqo
    idiv    rsi
    ret

因此,它使用64位除法(与gcc相同)。

在这里阻止使用32位除法的反例是什么?

编译以下代码时:int f(int i1,int i2){long l1 = i1;长l2 = i2;返回l1 * l2; }在x86-64上使用clang 10.1,在-O3下,我得到mov eax,edi imul eax,...

optimization compiler-construction compiler-optimization
1个回答
0
投票

考虑i1 == INT_MIN == -2147483648i2 == -1时会发生什么。

© www.soinside.com 2019 - 2024. All rights reserved.