繁体   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