【发布时间】:2015-05-23 22:21:54
【问题描述】:
我必须将以下指令从 SSE 翻译成 Neon
uint32_t a = _mm_cvtsi128_si32(_mm_shuffle_epi8(a,SHUFFLE_MASK) );
地点:
static const __m128i SHUFFLE_MASK = _mm_setr_epi8(3, 7, 11, 15, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1);
所以基本上我必须从寄存器中取出第 4、8、12 和 16 个字节并将其放入uint32_t。看起来像是一个打包指令(在 SSE 中我似乎记得我使用了 shuffle,因为它与打包相比节省了一条指令,this example 显示了打包指令的使用)。
这个操作如何在 Neon 中翻译?
我应该使用打包指令吗?
然后我如何提取 32 位? (有没有相当于_mm_cvtsi128_si32的东西?)
编辑:
首先,vgetq_lane_u32 应该允许替换 _mm_cvtsi128_si32
(但我必须将我的 uint8x16_t 转换为 uint32x4_t)
uint32_t vgetq_lane_u32(uint32x4_t vec, __constrange(0,3) int lane);
或直接存储车道vst1q_lane_u32
void vst1q_lane_u32(__transfersize(1) uint32_t * ptr, uint32x4_t val, __constrange(0,3) int lane); // VST1.32 {d0[0]}, [r0]
【问题讨论】:
-
是的,我已经看到了。但它是反过来移植的指南......
标签: c++ arm sse neon intrinsics