【问题标题】:ARM NEON: How do I bit-shift a whole 64-bit d register?ARM NEON:如何对整个 64 位 d 寄存器进行位移?
【发布时间】:2018-02-03 18:41:12
【问题描述】:

我想将d 寄存器(64 位)逻辑左移或右移任意位数,计数在另一个寄存器中。 (不是汇编时间常数。)

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

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

我曾考虑过使用 vshlvshr,但它们将寄存器作为单独的 SIMD 元素而不是整个寄存器作为一个“值”进行移位。

【问题讨论】:

  • 对于初学者,您应该指定什么样的班次。整数还是浮点数?位、字节或向量元素?什么方向?您在参考手册中发现了什么,为什么还不够?到目前为止,这是一个糟糕的问题。
  • 感谢@JohannesSchaub-litb 的反馈,我尝试更正并指定我的问题。
  • 我没有足够的经验来回答。但我快速浏览了手册并找到了 VTRN,矢量转置。够了吗?
  • 我认为您要求在没有元素边界的情况下转移整个寄存器。但尚不清楚您的移位计数是否始终是整数字节,或者它是否可以是任意位数。此外,您是否需要将移位计数作为运行时变量,或者它是否可以作为编译时常量。
  • 是的@PeterCordes 这正是我所需要的。我只是无法用言语表达。我的移位计数是一个运行时变量,在位级别,而不是字节级别

标签: assembly arm neon


【解决方案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)。不过,对于同一操作码,对于正或负立即数,这可能只是不同的汇编语法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 2015-12-26
    相关资源
    最近更新 更多