gpt4 book ai didi

c - 预计 GCC ARM 寄存器

转载 作者:太空宇宙 更新时间:2023-11-04 07:16:47 28 4
gpt4 key购买 nike

我正在尝试移植 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com