NEON 简单向量赋值内在?

2023-12-15

Having r1,r3 and 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 内在函数参考,我找不到任何简单的向量->向量分配内在函数。

实现这一目标的最简单方法是什么?我不确定内联汇编代码会是什么样子,因为我不知道在哪些寄存器中r1 and r4分配者vld1q_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内在的,编译器可能不会为其发出指令,只要它发出最终得到相同结果的指令即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

NEON 简单向量赋值内在? 的相关文章

随机推荐