2

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

错误:拇指条件指令应该在 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;
}

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

4

1 回答 1

3

您需要添加IT EQ指令;请参阅Ubuntu wiki上的Thumb2 移植。您正在复制ARM代码并尝试在thumb2模式下使用它。所有ARM指令都是有条件的,并且是ARM模式下的幻象(不需要)。在Thumb2模式下,您必须通知进程应针对以下说明测试哪个条件。IT EQ

gcc内联可能不适用于-mimplicit-it; 特别是因为编译器需要猜测操作码的数量才能使其成为自己的代码。即,计算分支大小等。

于 2013-10-01T17:06:03.120 回答