2

私はAndroidアプリケーションを開発しており、その中でNDKに取り組んでいます。ファイルのコンパイル中に、選択したプロセッサが「qadd16 r1、r1、r0」をサポートしていないというエラーが表示されました。このエラーが発生する理由と場所、およびこのエラーに対処する方法を誰かが説明できますか? これが私のbasic_op.hファイルのコードスニペットです

static inline Word32 L_add(register Word32 ra, register Word32 rb)
{
  Word32 out;

  __asm__("qadd %0, %1, %2"
          : "=r"(out)
          : "r"(ra), "r"(rb));

  return (out);
}

前もって感謝します

4

1 に答える 1

5

これは、QADD命令がターゲット アーキテクチャでサポートされていないために発生します ( http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211h/Chddhfig.html )。このコードをコンパイルするには、NDK で arm-v7 サポートを有効にする必要があります。

行を追加

APP_ABI := armeabi-v7a

Application.mk に追加すると、このコードは完全にコンパイルされます。

static inline unsigned int L_add(register unsigned int ra, register unsigned int rb)
{
  unsigned int out;

  __asm__("qadd %0, %1, %2"
          : "=r"(out)
          : "r"(ra), "r"(rb));

  return (out);
}

PS私はAndroid NDK r8を使用しています。

PPSなぜこの醜いアセンブリが必要なのですか? 次の出力アセンブリ リスト:

static inline unsigned int L_add(register unsigned int ra, register unsigned int rb)
{
  return (ra > 0xFFFFFFFF - rb) ? 0xFFFFFFFF : ra + rb;
}

かなり効率的で、移植性がはるかに高いように見えます。

于 2012-07-17T17:08:32.783 に答える