让我们说%edi
是x,k是一个常数整数(正)。如果我想做%eax<-k*x
以便它比imul
更快,我会使用leal,对吧?所以我的问题是,如果缩放因子是1,2,4,8,并且我使用单个leal
指令,那么k的哪些值是可能的?我认为它会是2 ^ k,但我不确定,有人可以向我解释一下吗?
如果我一个接一个地使用一对leal指令,k的值是多少?
答案 0 :(得分:1)
Lea可以将寄存器移位0,1,2或3位,并再次添加相同的寄存器。
这意味着lea可以进行以下乘法运算:
latency
LEA ALTERNATIVE (only if faster) LEA ALT
--------------------------------------------------------------------------
1: lea eax,[eax] nop 1 0
2: lea eax,[eax+eax] add eax,eax 1 1
3: lea eax,[eax*2+eax] - 2 -
4: lea eax,[eax*4] shl eax,2 2 1
5: lea eax,[eax*4+eax] - 2 -
6: - imul eax,6 - 3
7: - imul eax,7 - 3
8: lea eax,[eax*8] shl eax,3 2 1
9: lea eax,[eax*8+eax] - 2 -
请注意lea
的魔力并不是免费的
在除了最现代化的处理器之外的所有处理器上,复杂的&#39; lea将需要额外的CPU周期来解决
复杂的lea是具有缩放因子或3个操作数的lea
如果你想诉诸2 lea,例如要乘以10,imul通常会更快。
lea
的好处在于它不会修改标志寄存器,这与大多数替代方案不同。
如果我一个接一个地使用一对lea指令......
注意(i)mul最少需要3个周期来解决。复杂的lea将需要2个周期。所以你不能通过结合2个lea来击败(i)mul
简单的2次幂最好使用简单的shl
我将译文转换为PDP11语法,作为读者的练习 延迟是典型的Intel Core2时序,这适用于许多现代寄存器 Skylake和更新更快。