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