代码之家  ›  专栏  ›  技术社区  ›  A23149577

如何在armv7霓虹灯矢量之间移动单字数据

  •  1
  • A23149577  · 技术社区  · 7 年前

    我正在尝试使用armv7 neon矢量化开发一个程序集代码。在某种程度上,我需要将一个32位的值(单个单词)从一个neon向量复制到另一个neon向量,比如 mov dm[0], dn[1] . 当我检查手册时,我找不到 mov vmov 由于需要ARM寄存器,所以可以执行此逻辑的操作 r 在源或目标中。有什么想法或选择吗?

    2 回复  |  直到 7 年前
        1
  •  2
  •   Jake 'Alquimista' LEE    7 年前

    如果你想要:

    1)MOV d0[0],d1[0]

    vext d0, d0, d1, #4
    vrev64.32 d0, d0
    

    2)动阀d0[0],d1[1]

    vtrn.32 d1, d0
    

    3)动阀d0[1],d1[0]

    vtrn.32 d0, d1
    

    4)动阀d0[1],d1[1]

    vext d0, d1, d0, #4
    vrev64.32 d0, d0
    

    注意 d1 在2)和3)的情况下损坏。为了避免这种情况,你应该复制 D1 临时登记册 d2 用它来代替。

        2
  •  1
  •   Peter Cordes    7 年前

    在32位模式下(armv7及更早版本,而不是armv8),每个q寄存器别名为2 d 寄存器/4 s 寄存器。例如 q1 d2..3 而且 s4..7 . 你可以分开复印。

    我不确定写一个 S 注册并读取包含 q 在任何ARM UARCHES上注册。

    http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dht0002a/ch01s03s02.html 有一个寄存器映射:只有q0..q7有 S -注册别名。问题8..15只有 D 注册组件。(即只有32个 S 寄存器,32 D 寄存器,和16 Q 注册,所以 d16..31 子组件不能单独寻址,并且 q8..15 只有64位dword元素单独公开)。

    如果没有更好的方法可以做到这一点,那就保持你需要的向量在低位8分切 Q 寄存器。


    ARMV8(AARCH64)引入了可以索引到向量寄存器的指令,因为 s3 q3 :重叠/包装已更改。

    AArch32 vs 64 SIMD registers