簡體   English   中英

匯編分支指令,bne-0b

[英]Assembly branch instruction, bne- 0b

取自Google Protobuf PowerPC GCC,有一些方法可用於32位體系結構,但沒有方法可用於64位。

我看到0:標志,如果不等於當前地址之前的標志,則看到bne- 0b分支。

-bne-語句中做什么?

具體來說,當我為64位版本編寫此版本時,如果使用0:bne- 0bbne- 0b出現語法錯誤,但是32位版本可以正常工作。

為什么它接受一個單詞作為標記,而不接受0: :?

下面是Protobuf 32位方法。

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- 0b0b表示跳轉到當前位置上方的標簽0第一個實例)。

最后,我通過使用更長的標簽名稱解決了該問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM