小编ehu*_*udt的帖子

优化后续调用整数除法和模(余数)

整数除法/和模%运算通常在编程中一起使用,有时甚至在相同的操作数和后续行中使用.例如,下面的C函数是一个简单的函数,它将/2个数字的结果与它们的结果相加%,就是这样:

int sum2digits(int x, int base) {
    int n, m;
    n = x / base;
    m = x % base;
    return n + m;
}
Run Code Online (Sandbox Code Playgroud)

据我所知,双方/%通过(在x86)的同一台机器的指令执行.说,如果为整数除法(执行机器指令dividiv两个数字的),ab,然后之后的值a / b将被存储在寄存器EAX,其余a % b在EDX.
我想知道编译器是否利用了这种质量并看了一下汇编代码.事实证明,使用gcc进行正常编译并不能优化:

push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x14(%rbp)
mov    %esi,-0x18(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%edx
sar    $0x1f,%edx
idivl  -0x18(%rbp)
mov    %eax,-0x8(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%edx
sar    $0x1f,%edx
idivl …
Run Code Online (Sandbox Code Playgroud)

c compiler-construction optimization compiler-optimization

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