gpt4 book ai didi

linux - 为什么 mul 指令不能实现常量乘法?

转载 作者:太空宇宙 更新时间:2023-11-04 10:23:44 26 4
gpt4 key购买 nike

<分区>

让我们考虑以下函数:

#include <stdint.h>
uint64_t foo(uint64_t x) { return x * 3; }

如果我写的话,我会写

.global foo
.text
foo:
imul %rax, %rdi, $0x3
ret

另一方面,编译器生成两个加法,-O0:

   0:   55                      push   %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 89 7d f8 mov %rdi,-0x8(%rbp)
8: 48 8b 55 f8 mov -0x8(%rbp),%rdx
c: 48 89 d0 mov %rdx,%rax
f: 48 01 c0 add %rax,%rax
12: 48 01 d0 add %rdx,%rax
15: 5d pop %rbp
16: c3 retq

lea-O2:

0000000000000000 <foo>:
0: 48 8d 04 7f lea (%rdi,%rdi,2),%rax
4: c3 retq

为什么?由于每条汇编指令等于一个处理器时钟滴答,我的版本应该在 2 个 CPU 时钟周期内运行(因为它有两条指令),在 -O0 中我们需要 4 个周期来执行加法,因为它可能是重写为

  mov    %rdi,%rax
add %rax,%rax
add %rdi,%rax
retq

lea 也需要两个周期。

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