_mm_com_epi64
更新 : 2011 年 3 月
Visual Studio 2010 SP1 が必要です。
Microsoft 固有の仕様 →
XOP 命令 vpcomq を生成して、3 つ目のソースで指定された条件に基づいて 1 つ目と 2 つ目のソースのクワドワード間の符号付き比較を実行することによって生成されるビットマスクを返します。
__m128i _mm_com_epi64 (
__m128i src1,
__m128i src2,
int condition
);
パラメーター
[入力] src1
2 個の 64 ビット符号付き整数で構成される、パックされた 128 ビット配列。[入力] src2
2 個の 64 ビット符号付き整数で構成される、パックされた 128 ビット配列。[入力] condition
比較で使用される 32 ビット整数の条件。 有効な値は 0 から 7 です。
戻り値
2 個の 64 ビット符号なし整数 (それぞれ 0x0000000000000000 または 0xFFFFFFFFFFFFFFFF) で構成される、パックされた 128 ビット配列 r。 cond が condition の値で暗示された論理演算子である場合は、次のようになります。
r[i] := src1[i] cond src2[i] ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000;
必要条件
組み込み |
アーキテクチャ |
---|---|
_mm_com_epi64 |
XOP |
ヘッダー ファイル <intrin.h>
解説
この命令では、condition で記述された比較演算子を使用して、src1 の各クワドワードと src2 の対応するクワドワードを比較します (クワドワードの各ペアでは、同じ比較演算子が使用されます)。 condition の有効な値は 0 から 7 です。 <intrin.h> を含めることによって、condition に数値ではなく次の名前を使用できるようになります。
整数値 |
シンボル名 |
説明 |
---|---|---|
0 |
_MM_PCOMCTRL_LT |
r[i] = (src1[i] < src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000 |
1 |
_MM_PCOMCTRL_LE |
r[i] = (src1[i] <= src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000 |
2 |
_MM_PCOMCTRL_GT |
r[i] = (src1[i] > src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000 |
3 |
_MM_PCOMCTRL_GE |
r[i] = (src1[i] >= src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000 |
4 |
_MM_PCOMCTRL_EQ |
r[i] = (src1[i] == src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000 |
5 |
_MM_PCOMCTRL_NEQ |
r[i] = (src1[i] != src2[i]) ? 0xFFFFFFFFFFFFFFFF : 0x0000000000000000 |
6 |
_MM_PCOMCTRL_FALSE |
r[i] = 0x0000000000000000 (すべてゼロのマスク) |
7 |
_MM_PCOMCTRL_TRUE |
r[i] = 0xFFFFFFFFFFFFFFFF (すべて 1 のマスク) |
必要に応じて、次のマクロを使用できます。このマクロは、<intrin.h> を含めるときに定義するものです。
マクロ |
説明 |
---|---|
_mm_comlt_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 0) |
_mm_comle_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 1) |
_mm_comgt_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 2) |
_mm_comge_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 3) |
_mm_comeq_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 4) |
_mm_comneq_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 5) |
_mm_comfalse_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 6) |
_mm_comtrue_epi64(src1, src2) |
_mm_com_epi64(src1, src2, 7) |
vpcomq 命令は、XOP ファミリの命令の一部です。 この組み込みを使用する前に、プロセッサでこの命令がサポートされていることを確認してください。 この命令に対するハードウェア サポートを確認するには、InfoType を 0x80000001 にして __cpuid 組み込みを呼び出し、CPUInfo[2] (ECX) のビット 11 をチェックします。 このビットは、命令がサポートされている場合は 1 になり、サポートされていない場合は 0 になります。
使用例
#include <stdio.h>
#include <intrin.h>
main()
{
__m128i a, b, d;
int i;
a.m128i_i64[0] = -10;
a.m128i_i64[1] = 10;
b.m128i_i64[0] = 22;
b.m128i_i64[1] = -22;
printf("src1: %16I64d %16I64d\n",
a.m128i_i64[0], a.m128i_i64[1]);
printf("src2: %16I64d %16I64d\n",
b.m128i_i64[0], b.m128i_i64[1]);
d = _mm_com_epi64(a, b, _MM_PCOMCTRL_LT);
printf("< mask: %016I64x %016I64x\n",
d.m128i_u64[0], d.m128i_u64[1]);
d = _mm_com_epi64(a, b, _MM_PCOMCTRL_GT);
printf("> mask: %016I64x %016I64x\n",
d.m128i_u64[0], d.m128i_u64[1]);
}
参照
その他の技術情報
Visual Studio 2010 SP1 用に追加された XOP 組み込み
履歴の変更
日付 |
履歴 |
理由 |
---|---|---|
2011 年 3 月 |
このコンテンツを追加。 |
SP1 機能変更 |