我正在尝试将用 SSE3 内在函数编写的代码转换为 NEON SIMD,但由于 shuffle 功能而被卡住。我查看了GCC Intrinsic、ARM 手册和其他论坛,但未能找到解决方案。
代码:
_m128i upper = _mm_loadu_si128((__m128i*)p1);
register __m128i mask1 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1);
register __m128i mask2 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1,0x80);
__m128i temp1_upper = _mm_or_si128(_mm_shuffle_epi8(upper,mask1),_mm_shuffle_epi8(upper,mask2));
虽然 vtbl1_u8(uint8x8_t,uint8x8_t) 指令创建了一个查找表,可用于将值分配给目标寄存器,但它仅在 64 位寄存器上运行。此外,shuffle 操作在开始时执行比较,必须在NEON 和我不知道如何有效地做到这一点。
r0 = (mask0 & 0x80) ? 0 : SELECT(a, mask0 & 0x0f) // SELECT(a,n) 从 a 中提取第 n 个 8 位参数。
r1 = (mask1 & 0x80) ?0 : 选择(a, mask1 & 0x0f)
...
我找不到一条指令,它首先检查掩码的高位,然后有效地选择掩码的低 4 位。我知道我们可以比较寄存器中的每个位,然后在指定条件时选择低 4 位,但是我希望能有效地做到这一点。希望有人可以提供帮助或提供参考。
非常感谢,
干杯!