我正在尝试将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
答案 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,而不是自己动手。