Assembly 相当于;锁和xadd“;PowerPC上的组装说明

Assembly 相当于;锁和xadd“;PowerPC上的组装说明,assembly,powerpc,Assembly,Powerpc,我正在寻找以下针对AIX PowerPC的x86汇编指令的等效版本 锁 xadd 任何帮助都将不胜感激。PowerPC上的原子是使用lwarx(加载字和保留索引)和stwcx.(存储字条件索引)指令实现的 前者,lwarx,执行加载并在用于加载的缓存线上获取“保留”。如果另一个处理器获取了该缓存线,则该保留将丢失—通常是由另一个处理器对该相同的内存地址进行存储,或者甚至对同一缓存线中的另一个地址进行存储(稍后将对此进行详细介绍) stwcx.指令执行存储,但前提是保留(我们使用早期的lwarx获

我正在寻找以下针对AIX PowerPC的x86汇编指令的等效版本

锁 xadd


任何帮助都将不胜感激。

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

前者,
lwarx
,执行加载并在用于加载的缓存线上获取“保留”。如果另一个处理器获取了该缓存线,则该保留将丢失—通常是由另一个处理器对该相同的内存地址进行存储,或者甚至对同一缓存线中的另一个地址进行存储(稍后将对此进行详细介绍)

stwcx.
指令执行存储,但前提是保留(我们使用早期的
lwarx
获取的)仍然有效。更新条件寄存器以指示存储是否成功

使用这些,我们可以通过在您想要更新的位置获取预订来实现
锁定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

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

  • 内存地址需要正确对齐
  • 我们在这里假设字数大小的访问。对于不同的访问大小,使用
    lbarx
    lharx
    ldarx
    指令及其
    st*cx
  • 此外,如果您要对数据一致性做出任何其他断言,则需要确保内存访问顺序正确
  • 保留是针对整个缓存线的,因此您可能需要确保正确管理对同一缓存线的其他访问
出于这个(和其他)原因,通常最好使用系统提供的原子库,而不是自己编写代码。例如,
gcc
提供了可能适合您的情况的
同步、添加和获取


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

使用
lwarx
stwcx。
进行模拟。