powerpc e500 / p1020 。以原子方式读取 64 位(2x32 位寄存器)
powerpc e500 / p1020 . Read 64bit (2x32bit registers) in atomic way
我刚开始使用 P1020 PowerPC IC,遇到了第一个问题。我正在查看 P1020 参考手册和 e500 ppc 文档,但找不到我的问题的答案。
如何读取 64 位值 - 创建为时基模块的两个 32 位低位 TBL 和 32 位高位 TBU 寄存器 - 并防止竞争条件?是否保证该值是正确的(寄存器被锁存?)。是否有任何汇编指令可以以原子方式读取两个寄存器?我在哪里可以找到文档中的此类信息?
谢谢
PowerPC 体系结构文档对此有专门的章节 - 请参阅 https://wiki.alcf.anl.gov/images/f/fb/PowerPC_-Assembly-_IBM_Programming_Environment_2.3.pdf 的第 2.2.1.2 节“在 32 位模式下读取时基”(第 60 页)。
简而言之:你想读取时基的上半部分,然后是下半部分,再然后是上半部分,然后比较上半部分的两次读数。如果它们不相等,那么您的读取跨越了一个进位,因此再次执行所有三个读取。
如汇编中的文档所述:
loop:
mftbu rx # load from TBU
mftb ry # load from TBL
mftbu rz # load from TBU
cmpw rz, rx # see if ‘old’ = ‘new’
bne loop # loop if carry occurred
我刚开始使用 P1020 PowerPC IC,遇到了第一个问题。我正在查看 P1020 参考手册和 e500 ppc 文档,但找不到我的问题的答案。
如何读取 64 位值 - 创建为时基模块的两个 32 位低位 TBL 和 32 位高位 TBU 寄存器 - 并防止竞争条件?是否保证该值是正确的(寄存器被锁存?)。是否有任何汇编指令可以以原子方式读取两个寄存器?我在哪里可以找到文档中的此类信息? 谢谢
PowerPC 体系结构文档对此有专门的章节 - 请参阅 https://wiki.alcf.anl.gov/images/f/fb/PowerPC_-Assembly-_IBM_Programming_Environment_2.3.pdf 的第 2.2.1.2 节“在 32 位模式下读取时基”(第 60 页)。
简而言之:你想读取时基的上半部分,然后是下半部分,再然后是上半部分,然后比较上半部分的两次读数。如果它们不相等,那么您的读取跨越了一个进位,因此再次执行所有三个读取。
如汇编中的文档所述:
loop:
mftbu rx # load from TBU
mftb ry # load from TBL
mftbu rz # load from TBU
cmpw rz, rx # see if ‘old’ = ‘new’
bne loop # loop if carry occurred