我不是在一个位置,使这些在ARM NEON指令vld4_f32vld4q_f32之间的差。

在混乱开始时,我提出了我的编码水平,并开始寻找汇编指令,而不是更少的信息内部函数。

我需要使用原因的 vld4 这里变异的指令是因为,我想拍摄的 4 从每一个第四位float32_t的我大阵列。

“替代文字”

vld4_f32内在和相应的组装说明如下所示(从这链接

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

vld4q_f32内在和其相应的汇编指令看起来像这样

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

那么,在内在水平的我看到的差异的返回类型,但如果看看我的汇编指令和寄存器的数量,它们都样子是相同的。编译器或汇编程序将如何知道两个?

之间的区别

可有人阐明更多关于这一点,也解释如何可以实现负载的 4 float32_t 被定位的值在每4个存储器位置成单个寄存器?

有帮助吗?

解决方案

是,我发现了差异。我使用的CodeSourcery的看到实际的寄存器内容为所有负载指令。我已经发布的链接并不会给该vld4q_f32的完整细节。

好,首先出现的vld4_f32,此负载的 4 d 寄存器(例如d16-19)各自的 d 寄存器是64位长,所以该指令将加载第一8个值与间隔4交织如下面图。 “替代文字”

在第二种情况下,vld4q_f32,此负载的 8 d 寄存器(例如d16-23),而不是四个。对于这个链接的读者,这是完全不清楚这8个寄存器将被载入。当我看到一个vld4qf32该DIS组装代码,它被利用8个d寄存器。

此指令确实会做什么我希望它做即装载,它们在4所述的时间间隔为显示在下面的图4个中float32_t值。 “替代文字”

其他提示

我已经拆解2个内在,也许它可以帮助别人:

// C++
uint32x4x4_t r = vld4q_u32( ( uint32_t *) output );
// assembly
VLD4.32         {D16,D18,D20,D22}, [R0]!
VLD4.32         {D17,D19,D21,D23}, [R0]

// C++
uint32x2x4_t r = vld4_u32( ( uint32_t *) output );
// assembly
VLD4.32         {D20-D23}, [R0]
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top