如何将32位NEON组件转换为64位?

时间:2016-07-01 16:02:31

标签: assembly arm neon

我正在尝试在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

1 个答案:

答案 0 :(得分:3)

TL; DR:使用内在函数

检查asm输出以确保它不是愚蠢的并不是一个坏主意,但使用内在函数可以让编译器进行常量传播,并为有序内核调度/软件管道。

如果您阅读that post from 2009 you linked上的评论主题,您会发现NEON内在函数的错误代码是gcc bug fixed in 2011

目前编译器非常擅长处理内在函数,并且不断改进。

Clang尤其可以做很多事情,比如使用不同的shuffle指令而不是你用内在函数写的内容。

asm级差异:

我根本不是这方面的专家,但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相反。)