gpt4 book ai didi

x86 - 将 _mm_shuffle_epi32 转换为 C 表达式以进行排列?

转载 作者:行者123 更新时间:2023-12-04 19:44:23 30 4
gpt4 key购买 nike

我正在处理 SSE2 到 NEON 的端口。该端口处于早期阶段,并且产生不正确的结果。结果不正确的部分原因是 _mm_shuffle_epi32以及我选择的 NEON 指令。
_mm_shuffle_epi32 的文档从 Microsoft 开始偏瘦. Intel文档更好,但我不清楚一些伪代码在做什么。

SELECT4(src, control)
{
CASE(control[1:0])
0: tmp[31:0] := src[31:0]
1: tmp[31:0] := src[63:32]
2: tmp[31:0] := src[95:64]
3: tmp[31:0] := src[127:96]
ESAC
RETURN tmp[31:0]
}

dst[31:0] := SELECT4(a[127:0], imm8[1:0])
dst[63:32] := SELECT4(a[127:0], imm8[3:2])
dst[95:64] := SELECT4(a[127:0], imm8[5:4])
dst[127:96] := SELECT4(a[127:0], imm8[7:6])

我需要帮助设想什么 _mm_shuffle_epi32做。或者更准确地说,由立即数应用于值的排列。我想我需要将其视为基本的 C、AND 和 OR。

给定 C 语句和宏,例如:
v2 = _mm_shuffle_epi32(v1, _MM_SHUFFLE(i1,i2,i3,i4));

将生成的 C 表达式展开为基本 C 语句时会是什么样子?

最佳答案

不会进行 AND/OR 运算,除非您需要解压缩包含四个 2 位索引的 8 位整数。

_MM_SHUFFLE 做出自己的定义扩展到四个参数,而不是打包它们。

有点像

// dst = _mm_shuffle_epi32(src, _MM_SHUFFLE(d,c,b,a))
void pshufd(int dst[4], int src[4], int d,int c,int b,int a)
{ // note that the _MM_SHUFFLE args are high-element-first order
dst[0] = src[a];
dst[1] = src[b];
dst[2] = src[c];
dst[3] = src[d];
}

向量从低元素 = 0 开始索引。低元素是存储在最低地址的内存中的元素,但是当值在寄存器中时,您应该将它们视为 [ 3 2 1 0 ] .在这种表示法中,向量右移(如 psrldq )实际上向右移动。

这就是为什么 _mm_set_epi32(3, 2, 1, 0)int foo[] = { 0, 1, 2, 3 }; 以相反的顺序获取其参数.

关于x86 - 将 _mm_shuffle_epi32 转换为 C 表达式以进行排列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37084379/

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