C/C++/ASM:在CPU上相加a = a*2 + b?

Vin*_*ent 1 c x86 assembly multiplying fma

经典的Multiply-Accumulate操作是a = a + b*c.但我目前想知道是否存在允许在1个时钟周期内对整数执行以下操作的ASM指令:(a和b是无符号的64位整数:unsigned long long int)

a = a*2-1
a = a*2+b
Run Code Online (Sandbox Code Playgroud)

目前,我使用:

a *= 2
--a
Run Code Online (Sandbox Code Playgroud)

对于第一个和

a *= 2
a += b
Run Code Online (Sandbox Code Playgroud)

对于第二个.我认为每个都被转换为ASM中的2条指令.但有没有办法使用1 ASM指令(以及在Intel CPU上使用哪个指令集扩展)?

(我搜索那个因为我这次操作数十亿次)

jpa*_*cek 7

  1. 对于Intel CPU,请参阅LEA说明.它可以在一个指令中完成两个任务(不确定周期).(例如LEA EAX, [EAX*2+EBX]).请注意,这并非真正意味着乘法加法,因此它有趣的名称(加载有效地址).

  2. 在C和C++中,你不应该打扰.编译器会做它认为最好的事情,你可能只是阻碍它的努力.我会保持良好的年龄a = a*2-1.

PS:如果你认为某些内容被翻译为两个指令,那么没有什么比查看程序集更容易了.然后你就会知道.