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

Man*_*way 3 assembly powerpc

我正在寻找AIX PowerPC的以下x86汇编指令的等效网络.

锁定xadd

任何帮助,将不胜感激.

Jer*_*err 5

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

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

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

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

Temporary = Source + Destination;
Source = Destination;
Destination = Temporary;
Run Code Online (Sandbox Code Playgroud)

使用:

  • r1作为指向内存中"目标"字的指针
  • r2包含'Source':要添加和交换的值
  • r3作为输出,包含'Destination'的原始值
  • 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
Run Code Online (Sandbox Code Playgroud)

但是,这是一个相当简单的情况 - 在为任何架构实现原子时还有其他事项要考虑.例如:

  • 内存地址需要正确对齐
  • 我们假设这里有字大小的访问.对于不同的访问大小,请使用lbarx,lharx和ldarx说明及其st*cx对.
  • 此外,如果您正在进行有关数据一致性的任何其他断言,则需要确保正确排序内存访问.
  • 预留用于整个缓存行 - 因此您可能需要确保正确管理对同一缓存行的其他访问.

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

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