将GCC的__builtin_ia32_pshufd和__v4si模式转换为可移植的内在函数?

时间:2016-04-18 17:21:15

标签: c gcc intrinsics

我有一个程序充满了自定义宏和GCC内在函数,如__builtin_ia32_pshufd。我想将其转换为英特尔内在函数,以实现可移植性和最终的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内在函数转换为便携式英特尔内在函数?

1 个答案:

答案 0 :(得分:0)

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"
...