ARM NEON:如何对整个 64 位 d 寄存器进行位移?
Posted
技术标签:
【中文标题】ARM NEON:如何对整个 64 位 d 寄存器进行位移?【英文标题】:ARM NEON: How do I bit-shift a whole 64-bit d register? 【发布时间】:2018-02-03 18:41:12 【问题描述】:我想将d
寄存器(64 位)逻辑左移或右移任意位数,计数在另一个寄存器中。 (不是汇编时间常数。)
它包含整数值,我需要做的是,将它们“移动”到寄存器内的正确位置。只有零应该在“结束”处移入寄存器,所以这是一个逻辑移位,而不是算术移位。
我想在没有任何元素边界的情况下移动整个寄存器。
我曾考虑过使用 vshl
和 vshr
,但它们将寄存器作为单独的 SIMD 元素而不是整个寄存器作为一个“值”进行移位。
【问题讨论】:
对于初学者,您应该指定什么样的班次。整数还是浮点数?位、字节或向量元素?什么方向?您在参考手册中发现了什么,为什么还不够?到目前为止,这是一个糟糕的问题。 感谢@JohannesSchaub-litb 的反馈,我尝试更正并指定我的问题。 我没有足够的经验来回答。但我快速浏览了手册并找到了 VTRN,矢量转置。够了吗? 我认为您要求在没有元素边界的情况下转移整个寄存器。但尚不清楚您的移位计数是否始终是整数字节,或者它是否可以是任意位数。此外,您是否需要将移位计数作为运行时变量,或者它是否可以作为编译时常量。 是的@PeterCordes 这正是我所需要的。我只是无法用言语表达。我的移位计数是一个运行时变量,在位级别,而不是字节级别 【参考方案1】:在查找 how vshl
works 时,我看到有一个使用 64 位元素大小的版本。
如果你想对整个 128 位 q
寄存器进行位移,你会遇到问题,但是 vshl
/ vshr
可以为 d
寄存器做你想做的事情,如果你使用u64
-datatype 版本。
vshl.u64 d1, d0, d7 @ d1 = d1<<d7
也可与 q
操作数一起使用,以并行处理两个压缩的 64 位值。
VSHL(向量左移有符号变量)获取向量中的每个元素,将它们从第二个向量的相应元素的最低有效字节中移出一个值,并将结果放入目标向量中。 如果移位值为正,则操作为左移。否则就是右移。
对于立即移位,左和右有单独的助记符。 (例如 vshr.u64 Dd, Dm, #imm
与 vshl.u64 Dd, Dm, #imm
)。不过,对于同一操作码,对于正或负立即数,这可能只是不同的汇编语法。
【讨论】:
以上是关于ARM NEON:如何对整个 64 位 d 寄存器进行位移?的主要内容,如果未能解决你的问题,请参考以下文章
对于 ARM Aarch64 的 NEON 编码,如何将寄存器推送到堆栈?似乎 STMFD 不是 Aarch64 指令集的一部分?
ARM NEON:从 NEON 寄存器(Q/D 寄存器)中包含的地址加载数据