算術演算子

次の表は、Fvec クラスの算術演算子と一般的な構文を列挙したものです。この算術演算子はそれぞれ「標準演算」と「高度な演算」に分かれています。この 2 つについてはこのセクションの後半で詳しく解説します。

Fvec 算術演算子

カテゴリー 操作 演算子 一般的な構文
標準演算 加算 +
+=
R = A + B;
R += A;
  減算 -
-=
R = A - B;
R -= A;
  乗算 *
*=
R = A * B;
R *= A;
  除算 /
/=
R = A / B;
R /= A;
高度な演算 平方根 sqrt R = sqrt(A);
  逆数
(ニュートンラフソン法)
rcp
rcp_nr
R = rcp(A);
R = rcp_nr(A);
  平方根の逆数
(ニュートンラフソン法)
rsqrt
rsqrt_nr
R = rsqrt(A);
R = rsqrt_nr(A);

「標準算術演算子」の使用方法

次の 2 つの表は、標準算術演算子のクラスごとに戻り値を列挙したものです。「戻り値の表記法」の前半に述べた構文が使われます。

標準算術演算の戻り値の対応表

R A 演算子 B F32vec4 F64vec2 F32vec1
R0:= A0 + - * / B0      
R1:= A1 + - * / B1     N/A
R2:= A2 + - * / B2   N/A N/A
R3:= A3 + - * / B3   N/A N/A

代入付き算術演算の戻り値の対応表

R 演算子 A F32vec4 F64vec2 F32vec1
R0:= += -= *= /= A0      
R1:= += -= *= /= A1     N/A
R2:= += -= *= /= A2   N/A N/A
R3:= += -= *= /= A3   N/A N/A

次の表は、標準算術演算子の構文と組み込み関数を列挙したものです。

Fvec クラスの標準算術演算

操作 戻り値 構文の使用例 組み込み関数
加算 4 float F32vec4 R = F32vec4 A + F32vec4 B;
F32vec4 R += F32vec4 A;
_mm_add_ps
  2 double F64vec2 R = F64vec2 A + F32vec2 B;
F64vec2 R += F64vec2 A;
_mm_add_pd
  1 float F32vec1 R = F32vec1 A + F32vec1 B;
F32vec1 R += F32vec1 A;
_mm_add_ss
減算 4 float F32vec4 R = F32vec4 A - F32vec4 B;
F32vec4 R -= F32vec4 A;
_mm_sub_ps
  2 double F64vec2 R - F64vec2 A + F32vec2 B;
F64vec2 R -= F64vec2 A;
_mm_sub_pd
  1 float F32vec1 R = F32vec1 A - F32vec1 B;
F32vec1 R -= F32vec1 A;
_mm_sub_ss
乗算 4 float F32vec4 R = F32vec4 A * F32vec4 B;
F32vec4 R *= F32vec4 A;
_mm_mul_ps
  2 double F64vec2 R = F64vec2 A * F364vec2 B;
F64vec2 R *= F64vec2 A;
_mm_mul_pd
  1 float F32vec1 R = F32vec1 A * F32vec1 B;
F32vec1 R *= F32vec1 A;
_mm_mul_ss
除算 4 float F32vec4 R = F32vec4 A / F32vec4 B;
F32vec4 R /= F32vec4 A;
_mm_div_ps
  2 double F64vec2 R = F64vec2 A / F64vec2 B;
F64vec2 R /= F64vec2 A;
_mm_div_pd
  1 float F32vec1 R = F32vec1 A / F32vec1 B;
F32vec1 R /= F32vec1 A;
_mm_div_ss

「高度な算術演算子」の使用方法

次の表は、高度な算術演算子のクラスごとに戻り値を列挙したものです。「戻り値の表記法」の前半に述べた構文が使われます。

高度な算術演算子の戻り値の対応表

R 演算子 A F32vec4 F64vec2 F32vec1
R0:= sqrt rcp rsqrt rcp_nr rsqrt_nr A0      
R1:= sqrt rcp rsqrt rcp_nr rsqrt_nr A1     N/A
R2:= sqrt rcp rsqrt rcp_nr rsqrt_nr A2   N/A N/A
R3:= sqrt rcp rsqrt rcp_nr rsqrt_nr A3   N/A N/A
f := add_horizontal

 

 

(A0 + A1 + A2 + A3)       N/A N/A
d := add_horizontal

 

 

(A0 + A1)     N/A   N/A

次の表に、高度な算術演算子の例をいくつか示します。

Fvec クラス用の高度な算術演算

戻り値 構文の使用例 組み込み関数
平方根
4 float F32vec4 R = sqrt(F32vec4 A); _mm_sqrt_ps
2 double F64vec2 R = sqrt(F64vec2 A); _mm_sqrt_pd
1 float F32vec1 R = sqrt(F32vec1 A); _mm_sqrt_ss
逆数
4 float F32vec4 R = rcp(F32vec4 A); _mm_rcp_ps
2 double F64vec2 R = rcp(F64vec2 A); _mm_rcp_pd
1 float F32vec1 R = rcp(F32vec1 A); _mm_rcp_ss
平方根の逆数
4 float F32vec4 R = rsqrt(F32vec4 A); _mm_rsqrt_ps
2 double F64vec2 R = rsqrt(F64vec2 A); _mm_rsqrt_pd
1 float F32vec1 R = rsqrt(F32vec1 A); _mm_rsqrt_ss
逆数 (ニュートンラフソン法)
4 float F32vec4 R = rcp_nr(F32vec4 A); _mm_sub_ps
_mm_add_ps
_mm_mul_ps
_mm_rcp_ps
2 double F64vec2 R = rcp_nr(F64vec2 A); _mm_sub_pd
_mm_add_pd
_mm_mul_pd
_mm_rcp_pd
1 float F32vec1 R = rcp_nr(F32vec1 A); _mm_sub_ss
_mm_add_ss
_mm_mul_ss
_mm_rcp_ss
平方根の逆数 (ニュートンラフソン法)
4 float F32vec4 R = rsqrt_nr(F32vec4 A); _mm_sub_pd
_mm_mul_pd
_mm_rsqrt_ps
2 double F64vec2 R = rsqrt_nr(F64vec2 A); _mm_sub_pd
_mm_mul_pd
_mm_rsqrt_pd
1 float F32vec1 R = rsqrt_nr(F32vec1 A); _mm_sub_ss
_mm_mul_ss
_mm_rsqrt_ss
水平加算
1 float float f = add_horizontal(F32vec4 A); _mm_add_ss
_mm_shuffle_ss
1 double double d = add_horizontal(F64vec2 A); _mm_add_sd
_mm_shuffle_sd