【问题标题】:How to use ARM intrinsics in iOS?如何在 iOS 中使用 ARM 内部函数?
【发布时间】:2013-11-09 00:28:53
【问题描述】:

我需要在 iPad 上快速计算数百万个 32 位整数的 MSB(最高有效位)。我有自己的(丑陋的)用普通 C 语言编写的 MSB 实现,速度很慢。 ARM 处理器具有 CLZ(计数前导零)硬件命令,这对此非常有用。根据ARM reference,有一个内在的C 函数__CLZ。如何在我的 Xcode 项目中添加对 ARM 内部函数的支持?

附:我已经设法找到从 NEON 访问硬件 CLZ 的方法(通过包含 arm_neon.h),但这不是我需要的,因为它只适用于矢量,但我需要标量 MSB。

【问题讨论】:

  • 你不能只使用内联汇编代码吗?
  • 我还不知道如何编写内联 asm ;-)

标签: ios arm neon intrinsics


【解决方案1】:

我在ARM C language extensions 的第 44 页找到了 ARM 内部函数名称。其中一些在 Xcode 中工作。正如预期的那样,这将打印 31:

NSLog(@"%u", __builtin_clz(1));

注意事项:

  • 我在 Apple 文档中没有找到任何相关的参考资料。 Xcode 很可能从 LLVM 或 CLANG 继承了这些函数。
  • 您无需包含任何特殊的标头或框架即可使用这些功能。 Xcode IDE 自动完成不知道它们。
  • 仅实现了扩展列表中的少数功能。根据同一文档的第 12-13 页,它应该是两个头文件:arm_acle.h 用于非 NEON 内在函数,arm_neon.h 用于 NEON 内在函数。 Xcode 只有第二个文件,但第一个文件中的一些函数在其他地方声明。

【讨论】:

    【解决方案2】:

    这可能很明显,但如果您使用 ARM 特定指令,您将无法在 iOS 模拟器中运行您的应用程序。模拟器使用 Mac 的原生 x86-64 硬件。

    您可以创建一个使用编译器指令来使用 ARM 命令的包装函数,或者如果您没有支持,则回退到“丑陋”的代码。

    【讨论】:

    • 我不使用模拟器。您能解释一下如何将 CLZ 添加到代码中吗?我尝试添加clz, CLZ, __clz, __builtin_clz__ 等...函数,但它们根本没有在任何地方声明。我也尝试过grep -R "clz" /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain,但只找到指向 NEON 和 x86 的链接
    猜你喜欢
    • 2013-09-18
    • 2022-11-19
    • 2013-05-08
    • 2012-08-07
    • 1970-01-01
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多