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 の値をベクトル型 destN 番目の要素に代入する。

処理詳細

dest[N] = src;

対応するベクトル命令

  • LSV


scalar __builtin_ve_lvs(vector src, int N);

説明

ベクトル型 srcN 番目の要素を返却する。

処理詳細

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 = src1src2 の比較結果

比較結果の値は以下である。

  • 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 = src1src2 の比較結果

比較結果の値は以下である。

  • 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] = src2
dest [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] = src2
dest [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] = src2
dest [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] = src3
dest [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] = src3
dest [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] = src3
dest [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] = src3
dest [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