gpt4 book ai didi

c++ - 为什么通过指针进行 int 加法比通过指针进行 int 乘法少一条 x86 指令?

转载 作者:行者123 更新时间:2023-12-04 12:13:55 24 4
gpt4 key购买 nike

我有以下 C/C++ 代码( compiler explorer link ):

void update_mul(int *x, int *amount) { 
*x *= *amount;
}

void update_add(int *x, int *amount) {
*x += *amount;
}
在 clang 和 gcc 下编译为 C 或 C++ 至少 -O1启用,以上转换为这个程序集:
update_mul:                             # @update_mul
mov eax, dword ptr [rdi]
imul eax, dword ptr [rsi]
mov dword ptr [rdi], eax
ret
update_add: # @update_add
mov eax, dword ptr [rsi]
add dword ptr [rdi], eax
ret
似乎添加它正在做类似的事情:
register = *amount;
*x += register;
但是对于乘法,它正在做:
register = *x;
register *= *amount;
*x = register;
为什么乘法需要额外的加法指令,或者不需要但只是更快?

最佳答案

IA-32 architecture specification ( alternative single-page link ) 表明对于目标(第一个参数)是内存操作数的 IMUL 根本没有编码:

Encoding               | Meaning
IMUL r/m8* | AX ← AL ∗ r/m byte.
IMUL r/m16 | DX:AX ← AX ∗ r/m word.
IMUL r/m32 | EDX:EAX ← EAX ∗ r/m32.
IMUL r/m64 | RDX:RAX ← RAX ∗ r/m64.
IMUL r16, r/m16 | word register ← word register ∗ r/m16.
IMUL r32, r/m32 | doubleword register ← doubleword register ∗ r/m32.
IMUL r64, r/m64 | Quadword register ← Quadword register ∗ r/m64.
IMUL r16, r/m16, imm8 | word register ← r/m16 ∗ sign-extended immediate byte.
IMUL r32, r/m32, imm8 | doubleword register ← r/m32 ∗ sign- extended immediate byte.
IMUL r64, r/m64, imm8 | Quadword register ← r/m64 ∗ sign-extended immediate byte.
IMUL r16, r/m16, imm16 | word register ← r/m16 ∗ immediate word.
IMUL r32, r/m32, imm32 | doubleword register ← r/m32 ∗ immediate doubleword.
IMUL r64, r/m64, imm32 | Quadword register ← r/m64 ∗ immediate doubleword.

关于c++ - 为什么通过指针进行 int 加法比通过指针进行 int 乘法少一条 x86 指令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68745215/

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