gpt4 book ai didi

sse - SSE 和 NEON Intrinsics-Shuffling 之间的转换

转载 作者:行者123 更新时间:2023-12-04 15:03:08 27 4
gpt4 key购买 nike

我正在尝试将用 SSE3 内在函数编写的代码转换为 NEON SIMD,但由于 shuffle 函数而卡住了。我查看了 GCC Intrinsic , ARM manuals和其他论坛,但一直无法找到解决方案。
代码:

_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) extracts nth 8-bit parameter from a.

r1 = (mask1 & 0x80) ? 0 : SELECT(a, mask1 & 0x0f)

...


我找不到首先检查掩码的高位然后有效地选择掩码的低4位的指令。我知道我们可以比较寄存器中的每一位,然后如果指定条件,然后选择低4位,但是我希望能有效地做到这一点。希望有人可以提供帮助或提供引用。
非常感谢,
干杯!

最佳答案

当索引超出范围时,VTBL 返回 0。

由于它最多支持两个 Q 寄存器作为查找表,因此非常简单:

  • 将查找表加载到 Q 寄存器(例如 Q8)
  • vtbl.8 d0, {q8}, d0(其中 d0 包含您的掩码)

  • 这样就行了。

    如果你想让 4~6 位不碍事,你可以在 vtbl 之前将它们屏蔽掉。

    不幸的是,VBIC 对于 8bit 立即数绝对没用。

    因此,您必须牺牲一个初始化为位掩码操作数的寄存器。
  • vmov.u8,d1,#0x70
  • 将查找表加载到 Q 寄存器(例如 Q8)
  • vbic.i8 d0、d0、d1
  • vtbl.8 d0, {q8}, d0(其中 d0 包含您的掩码)
  • 关于sse - SSE 和 NEON Intrinsics-Shuffling 之间的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962141/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com