我正在尝试在64位iOS设备上使用MSFA(googles music synth),它有四个用于DSP操作的NEON汇编源文件,显然是为32位架构编写的。我最初被告知最好将其重写为NEON内在函数,以便它与架构无关。但是,在阅读了一些文章(例如http://hilbert-space.de/?p=22)之后,似乎仍然将它作为纯手工编写的程序集是理想的。
我的问题是,将此转换为64位是否微不足道?如果是这样,我将如何开始这样做?
.s文件是:
https://github.com/google/music-synthesizer-for-android/blob/master/cpp/src/neon_fir.s
https://github.com/google/music-synthesizer-for-android/blob/master/cpp/src/neon_fm_kernel.s
https://github.com/google/music-synthesizer-for-android/blob/master/cpp/src/neon_iir.s
https://github.com/google/music-synthesizer-for-android/blob/master/cpp/src/neon_ladder.s
答案 0 :(得分:3)
TL; DR:使用内在函数
检查asm输出以确保它不是愚蠢的并不是一个坏主意,但使用内在函数可以让编译器进行常量传播,并为有序内核调度/软件管道。
如果您阅读that post from 2009 you linked上的评论主题,您会发现NEON内在函数的错误代码是gcc bug fixed in 2011。
目前编译器非常擅长处理内在函数,并且不断改进。
Clang尤其可以做很多事情,比如使用不同的shuffle指令而不是你用内在函数写的内容。
我根本不是这方面的专家,但NEON的主要变化之一是Aarch64有32个128b NEON寄存器(v0 - v31
),而不是由较小的成对组成的大regs暂存器。
另请参阅有关element-size语法的一些official ARM documentation,您可以使用.16B
来指示16字节元素的向量。 (与the old syntax where .8
meant each element was 8 bits相反。)