C NEON简单向量赋值内在?

C NEON简单向量赋值内在?,c,arm,simd,neon,intrinsics,C,Arm,Simd,Neon,Intrinsics,将uint32x4\u t类型的r1、r3和r4加载到霓虹灯寄存器中,我有以下代码: 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 intrinsi

uint32x4\u t
类型的
r1
r3
r4
加载到霓虹灯寄存器中,我有以下代码:

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 intrinsics参考资料,我找不到任何简单的向量->向量赋值内在


最简单的方法是什么?我不确定内联汇编代码是什么样子,因为我不知道哪些寄存器是由
vld1q\u u32
分配的
r1
r4
。我不需要实际的交换,只需要赋值。

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
内在函数,编译器也可能不会为它发出指令,只要它发出的指令最终得到相同的结果。

程序集是什么样子的?你是用-O2编译的吗?是的,只有一堆逻辑指令,但没有我所期望的
vmov
。如果你认为NEON指令
vmov
的变体缺少一个内在函数,请随意在操作码、参数、文档链接,因此,您是否暗示上述代码将按预期工作,但DISS汇编中没有
vmov
指令?