英特尔

时间:2017-05-10 13:14:58

标签: assembly x86 intel

Appel在第8页的“Runtime Tags Aren't Necessary”中解释了如何通过标记指针来区分整数和指针:

  

有些实现使用0的低位标记表示整数,然后是整数   然后可以用普通的机器添加指令来完成,而不是   需要移位或校正(因为2x + 2y = 2(x + y))。这要求指针的标签为1;但是可以使用奇数偏移来完成指针提取以进行补偿。

这个想法是:如果指针对齐,则该值是2或4的倍数。在这种情况下,较低的1或2位始终为零,可以设置为某个值以实现标记以区分整数从指针。

在Intel语法中没有偏移的未标记指针获取是:

mov    eax, DWORD PTR [ebx]

带偏移的等效标记指针获取是:

mov    eax, DWORD PTR [ebx-0x1] 

两次提取的周期有什么不同?

1 个答案:

答案 0 :(得分:3)

寻址模式的复杂性通常对加载指令的吞吐量没有影响,但它可能会对延迟 1产生1个周期的影响

特别是简单寻址模式,[base][base + offset] offset < 2048通常需要4个周期,而复杂模式(这是任何事情都不是不简单)需要5个周期。这是用于加载到通用寄存器中的:对于向量加载,通常会增加1或2个周期。

因此,在您的情况下,您仅使用base具有非常小的偏移量,因此您应该获得4个周期的最快加载延迟。

这适用于英特尔,我不确定AMD。

详细信息在英特尔优化指南中,但这里的the source我能找到最快。

正如Ross在评论中提到的那样,使用偏移量至少还有一个小的缺点:对于带偏移量的版本,指令为one byte longer(如果偏移量超出范围,则指令将长4个字节)范围-128到127),这会略微增加icache的压力。

1 不言而喻,这是针对L1的命中。如果你错过了L1,延迟时间会更长 - 也许很多更长时间,如果你在这种情况下仍然需要支付一个额外的周期,这可能无关紧要(但我想你平均而言,因为错过了在计算地址之前不会开始。)