gpt4 book ai didi

c - 为什么 GCC 会将字复制到返回寄存器而不是字节?

转载 作者:行者123 更新时间:2023-12-03 16:49:58 25 4
gpt4 key购买 nike

GCC (4.4.7) 没有将字节从结构移动到 %eax 是否有逻辑原因?直接,还是只是优化疏忽?

考虑以下程序:

struct foo { unsigned char x; };
struct bar { unsigned int x; };

int foo (const struct foo *x, int y) { return x->x * y; }
int bar (const struct bar *x, int y) { return x->x * y; }

使用 GCC 编译时,foo()bar()与我预期的差异更大:

foo:
.LFB0:
.cfi_startproc
movzbl (%rdi), %edx
movl %esi, %eax
imull %edx, %eax
ret
.cfi_endproc

bar:
.LFB1:
.cfi_startproc
movl (%rdi), %eax
imull %esi, %eax
ret
.cfi_endproc

我预计 foo()就像bar() , 除了使用不同的移动指令。

我会在 clang-500.2.79 下注明,编译器生成我期望的代码 foo() , 和 foo()bar()具有相同数量的指令(正如我对 GCC 的预期,但我错了)。

最佳答案

由于您在函数 foo 中将 uchar x 和 uint y 相乘,编译器必须首先将 uchar x 提升为 int,指令 movzbl 就是这样做的。

参见 the explanation of movz instructions here.

之后我用 gcc 4.6.1 和 -O3 选项重新编译了你的代码,我得到的汇编如下:

foo:
.LFB34:
.cfi_startproc
movzbl (%rdi), %eax
imull %esi, %eax
ret
.cfi_endproc

bar:
.LFB35:
.cfi_startproc
movl (%rdi), %eax
imull %esi, %eax
ret
.cfi_endproc

它不再使用 %edx。

关于c - 为什么 GCC 会将字复制到返回寄存器而不是字节?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com