次の表は、Fvecクラスの算術演算子と一般的な構文を列挙したものです。この算術演算子はそれぞれ「標準演算」と「高度な演算」に分かれています。 この2つについては本節の後半で詳しく解説します。
分類 | 操作 | 演算子 | 一般的な構文 |
---|---|---|---|
標準 |
加算 |
+ |
R = A +
B; |
減算 |
- |
R = A -
B; | |
乗算 |
* |
R = A *
B; | |
除算 |
/ |
R = A / B; R /= A; | |
高度な演算 |
平方根 |
sqrt |
R = sqrt(A); |
逆数 |
rcp |
R = rcp(A); | |
平方根の逆数 |
rsqrt |
R = rsqrt(A); |
次の2つの表は、標準算術演算子のクラスごとに戻り値を列挙したものです。 「戻り値の表記法」節の前半に述べた構文が使われます。
R | A | 演算子 | B | F32vec4 | F64vec2 | F32vec1 | |||
---|---|---|---|---|---|---|---|---|---|
R0:= |
A0 |
+ |
- |
* |
/ |
B0 |
|
|
|
R1:= |
A1 |
+ |
- |
* |
/ |
B1 |
|
|
非対応 |
R2:= |
A2 |
+ |
- |
* |
/ |
B2 |
|
非対応 |
非対応 |
R3:= |
A3 |
+ |
- |
* |
/ |
B3 |
|
非対応 |
非対応 |
R | 演算子 | A | F32vec4 | F64vec2 | F32vec1 | |||
---|---|---|---|---|---|---|---|---|
R0:= |
+= |
-= |
*= |
/= |
A0 |
|
|
|
R1:= |
+= |
-= |
*= |
/= |
A1 |
|
|
非対応 |
R2:= |
+= |
-= |
*= |
/= |
A2 |
|
非対応 |
非対応 |
R3:= |
+= |
-= |
*= |
/= |
A3 |
|
非対応 |
非対応 |
次の表は、標準算術演算子の構文と組込み関数を列挙したものです。
操作 | 戻り値 | 構文の使用例 | 組込み関数 |
---|---|---|---|
加算 |
floatが4個 |
F32vec4 R = F32vec4 A + F32vec4 B; F32vec4 R += F32vec4 A; |
_mm_add_ps |
|
doubleが2個 |
F64vec2 R = F64vec2 A + F32vec2 B; F64vec2 R += F64vec2 A; |
_mm_add_pd |
|
floatが1個 |
F32vec1 R = F32vec1 A + F32vec1 B; F32vec1 R += F32vec1 A; |
_mm_add_ss |
減算 |
floatが4個 |
F32vec4 R = F32vec4 A - F32vec4 B; F32vec4 R -= F32vec4 A; |
_mm_sub_ps |
|
doubleが2個 |
F64vec2 R - F64vec2 A + F32vec2 B; F64vec2 R -= F64vec2 A; |
_mm_sub_pd |
|
floatが1個 |
F32vec1
R = F32vec1 A - F32vec1 B; |
_mm_sub_ss |
乗算 |
floatが4個 |
F32vec4
R = F32vec4 A * F32vec4 B; |
_mm_mul_ps |
|
doubleが2個 |
F64vec2
R = F64vec2 A * F364vec2 B; |
_mm_mul_pd |
|
floatが1個 |
F32vec1
R = F32vec1 A * F32vec1 B; |
_mm_mul_ss |
除算 |
floatが4個 |
F32vec4
R = F32vec4 A / F32vec4 B; |
_mm_div_ps |
|
doubleが2個 |
F64vec2
R = F64vec2 A / F64vec2 B; |
_mm_div_pd |
|
floatが1個 |
F32vec1
R = F32vec1 A / F32vec1 B; |
_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 |
|
|
非対応 |
R2:= |
sqrt |
rcp |
rsqrt |
rcp_nr |
rsqrt_nr |
A2 |
|
非対応 |
非対応 |
R3:= |
sqrt |
rcp |
rsqrt |
rcp_nr |
rsqrt_nr |
A3 |
|
非対応 |
非対応 |
f := |
add_horizontal |
(A0 + A1 + A2 + A3) |
|
非対応 |
非対応 | ||||
d := |
add_horizontal |
(A0 + A1) |
非対応 |
|
非対応 |
次の表に、高度な算術演算子の例をいくつか示します。
戻り値 | 構文の使用例 | 組込み関数 |
---|---|---|
平方根 | ||
floatが4個 |
F32vec4 R = sqrt(F32vec4 A); |
_mm_sqrt_ps |
doubleが2個 |
F64vec2 R = sqrt(F64vec2 A); |
_mm_sqrt_pd |
floatが1個 |
F32vec1 R = sqrt(F32vec1 A); |
_mm_sqrt_ss |
逆数 | ||
floatが4個 |
F32vec4 R = rcp(F32vec4 A); |
_mm_rcp_ps |
doubleが2個 |
F64vec2 R = rcp(F64vec2 A); |
_mm_rcp_pd |
floatが1個 |
F32vec1 R = rcp(F32vec1 A); |
_mm_rcp_ss |
平方根の逆数 | ||
floatが4個 |
F32vec4 R = rsqrt(F32vec4 A); |
_mm_rsqrt_ps |
doubleが2個 |
F64vec2 R = rsqrt(F64vec2 A); |
_mm_rsqrt_pd |
floatが1個 |
F32vec1 R = rsqrt(F32vec1 A); |
_mm_rsqrt_ss |
逆数(ニュートン・ラフソン法) | ||
floatが4個 |
F32vec4 R = rcp_nr(F32vec4 A); |
_mm_sub_ps |
doubleが2個 |
F64vec2 R = rcp_nr(F64vec2 A); |
_mm_sub_pd |
floatが1個 |
F32vec1 R = rcp_nr(F32vec1 A); |
_mm_sub_ss |
平方根の逆数(ニュートン・ラフソン法) | ||
floatが4個 |
F32vec4 R = rsqrt_nr(F32vec4 A); |
_mm_sub_pd |
doubleが2個 |
F64vec2 R = rsqrt_nr(F64vec2 A); |
_mm_sub_pd |
floatが1個 |
F32vec1 R = rsqrt_nr(F32vec1 A); |
_mm_sub_ss |
水平加算 | ||
floatが1個 |
float f = add_horizontal(F32vec4 A); |
_mm_add_ss |
doubleが1個 |
double d = add_horizontal(F64vec2 A); |
_mm_add_sd _mm_shuffle_sd |