【问题标题】:How to deal with this : selected processor does not support `qadd16 r1,r1,r0'如何处理:所选处理器不支持 `qadd16 r1,r1,r0'
【发布时间】:2012-07-17 13:05:26
【问题描述】:

我正在开发 android 应用程序,并且正在开发 NDK。在编译文件时,我得到了 selected processor does not support `qadd16 r1,r1,r0' 的错误。谁能解释我为什么这个错误出现在哪里以及如何处理这个错误?这是我basic_op.h文件的代码sn-p

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);
}

提前致谢

【问题讨论】:

  • 你只是为 ARM 编译吗?
  • 实际上我想创建一个库(.so)文件,它将加载到我的应用程序中。
  • 您的目标处理器没有“qaddr”指令。顺便说一句,你为什么用汇编而不是 C 或 Java 来做这个?
  • 哦,好吧,那么我应该使用哪个处理器来运行它?
  • @juned:那是不是 ARM? qadd 仅在 ARM(v6+) 中受支持。

标签: c assembly android-ndk arm abi


【解决方案1】:

发生这种情况是因为您的目标架构 (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;
}

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

【讨论】:

  • QADD 和 + 不做同样的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 1970-01-01
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
  • 2016-03-06
  • 1970-01-01
相关资源
最近更新 更多