我和我的教授交谈过,他说:
leaq (%rax,%rax,8)
比以下速度更快:
imulq $9, %rax
我问他为什么(在这两种情况下,我们都用几乎相同的数字进行乘法),他说我们不会讨论这个。
有人可以帮助我简单地理解为什么 leaq 总体上很快吗?
评论中提出的一个问题是:
imulq $9, %rax
比执行 2 个命令更快,一个命令左移,另一个命令添加 %rax(我们之前可以将其保存在寄存器中)
and why?
The lea
(加载有效地址)是执行指针算术常用操作的一种方法。指令如何引用其操作数称为其寻址方式 and lea
支持scaled or 基址加索引加偏移量寻址模式(等等)。
address = base address + index * scaling + offset
其中缩放值可以是几个 2 的幂 (1, 2, 4, 8) 之一。这些值对于字节、字符、整数、指针等数组很有用。它不能对任意值进行编码或执行乘法。在硬件中,这几个选项可以通过几个多路复用器来实现,延迟只有一个周期的一小部分。
另一方面,乘法指令通过可以将两个任意全角(64 位)操作数相乘的乘法电路。这是一个复杂度明显更高的操作。即使并行使用多个全角加法器,其延迟也约为全角加法器的六倍 (log n)(尽管设计可能会采用优化,使其能够更快地乘以更简单的值)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)