如何处理:选定的处理器不支持`qadd16 r1,r1,r0'

时间:2012-07-17 13:05:27

标签: c assembly android-ndk arm abi

我正在开发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);
}

提前致谢

1 个答案:

答案 0 :(得分:5)

这是因为您的目标体系结构(http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0211h/Chddhfig.html)不支持QADD指令。要编译此代码,您需要在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);
}

P.S。我使用的是Android NDK r8。

P.P.S。为什么你需要这个丑陋的装配?输出程序集列表:

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

看起来仍然相当有效,而且更便携!