使用带有NDK r10c的64位CPU瞄准Android-21,NEON内在函数在多大程度上类似于32位ARMv7a?将ARM特定的C代码移植到新平台有哪些主要注意事项?
答案 0 :(得分:3)
C中的NEON内在函数应该大致相同--Linaro正在将手写汇编转换为内在函数(显然会导致一些性能损失,因为编译器在这方面并不完美)来移植NEON支持在一些库(例如libvpx)到64位。有一些新的东西(比如支持64位浮点数),但据我所知,现有的内在函数中的大多数(实际上都是?)也应该是一样的。
指令的大多数实际更改(如vzip - > zip1 / zip2)和寄存器集(更改了SIMD寄存器别名的方式)都隐藏在内在级别上。
要记住的主要警告不是将旧代码移植到AArch64,而是关于现有二进制文件和运行32位代码。
您很可能需要更新NEON运行时检测(例如cpufeatures库),以便在新的ARMv8设备上正确检测它,即使在32位模式下运行也是如此。如果您使用NDK中的cpufeatures库,则需要使用NDK r10或更新版本来重建代码,以便在ARMv8设备上正确检测它,即使您不打算将其实际移植到AArch64 - 否则您需要&#39 ; ll最终只运行后备C代码。 (简而言之,旧的cpufeatures库只解析/ proc / cpuinfo,这改变了ARMv8设备上的格式,因此旧的cpufeatures版本不能正确检测功能。)
编辑: 事实证明,android内核最终为/ proc / cpuinfo提供了额外的兼容性选项,因此来自旧NDK版本的cpufeatures库将继续检测NEON就好了。有关此额外兼容性选项的详细信息,请参阅https://android.googlesource.com/kernel/common/+/cba0c6b2913c0d075a7434025f5dc29cd813707f%5E%21/和https://android.googlesource.com/kernel/common/+/3868e7f8d47992922756d1aa6590f0d556c669b8%5E%21/(它似乎不在上游Linux内核中,至少现在还没有)。