NEON简单的向量分配内在?

时间:2013-03-13 13:40:56

标签: c arm simd neon intrinsics

r1r3r4类型uint32x4_t加载到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内在函数参考略读我找不到任何简单的vector->向量赋值内在函数。

实现这一目标的最简单方法是什么?我不确定内联汇编代码的外观如何,因为我不知道r1分配了哪些寄存器r4vld1q_u32。我不需要实际的交换,只需要分配。

1 个答案:

答案 0 :(得分:3)

C具有抽象机器的概念。根据此抽象机器描述分配和其他操作。作业r4 = r1;表示在抽象机中为r4指定r1 的值。

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

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

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