【问题标题】:Porting ARM NEON code to AARCH64, many questions将 ARM NEON 代码移植到 AARCH64,很多问题
【发布时间】:2015-03-18 23:22:18
【问题描述】:

我正在将一些 ARM NEON 代码移植到 64 位 ARM-v8,但我找不到关于它的好文档。

很多功能好像没了,不使用也不知道怎么实现同样的功能。

所以,一般的问题是:我在哪里可以找到新 SIMD 实现的完整参考,包括如何执行许多 ARM-NEON 教程中解释的相同简单任务的说明?

关于特定功能的一些问题:

1 - 如何在 Dx 寄存器的所有通道中加载一个值?旧代码是

    mov R0, #42
    vdup.8 D0, R0

我的猜测是:

    mov W0, #42
    dup V0.8B, W0

2 - 如何加载具有交错数据的多个 Dx/Qx 寄存器?在旧代码中是:

    vld4.8 {D0-D3}, [R0]!

但我在新文档中找不到任何内容。

我知道这是一个全新的模型,但它的文档记录不是很好(或者至少,我无法找到任何具有可读示例的参考)

【问题讨论】:

  • 我同意dup 看起来等同于vdupvld4 的等价物似乎是 ld4。可能值得尝试查找旧的“ARMv8 指令集概述”PDF 的副本——自从正确的 ARMv8-A ARM 发布以来,它已从 ARM 网站上消失,但更容易浏览。

标签: android arm simd neon arm64


【解决方案1】:

关于在 Android 中使用 ARMv8 的文档不是很好,但是对于您的具体问题,本文档已经很好地回答了它们:

ARMv8 Instruction Set Overview

回答您的具体问题:

mov R0, #42
vdup.8 D0, R0

变成

mov w0,#42
dup v0.8b,w0

vld4.8 {d0-d3}, [r0]!

变成

 ld4 {v0.8b,v1.8b,v2.8b,v3.8b},[x0],#32

【讨论】:

  • 感谢您的第一个答案,现在我正在尝试找出其余部分。比如,看似简单的PLD指令,似乎变成了复杂的怪物……
  • 不,等等... dup.8b 和 ld4.8b 不存在,寄存器是后缀的,不是助记符。
  • 很高兴我能帮上忙。 PLD 已经变异以支持读取/写入和 L0/L1/L2/L3 缓存的许多选项。我尝试在 Xcode 上使用它,但它不接受 ARM 文档中的语法。开始使用 ARM64 的最佳方法是让 GCC 从 C 中输出 ASM 源代码并弄清楚它的作用。
  • 在 Xcode 上,它接受我指定的语法,在 Android/GCC 上,它想查看目标向量寄存器上的大小后缀。已更新答案以反映 GCC 首选语法。
  • @MaximAkristiniy vld4.8 {d0-d3} 也加载 32 个字节(4 个 64 位寄存器)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多