1

r1将,r3r4类型加载到 NEON 寄存器中,我有uint32x4_t以下代码:

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

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

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

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

4

1 回答 1

4

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

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

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

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

于 2013-03-13T14:04:38.247 回答