你如何使用霓虹内在函数加载 3 个浮点数
Posted
技术标签:
【中文标题】你如何使用霓虹内在函数加载 3 个浮点数【英文标题】:How do you load 3 floats using neon intrinsics 【发布时间】:2016-04-10 12:37:10 【问题描述】:我正在尝试将此霓虹灯代码转换为内在函数:
vld1.32 d0, [%[pInVertex1]]
flds s2, [%[pInVertex1], #8]
这会将变量 pInVertex1 中的 3 个 32 位浮点数加载到 d0 和 d1 寄存器中。 我找不到任何等效的 instrinsics 版本。有 vld1q_f32,但仅适用于 4 个浮点数。任何人都知道这样做的有效方法(我的意思是无需额外复制)?
【问题讨论】:
是否可以调整寄存器的使用,使其可以使用单通道vld3
,即s0
、s2
、s4
而不是s0
、@987654327 @, s2
? (尽管我不确定内在函数中会是什么样子。)否则,可能值得考虑使用单个 vld1
加载 4 个元素并忽略其中一个元素的效率将不低于两个单独的指令(并且可能更多),前提是 a) 可以丢弃 s3
和 b) 您对数据进行布局,以便阅读到最后不会有问题。
也许,我可以做到,但它只适用于加载值。当我将 3 个值写入数组时,我遇到了同样的问题。如果我写入 4 个值,那么我将覆盖来自不同顶点的数据。
【参考方案1】:
在 Aarch32 中唯一只写入 3 个 32 位浮点数的指令是多重加载指令:
r0 holds the address of the structure
FLDMIAS r0, s0-s2
这可以在 VFP 或 Neon 代码中使用。
我不知道对应的内在函数。
【讨论】:
谢谢,知道这很有用。所以,我需要的是 FLDMIAS 的内在版本。【参考方案2】:在DirectXMath 中,我将XMLoadFloat3
的ARM-NEON 版本实现为:
float32x2_t x = vld1_f32( reinterpret_cast<const float*>(pSource) );
float32x2_t zero = vdup_n_f32(0);
float32x2_t y = vld1_lane_f32( reinterpret_cast<const float*>(pSource)+2, zero, 0 );
return vcombine_f32( x, y );
【讨论】:
以上是关于你如何使用霓虹内在函数加载 3 个浮点数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用霓虹内在函数准确地将 uchar 转换为 float32 ,反之亦然