Vector Builtin 関数詳細¶
記述規則¶
関数ごとに、関数プロトタイプ宣言、説明、処理詳細、対応する命令の順で説明します。
関数のプロトタイプ宣言を以下のように記述します。
- void __builtin_ve_XXXX(vector dest, scalar src [, __vm mask] [, int vl]);
パラメータの型に vector と記述されているとき、ベクトル型の引数を指定します。
パラメータの型に scalar と記述されているとき、ベクトル型以外の引数を指定します。
省略できる引数を[]で囲って表記します。上記の表記の場合、以下の四つの記述ができることを示します。
void __builtin_ve_XXXX(dest, src1, src2); void __builtin_ve_XXXX(dest, src1, src2, mask); void __builtin_ve_XXXX(dest, src1, src2, vl); void __builtin_ve_XXXX(dest, src1, src2, mask, vl);省略できるベクトルマスク型の引数が省略されたとき、すべてのビットが1のベクトルマスク型が指定されたものとみなされます。
省略できるベクトル長の引数が省略されたとき、引数のベクトル型の要素数を元にベクトル長が算定され、その全要素が計算対象となります。引数がベクトルマスク型のときは256が指定されたものとみなされます。
説明 では、関数の機能を説明しています。
処理詳細 では、読者の理解を容易にするため、関数の処理をC言語プログラムのイメージで説明しています。
対応するベクトル命令 では、当該関数とほぼ同じ処理をする命令を示しています。関数が対応するベクトル命令にそのまま置き換わることを示すものではないことに注意して下さい。
ベクトルロード・ベクトルストア・ベクトル転送¶
-
void __builtin_ve_vld(vector dest, void *addr, size_t stride[
, __vm mask
][, int vl
])¶
説明
addr の位置からストライド stride でベクトル型 dest にベクトルロードする。
ストライド はバイト単位で指定する。たとえば、次の例のようにストライドが 16 (=sizeof(double)*2) でベクトルロードしたとき、
typedef double v64 __attribute__((ext_vector_type(64))); v64 v; double a[128]; __builtin_ve_vld(v, a, sizeof(double)*2, 64);以下のようにベクトル型vの要素に配列aの要素を代入したのと同じ結果になる。
v[0] = a[0] v[1] = a[2] v[2] = a[4] ... v[63] = a[126]
処理詳細
for (int i = 0; i < vl; i++) { vreg[i] = *((element-type)(addr + (i * stride))); } for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = vreg[i]; } }
対応するベクトル命令
VLD
VLDU
VLDL
-
void __builtin_ve_vst(vector src, void *addr, size_t stride[
, __vm mask
][, int vl
]);¶
説明
addr の位置からストライド stride でベクトル型 src をベクトルストアする。
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { *((element-type)(addr + (i * stride))) = src[i]; } }
対応するベクトル命令
VST
VSTU
VSTL
-
void __builtin_ve_vgt(vector dest, void *addr, vector index[
, __vm mask
][, int vl
]);¶
説明
配列 addr の先頭から、 index で指定された要素番号の配列要素をベクトル型 dest にベクトル収集する。
typedef double vf __attribute__((ext_vector_type(8))); typedef int vi __attribute__((ext_vector_type(8))); vf v; vi idx = { 3, 4, 0, 1, 3, 4, 2, 5 }; double a[8]; __builtin_ve_vgt(v, a, idx, 8);のとき、以下のようにベクトル型vの要素に配列aの要素を代入したのと同じ結果になる。
v[0] = a[3]; // (=a[idx[0]]) v[1] = a[4]; // (=a[idx[1]]) v[2] = a[0]; // (=a[idx[2]]) v[3] = a[1]; // (=a[idx[3]]) v[4] = a[3]; // (=a[idx[4]]) v[5] = a[4]; // (=a[idx[5]]) v[6] = a[2]; // (=a[idx[6]]) v[7] = a[5]; // (=a[idx[7]])
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = *((element-type)(addr + (index[i] * sizeof(element-type)))); } }
対応するベクトル命令
VGT
VGTU
VGTL
VSFA ( a[idx[i]]のアドレス計算のため )
-
void __builtin_ve_vsc(vector src, void *addr, vector index[
, __vm mask
][, int vl
]);¶
説明
配列 addr の先頭から、 index で指定された要素番号の配列要素にベクトル型 dest をベクトル拡散する。
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { *((element-type)(addr + (index[i] * sizeof(element-type)))) = src[i]; } }
対応するベクトル命令
VSC
VSCU
VSCL
VSFA ( a[idx[i]]のアドレス計算のため )
-
void __builtin_ve_pfchv(void *addr, size_t stride[
, int vl
]);¶
説明
addr の位置から stride ごとに値をプリフェッチする。
処理詳細
for (int i = 0; i < vl; i++) { キャッシュ <= addr + (i * 4); // プリフェッチ }
対応するベクトル命令
PFCHV
-
void __builtin_ve_lsv(vector dest, int N, scalar src);¶
説明
スカラ src の値をベクトル型 dest の N 番目の要素に代入する。
処理詳細
dest[N] = src;
対応するベクトル命令
LSV
-
scalar __builtin_ve_lvs(vector src, int N);¶
説明
ベクトル型 src の N 番目の要素を返却する。
処理詳細
return src[N];
対応するベクトル命令
LVS
-
void __builtin_ve_vbrd(vector dest, scalar src[
, mask
][, int vl
]);¶
説明
スカラ src の値をベクトル型 dest の全要素に代入する。
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src; } }
対応するベクトル命令
VBRD
-
void __builtin_ve_vmv(vector dest, vector src, int rotate[
, __vm mask
][, int vl
]);¶
説明
ベクトル型 src の要素を rotate だけローテートさせ、ベクトル型 dest に代入する。
たとえば、vl =7、rotate =3のとき、以下の結果となる。
dest[0] = src[3] dest[1] = src[4] dest[2] = src[5] dest[3] = src[6] dest[4] = src[0] dest[5] = src[1] dest[6] = src[2]
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src[mod(rotate + i), VL)]l; } }
対応するベクトル命令
VMV
ベクトル固定小数点演算¶
-
void __builtin_ve_vadd(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vadd(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vadd(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 + src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] + src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] + src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 + src2[i]; } }
対応するベクトル命令
VADD
VADS
VADX
-
void __builtin_ve_vsub(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vsub(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vsub(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 - src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] - src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] - src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 - src2[i]; } }
対応するベクトル命令
VSUB
VSBS
VSBX
-
void __builtin_ve_vmul(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vmul(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vmul(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 * src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] * src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] * src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 * src2[i]; } }
対応するベクトル命令
VMPY
VMPS
VMPX
-
void __builtin_ve_vdiv(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vdiv(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vdiv(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 / src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] / src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] / src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 / src2[i]; } }
対応するベクトル命令
VDIV
VDVS
VDVX
-
void __builtin_ve_vrem(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vrem(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vrem(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 % src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] % src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] % src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 % src2[i]; } }
対応するベクトル命令
なし
-
void __builtin_ve_vcmp(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vcmp(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vcmp(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 と src2 の比較結果
比較結果の値は以下である。
src1 > src2 のとき、正の値
src1 == src2 のとき、ゼロ
src1 < src2 のとき、負の値
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { if (src1[i] > src2[i]) { dest[i] = positive-value; } else if (src1[i] == src2[i]) { dest[i] = 0; } else { dest[i] = negative-value; } } }for (int i = 0; i < vl; i++) { if (mask[i]) { if (src1[i] > src2) { dest[i] = positive-value; } else if (src1[i] == src2) { dest[i] = 0; } else { dest[i] = negative-value; } } }for (int i = 0; i < vl; i++) { if (mask[i]) { if (src1 > src2[i]) { dest[i] = positive-value; } else if (src1 == src2[i]) { dest[i] = 0; } else { dest[i] = negative-value; } } }
対応するベクトル命令
VCMP
VCPS
VCPX
-
void __builtin_ve_vmax(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vmax(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vmax(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = max ( src1 , src2 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = max( src1[i], src2[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = max( src1[i], src2 ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = max( src1, src2[i] ); } }
対応するベクトル命令
VCMS
VCMX
-
void __builtin_ve_vmin(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vmin(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vmin(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = min ( src1 , src2 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = min( src1[i], src2[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = min( src1[i], src2 ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = min( src1, src2[i] ); } }
対応するベクトル命令
VCMS
VCMX
ベクトルビット論理演算¶
-
void __builtin_ve_vand(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vand(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vand(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 & src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] & src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] & src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 & src2[i]; } }
対応するベクトル命令
VAND
-
void __builtin_ve_vor(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vor(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vor(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 | src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] | src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] | src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 | src2[i]; } }
対応するベクトル命令
VOR
-
void __builtin_ve_vxor(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vxor(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vxor(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 ^ src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] ^ src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] ^ src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 ^ src2[i]; } }
対応するベクトル命令
VXOR
-
void __builtin_ve_veqv(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_veqv(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_veqv(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = ~( src1 ^ src2 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ~(src1[i] ^ src2[i]); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ~(src1[i] ^ src2); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ~(src1 ^ src2[i]); } }
対応するベクトル命令
VEQV
-
void __builtin_ve_vldz(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = src のleading zeroの個数 (=最初に1の現れる位置)
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = leading-zero-of src[i]; } }
対応するベクトル命令
VLDZ
-
void __builtin_ve_vpcnt(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = src のpopulation count (=値1のビットの個数)
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = population-count-of src[i]; } }
対応するベクトル命令
VPCNT
ベクトルシフト演算¶
-
void __builtin_ve_vsll(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vsll(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);
説明
dest = src1 << src2 (左論理シフト)
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] << src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] << src2; } }
対応するベクトル命令
VSLL
-
void __builtin_ve_vsrl(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vsrl(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);
説明
dest = src1 >> src2 (右論理シフト)
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] >> src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] >> src2; } }
対応するベクトル命令
VSRL
-
void __builtin_ve_vsla(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vsla(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);
説明
dest = src1 << src2 (左算術シフト)
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] << src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] << src2; } }
対応するベクトル命令
VSLA
VSLAX
-
void __builtin_ve_vsra(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vsra(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);
説明
dest = src1 >> src2 (右算術シフト)
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] >> src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] >> src2; } }
対応するベクトル命令
VSRA
VSRAX
-
void __builtin_ve_vsfa(vector dest, vector src1, scalar src2, scalar src3[
, __vm mask
][, int vl
]);¶
説明
dest = src3 + ( src1 << src2 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src3 + (src1[i] << src2); } }
対応するベクトル命令
VSFA
ベクトル浮動小数点演算¶
-
void __builtin_ve_vfadd(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfadd(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfadd(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 + src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] + src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] + src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 + src2[i]; } }
対応するベクトル命令
VFAD
-
void __builtin_ve_vfsub(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfsub(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfsub(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 - src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] - src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] - src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 - src2[i]; } }
対応するベクトル命令
VFSB
-
void __builtin_ve_vfmul(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfmul(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfmul(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 * src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] * src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] * src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 * src2[i]; } }
対応するベクトル命令
VFMP
-
void __builtin_ve_vfdiv(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfdiv(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfdiv(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 / src2
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] / src2[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] / src2; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = src1 / src2[i]; } }
対応するベクトル命令
VFDV
Note
本関数より、ベクトル浮動小数点除算関数 の方が高速である。
-
void __builtin_ve_vfcmp(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfcmp(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfcmp(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = src1 と src2 の比較結果
比較結果の値は以下である。
src1 > src2 のとき、正の値
src1 == src2 のとき、ゼロ
src1 < src2 のとき、負の値
上記以外のとき、quiet NaN
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { if (src1[i] > src2[i]) { dest[i] = positive-value; } else if (src1[i] == src2[i]) { dest[i] = 0; } else if (src1[i] < src2[i]) { dest[i] = negative-value; } else { dest[i] = NaN; } } }for (int i = 0; i < vl; i++) { if (mask[i]) { if (src1[i] > src2) { dest[i] = positive-value; } else if (src1[i] == src2) { dest[i] = 0; } else if (src1[i] < src2) { dest[i] = negative-value; } else { dest[i] = NaN; } } }for (int i = 0; i < vl; i++) { if (mask[i]) { if (src1 > src2[i]) { dest[i] = positive-value; } else if (src1 == src2[i]) { dest[i] = 0; } else if (src1 < src2[i]) { dest[i] = negative-value; } else { dest[i] = NaN; } } }
対応するベクトル命令
VFCP
-
void __builtin_ve_vfmax(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfmax(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfmax(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = fmax( src1 , src2 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = fmax( src1[i], src2[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = fmax( src1[i], src2 ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = fmax( src1, src2[i] ); } }
対応するベクトル命令
VFCM
-
void __builtin_ve_vfmin(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfmin(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfmin(vector dest, scalar src1, vector src2[
, __vm mask
][, int vl
]);
説明
dest = fmin( src1 , src2 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = fmin( src1[i], src2[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = fmin( src1[i], src2 ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = fmin( src1, src2[i] ); } }
対応するベクトル命令
VFCM
-
void __builtin_ve_vfmadd(vector dest, vector src1, vector src2, vector src3[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfmadd(vector dest, vector src1, scalar src2, vector src3[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfmadd(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);
説明
dest = ( src1 * src2 ) + src3
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] * src2[i] ) + src3[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] * src2 ) + src3[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] * src2[i] ) + src3; } }
対応するベクトル命令
VFMAD
-
void __builtin_ve_vfmsub(vector dest, vector src1, vector src2, vector src3[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfmsub(vector dest, vector src1, scalar src2, vector src3[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfmsub(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);
説明
dest = ( src1 * src2 ) - src3
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] * src2[i] ) - src3[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] * src2 ) - src3[i]; } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] * src2[i] ) - src3; } }
対応するベクトル命令
VFMSB
-
void __builtin_ve_vfnmadd(vector dest, vector src1, vector src2, vector src3[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfnmadd(vector dest, vector src1, scalar src2, vector src3[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfnmadd(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);
説明
dest = - ( ( src1 * src2 ) + src3 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = - ( ( src1[i] * src2[i] ) + src3[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = - ( ( src1[i] * src2 ) + src3[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = - ( ( src1[i] * src2[i] ) + src3 ); } }
対応するベクトル命令
VFNMAD
-
void __builtin_ve_vfnmsub(vector dest, vector src1, vector src2, vector src3[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vfnmsub(vector dest, vector src1, scalar src2, vector src3[
, __vm mask
][, int vl
]); -
void __builtin_ve_vfnmsub(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);
説明
dest = - ( ( src1 * src2 ) - src3 )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = - ( ( src1[i] * src2[i] ) - src3[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = - ( ( src1[i] * src2 ) - src3[i] ); } }for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = - ( ( src1[i] * src2[i] ) - src3 ); } }
対応するベクトル命令
VFNMSB
-
void __builtin_ve_vfsqrt(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = sqrt( src )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = sqrt( src[i] ); } }
対応するベクトル命令
VFSQRT
-
void __builtin_ve_vrcp(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = approximate-value-of (1.0 / src )
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = approximate-value-of (1.0 / src[i] ); } }
対応するベクトル命令
VRCP
-
void __builtin_ve_vrsqrt(vector dest, vector src, _except except[
, __vm mask
][, int vl
]);¶
説明
dest = approximate-value-of ( 1.0 / sqrt( src ) )
except が_ZERODIVのとき、ゼロ除算例外を発生させる
except が_NOZERODIVのとき、ゼロ除算例外を発生させない
_ZERODIV、_NOZERODIVの値は、ヘッダ<_vector.h>で定義されている。
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = approximate-value-of ( 1.0 / sqrt( src[i] ) ) } }
対応するベクトル命令
VRSQRT
-
void __builtin_ve_vfix(vector dest, vector src, _round round[
, __vm mask
][, int vl
]);¶
説明
dest = src の整数型への変換結果
round で端数処理の方法を指定する。以下の値が指定できる。
_RW のとき、現在のシステムの設定に従う
_RZ のとき、0への丸め
_RP のとき、正の無限大への丸め
_RM のとき、負の無限大への丸め
_RN のとき、最近接丸め (偶数への丸め)
_RA のとき、四捨五入
上記の値はヘッダ<_vector.h>で定義されている。
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = convert-to-integer( src[i] ); } }
対応するベクトル命令
VFIX
VFIXX
-
void __builtin_ve_vflt(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = src の浮動小数点数型への変換結果
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = convert-to-floating( src[i] ); } }
対応するベクトル命令
VFLT
VFLTX
-
void __builtin_ve_vcnv(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = src の精度変換結果
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { dest[i] = convert-precision( src[i] ); } }
対応するベクトル命令
VCVS
VCVD
ベクトルリダクション演算¶
-
void __builtin_ve_vsum(vector dest, vector src[
,__vm mask
][, int vl
]);¶
説明
dest [0] = src [0] + src [1] + ... + src [ vl - 1]
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[0] = dest[0] + src[i]; } }
対応するベクトル命令
VSUMS
VSUMX
-
void __builtin_ve_vrmax(vector dest, vector src, _position pos[
, __vm mask
][, int vl
]);¶
説明
dest [0] = max ( src [0], src [1], ....., src [ vl -1])
pos = _FIRSTのとき、dest [4]=最大値が最初に現れた要素番号
pos = _LASTのとき、dest [4]=最大値が最後に現れた要素番号
_FIRST、_LASTの値は、ヘッダ<_vector.h>で定義されている。
dest[0] = src[0]; for (int i = 1; i < vl; i++) { dest[0] = max ( dest[0], src[i] ); } if (pos == _FIRST) { dest[4] = 最大値が最初に現れる要素番号; } else { dest[4] = 最大値が最後に現れる要素番号; }
対応するベクトル命令
VMAX
対応するベクトル命令
VMAX
VMAXX
-
void __builtin_ve_vrmin(vector dest, vector src, _position pos[
, __vm mask
][, int vl
]);¶
説明
dest [0] = min ( src [0], src [1], ....., src [ vl -1])
pos = _FIRSTのとき、dest [4] = 最小値が最初に現れた要素番号
pos = _LASTのとき、dest [4] = 最小値が最後に現れた要素番号
_FIRST、_LASTの値は、ヘッダ<_vector.h>で定義されている。
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { dest[0] = min ( dest[0], src[i] ); } if (pos == _FIRST) { dest[4] = 最大値が最初に現れる要素番号; } else { dest[4] = 最大値が最後に現れる要素番号; }
対応するベクトル命令
VMAX
VMAXX
-
void __builtin_ve_vrand(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src [0] & src [1] & ... & src [ vl - 1]
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[0] = dest[0] & src[i]; } }
対応するベクトル命令
VRAND
-
void __builtin_ve_vror(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src [0] | src [1] | ... | src [ vl - 1]
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[0] = dest[0] | src[i]; } }
対応するベクトル命令
VROR
-
void __builtin_ve_vrxor(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src [0] ^ src [1] ^ ... ^ src [ vl - 1]
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[0] = dest[0] ^ src[i]; } }
対応するベクトル命令
VRXOR
-
void __builtin_ve_vfsum(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src [0] + src [1] + ... + src [ vl - 1]
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[0] = dest[0] + src[i]; } }
対応するベクトル命令
VFSUM
-
void __builtin_ve_vfrmax(vector dest, vector src, _position pos[
, __vm mask
][, int vl
]);¶
説明
dest [0] = fmax ( src [0], src [1], ....., src [ vl -1])
pos = _FIRSTのとき、dest [4]=最大値が最初に現れた要素番号
pos = _LASTのとき、dest [4]=最大値が最後に現れた要素番号
_FIRST、_LASTの値は、ヘッダ<_vector.h>で定義されている。
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { dest[0] = fmax ( dest[0], src[i] ); } if (pos == _FIRST) { dest[4] = 最大値が最初に現れる要素番号; } else { dest[4] = 最大値が最後に現れる要素番号; }
対応するベクトル命令
VFMAX
-
void __builtin_ve_vfrmin(vector dest, vector src, _position pos[
, __vm mask
][, int vl
]);¶
説明
dest [0] = fmin ( src [0], src [1], ....., src [ vl -1])
pos = _FIRSTのとき、dest [4]=最小値が最初に現れた要素番号
pos = _LASTのとき、dest [4]=最小値が最後に現れた要素番号
_FIRST、_LASTの値は、ヘッダ<_vector.h>で定義されている。
処理詳細
dest[0] = src[0]; for (int i = 1; i < vl; i++) { dest[0] = fmin ( dest[0], src[i] ); } if (pos == _FIRST) { dest[4] = 最小値が最初に現れる要素番号; } else { dest[4] = 最小値が最後に現れる要素番号; }
対応するベクトル命令
VFMAX
ベクトル漸化式演算¶
-
void __builtin_ve_vfia(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src2dest [i] = src1 [i] + dest [i-1] (i = 1, ..., vl - 1)
処理詳細
dest[0] = src2; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] + dest[i-1]; } }
対応するベクトル命令
VFIA
-
void __builtin_ve_vfis(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src2dest [i] = src1 [i] - dest [i-1] (i = 1, ..., vl - 1 )
処理詳細
dest[0] = src2; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] - dest[i-1]; } }
対応するベクトル命令
VFIS
-
void __builtin_ve_vfim(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src2dest [i] = src1 [i] * dest [i-1] (i = 1, ..., vl - 1 )
処理詳細
dest[0] = src2; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] * dest[i-1]; } }
対応するベクトル命令
VFIM
-
void __builtin_ve_vfiam(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src3dest [i] = ( src1 [i] + dest [i-1] ) * src2 [i] (i = 1, ..., vl - 1 )
処理詳細
dest[0] = src2; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] + dest[i-1] ) * src2[i]; } }
対応するベクトル命令
VFIAM
-
void __builtin_ve_vfism(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src3dest [i] = ( src1 [i] - dest [i-1] ) * src2 [i] (i = 1, ..., vl - 1 )
処理詳細
dest[0] = src2; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[i] = ( src1[i] - dest[i-1] ) * src2[i]; } }
対応するベクトル命令
VFISM
-
void __builtin_ve_vfima(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src3dest [i] = src1 [i] + ( dest [i-1] * src2 [i] ) (i = 1, ..., vl - 1 )
処理詳細
dest[0] = src2; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] + ( dest[i-1] * src2[i] ); } }
対応するベクトル命令
VFIMA
-
void __builtin_ve_vfims(vector dest, vector src1, vector src2, scalar src3[
, __vm mask
][, int vl
]);¶
説明
dest [0] = src3dest [i] = src1 [i] - ( dest [i-1] * src2 [i] ) (i = 1, ..., vl - 1 )
処理詳細
dest[0] = src2; for (int i = 1; i < vl; i++) { if (mask[i]) { dest[i] = src1[i] - ( dest[i-1] * src2[i] ); } }
対応するベクトル命令
VFIMS
ベクトルマージ演算¶
-
void __builtin_ve_vmrg(vector dest, vector src1, vector src2[
, __vm mask
][, int vl
]);¶ -
void __builtin_ve_vmrg(vector dest, vector src1, scalar src2[
, __vm mask
][, int vl
]);
説明
dest = mask ? src1 : src2
処理詳細
for (int i = 0; i < vl; i++) { dest[i] = mask[i] ? src1[i] + src2[i]; }for (int i = 0; i < vl; i++) { dest[i] = mask[i] ? src1[i] + src2; }
対応するベクトル命令
VMRG
-
void __builtin_ve_vcp(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = vector-compress ( src , mask )
処理詳細
for (int i = 0, j = 0; i < vl; i++) { if (mask[i]) { dest[j] = src[i]; j++; } }
対応するベクトル命令
VCP
-
void __builtin_ve_vex(vector dest, vector src[
, __vm mask
][, int vl
]);¶
説明
dest = vector-expand ( src , mask )
処理詳細
for (int i = 0, j = 0; i < vl; i++) { if (mask[i]) { dest[i] = src[j]; j++; } }
対応するベクトル命令
VEX
ベクトルマスク演算¶
-
void __builtin_ve_vfmk(__vm dest, vector src, _compare comp[
, __vm mask
][, int vl
]);¶
説明
mask = (condition-of-( src )-is-comp) ? 1 : 0
処理詳細
for (int i = 0; i < vl; i++) { mask[i] = (src[i] == comp) ? 1: 0; }
対応するベクトル命令
VFMK
-
void __builtin_ve_andm(__vm dest, __vm src1, __vm src2);¶
説明
dest = src1 & src2
処理詳細
for (int i = 0; i < vl; i++) { dest[i] = src1[i] & src2[i]; }
対応するベクトル命令
ANDM
-
void __builtin_ve_orm(__vm dest, __vm src1, __vm src2);¶
説明
dest = src1 | src2
処理詳細
for (int i = 0; i < vl; i++) { dest[i] = src1[i] | src2[i]; }
対応するベクトル命令
ORM
-
void __builtin_ve_xorm(__vm dest, __vm src1, __vm src2);¶
説明
dest = src1 ^ src2
処理詳細
for (int i = 0; i < vl; i++) { dest[i] = src1[i] ^ src2[i]; }
対応するベクトル命令
XORM
-
void __builtin_ve_eqvm(__vm dest, __vm src1, __vm src2);¶
説明
dest = ~( src1 ^ src2 )
処理詳細
for (int i = 0; i < vl; i++) { dest[i] = ~( src1[i] ^ src2[i] ); }
対応するベクトル命令
EQVM
-
void __builtin_ve_nndm(__vm dest, __vm src1, __vm src2);¶
説明
dest = (~ src1 ) & src2
処理詳細
for (int i = 0; i < vl; i++) { dest[i] = ~( src1[i] ) & src2[i]; }
対応するベクトル命令
NNDM
-
void __builtin_ve_negm(__vm dest, __vm src);¶
説明
dest = ~ src
処理詳細
for (int i = 0; i < vl; i++) { dest[i] = ~src[i]; }
対応するベクトル命令
NEGM
-
int __builtin_ve_lzvm(__vm src[
, int vl
]);¶
説明
src のleading zeroの個数 (=最初に1の現れる位置) を返却する。
処理詳細
for (int i = 0; i < vl; i++) { if (mask[i]) { return i; *dest = i; } }
対応するベクトル命令
LZVM
-
int __builtin_ve_pcvm(__vm src[
, int vl
]);¶
説明
src のpopulation count (=値1のビットの個数) を返却する。
処理詳細
dest = 0; for (int i = 0; i < vl; i++) { if (mask[i]) { dest++; } } return dest;
対応するベクトル命令
PCVM
-
int __builtin_ve_tovm(__vm src[
, int vl
]);¶
説明
src で最後に値1の現れるビット位置を返却する。
処理詳細
for (int i = vl - 1; i >= 0; i--) { if (mask[i]) { return return i; } }
対応するベクトル命令
TOVM
最大ベクトル長取得¶
-
int __builtin_ve_get_maxvl(void);¶
説明
最大ベクトル長を返却する。
対応するベクトル命令
SMVL