c++ - 使用 RAX/EAX/AX/AL/AH 寄存器作为目的地时,进位加法是否更快?

标签 c++ assembly x86 intel inline-assembly

在英特尔文档中,我们对 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/

相关文章:

c++ - 如何在不知道百分比的情况下在 Qt 中显示 'infinite floating' 进度条?

c++ - 获取 Win32 程序以在启动时请求调试器?

c - 分析 "technique"用于交换 2 个变量而没有第三个临时变量

x86 - 从命令行使用 devenv.exe 并打开解决方案

linux - 如何在汇编 NASM 中打印数字?

c++ - UE4Editor-CoreUObject触发断点

c++ - 如何将 unique_ptr.get() 的引用传递给函数

assembly - dword 操作数在汇编中有什么作用

c - 为什么 "movl $1, %edx"而不是 "movl $0, %edx"

windows - 什么导致页面错误?