【问题标题】:Why does GCC need to clear edx for mysterious reasons?为什么 GCC 出于神秘的原因需要清除 edx?
【发布时间】:2012-09-17 13:06:53
【问题描述】:

考虑以下代码:

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 次?

【问题讨论】:

  • 因为你不应该使用-O3,也许吧? ;-)
  • 因为divl%edx 作为输入和输出
  • @harold:%edx 究竟是如何用作输入的?
  • @harold:没关系,找到了 - 它需要一个双字。将其发布为答案,我会接受。

标签: optimization gcc assembly


【解决方案1】:

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

【讨论】:

  • 如果不为零,则应选择 %edx 以便除法的商适合 32 位,否则会引发异常。换句话说,%edx 应该小于除数
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-12
  • 2013-11-24
  • 2011-11-05
  • 2011-11-25
相关资源
最近更新 更多