Android 支持 ARMv5TE 和 ARMv7-A。阅读有关支持的 CPU ARCH 和 ABI 的 NDK 文档,请访问$NDK/docs/CPU-ARCH-ABIS.html
。
ARMv5TE 是默认的,不给你任何硬件浮点支持,你可以查看Android NDK页面了解更多。您应该将 ARMv7-A 支持添加到您的应用程序中,以获得硬件的最佳支持。
ARMv6 介于两者之间,如果你想针对这些设备,你必须做一些Android.mk
诡计。
如今,如果您正在编写一个现代应用程序,您可能会针对具有 ARMv7-A 处理器类型(具有 VFPv3 和 NEON)的较新设备。如果你只想支持ARMv6,你应该使用 ARMv5TE 来覆盖这些。如果您想利用 ARMv6 提供的一些额外功能,那么您将完全失去对 ARMv5TE 的支持。
我用 NDK r8c 编译了您的简单代码行,它可以为我生成如下所示的二进制文件。最好的 ARM VFP 允许您的语句是multiply and accumulate
指令,fmac
编译器可以轻松发出这些指令。
00000000 <f>:
0: ee607aa2 fmuls s15, s1, s5
4: ed9f7a05 flds s14, [pc, #20]
8: ee407a07 fmacs s15, s0, s14
c: ee417a03 fmacs s15, s2, s6
10: ee417ae3 fnmacs s15, s3, s7
14: eeb00a67 fcpys s0, s15
18: ee020a44 fnmacs s0, s4, s8
1c: e12fff1e bx lr
将您的语句分成几块以获得双重发布可能会更好,但您可以在 C 中执行此操作。
你不能仅仅使用汇编来创造奇迹,但是编译器也可以创造一个巨大的废话。GCC 和 ARM 不如 GCC 和 Intel。尤其是在矢量化、NEON 使用方面。如果您需要高性能的例程,检查编译器生成的内容总是好的。