我正在使用SSE2到NEON的端口。该端口尚处于早期阶段,并且产生了错误的结果。结果不正确的部分原因是_mm_shuffle_epi32我选择的NEON指令。
Microsoft的文档_mm_shuffle_epi32是精简版。在英特尔文档是更好的,但它不是我清楚什么是一些伪代码的是做。
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])
Run Code Online (Sandbox Code Playgroud)
我需要设想一下该怎么_mm_shuffle_epi32做。或更正确地说,排列是立即数应用于值的。我想我需要将其视为基本的C和AND与OR。
给定C语句和宏,例如:
v2 = _mm_shuffle_epi32(v1, _MM_SHUFFLE(i1,i2,i3,i4));
Run Code Online (Sandbox Code Playgroud)
展开为基本C语句时,结果C表达式是什么样子?