k值可能以leal表示

时间:2016-09-28 17:59:11

标签: assembly x86

让我们说%edi是x,k是一个常数整数(正)。如果我想做%eax<-k*x以便它比imul更快,我会使用leal,对吧?所以我的问题是,如果缩放因子是1,2,4,8,并且我使用单个leal指令,那么k的哪些值是可能的?我认为它会是2 ^ k,但我不确定,有人可以向我解释一下吗?

如果我一个接一个地使用一对leal指令,k的值是多少?

1 个答案:

答案 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和更新更快。