相当于PowerPC上的“lock和xadd”汇编指令

时间:2015-01-29 12:53:16

标签: assembly powerpc

我正在寻找以下针对AIX PowerPC的x86汇编指令。

锁 XADD

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:5)

PowerPC上的Atomics是使用lwarx(加载字和保留索引)和stwcx.(存储字条件索引)指令实现的。

前者lwarx执行加载并获得预约"在用于加载的缓存行上。如果另一个处理器获得该高速缓存行,则此预留将丢失 - 通常是由另一个处理器执行到同一内存地址的存储,或者甚至是同一个高速缓存行中的另一个地址(稍后将详细介绍)。

stwcx.指令执行商店,但仅当预订(我们使用之前的lwarx获得)仍然有效时。更新条件寄存器以指示商店是否成功。

使用这些,我们可以通过获取您要更新的位置的预订来实施lock xadd。使用lock xadd的以下定义:

Temporary = Source + Destination;
Source = Destination;
Destination = Temporary;

使用:

  • r1作为指向“目的地”的指针记忆中的词
  • r2包含'来源':要添加和交换的值
  • r3作为输出,包含'目的地'
  • 的原始值
  • r4作为临时登记册

这样的事可能有用:

retry:
    # load the word addressed in r1 into r3, and create
    # a reservation for that address
    lwarx   r3, r0, r1

    # r4 = r3 + r2
    add     r4, r3, r2

    # if we still have the reservation, store r4 into the address
    # in r1...
    stwcx.  r4, r0, r1

    # ... otherwise, try again
    bne-    retry

然而,这是一个非常简单的情况 - 在为任何架构实现原子时还有其他事项需要考虑。例如:

  • 内存地址需要正确对齐
  • 我们假设这里有字大小的访问权限。对于不同的访问大小,请使用lbarxlharxldarx说明及其st*cx对。
  • 此外,如果您正在就数据一致性做出任何其他断言,那么您需要确保正确地订购了内存访问。
  • 预留适用于整个缓存行 - 因此您可能需要确保正确管理对同一缓存行的其他访问。

出于这个(和其他)原因,使用系统提供的原子库而不是编写自己的原子库通常会更好。例如,gcc提供__sync_add_and_fetch,这可能适合您的情况。

如果您了解更多信息,请参阅第4.4.2节中的Power ISA第二册。