我正在尝试移植 bunny到 armv7h,它使用了一些我在转换为 asm 时遇到问题的 x86 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
最佳答案
线索就在错误消息中——完全准确。
ARM算术指令占用三个operands :
ADD{S} rd, rs, <operand>
SUB{S} rd, rs, <operand>
在哪里operand
是其中之一:
- 注册
- 立即值
- 按常数移位的寄存器
- 一个寄存器被另一个寄存器移位
在你的例子中,我想你会想要一个立即数 1
, 这将给出
ADD rd, rd, #1
但是,这忽略了您试图实现内存位置 原子增量的根本缺陷。编译器正在从内存指令中生成加载,以实现对 ptr
的取消引用。 .它不是很明显它曾经生成结果的存储。即使是这样,这也最多是 3 条指令(加载、递增、存储)的非原子序列。
我建议查看 GCC's atomic intrinsics而不是自己滚动。
关于c - 预计 GCC ARM 寄存器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23979193/