请考虑以下代码:

int isqrt(int x) {
    unsigned int r;

    r = x >> 7;

    r += x / r;
    r >>= 1;
    r += x / r;
    r >>= 1;
    r += x / r;
    r >>= 1;

    return r;
}

gcc -O3 isqrt.c -S生成:

_isqrt:
    pushl   %ebx
    movl    8(%esp), %ecx
    movl    %ecx, %ebx
    sarl    $7, %ebx
    movl    %ecx, %eax
    xorl    %edx, %edx  ; huh?
    divl    %ebx
    addl    %eax, %ebx
    shrl    %ebx
    movl    %ecx, %eax
    xorl    %edx, %edx  ; huh?
    divl    %ebx
    addl    %eax, %ebx
    shrl    %ebx
    movl    %ecx, %eax
    xorl    %edx, %edx  ; huh?
    divl    %ebx
    addl    %ebx, %eax
    shrl    %eax
    popl    %ebx
    ret

为什么明确%edx无缘无故3次?

#1楼 票数:6 已采纳

divl x除以%edx:%eax x ,因此%edx应该是有意义的(通常为零)。 它还将余数放在%edx因此必须再次清除它,而不仅仅是一次。

  ask by orlp translate from so

未解决问题?本站智能推荐:

2回复

为什么gcc创建冗余的汇编代码?

我想研究如何将某些C / C ++功能转换为程序集,并创建了以下文件: 然后,我用gcc -S编译了该代码(并且还尝试了g++ -S ),但是当我查看汇编代码时,我很失望地在bar函数中发现微不足道的冗余,我认为gcc应该可以优化它: 除其他外,线 似乎毫无意义地多余。
1回复

为什么GCC生成的代码从堆栈中读取垃圾?

考虑以下代码(使用Eigen ): 我使用gcc-4.8进行了全面的优化和编译,以生成程序集清单。 这是我使用的命令: (我的CPU是运行64位Linux系统的Intel®Xeon®CPU E3-1226 v3-希望现在-march=native对读者有意义。) 让我感到
2回复

模数(%)的GCC实现如何工作,为什么不使用div指令?

我试图弄清楚如何在汇编中计算模10,所以我在gcc中编译了以下c代码,看看它是什么产生的。 令我惊讶的是,我得到了 其中-4(%ebp)或“i”是输入,-12(%ebp)或“j”是答案。 我已经测试了这个,无论你做出什么数字,它都能正常工作-4(%ebp)。 我的问题是这
3回复

为什么GCC为几乎相同的C代码生成如此完全不同的程序集?

在编写优化的ftol函数时,我在GCC 4.6.1发现了一些非常奇怪的行为。 让我先向您展示代码(为清楚起见,我标记了差异): fast_trunc_one,C: fast_trunc_two,C: 好像是对的吗? GCC不同意。 用gcc -O3 -S -Wall
4回复

为什么添加内联汇编注释会导致 GCC 生成的代码发生如此大的变化?

所以,我有这个代码: 我想看看 GCC 4.7.2 会生成的代码。 所以我运行g++ -march=native -O3 -masm=intel -S a.c++ -std=c++11并得到以下输出: 我不擅长阅读汇编,所以我决定添加一些标记来了解循环体的去向: 海湾合作委员会吐出了这个
1回复

volatile关键字不适用于gcc内联汇编

我需要运行以下简单的内联汇编代码: 直到我打开优化(gcc -O1)为止,它都能正常工作(打印计数= 10),在这种情况下,它会打印count = 0。 我读到“易失”限定符将阻止优化器将代码置于循环之外。 但这似乎没有作用。
2回复

为什么总是gcc使jle / jg?

我编写了一些仅与字符进行比较的汇编测试代码,无论条件是否相等,gcc总是使jle / jg组合。 范例1。 如果('A'<测试&&测试<'Z') 范例2。 如果('A'<=测试&&测试<='Z') 我
4回复

GCC 为什么一直没有运行优化?

我用 C 编写了众所周知的交换函数,并使用 gcc S 观看了汇编输出,并再次做了同样的事情,但对 O2 进行了优化 差异非常大,因为与 20 行相比,我只看到了 5 行。 我的问题是,如果优化真的有帮助,为什么不一直使用它? 为什么我们非优化编译代码? 向业内人士提出一个额外的问题,当您在测试