ARM64 SIMD指令优化:将交替字节打包为连续字节(Hex转uint64_t)
优化NEON寄存器字节合并方案
针对你的需求,我们可以利用NEON的向量提取和位操作指令,完全消除单字节mov指令,大幅减少指令数量:
ARMv8-A 最优方案(支持直接索引提取)
; 输入v6.16b = 0a,0b,0c,0d,0e,0f,07,08,0a,0b,0c,0d,0e,0f,07,08 vmov v7.8b, v6.16b[0,2,4,6,8,10,12,14] ; 提取所有偶数位置字节:0a,0c,0e,07,0a,0c,0e,07 vshl.u8 v7, v7, #4 ; 左移4位,将低4位移到高4位:a0,c0,e0,70,a0,c0,e0,70 vmov v8.8b, v6.16b[1,3,5,7,9,11,13,15] ; 提取所有奇数位置字节:0b,0d,0f,08,0b,0d,0f,08 orr v10.8b, v7.8b, v8.8b ; 合并高低4位,得到目标结果:ab,cd,ef,78,ab,cd,ef,78
ARMv7 兼容方案(无直接索引提取时使用)
; 输入v6.16b = 0a,0b,0c,0d,0e,0f,07,08,0a,0b,0c,0d,0e,0f,07,08 mov v0.8b, v6.8b ; 复制前8字节到v0:0a,0b,0c,0d,0e,0f,07,08 mov v1.8b, v6.8b[8] ; 复制后8字节到v1:0a,0b,0c,0d,0e,0f,07,08 vuzp.8 v0, v1 ; 分离偶数/奇数位置字节: ; v0 = 0a,0c,0e,07,0a,0c,0e,07(原偶数位) ; v1 = 0b,0d,0f,08,0b,0d,0f,08(原奇数位) vshl.u8 v0, v0, #4 ; 左移4位:a0,c0,e0,70,a0,c0,e0,70 orr v10.8b, v0, v1 ; 合并得到目标结果:ab,cd,ef,78,ab,cd,ef,78
方案优势
- 彻底消除了原代码中7条单字节
mov指令,改用向量级操作,执行效率更高 - 指令数量从12条减少到4条,逻辑更简洁直观
- 直接通过提取、移位、合并三步完成转换,无冗余操作
如果需要生成16字节的重复结果(即目标为ab,cd,ef,78,ab,cd,ef,78,ab,cd,ef,78,ab,cd,ef,78),只需在最后添加一条:
vdup.16b v10, v10.8b
内容的提问来源于stack exchange,提问作者Stephane
相关产品推荐
相关产品推荐

