如何编写ARM64 NEON之二

在从ARM32位NEON移植到ARM64位NEON的过程中,遇到了诸多挑战,包括Q/D寄存器的取消,内联汇编的使用限制,load/store指令的连续寄存器要求,以及指令集的变化。这些变化使得编程复杂度增加,需要更多技巧来适应。
摘要由CSDN通过智能技术生成

   花了大半个月的时间重写小波变换的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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值