【问题标题】:NEON simple vector assignment intrinsic?NEON 简单向量赋值内在?
【发布时间】:2013-03-01 11:42:34
【问题描述】:

uint32x4_t 类型的r1r3r4 加载到NEON 寄存器中,我有以下代码:

r3 = veorq_u32(r0,r3);   
r4 = r1;    
r1 = vandq_u32(r1,r3);   
r4 = veorq_u32(r4,r2);   
r1 = veorq_u32(r1,r0);

我只是想知道 GCC 是否真的将 r4 = r1 翻译成 vmov 指令。看着反汇编的代码,我并不感到惊讶。 (而且我无法弄清楚生成的汇编代码实际上是做什么的)

浏览 ARM 的 NEON 内在函数参考我找不到任何简单的向量->向量赋值内在函数。

实现这一目标的最简单方法是什么?我不确定内联汇编代码的样子,因为我不知道vld1q_u32 分配的r1r4 在哪些寄存器中。我不需要实际的交换,只需要分配。

【问题讨论】:

  • 装配体是什么样子的?你用 -O2 编译了吗?
  • 是的,只有一堆逻辑指令,但没有我所期望的vmov
  • 如果您认为 NEON 指令变体 vmov 的内在函数缺失,请随时在 gcc.gnu.org 发布错误,并附上操作码、参数、文档链接等。

标签: c arm simd neon intrinsics


【解决方案1】:

C 有一个抽象机器的概念。分配和其他操作是根据这个抽象机器来描述的。赋值r4 = r1; 表示将抽象机中的r1 的值赋给r4。

当编译器为程序生成指令时,它通常不会完全模仿抽象机器中发生的所有事情。它将抽象机器中发生的操作转换为获得相同结果的处理器指令。编译器会跳过诸如移动指令之类的事情,如果它可以确定没有它们也可以获得相同的结果。

特别是,编译器可能不会每次都将r1 保存在同一个位置。它可能会在您第一次需要它时将其从内存加载到某个寄存器 R7 中。但是它可能会通过将结果放入 R8 来实现您的声明 r1 = vandq_u32(r1,r3);,同时在 R7 中保留 r1 的原始值。然后,当您稍后拥有 r4 = veorq_u32(r4,r2); 时,编译器可以使用 R7 中的值,因为它仍然包含 r4 在抽象机中(来自r4 = r1; 语句)将具有的值。

即使您明确编写了 vmov 内在函数,编译器也可能不会为它发出指令,只要它发出的指令最终得到相同的结果。

【讨论】:

  • 那么你是在暗示上面的代码会按预期工作,但反汇编中没有vmov 指令?
猜你喜欢
  • 2013-09-09
  • 2011-12-23
  • 2011-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-02
  • 2013-09-16
相关资源
最近更新 更多