我正在寻找以下针对AIX PowerPC的x86汇编指令。
锁 XADD
任何帮助都将不胜感激。
答案 0 :(得分:5)
PowerPC上的Atomics是使用lwarx
(加载字和保留索引)和stwcx.
(存储字条件索引)指令实现的。
前者lwarx
执行加载并获得预约"在用于加载的缓存行上。如果另一个处理器获得该高速缓存行,则此预留将丢失 - 通常是由另一个处理器执行到同一内存地址的存储,或者甚至是同一个高速缓存行中的另一个地址(稍后将详细介绍)。
stwcx.
指令执行商店,但仅当预订(我们使用之前的lwarx
获得)仍然有效时。更新条件寄存器以指示商店是否成功。
使用这些,我们可以通过获取您要更新的位置的预订来实施lock xadd
。使用lock xadd
的以下定义:
Temporary = Source + Destination;
Source = Destination;
Destination = Temporary;
使用:
这样的事可能有用:
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
提供__sync_add_and_fetch
,这可能适合您的情况。
如果您了解更多信息,请参阅第4.4.2节中的Power ISA第二册。