针对arm64优化simd指令(mov)

问题描述 投票:0回答:1

我有这个V6.16b寄存器:0a,0b,0c,0d,0e,0f,07,08,0a,0b,0c,0d,0e,0f,07,08

目标是:ab,cd,ef,78,ab,cd,ef,78

我是这样做的:

movi v7.8h,   0x04            // 04,00,04,00,04,00,04,00,04,00,04,00,04,00,04,00
ushl v6.16b,  v6.16b,  v7.16b // a0,0b,c0,0d,e0,0f,70,08,a0,0b,c0,0d,e0,0f,70,08
movi v8.8h,   0xf8            // f8,00,f8,00,f8,00,f8,00,f8,00,f8,00,f8,00,f8,00
ushl v10.8h,  v6.8h,   v8.8h  // 0b,00,0d,00,0f,00,08,00,0b,00,0d,00,0f,00,08,00
orr  v10.16b, v10.16b, v6.16b // ab,0b,cd,0d,ef,0f,78,08,ab,0b,cd,0d,ef,0f,78,08

mov v10.b[1], v10.b[2]
mov v10.b[2], v10.b[4]
mov v10.b[3], v10.b[6]
mov v10.b[4], v10.b[8]
mov v10.b[5], v10.b[10]
mov v10.b[6], v10.b[12]
mov v10.b[7], v10.b[14] // ab,cd,ef,78,ab,cd,ef,78,ab,0b,cd,0d,ef,0f,78,08

它确实有效,但是有没有办法用更少的指令来做到这一点? (特别是mov)

macos assembly simd arm64 neon
1个回答
0
投票

所以你有零扩展半字节以大尾数顺序解压缩以打包成字节?就像十六进制 -> 整数。可能是

ushr v0.8h, v6.8h, #12
/
orr
在偶数元素中获取所需的字节,在奇数元素中获取垃圾。或者也许
usra
可以在一条指令中做到这一点(移位和累加),因为当设置的位不重叠时,ORR 和 ADD 是等效的。

对于打包步骤,

UZP1
应该能够获取偶数向量元素(从0开始)并将它们打包到低8字节中。 (如果使用相同的向量作为两个源操作数,则在高 8 字节中重复。)

© www.soinside.com 2019 - 2024. All rights reserved.