将r1
,r3
和r4
类型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
分配了哪些寄存器r4
和vld1q_u32
。我不需要实际的交换,只需要分配。
答案 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
内在函数,编译器也可能不会为它发出指令,只要它发出最终得到相同结果的指令。