在英特尔文档中,我们对 ADC
进行了下一个定义:
Op/En Operand 1 Operand 2 .....
RM ModRM:reg (r, w) ModRM:r/m (r)
MR ModRM:r/m (r, w) ModRM:reg (r)
MI ModRM:r/m (r, w) imm8
I AL/AX/EAX/RAX imm8
现在是asm
代码的一个小例子:
asm (
"adc -Ox12(%rbp), %rax \n\t" //1
"adc -Ox12(%rbp), %rdx \n\t" //2
"adc -Ox12(%rbp), %r8 \n\t" //3
"adc -Ox12(%rbp), %R11 \n\t" //4
"adc %r8 , %rdx \n\t" //5
"adc %r8 , %rax \n\t" //6
"adc $3 , %rdx \n\t" //7
"adc $3 , %rax \n\t" //8
);
你能告诉我每组中哪条指令最快吗?为什么?
我有这个问题,因为在英特尔中,他们引用了 %RAX
寄存器。另一个慢吗?
最佳答案
注意:对于下面的所有内容,我假设是现代 80x86(过去 10 年左右的任何内容)。
对于第一组;第一条指令导致缓存未命中或依赖性停顿的可能性(非常小)增加(由 RBP、RAX 或进位标志被引导到它的指令修改引起)。
对于所有其他指令,都依赖于 eflags(它们必须等到知道前一条指令的进位标志),它们都会受到同样的影响。更具体地说,我希望“进位标志依赖性”将执行限制为每条指令 1 个周期(没有并行发生的指令)。这是最有可能的瓶颈。
使用的寄存器没有区别(除了依赖于以前使用的寄存器)。
关于c++ - 使用 RAX/EAX/AX/AL/AH 寄存器作为目的地时,进位加法是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35368532/