2

ARMV7 のアーム インライン アセンブリ コードをコンパイルしてアトミックに比較およびスワップしようとしています。基本的には 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 portingを参照してください。ARMコードをコピーして、 thumb2モードで使用しようとしています。すべてのARM命令は条件付きであり、ARMモードではファントムです (不要)。Thumb2モードでは、次の命令のためにどの条件をテストする必要があるかをプロセスに通知する必要がありますIT EQ

gcc インラインが適用されない可能性があります-mimplicit-it。特に、コンパイラは独自のコードを作成するためにオペコードの数を推測する必要があるためです。つまり、枝のサイズなどを計算します。

于 2013-10-01T17:06:03.120 に答える