我正在尝试编译ARMV7的arm内联汇编代码以进行原子比较和交换,基本上我已经从ARM linux内核复制了代码,但不知何故它没有编译。它给出了以下错误
Erro:拇指条件指令应该在IT块中 - 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;
}
知道这个错误意味着什么吗?
答案 0 :(得分:3)
您需要添加IT EQ
指令;请参阅 Ubuntu wiki 中的Thumb2 porting。您正在复制 ARM 代码并尝试在 thumb2 模式下使用它。所有 ARM 指令都是有条件的,IT EQ
是 ARM 模式中的幻像(不需要)。在 Thumb2 模式下,您必须通知流程应针对以下说明测试哪个条件。
gcc inlines 可能不适用于-mimplicit-it
;特别是当编译器需要猜测操作码的数量以使其成为自己的代码时。即,计算分支大小等