gpt4 book ai didi

linux - ARM 组装中的原子比较和交换

转载 作者:太空狗 更新时间:2023-10-29 12:04:41 24 4
gpt4 key购买 nike

我正在尝试编译 ARMV7 的 arm 内联汇编代码以原子方式比较和交换,基本上我已经从 ARM linux 内核复制代码但不知何故它没有编译。它给出了以下错误

错误:thumb 条件指令应该在 IT block 中 -- strexeq r5,r1,[r3]。下面是代码

static inline int
dfp_atomic32_cmpset(volatile uint32_t *dst, uint32_t exp, uint32_t src)
{

unsigned long oldval, res;

smp_mb();

do {
__asm__ __volatile__("@ dfp_atomic32_cmpset\n"
"ldrex %1, [%3]\n"
"mov %0, #0\n"
"teq %1, %4\n"
"strexeq %0, %5, [%3]\n"
: "=&r" (res), "=&r" (oldval), "+Qo" (*dst)
: "r" (dst), "Ir" (exp), "r" (src)
: "cc");
} while (res);

smp_mb();

return oldval;
}

知道这个错误是什么意思吗?

最佳答案

需要添加IT EQ指令;见Thumb2 portingUbuntu wiki。您正在复制 ARM 代码并尝试在 thumb2 模式下使用它。所有 ARM 指令都是有条件的,IT EQARM 模式下是幻影(不需要)。在 Thumb2 模式下,您必须通知进程应该为以下指令测试哪些条件。

gcc inlines 可能不适用于 -mimplicit-it;特别是当编译器需要猜测操作码的数量来制作它自己的代码时。即,计算分支大小等。

关于linux - ARM 组装中的原子比较和交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19119009/

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