インテル® C++ コンパイラー 18.0 デベロッパー・ガイドおよびリファレンス
ここでは、さまざまな SIMD 演算を実行する演算子、これらの演算子を実行する対応組込み関数、そして、これらの演算子を実装するクラスを列挙した表を示します。ここにリストされているクラスは、SIMD 演算用のインテル® C++ クラス・ライブラリーに属しています。
次の表では、
N/A は、演算子が特定のクラスには実装されないことを示します。例えば、論理演算子の表では Andnot 演算子は、F32vec4 クラスや F32vec1 クラスには実装されません。
クラス列以下の N/A 以外の項目は、当該演算子が特定のクラスに実装されることを表し、対応する組込み関数のサフィックスを示します。例えば、算術演算 (1) の表では、対応する組込み関数が _mm_add_[x] で、項目 epi16 は I16vec8 列にあります。つまり、これは I16vec8 クラスは加算演算子を実装し、対応する組込み関数は _mm_add_epi16 であるということを意味します。
論理演算子:
演算子 |
対応する組込み関数 |
クラス |
||||
---|---|---|---|---|---|---|
I128vec1, |
I64vec1, |
F64vec2 |
F32vec4 |
F32vec1 |
||
&、&= |
_mm_and_[x] |
si128 |
si64 |
pd |
ps |
ps |
|、|= |
_mm_or_[x] |
si128 |
si64 |
pd |
ps |
ps |
^、^= |
_mm_xor_[x] |
si128 |
si64 |
pd |
ps |
ps |
Andnot |
_mm_andnot_[x] |
si128 |
si64 |
pd |
N/A |
N/A |
算術演算: (1)
演算子 |
対応する組込み関数 |
クラス |
|||
---|---|---|---|---|---|
I64vec2 |
I32vec4 |
I16vec8 |
I8vec16 |
||
+、+= |
_mm_add_[x] |
epi64 |
epi32 |
epi16 |
epi8 |
-、-= |
_mm_sub_[x] |
epi64 |
epi32 |
epi16 |
epi8 |
*、*= |
_mm_mullo_[x] |
N/A |
N/A |
epi16 |
N/A |
/、/= |
_mm_div_[x] |
N/A |
N/A |
N/A |
N/A |
mul_high |
_mm_mulhi_[x] |
N/A |
N/A |
epi16 |
N/A |
mul_add |
_mm_madd_[x] |
N/A |
N/A |
epi16 |
N/A |
sqrt |
_mm_sqrt_[x] |
N/A |
N/A |
N/A |
N/A |
rcp |
_mm_rcp_[x] |
N/A |
N/A |
N/A |
N/A |
rcp_nr |
_mm_rcp_[x] |
N/A |
N/A |
N/A |
N/A |
rsqrt |
_mm_rsqrt_[x] |
N/A |
N/A |
N/A |
N/A |
rsqrt_nr |
_mm_rsqrt_[x] |
N/A |
N/A |
N/A |
N/A |
算術演算: (2)
演算子 |
対応する組込み関数 |
クラス |
|||||
---|---|---|---|---|---|---|---|
I32vec2 |
I16vec4 |
I8vec8 |
F64vec2 |
F32vec4 |
F32vec1 |
||
+、+= |
_mm_add_[x] |
pi32 |
pi16 |
pi8 |
pd |
ps |
ss |
-、-= |
_mm_sub_[x] |
pi32 |
pi16 |
pi8 |
pd |
ps |
ss |
*、*= |
_mm_mullo_[x] |
N/A |
pi16 |
N/A |
pd |
ps |
ss |
/、/= |
_mm_div_[x] |
N/A |
N/A |
N/A |
pd |
ps |
ss |
mul_high |
_mm_mulhi_[x] |
N/A |
pi16 |
N/A |
N/A |
N/A |
N/A |
mul_add |
_mm_madd_[x] |
N/A |
pi16 |
N/A |
N/A |
N/A |
N/A |
sqrt |
_mm_sqrt_[x] |
N/A |
N/A |
N/A |
pd |
ps |
ss |
rcp |
_mm_rcp_[x] |
N/A |
N/A |
N/A |
pd |
ps |
ss |
rcp_nr |
_mm_rcp_[x] |
N/A |
N/A |
N/A |
pd |
ps |
ss |
rsqrt |
_mm_rsqrt_[x] |
N/A |
N/A |
N/A |
pd |
ps |
ss |
rsqrt_nr |
_mm_rsqrt_[x] |
N/A |
N/A |
N/A |
pd |
ps |
ss |
シフト演算: (1)
演算子 |
対応する組込み関数 |
クラス |
||||
---|---|---|---|---|---|---|
I128vec1 |
I64vec2 |
I32vec4 |
I16vec8 |
I8vec16 |
||
>>、>>= |
_mm_srl_[x] |
N/A |
epi64 |
epi32 |
epi16 |
N/A |
<<、<<= |
_mm_sll_[x] |
N/A |
epi64 |
epi32 |
epi16 |
N/A |
シフト演算: (2)
演算子 |
対応する組込み関数 |
クラス |
|||
---|---|---|---|---|---|
I64vec1 |
I32vec2 |
I16vec4 |
I8vec8 |
||
>>、>>= |
_mm_srl_[x] |
si64 |
pi32 |
pi16 |
N/A |
<<、<<= |
_mm_sll_[x] |
si64 |
pi32 |
pi16 |
N/A |
比較演算: (1)
演算子 |
対応する組込み関数 |
クラス |
|||||
---|---|---|---|---|---|---|---|
I32vec4 |
I16vec8 |
I8vec16 |
I32vec2 |
I16vec4 |
I8vec8 |
||
cmpeq |
_mm_cmpeq_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
cmpneq |
_mm_cmpeq_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
cmpgt |
_mm_cmpgt_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
cmpge |
_mm_cmpge_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
cmplt |
_mm_cmplt_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
cmple |
_mm_cmple_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
cmpngt |
_mm_cmpngt_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
cmpnge |
_mm_cmpnge_[x] |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
cmpnlt |
_mm_cmpnlt_[x] |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
cmpnle |
_mm_cmpnle_[x] |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
* 組込み関数 _mm_andnot_[y] は fvec クラスには適用されない点に注意してください。
比較演算: (2)
演算子 |
対応する組込み関数 |
クラス |
||
---|---|---|---|---|
F64vec2 |
F32vec4 |
F32vec1 |
||
cmpeq |
_mm_cmpeq_[x] |
pd |
ps |
ss |
cmpneq |
_mm_cmpeq_[x] |
pd |
ps |
ss |
cmpgt |
_mm_cmpgt_[x] |
pd |
ps |
ss |
cmpge |
_mm_cmpge_[x] |
pd |
ps |
ss |
cmplt |
_mm_cmplt_[x] |
pd |
ps |
ss |
cmple |
_mm_cmple_[x] |
pd |
ps |
ss |
cmpngt |
_mm_cmpngt_[x] |
pd |
ps |
ss |
cmpnge |
_mm_cmpnge_[x] |
pd |
ps |
ss |
cmpnlt |
_mm_cmpnlt_[x] |
pd |
ps |
ss |
cmpnle |
_mm_cmpnle_[x] |
pd |
ps |
ss |
* 組込み関数 _mm_andnot_[y] は fvec クラスには適用されない点に注意してください。
条件付き選択演算: (1)
演算子 |
対応する組込み関数 |
クラス |
|||||
---|---|---|---|---|---|---|---|
I32vec4 |
I16vec8 |
I8vec16 |
I32vec2 |
I16vec4 |
I8vec8 |
||
select_eq |
_mm_cmpeq_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
select_neq |
_mm_cmpeq_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
select_gt |
_mm_cmpgt_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
select_ge |
_mm_cmpge_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
select_lt |
_mm_cmplt_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
select_le |
_mm_cmple_[x] |
epi32 |
epi16 |
epi8 |
pi32 |
pi16 |
pi8 |
select_ngt |
_mm_cmpgt_[x] |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
select_nge |
_mm_cmpge_[x] |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
select_nlt |
_mm_cmplt_[x] |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
select_nle |
_mm_cmple_[x] |
N/A |
N/A |
N/A |
N/A |
N/A |
N/A |
* 組込み関数 _mm_andnot_[y] は fvec クラスには適用されない点に注意してください。
条件付き選択演算: (2)
演算子 |
対応する組込み関数 |
クラス |
||
---|---|---|---|---|
F64vec2 |
F32vec4 |
F32vec1 |
||
select_eq |
_mm_cmpeq_[x] |
pd |
ps |
ss |
select_neq |
_mm_cmpeq_[x] |
pd |
ps |
ss |
select_gt |
_mm_cmpgt_[x] |
pd |
ps |
ss |
select_ge |
_mm_cmpge_[x] |
pd |
ps |
ss |
select_lt |
_mm_cmplt_[x] |
pd |
ps |
ss |
select_le |
_mm_cmple_[x] |
pd |
ps |
ss |
select_ngt |
_mm_cmpgt_[x] |
pd |
ps |
ss |
select_nge |
_mm_cmpge_[x] |
pd |
ps |
ss |
select_nlt |
_mm_cmplt_[x] |
pd |
ps |
ss |
select_nle |
_mm_cmple_[x] |
pd |
ps |
ss |
* 組込み関数 _mm_andnot_[y] は fvec クラスには適用されない点に注意してください。
パック演算とアンパック演算: (1)
演算子 |
対応する組込み関数 |
クラス |
||||
---|---|---|---|---|---|---|
I64vec2 |
I32vec4 |
I16vec8 |
I8vec16 |
I32vec2 |
||
unpack_high |
_mm_unpackhi_[x] |
epi64 |
epi32 |
epi16 |
epi8 |
pi32 |
unpack_low |
_mm_unpacklo_[x] |
epi64 |
epi32 |
epi16 |
epi8 |
pi32 |
pack_sat |
_mm_packs_[x] |
N/A |
epi32 |
epi16 |
N/A |
pi32 |
packu_sat |
_mm_packus_[x] |
N/A |
N/A |
epi16 |
N/A |
N/A |
sat_add |
_mm_adds_[x] |
N/A |
N/A |
epi16 |
epi8 |
N/A |
sat_sub |
_mm_subs_[x] |
N/A |
N/A |
epi16 |
epi8 |
N/A |
パック演算とアンパック演算: (2)
演算子 |
対応する組込み関数 |
クラス |
||||
---|---|---|---|---|---|---|
I16vec4 |
I8vec8 |
F64vec2 |
F32vec4 |
F32vec1 |
||
unpack_high |
_mm_unpackhi_[x] |
pi16 |
pi8 |
pd |
ps |
N/A |
unpack_low |
_mm_unpacklo_[x] |
pi16 |
pi8 |
pd |
ps |
N/A |
pack_sat |
_mm_packs_[x] |
pi16 |
N/A |
N/A |
N/A |
N/A |
packu_sat |
_mm_packus_[x] |
pu16 |
N/A |
N/A |
N/A |
N/A |
sat_add |
_mm_adds_[x] |
pi16 |
pi8 |
pd |
ps |
ss |
sat_sub |
_mm_subs_[x] |
pi16 |
pi8 |
pi16 |
pi8 |
pd |
変換演算:
変換演算は、組込み関数のみを使用して実行できます。これらの組込み関数に対応する実装クラスはありません。
演算子 |
対応する組込み関数 |
---|---|
F64vec2ToInt |
_mm_cvttsd_si32 |
F32vec4ToF64vec2 |
_mm_cvtps_pd |
F64vec2ToF32vec4 |
_mm_cvtpd_ps |
IntToF64vec2 |
_mm_cvtsi32_sd |
F32vec4ToInt |
_mm_cvtt_ss2si |
F32vec4ToIs32vec2 |
_mm_cvttps_pi32 |
IntToF32vec4 |
_mm_cvtsi32_ss |
Is32vec2ToF32vec4 |
_mm_cvtpi32_ps |