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 位)逻辑左移或右移任意位数,计数在另一个寄存器中。 (不是汇编时间常数。)

它包含整数值,我需要做的是,将它们“移动”到寄存器内的正确位置。只有零应该在“结束”处移入寄存器,所以这是一个逻辑移位,而不是算术移位。

我想在没有任何元素边界的情况下移动整个寄存器。

我曾考虑过使用 vshlvshr,但它们将寄存器作为单独的 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, #immvshl.u64 Dd, Dm, #imm)。不过,对于同一操作码,对于正或负立即数,这可能只是不同的汇编语法。

【讨论】:

以上是关于ARM NEON:如何对整个 64 位 d 寄存器进行位移?的主要内容,如果未能解决你的问题,请参考以下文章

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

对于 ARM Aarch64 的 NEON 编码,如何将寄存器推送到堆栈?似乎 STMFD 不是 Aarch64 指令集的一部分?

ARM NEON:从 NEON 寄存器(Q/D 寄存器)中包含的地址加载数据

优化系列汇编优化技术:ARM架构64位(AARCH64)汇编优化及demo

Eigen 3.3 中的 ARM NEON 改进

如何在armv7中得到armv8中的64位Vn.8h,就像arm寄存器中的D寄存器一样?