| ア | イ | ウ | エ | オ |
| カ | キ | ク | ケ | コ |
| サ | シ | ス | セ | ソ |
| タ | チ | ツ | テ | ト |
| ナ | ニ | ヌ | ネ | ノ |
| ハ | ヒ | フ | ヘ | ホ |
| マ | ミ | ム | メ | モ |
| ヤ | ユ | ヨ | ||
| ラ | リ | ル | レ | ロ |
| ワ | ヰ | ヴ | ヱ | ヲ |
| ン |
| A | B | C | D | E |
| F | G | H | I | J |
| K | L | M | N | O |
| P | Q | R | S | T |
| U | V | W | X | Y |
| Z | 数字 | 記号 | ||
x86プロセッサー用のC/C++で、SSEを扱うための独自のデータ型(変数型)。SSE2以降では関連して__m128iと__m128dが追加された。
#include <xmmintrin.h>
#include <emmintrin.h>
#include <pmmintrin.h>
SSEはxmmintrin、SSE2の機能を使うためにはemmintrin、SSE3の機能はpmmintrinをincludeすることで、それぞれ利用可能になる。
Microsoft Visual Studio 2010の場合、次のように定義がある。
xmmintrin.h
typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128 { float m128_f32[4]; unsigned __int64 m128_u64[2]; __int8 m128_i8[16]; __int16 m128_i16[8]; __int32 m128_i32[4]; __int64 m128_i64[2]; unsigned __int8 m128_u8[16]; unsigned __int16 m128_u16[8]; unsigned __int32 m128_u32[4]; } __m128;
emmintrin.h
typedef union __declspec(intrin_type) _CRT_ALIGN(16) __m128i {
__int8 m128i_i8[16];
__int16 m128i_i16[8];
__int32 m128i_i32[4];
__int64 m128i_i64[2];
unsigned __int8 m128i_u8[16];
unsigned __int16 m128i_u16[8];
unsigned __int32 m128i_u32[4];
unsigned __int64 m128i_u64[2];
} __m128i;
typedef struct __declspec(intrin_type) _CRT_ALIGN(16) __m128d {
double m128d_f64[2];
} __m128d;
Cの標準機能のみで定義することができないため、Visual C/C++の独自拡張機能を用いて定義されているが、その実体はどうやらunionのようである。
FreeBSDの場合、次のように定義がある。
xmmintrin.h
typedef float __m128 __attribute__ ((__vector_size__ (16), __may_alias__));
emmintrin.h
typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
typedef double __m128d __attribute__ ((__vector_size__ (16), __may_alias__));
Cの標準機能のみで定義することができないため、GCCの独自拡張機能を用いて定義されている。
__vector_size__は、バイト単位で変数のベクトル長を定義するものである。ここでは16バイト(つまり128ビット)である。__m128型はパックド単精度浮動小数点に、__m128d型はパックド倍精度浮動小数点に、__m128i型はパックド整数にそれぞれ対応しており、例えば__m128のfloat型なら、各32ビット長、つまり4バイト4台のベクトルとして定義される。
__may_alias__は、この属性を持つ型のオブジェクトへのアクセスは、型に基づく別名解析の対象とされず、代わりにchar型と同様、他の種類のオブジェクトへの別名として定義される。
__m128は、関数の戻り値やパラメーターとして利用できるが、他の一般的な算術式と共に使うことはできない。
処理系の実装に依存するが、この変数型を扱うための関数が用意されており、これを通してSSEを使うことになる。
なお、Intel AVX以降で拡張された256ビットのYMMレジスターは、__m256、__m256d、__m256i、のいずれかで扱うことができる。
結果として、__m128データ型は4つの32ビット浮動小数点数、__m128dデータ型は2つの64ビット浮動小数点数、__m128iデータ型は16個の8ビット整数値、8個の16ビット整数値、4個の32ビット整数値、または2個の64ビット整数値を保持することができる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます