[英]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.