Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?

Posted

技术标签:

【中文标题】Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?【英文标题】:Armv8a NEON inline asm code: How to convert 16x8bit vector to four 4x32bit (integer) vectors? 【发布时间】:2019-07-24 22:08:25 【问题描述】:

我需要加载 8 位数组,然后使用 armv8a neon 内联 asm 代码将每个元素转换为 32 位整数。我已经用 armv7 完成了,但不知道如何在 v8a 中完成......

我在v7中使用的代码是

"pld        [%1, #128]                 \n"
"vld1.u8    d0,d1, [%1]!       \n" 
"vmovl.u8   q8, d0               \n"  
"vmovl.u8   q9, d1               \n" 
"vmovl.u16  q0, d16              \n" 
"vmovl.u16  q1, d17              \n" 
"vmovl.u16  q2, d18              \n" 
"vmovl.u16  q3, d19              \n" 

如何使用 armv8a 霓虹灯代码完成此操作?或者如何将上面的代码转换为 armv8a? PS:就我而言,我只需要内联 asm 而不是内在函数...

感谢您的帮助。

【问题讨论】:

【参考方案1】:

对于无符号元素,USHLLUSHLL2 的班次编号为 0 即可。

ld1     v0.16b, [%1], #16

USHLL   v16.8h, v0.8b, #0
USHLL2  v17.8h, v0.16b, #0

USHLL   v0.4s, v16.4h, #0
USHLL2  v1.4s, v16.8h, #0
USHLL   v2.4s, v17.4h, #0
USHLL2  v3.4s, v17.8h, #0

对于有符号元素 - 猜猜 - 改用 SSHLLSSHLL2

同样,在aarch64 上也没有直接等效于MOVN

--编辑

另一方面,有XTN/XTN2 指令与VMOVN 完全一样。

【讨论】:

谢谢!但是,在 aarch64 中找不到 USHRN 和 USHRN2。它给出了错误Error: unknown mnemonic ushrn' -- ushrn v19.8b,v17.8h,#0'。所以我又试了一个UQSHRN,但不允许换档0,这给出了错误``uqshrn v19.8b,v17.8h,#0'`...你能帮忙吗? @KathyLee 我的错,有符号和无符号值都应该是SHRN/SHRN2。 (符号无关紧要,因为最大移位值可能不超过元素大小的一半)。那个该死的aarch64助记符(借口,借口) @KathyLee 现在我看到SHRN/SHRN 也不允许#0 作为筛选值,我不记得我现在是如何处理的......只是等一下,我来看看我的旧项目。 aarch64 助记符真的很烂。 慢慢来。谢谢你帮忙。 :) @KathyLee 这些是XTN/XTN2“提取窄”Grrrrrr 的说明……我讨厌aarch64 助记符。我会相应地编辑答案。

以上是关于Armv8a NEON 内联汇编代码:如何将 16x8 位向量转换为四个 4x32 位(整数)向量?的主要内容,如果未能解决你的问题,请参考以下文章

Windows phone 8 neon 内联程序集 ffmpeg [重复]

NEON 汇编代码,如何将 BYTE 转换为浮点数?

SAD 16*4 的 Arm-neon 优化版本未提供预期增益

Neon Intrinsic 版本的汇编代码

如何在 ARMv7 NEON 向量之间移动单字数据

如何访问 NEON 指令中的完整 128 位?