【发布时间】:2016-02-12 17:17:05
【问题描述】:
在英特尔文档中,我们对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 寄存器。另一个慢吗?
【问题讨论】:
-
我相信这是对 16 位时代的回归,当时英特尔首先设计了指令集,并将寄存器专门用于不同的任务。
ax是 累加器,因此它的字母为寄存器“A”。如今,唯一真正的优势是带有操作数寄存器 A 的 ADC 具有更短编码的特权,这可能会使代码更快,也可能不会。 -
我不想局限于加法,更多的寄存器也引用了
%RAX,EAX(例如)。这是否意味着更多的性能?那么ADC的时钟周期数等于ADD。ADC不是比ADD更有效率,加上进位? pdos.csail.mit.edu/6.828/2008/readings/i386 -
看起来您提供的链接是 80386 的指令时序。它们不一定与当今的处理器有任何相似之处。我认为寄存器重命名、流水线等功能的存在将使得很难对一个比另一个“更有效”做出任何明确的声明。
-
@IwillnotexistIdonotexist 感谢该链接。非常有用,我不知道。通过本文,寄存器之间没有任何区别。是这样吗?
标签: c++ assembly x86 intel inline-assembly