_mm_perm_epi8

更新 : 2011 年 3 月

Visual Studio 2010 SP1 が必要です。

Microsoft 固有の仕様 →

XOP 命令 vpperm を生成して、1 つ目と 2 つ目のソースからバイトを選択し、任意でそれらを変換します。

__m128i _mm_perm_epi8 (
   __m128i src1,
   __m128i src2,
   __m128i selector
);

パラメーター

  • [入力] src1
    16 個のバイトを含む 128 ビットのパラメーター。

  • [入力] src2
    16 個のバイトを含む 128 ビットのパラメーター。

  • [入力] selector
    src1 および src2 からバイトを選択し、選択したバイトに適用する変換を任意で選択する 128 ビットのパラメーター。

戻り値

src1 および src2 から選択されたバイトを含み、任意で変換される 128 ビットの結果 r。

必要条件

組み込み

アーキテクチャ

_mm_perm_epi8

XOP

ヘッダー ファイル <intrin.h>

解説

selector のバイトごとに、下位ビットによって src1 または src2 からバイトが選択されます。 値 0 から 15 では src1 のバイト 0 から 15 が選択され、値 16 から 31 では src2 のバイト 0 から 15 が選択されます。 selector の各バイトの上位ビットによって、選択されたバイトに適用する変換が決まります (変換する場合)。

selector の上位 3 ビットの値

選択される変換

000b

変換なし

001b

ソース バイトを反転する (1 の補数)

010b

ソース バイトをビット リバースする

011b

反転したソース バイトをビット リバースする

100b

結果のバイトを 0x00 に設定する

101b

結果のバイトを 0xFF に設定する

110b

ソース バイトの最上位ビットを複製する

111b

ソース バイトの反転した最上位ビットを複製する

vpperm 命令は、XOP ファミリの命令の一部です。 この組み込みを使用する前に、プロセッサでこの命令がサポートされていることを確認してください。 この命令に対するハードウェア サポートを確認するには、InfoType を 0x80000001 にして __cpuid 組み込みを呼び出し、CPUInfo[2] (ECX) のビット 11 をチェックします。 このビットは、命令がサポートされている場合は 1 になり、サポートされていない場合は 0 になります。

使用例

#include <stdio.h>
#include <intrin.h>
int main()
{
    __m128i a, b, selector, d;
    int i;
    for (i = 15; i >= 0; i--) {
        a.m128i_u8[i] = i;               // 0x0f0e0d0c...
        b.m128i_u8[i] = (i << 4) | i;    // 0xffeeddcc...
    }
    selector.m128i_u64[1] = 0xfedcba9876543210ll;
    selector.m128i_u64[0] = 0x0011223344556677ll;
    d = _mm_perm_epi8(a, b, selector);
    printf_s("%016I64x %016I64x\n", d.m128i_u64[1], d.m128i_u64[0]);
}
  

参照

参照

__cpuid, __cpuidex

その他の技術情報

Visual Studio 2010 SP1 用に追加された XOP 組み込み

履歴の変更

日付

履歴

理由

2011 年 3 月

このコンテンツを追加。

SP1 機能変更