ARM NEON:vld4_f32和vld4q_f32之间有什么区别?

Hag*_*ble 5 memory assembly arm cpu-registers neon

我无法弄清楚ARM NEON指令之间vld4_f32和之间的区别vld4q_f32.

当我提高编码级别并开始查看汇编指令而不是信息量较少的内在函数时,就开始出现混乱.

我需要在这里使用vld4变体指令的原因是因为,我想从我的大数组的每个第4个位置捕获4个 .float32_t

替代文字

vld4_f32本征及相应的汇编指令是这样的(此链接)

float32x2x4_t vld4_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0]
Run Code Online (Sandbox Code Playgroud)

vld4q_f32内部函数及其对应的汇编指令看起来像这样

float32x4x4_t vld4q_f32 (const float32_t *) 
Form of expected instruction(s): vld4.32 {d0, d1, d2, d3}, [r0]
Run Code Online (Sandbox Code Playgroud)

好吧,在内在级别,我看到的差异是返回类型,但是如果我查看汇编指令和寄存器的数量,它们看起来都是一样的.编译器或汇编器将如何知道两者之间的区别?

有人可以澄清更多关于这一点,并解释我如何实现加载4个float32_t值,这些值位于每个第4个内存位置到一个寄存器中?

Hag*_*ble 7

是的,我发现了差异.我使用CodeSourcery查看所有加载指令的实际寄存器内容.我发布的链接没有提供vld4q_f32的完整详细信息.

好的,首先是vld4_f32加载4 d寄存器(例如d16-19),每个d寄存器是64位长,因此该指令将以4的间隔加载前8个交错的值,如下图所示. 替代文字

在第二种情况下vld4q_f32,它加载8个寄存器(例如d16-23)而不是4个寄存器.对于此链接的读者,一点都不清楚将加载8个寄存器.当我查看a的拆解代码时vld4qf32,它正在使用8 d寄存器.

该指令确实会做我希望它做的事情,即加载4个float32_t间隔为4的值,如下图所示. 替代文字