XL C/C++ は、非直交言語拡張機能を使用して、AltiVec テクノロジーのプログラミング・モデルをサポートします。
AltiVec データ型は、ベクトル型 として参照されます。
AltiVec プログラミング・インターフェース仕様の IBM インプリメンテーションは、
型修飾子およびストレージ・クラス指定子を宣言内でキーワード vector (または、代替スペル __vector) に先行させることを可能にする拡張構文規則です。
キーワード vector は、型指定子として使用される場合、およびプログラムがオプション -qaltivec を使用してコンパイルされる場合のみ、宣言コンテキストで認識されます。その他の AltiVec キーワード pixel および bool は、キーワード vector が前に付く場合のみ、有効な型指定子として認識されます。ソース・コードを最大限に移植可能に保つには、 ご使用のプログラムで vector、pixel、または bool をキーワードまたは ID として使用することを避けます。 宣言で、指定子 vector および pixel の下線バージョン (__vector および __pixel) を使用します。
正しいフォームの構文のほとんどは、次のダイアグラムで取り込まれます。 バリエーションの一部は、明確にするためにダイアグラムから省略されています。 const などの型修飾子、および static などのストレージ・クラス指定子は、どちらもキーワード vector (または __vector) のすぐ後に続かない限り、宣言で任意の順序で表示することができます。
.-----------------------------. V | >>---+-------------------------+-+------------------------------> +-type_qualifier----------+ '-storage_class_specifier-' >--+-vector---+-+-+-bool-----+--+-char-----------+-+----------->< '-__vector-' | +-signed---+ +-short--+-----+-+ | | '-unsigned-' | '-int-' | | | +-int------------+ | | '-long--+-----+--' | | '-int-' | +-pixel----------------------------+ +-__pixel--------------------------+ '-float----------------------------'
注:
型指定子としての typedef 名は、ベクトル宣言コンテキストで許可されません。 ただし、vector 型は、typedef 宣言で使用することができ、その結果の typedef 名は一般的な方法で使用できます。
すべてのベクトル型は、16 バイトの境界上で位置合わせされる必要があります。1 つ以上のベクトル型が含まれる集合体は、ベクトル型の各メンバーが 16 バイトで位置合わせされるように、16 バイトの境界上で位置合わせしなければならず、また必要な場合は、埋め込みを行う必要があります。
間接演算子 * は、ベクトル型へのポインターを処理するために拡張されています。 ベクトル・ポインターは、16 バイトの位置合わせを持つメモリー・ロケーションを指示する必要があります。 ただし、コンパイラーはこの制約を施行しません。ベクトル・ポインターを間接参照すると、ベクトル型およびその 16 バイトの位置合わせが保守されます。 プログラムが、16 バイトの位置合わせアドレスが含まれないベクトル・ポインターを間接参照する場合、 振る舞いは予測できません。
ポインター演算は、ベクトル型へのポインターに対して定義されます。以下のような場合:
vector unsigned int *v;
式 v + 1 は、 v に続くベクトルへのポインターを表します。
ベクトル型は、他のベクトル型にキャストすることができます。キャストは、型変換を実行しません。 128 ビットのパターンは保存されますが、値は必ずしも保存されません。ベクトル型とスカラー型の間のキャストは許可されません。
ベクトル・ポインター、および非ベクトル型へのポインターは、互いにキャストすることができます。 非ベクトル型へのポインターがベクトル・ポインターにキャストされる場合、 アドレスは 16 バイトの位置合わせでなければなりません。非ベクトル型へのポインターの参照されるオブジェクトは、 __align 指定子または __attribute__((aligned(16))) のいずれかを使用して、16 バイトの境界上で位置合わせすることができます。ベクトル型のみが、自然 16 バイト位置合わせを持ちます。
ベクトル型は、ベクトル・リテラルまたは同じベクトル型を持つ任意の式によって初期化されます。 次に例を示します。
vector unsigned int v1; vector unsigned int v2 = (vector unsigned int)(10); v1 = v2;
ベクトル型は、初期化指定子リストによって初期化することができます。
中括弧で囲んだ初期化指定子リスト内のエレメントの数は、ベクトル型のエレメント数以下でなければなりません。
初期化されていないエレメントはすべて、ゼロに初期化されます。
例:
vector unsigned int v1 = {1}; // initialize the first 4 bytes of v1 with 1 and the remaining 12 bytes with zeros vector unsigned int v2 = {1,2}; // initialize the first 8 bytes of v1 with 1 and 2 and the remaining 8 bytes with zeros vector unsigned int v3 = {1,2,3,4}; // equivalent to the vector literal (vector unsigned int) (1,2,3,4)
ベクトル・リテラルとは異なり、 初期化指定子リストのエレメントは、初期化済みのベクトル変数が静的でないかぎり、 定数式である必要はありません。 そのため、以下は有効です。
int i=1; int foo() { return 2; } int main() { vector unsigned int v1 = {i, foo()}; return 0; }
関連参照