预计GCC ARM寄存器

时间:2014-06-01 11:06:37

标签: c gcc assembly arm inline-assembly

我正在尝试将bunny移植到armv7h,它使用了一些x86 asm,我无法转换为asm。

static __inline__ void atomic_inc(volatile int* ptr){
    __asm__ __volatile__("lock incl %0": "=m" (*ptr): "m" (*ptr));
}    

static __inline__ void atomic_dec(volatile int* ptr){
    __asm__ __volatile__("lock decl %0": "=m" (*ptr): "m" (*ptr));
}

有什么,我试过

"ADD/SUB %0 %0": "=r" (*ptr): "m" (*ptr));

两者都给了

Error: ARM register expected -- `add [r3] [r3]'

Error: ARM register expected -- `sub [r4] [r4]'

使用编译:

armv7l-unknown-linux-gnueabihf-gcc -Wall -O3 -funroll-loops -fno-strict-aliasing
-ffast-math -Wno-pointer-sign -mcpu=cortex-a15 -mfpu=neon -marm

1 个答案:

答案 0 :(得分:3)

线索在于错误信息 - 这完全准确。

ARM算术指令需要三个operands

ADD{S} rd, rs, <operand>

SUB{S} rd, rs, <operand>

operand之一是:

  • 寄存器
  • 即时值
  • 寄存器移位常数
  • 由另一个寄存器移位的寄存器

在你的情况下,我想你会想要一个1的立即常量,它会给出汇编指令

ADD rd, rd, #1

然而,这忽略了您尝试实现内存位置的原子增量的基本缺陷。编译器正在从内存指令生成一个加载,以实现ptr的解除引用。它不会立即产生结果的存储。即使它确实如此,这也是最好的,是3个指令的非原子序列(加载,增量,存储)。

我建议您查看GCC's atomic intrinsics,而不是自己动手。