次の表は、Fvec クラスの算術演算子と一般的な構文を列挙したものです。この算術演算子はそれぞれ「標準演算」と「高度な演算」に分かれています。この 2 つについてはこのセクションの後半で詳しく解説します。
カテゴリー | 操作 | 演算子 | 一般的な構文 |
---|---|---|---|
標準演算 | 加算 | + += |
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 |
次の表は、標準算術演算子の構文と組み込み関数を列挙したものです。
操作 | 戻り値 | 構文の使用例 | 組み込み関数 |
---|---|---|---|
加算 | 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 |
次の表に、高度な算術演算子の例をいくつか示します。
戻り値 | 構文の使用例 | 組み込み関数 |
---|---|---|
平方根 | ||
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 |