采用Google Protobuf PowerPC GCC,有32位架构的方法,但64位没有。
我看到0:
标志,如果不等于当前地址之前的标志,则会看到bne- 0b
分支。
-
语句中bne-
做了什么?
具体来说,当我为64位编写这个版本时,如果我使用0:
和bne- 0b
,我会收到语法错误,但32位版本的工作正常。
为什么它接受一个单词作为标志,而不是0:
?
inline Atomic32 NoBarrier_AtomicIncrement(volatile Atomic32 *ptr,
Atomic32 increment) {
Atomic32 temp;
__asm__ __volatile__(
"0: \n\t" // flag
"lwarx %[temp],0,%[ptr] \n\t"
"add %[temp],%[increment],%[temp] \n\t"
"stwcx. %[temp],0,%[ptr] \n\t"
"bne- 0b \n\t" // branch not equal <dash> flag before
: [temp] "=&r"(temp)
: [increment] "r"(increment), [ptr] "r"(ptr)
: "cc", "memory");
return temp;
}
以下是我对64位版本的尝试。
inline Atomic64 NoBarrier_AtomicIncrement(volatile Atomic64 *ptr,
Atomic64 increment) {
Atomic64 temp;
__asm__ __volatile__(
"0: \n\t"
"ldarx %[temp],0,%[ptr] \n\t"
"add %[temp],%[increment],%[temp] \n\t"
"stdcx. %[temp],0,%[ptr] \n\t"
"bne- 0b \n\t"
: [temp] "=&r"(temp)
: [increment] "r"(increment), [ptr] "r"(ptr)
: "cc", "memory");
return temp;
}
请注意,Atomic32
为int
,Atomic64
为long
。
另外,如果我用0:
之类的单词替换loopai64:
标记,我就不会收到错误。但是,当我运行编译器时,它会陷入无限循环。
答案 0 :(得分:1)
0:
是本地标签。但是,所有体系结构都不支持有向分支,例如bne- 0b
(0b
表示跳转到当前位置之上的标签0
的第一个实例)。
最后,我通过使用更长的标签名称解决了这个问题。