花了大半个月的时间重写小波变换的NEON汇编,由于是在ARM32位NEON(ARMV7 NEON)的基础上,重写并且优化ARM64(ARMV8 NEON),由于种种原因,遇到很多困难,这里把一些遇到的问题记录下来:
(1 )ARMV8指令集取消了在Q/D寄存器,对于非浮点运算,只能使用V寄存器。这就意味着每条指令都要对128bit的V寄存器来操作,给编程带来了很大不便。我猜想原因是64位ARM处理器提供了32个V寄存器,相比32位ARM处理器的Q寄存器翻了一倍,所以ARM公司认为没有必要再把每个128bit寄存器拆分成两个64bit寄存器来使用?
但是对具体coding而言,灵活使用64/128bit带来了更大的灵活性,某些指令例如 VZIP, VUZP, VTRN,直接操作64bit寄存器有着事半功倍的效果。我不得不用更多条指令在V寄存器上做同样的事情,而且中间的计算结果后64bit是压根没用的,欲哭无泪。
(2) 由于项目原因,我大量使用的是内嵌汇编(Inline assembly),这样的好处是不用关心输入参数的压栈出栈操作,把精力集中在具体的代码逻辑上。但这也带来一些问题,在ARM32 NEON中,可以使用%[variable]的形式,在inline assembly中直接调用局部变量或者全局变量,非常方便,而在ARM64汇编中,这样的语法竟然编译不过!只能把所有需要用到的参数都作为输入参数,带来了很多不必要的麻烦。而且ARM64的assembler语法检查更为严格,我曾遇到一个编译错误,大概意思是 "indirect vari