【问题标题】:ARM instruction for storing multiple registers in memory用于在内存中存储多个寄存器的 ARM 指令
【发布时间】:2012-09-20 23:15:49
【问题描述】:

以下 ARM 指令在一条指令中将多个浮点寄存器存储在内存中(当然,在每个寄存器存储之后递增基地址):

VSTMIA R0! {S1-S4}

现在的问题是寄存器列表必须是连续的,即如果你想在 R0 中传输寄存器,例如在 R0+4 中的 S3,如果不调用单个存储,你就无法做到这一点。 我有几个寄存器要一次性存储在内存中,但问题是它们需要以不同的顺序存储。我真的不想交换寄存器(我有大约 7 个寄存器)。那么有没有更聪明的方法呢? 还想知道是否有人知道使用 VSTM 进行单次多次传输是否比使用单个 VSTR 指令进行多次传输更快?

【问题讨论】:

  • STM(存储多个)指令将比单个 STR 指令更快。您可以为 STM 和 LDM 选择单独的寄存器,但它们的读/写顺序不能更改。
  • 如果这是关于像 rgb->bgr 对话这样的交错/去交错数据,请查看 neon。它有那些东西。
  • AIUI 性能可以高度依赖于实现,但 LDM 和 STM 的使用频率很高,如果不让它们至少与单独的加载/存储一样快,那就太愚蠢了。如果您可以简单地重命名代码中的寄存器,我会这样做。

标签: assembly arm


【解决方案1】:

您忘记提及您正在使用的 CPU 架构。如果您为 NEON 编写代码,请查看 ARM 博客中的此页面:Coding for NEON - Part 5: Rearranging Vectors

编辑:
使用 VSTM 进行单次多次传输是否比使用单个 VSTR 指令进行多次传输更快?

可能,但不要相信任何人的话。最好的办法是分析您的代码并检查 Technical Reference Manual 以获得您的核心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-29
    • 1970-01-01
    • 2015-11-01
    • 2021-01-23
    • 1970-01-01
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    相关资源
    最近更新 更多