Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
转换GCC';内置ia32 pshufd和v4si模式转换为便携式内置模式?_C_Gcc_Intrinsics - Fatal编程技术网

转换GCC';内置ia32 pshufd和v4si模式转换为便携式内置模式?

转换GCC';内置ia32 pshufd和v4si模式转换为便携式内置模式?,c,gcc,intrinsics,C,Gcc,Intrinsics,我有一个充满自定义宏和GCC内部函数的程序,比如\uuuu builtin\uia32\upshufd。我想将其转换为Intel Intrinsic,以实现便携性和最终的Windows支持 我对源文件进行了预处理,包括-fno builtin选项,但似乎得到了一些内置文件。以下是其中之一: row = ((__m128i)__builtin_ia32_pshufd ((__v4si)(__m128i)( row ), (int)(((( 1 ) << 6) | (( 0

我有一个充满自定义宏和GCC内部函数的程序,比如
\uuuu builtin\uia32\upshufd
。我想将其转换为Intel Intrinsic,以实现便携性和最终的Windows支持

我对源文件进行了预处理,包括
-fno builtin
选项,但似乎得到了一些内置文件。以下是其中之一:

row = 
 ((__m128i)__builtin_ia32_pshufd ((__v4si)(__m128i)(
 row
 ), (int)((((
 1
 ) << 6) | ((
 0
 ) << 4) | ((
 3
 ) << 2) | (
 2
 )))))
 ;
如何将这两个GCC内部函数转换为可移植的Intel内部函数

row = 
 ((__m128i) ((__v4si)(__m128i)(
 row
 ), (int)((((
 0
 ) << 6) | ((
 3
 ) << 4) | ((
 2
 ) << 2) | (
 1
 )))))
 ;
如果正在使用预处理的源文件,则:

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"
...
文件=
文件=
cp$file$t文件
sed-i的|(| u m128i)| u内置的| ia32 | pshufd(|u v4si)| | | | | | m | u shufle | epi32(| g'$tfile)
perl-0777-i-pe's/\(\n 0\n\)/0/igs's$t文件
perl-0777-i-pe's/\(\n 1\n\)/1/igs'$tfile“
perl-0777-i-pe's/\(\n 2\n\)/2/igs's$t文件
perl-0777-i-pe's/\(\n 3\n\)/3/igs's$t文件
perl-0777-i-pe's/\(\n row\n\)/row/igs'$tfile“

sed-i's |(int)(((2@Olaf-没有什么需要编辑。请开发一些主题知识。你不需要使用
\u MM\u SHUFFLE
。当然,它比那种乱七八糟的东西更容易阅读,但原始版本仍然会生成一个整数,你可以用它作为
\u MM\u SHUFFLE\u epi32
的SHUFFLE参数。另一种不使用
编写1,0,3,2的半可读方式>_MM_SHUFFLE
宏是
0b0101110
。我更喜欢汇编程序中的0b方式,但在C语言中更喜欢
\u MM_SHUFFLE
方式。
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"
...