将 GCC 的 __builtin_ia32_pshufd 和 __v4si 模式转换为可移植内在模式?
Convert GCC's __builtin_ia32_pshufd and __v4si mode to portable intrinsic?
我有一个程序充满了自定义宏和 GCC 内部函数,例如 __builtin_ia32_pshufd
。我想将其转换为 Intel 内在函数以实现可移植性和最终 Windows 支持。
我预处理了源文件,包括 -fno-builtin
选项,但我似乎得到了一些内置函数。这是其中之一:
row =
((__m128i)__builtin_ia32_pshufd ((__v4si)(__m128i)(
row
), (int)((((
1
) << 6) | ((
0
) << 4) | ((
3
) << 2) | (
2
)))))
;
我也无法弄清楚如何处理模式属性 (__v4si
):
row =
((__m128i) ((__v4si)(__m128i)(
row
), (int)((((
0
) << 6) | ((
3
) << 4) | ((
2
) << 2) | (
1
)))))
;
如何将这两个 GCC 内部函数转换为可移植的 Intel 内部函数?
row =
((__m128i) ((__v4si)(__m128i)(
row
), (int)((((
0
) << 6) | ((
3
) << 4) | ((
2
) << 2) | (
1
)))))
;
这可以通过以下方式返回到可移植的内在函数:
row = (_mm_shuffle_epi32(row, _MM_SHUFFLE(2,1,0,3)));
如果您使用的是经过预处理的源文件,则:
file=<preprocessed source file>
tfile=<temporary file>
cp $file $tfile
sed -i 's|(__m128i)__builtin_ia32_pshufd ((__v4si)(__m128i)|_mm_shuffle_epi32(|g' "$tfile"
perl -0777 -i -pe 's/\(\n 0\n\)/0/igs' "$tfile"
perl -0777 -i -pe 's/\(\n 1\n\)/1/igs' "$tfile"
perl -0777 -i -pe 's/\(\n 2\n\)/2/igs' "$tfile"
perl -0777 -i -pe 's/\(\n 3\n\)/3/igs' "$tfile"
perl -0777 -i -pe 's/\(\n row\n\)/ row/igs' "$tfile"
sed -i 's|(int)(((2 << 6) \| (1 << 4) \| (0 << 2) \| 3)))|_MM_SHUFFLE(2,1,0,3))|g' "$tfile"
sed -i 's|(int)(((1 << 6) \| (0 << 4) \| (3 << 2) \| 2)))|_MM_SHUFFLE(1,0,3,2))|g' "$tfile"
sed -i 's|(int)(((0 << 6) \| (3 << 4) \| (2 << 2) \| 1)))|_MM_SHUFFLE(0,3,2,1))|g' "$tfile"
...
我有一个程序充满了自定义宏和 GCC 内部函数,例如 __builtin_ia32_pshufd
。我想将其转换为 Intel 内在函数以实现可移植性和最终 Windows 支持。
我预处理了源文件,包括 -fno-builtin
选项,但我似乎得到了一些内置函数。这是其中之一:
row =
((__m128i)__builtin_ia32_pshufd ((__v4si)(__m128i)(
row
), (int)((((
1
) << 6) | ((
0
) << 4) | ((
3
) << 2) | (
2
)))))
;
我也无法弄清楚如何处理模式属性 (__v4si
):
row =
((__m128i) ((__v4si)(__m128i)(
row
), (int)((((
0
) << 6) | ((
3
) << 4) | ((
2
) << 2) | (
1
)))))
;
如何将这两个 GCC 内部函数转换为可移植的 Intel 内部函数?
row =
((__m128i) ((__v4si)(__m128i)(
row
), (int)((((
0
) << 6) | ((
3
) << 4) | ((
2
) << 2) | (
1
)))))
;
这可以通过以下方式返回到可移植的内在函数:
row = (_mm_shuffle_epi32(row, _MM_SHUFFLE(2,1,0,3)));
如果您使用的是经过预处理的源文件,则:
file=<preprocessed source file>
tfile=<temporary file>
cp $file $tfile
sed -i 's|(__m128i)__builtin_ia32_pshufd ((__v4si)(__m128i)|_mm_shuffle_epi32(|g' "$tfile"
perl -0777 -i -pe 's/\(\n 0\n\)/0/igs' "$tfile"
perl -0777 -i -pe 's/\(\n 1\n\)/1/igs' "$tfile"
perl -0777 -i -pe 's/\(\n 2\n\)/2/igs' "$tfile"
perl -0777 -i -pe 's/\(\n 3\n\)/3/igs' "$tfile"
perl -0777 -i -pe 's/\(\n row\n\)/ row/igs' "$tfile"
sed -i 's|(int)(((2 << 6) \| (1 << 4) \| (0 << 2) \| 3)))|_MM_SHUFFLE(2,1,0,3))|g' "$tfile"
sed -i 's|(int)(((1 << 6) \| (0 << 4) \| (3 << 2) \| 2)))|_MM_SHUFFLE(1,0,3,2))|g' "$tfile"
sed -i 's|(int)(((0 << 6) \| (3 << 4) \| (2 << 2) \| 1)))|_MM_SHUFFLE(0,3,2,1))|g' "$tfile"
...