加算演算子と減算演算子は、右辺の各オペランドの符号が揃っていない場合は、共通の親クラスのうち最も近い親クラスを返します。使用例と例外をいくつか次のコードに示します。
/* Return nearest common ancestor type, I16vec4 */
Is16vec4 A;
Iu16vec4 B;
I16vec4 C;
C = A + B;
/* Returns type left-hand operand type */
Is16vec4 A;
Iu16vec4 B;
A += B;
B -= A;
/* Explicitly convert B to Is16vec4 */
Is16vec4 A, C;
Iu32vec24 B;
C = A + C;
C = A + (Is16vec4)B;
操作 | 記号 | 構文 | 対応する組込み関数 |
---|---|---|---|
加算 |
+ |
R = A +
B |
_mm_add_epi64 _mm_add_epi32 _mm_add_epi16 _mm_add_epi8 _mm_add_pi32 _mm_add_pi16 _mm_add_pi8 |
減算 |
- |
R = A -
B |
_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; |