汇编分支指令,bne-0b

时间:2018-04-19 18:49:37

标签: gcc assembly inline-assembly powerpc

采用Google Protobuf PowerPC GCC,有32位架构的方法,但64位没有。

我看到0:标志,如果不等于当前地址之前的标志,则会看到bne- 0b分支。

-语句中bne-做了什么?

具体来说,当我为64位编写这个版本时,如果我使用0:bne- 0b,我会收到语法错误,但32位版本的工作正常。

为什么它接受一个单词作为标志,而不是0:

以下是Protobuf 32 bit method.

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;
}

请注意,Atomic32intAtomic64long

另外,如果我用0:之类的单词替换loopai64:标记,我就不会收到错误。但是,当我运行编译器时,它会陷入无限循环。

1 个答案:

答案 0 :(得分:1)

0:是本地标签。但是,所有体系结构都不支持有向分支,例如bne- 0b0b表示跳转到当前位置之上的标签0的第一个实例)。

最后,我通过使用更长的标签名称解决了这个问题。