加算演算子と減算演算子

加算演算子と減算演算子は、右辺の各オペランドの符号が揃っていない場合は、共通の親クラスのうち最も近い親クラスを返します。使用方法の例と例外をいくつか次のコードに示します。

加算演算子および減算演算子の構文の使用例

共通の親データ型のうち最も近いデータ型 (I16vec4) を返します。

Is16vec4 A;

Iu16vec4 B;

I16vec4 C;

C = A + B;

左辺のオペランドのデータ型を返します。

Is16vec4 A;

Iu16vec4 B;

A += B;

B -= A;

明示的に B を Is16vec4 に変換します。

Is16vec4 A,C;

Iu32vec24 B;

C = A + C;

C = A + (Is16vec4)B;

加算演算子、減算演算子、およびそれらに対応する組み込み関数

操作 記号 構文 対応する組み込み関数
加算 +
+=
R = A + B
R += A
_mm_add_epi64
_mm_add_epi32
_mm_add_epi16
_mm_add_epi8
_mm_add_pi32
_mm_add_pi16
_mm_add_pi8
減算 -
-=
R = A - B
R -= A
_mm_sub_epi64
_mm_sub_epi32
_mm_sub_epi16
_mm_sub_epi8
_mm_sub_pi32
_mm_sub_pi16
_mm_sub_pi8

次の表は、右辺の各オペランドの符号が異なっている場合に、クラスを複数組み合わせたときの、加算と減算の戻り値を列挙したものです。この 2 つのオペランドは同じサイズでなければなりません。サイズが異なる場合は、型キャストを明示的に示す必要があります。

加算演算子と減算演算子の多重定義

戻り値 使用できる演算子 右辺のオペランド
R 加算 減算

A

B
I64vec2 R + - I[s|u]64vec2 A I[s|u]64vec2 B
I32vec4 R + - I[s|u]32vec4 A I[s|u]32vec4 B
I32vec2 R + - I[s|u]32vec2 A I[s|u]32vec2 B
I16vec8 R + - I[s|u]16vec8 A I[s|u]16vec8 B
I16vec4 R + - I[s|u]16vec4 A I[s|u]16vec4 B
I8vec8 R + - I[s|u]8vec8 A I[s|u]8vec8 B
I8vec16 R + - I[s|u]8vec2 A I[s|u]8vec16 B

次の表は、代入付きの加算演算子と減算演算子の各種オペランドについて、戻り値のデータ型を列挙したものです。戻り値のサイズと符号の有無は、左辺のオペランドによって決まります。右辺のオペランドは左辺のオペランドと同じサイズでなければなりません。サイズが異なる場合は、明示的な型キャストを行う必要があります。

代入付きの加算演算子と減算演算子

戻り値 (R) 左辺 (R) 加算 減算 右辺 (A)
I[x]32vec4 I[x]32vec2 R += -= I[s|u]32vec4 A;
I[x]32vec2 R I[x]32vec2 R += -= I[s|u]32vec2 A;
I[x]16vec8 I[x]16vec8 += -= I[s|u]16vec8 A;
I[x]16vec4 I[x]16vec4 += -= I[s|u]16vec4 A;
I[x]8vec16 I[x]8vec16 += -= I[s|u]8vec16 A;
I[x]8vec8 I[x]8vec8 += -= I[s|u]8vec8 A;