__m64
読み:アンダースコア-アンダースコア-エムろくじゅうよん
外語:__m64
x86プロセッサー用のC/C++で、MMXや3DNow!を扱うための独自のデータ型(変数型)。
概要
MMXレジスターは、64ビット長のSIMD演算装置用レジスターである。
通常のintやlongなどと性質の異なるものであるため、このような独自の型が用意されたようである。
当然、MMXなどと無縁の環境に対する移植性はないものの、Microsoft WindowsとPC UNIX(FreeBSDやLinux等)では共通して使えるようである。
特徴
仕様
Windows
Microsoft Visual Studio 2010の場合、mmintrin.hに、次のように定義がある。
typedef union __declspec(intrin_type) _CRT_ALIGN(8) __m64
{
unsigned __int64 m64_u64;
float m64_f32[2];
__int8 m64_i8[8];
__int16 m64_i16[4];
__int32 m64_i32[2];
__int64 m64_i64;
unsigned __int8 m64_u8[8];
unsigned __int16 m64_u16[4];
unsigned __int32 m64_u32[2];
} __m64;
Cの標準機能のみで定義することができないため、Visual C/C++の独自拡張機能を用いて定義されているが、その実体はどうやらunionのようである。
FreeBSD
FreeBSDの場合、mmintrin.hに、次のように定義がある。
typedef int __m64 __attribute__ ((__vector_size__ (8), __may_alias__));
Cの標準機能のみで定義することができないため、GCCの独自拡張機能を用いて定義されている。
__vector_size__は、バイト単位で変数のベクトル長を定義するものである。ここでは8バイト(つまり64ビット)である。型はintで定義されているので、各32ビット長、つまり4バイト2台のベクトルとして定義される。
__may_alias__は、この属性を持つ型のオブジェクトへのアクセスは、型に基づく別名解析の対象とされず、代わりにchar型と同様、他の種類のオブジェクトへの別名として定義される。
結果として__m64データ型は、8つの8ビット値、4つの16ビット値、2つの32ビット値、または1つの64ビット値を保持することができる。
利用方法
__m64は、関数の戻り値やパラメーターとして利用できるが、他の一般的な算術式と共に使うことはできない。
処理系の実装に依存するが、この変数型を扱うための関数が用意されており、これを通してMMXを使うことになる。
再検索