【问题标题】:How to enable intrinsics in compiler?如何在编译器中启用内在函数?
【发布时间】:2013-01-07 00:20:44
【问题描述】:

谁能解释一下:如何在 c 代码中启用内在函数?

我想在 armv5TE 中使用special dsp instructions

考虑qadd 指令,当我使用汇编程序方法时它可以很好地工作,如下所示:

inline int function_qadd(int a, int b) {
    __asm__ (
            "qadd %0, %1, %2" : "=r" (a) : "r" (a), "r" (b));
    return a;
}

但是当我尝试像这样使用__qadd intrinsic 而不是 asm 时:

int add_result = __qadd(5,10);
LOGI("qadd='%d'", add_result);

我有错误:

错误:未定义对“__qadd”的引用

我做错了什么,如何在 c 代码中启用内在函数?

更新:

我有ndk android-ndk-r8c(windows 版),它have GCC 4.6 as default

GCC 4.6 编译器仍然是默认的,

除了我在 android.mk 中明确指定

NDK_TOOLCHAIN_VERSION=4.6

我的编译器标志是:

LOCAL_CFLAGS += -std=c99 -ffast-math -march=armv5te -mfpu=vfp -mfloat-abi=softfp 

除了我通过 -S 编译器标志检查 gcc 生成的 asm 代码之外,它还生成 qadd 指令:

qadd r3, r3, r2

【问题讨论】:

  • 你使用的是哪个编译器?
  • 每个编译器都有自己的内在函数规则。可能您需要包含带有特殊声明的标题。
  • 嗯,根据infocenter.arm.com/help/topic/com.arm.doc.dui0491h/…,编译器是GCC,函数不需要声明。仔细检查您是否正在为正确的 ISA 进行编译;汇编器可能只是让您为错误的处理器生成指令。
  • 土豆,你链接的那个文件是armcc的文件吗?据我所知,GCC 不会将 __qadd 或任何等价物用作内在函数。
  • 如何在编译中使用armcc?

标签: android c arm


【解决方案1】:

内在函数 __qadd 不适用于 GCC 编译器。您提供的文档链接适用于(非免费)armcc 编译器。

如果您使用 GCC,则使用汇编程序方法是使用 qadd 指令的唯一实用方法。

【讨论】:

    猜你喜欢
    • 2013-07-14
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2012-06-19
    • 2018-08-11
    • 2020-03-12
    • 2015-10-25
    • 1970-01-01
    相关资源
    最近更新 更多