__m64
読み:アンダースコア-アンダースコア-エムろくじゅうよん
外語:__m64

 x86プロセッサー用のC/C++で、MMX3DNow!を扱うための独自のデータ型(変数型)。
目次

概要
 MMXレジスターは、64ビット長のSIMD演算装置用レジスターである。
 通常のintやlongなどと性質の異なるものであるため、このような独自の型が用意されたようである。
 当然、MMXなどと無縁の環境に対する移植性はないものの、Microsoft WindowsPC UNIX(FreeBSDLinux等)では共通して使えるようである。

特徴

仕様

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を使うことになる。

再検索