r1r3r4类型的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 = r1转换成vmov指令。看看反汇编的代码,我并不惊讶它没有(而且我也不知道生成的汇编代码实际上做了什么)
浏览ARM的NEON内部函数引用,我找不到任何简单的向量->向量赋值内在函数。
最简单的方法是什么?我不知道内联程序集代码是什么样子的,因为我不知道哪些寄存器是由r1分配的r4vld1q_u32寄存器。我不需要真正的交换,只要分配。

最佳答案

C有一个抽象机器的概念。赋值和其他操作是用这个抽象的机器来描述的。赋值r4 = r1;表示在抽象机中将r1的值赋值给r4。
当编译器为程序生成指令时,它通常不会完全模拟抽象机中发生的所有事情。它将在抽象机中发生的操作转换为获得相同结果的处理器指令。如果编译器发现不使用移动指令也可以得到相同的结果,那么它将跳过诸如移动指令之类的内容。
特别是,编译器可能不会每次都将r1保持在同一位置。它可能会在您第一次需要它时从内存中将它加载到某个寄存器R7中。但它可能会实现您的语句r1 = vandq_u32(r1,r3);,方法是将结果放入R8,同时将r1的原始值保留在R7中。然后,当您以后有r4 = veorq_u32(r4,r2);时,编译器可以使用R7中的值,因为它仍然包含r4在抽象机中(从r4 = r1;语句)应该有的值。
即使显式地编写了vmov内在函数,编译器也可能不会为它发出指令,只要它发出的指令最终得到相同的结果。

关于c - NEON简单 vector 赋值是固有的吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15387009/

10-12 14:55