我正在尝试编译ARMV7的arm内联汇编代码来进行primefaces比较和交换,基本上我已经从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; }
任何想法是什么错误的意思?
您需要添加IT EQ指令; 请参阅Ubuntu维基上的 Thumb2移植 。 您正在复制ARM代码并尝试在thumb2模式下使用它。 所有的ARM指令都是有条件的, IT EQ是ARM模式下的一个幻影(不需要)。 在Thumb2模式下,您必须通知过程哪些条件应按照以下说明进行测试。
gcc内联可能不适用于-mimplicit-it ; 尤其是当编译器需要猜测操作码的数量来制作自己的代码时。 即计算分支尺寸等