[英]Assembly branch instruction, bne- 0b
取自Google Protobuf PowerPC GCC,有一些方法可用于32位体系结构,但没有方法可用于64位。
我看到0:
标志,如果不等于当前地址之前的标志,则看到bne- 0b
分支。
-
在bne-
语句中做什么?
具体来说,当我为64位版本编写此版本时,如果使用0:
和bne- 0b
, 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:
是本地标签。 但是,并非所有架构都支持定向分支,例如bne- 0b
( 0b
表示跳转到当前位置上方的标签0
第一个实例)。
最后,我通过使用更长的标签名称解决了该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.