私はプロジェクトにGCCSIMDベクトル拡張を使用しています。すべてが非常にうまく機能しますが、キャストします。ベクトルのすべてのコンポーネントをリセットするだけです。
マニュアルには次のように記載されています。
同じサイズであれば、あるベクトル型から別のベクトル型にキャストすることができます(実際、同じサイズの他のデータ型との間でベクトルをキャストすることもできます)。
簡単な例を次に示します。
#include <stdio.h>
typedef int int4 __attribute__ (( vector_size( sizeof( int ) * 4 ) ));
typedef float float4 __attribute__ (( vector_size( sizeof( float ) * 4 ) ));
int main()
{
int4 i = { 1 , 2 , 3 , 4 };
float4 f = { 0.1 , 0.2 , 0.3 , 0.4 };
printf( "%i %i %i %i\n" , i[0] , i[1] , i[2] , i[3] );
printf( "%f %f %f %f\n" , f[0] , f[1] , f[2] , f[3] );
f = ( float4 )i;
printf( "%f %f %f %f\n" , f[0] , f[1] , f[2] , f[3] );
}
gcc cast.c -O3 -o cast
私のマシンでコンパイルして実行すると、次のようになります。
1 2 3 4
0.100000 0.200000 0.300000 0.400000
0.000000 0.000000 0.000000 0.000000 <-- no no no
私はそのアセンブラーの第一人者ではありませんが、ここでいくつかのバイトの動きが見られます。
[...] 400454:f2 0f 10 1d 1c 02 00 movsd 0x21c(%rip)、%xmm3 40045b:00 40045c:bf 49 06 40 00 mov $ 0x400649、%edi 400461:f2 0f 10 15 17 02 00 movsd 0x217(%rip)、%xmm2 400468:00 400469:b8 04 00 00 00 mov $ 0x4、%eax 40046e:f2 0f 10 0d 12 02 00 movsd 0x212(%rip)、%xmm1 400475:00 400476:f2 0f 10 05 12 02 00 movsd 0x212(%rip)、%xmm0 40047d:00 40047e:48 83 c408追加$0x8、%rsp 400482:e9 59 ff ff ff jmpq 4003e0
私はスカラーと同等のベクトルを疑っています:
*( int * )&float_value = int_value;
この動作をどのように説明できますか?