VPTERNLOGD - Packed TERNary LOGic Dword

VPTERNLOGD xmm1{k1}{z}, xmm2, xmm3/m128/m32bcst, imm8    (V5+VL
__m128i _mm_ternarylogic_epi32(__m128i a, __m128i b, __m128i c, int imm8);
__m128i _mm_mask_ternarylogic_epi32(__m128i a, __mmask8 k, __m128i b, __m128i c, int imm8);
__m128i _mm_maskz_ternarylogic_epi32(__mmask8 k, __m128i a, __m128i b, __m128i c, int imm8);


①②③の各ビットについてimm8で指定したビット単位の論理演算を行い結果を第一オペランド(戻り値)に返す
VPTERNLOGD ymm1{k1}{z}, ymm2, ymm3/m256/m32bcst, imm8    (V5+VL
__m256i _mm256_ternarylogic_epi32(__m256i a, __m256i b, __m256i c, int imm8);
__m256i _mm256_mask_ternarylogic_epi32(__m256i a, __mmask8 k, __m256i b, __m256i c, int imm8);
__m256i _mm256_maskz_ternarylogic_epi32(__mmask8 k, __m256i a, __m256i b, __m256i c, int imm8);


①②③の各ビットについてimm8で指定したビット単位の論理演算を行い結果を第一オペランド(戻り値)に返す
VPTERNLOGD zmm1{k1}{z}, zmm2, zmm3/m512/m32bcst, imm8    (V5
__m512i _mm512_ternarylogic_epi32(__m512i a, __m512i b, __m512i c, int imm8);
__m512i _mm512_mask_ternarylogic_epi32(__m512i a, __mmask16 k, __m512i b, __m512i c, int imm8);
__m512i _mm512_maskz_ternarylogic_epi32(__mmask16 k, __m512i a, __m512i b, __m512i c, int imm8);


①②③の各ビットについてimm8で指定したビット単位の論理演算を行い結果を第一オペランド(戻り値)に返す

imm8の指定方法

以下の方法で任意のビット演算を指定可

1. ①②③を使った論理式を組み立てる(使わないのがあってもOK)
2. 1の式に①=F0、②=CC、③=AAを代入して計算して8ビットの値を得る
3. 2をimm8として指定する

例1 ① & (② | ③) を計算する

F0 & (CC | AA) = E0をimm8として指定する

例2 ①のビットが立っているとき②のビットをそのまま、立っていないとき③のビットを反転してコピーする

(① & ②) | ((~①) & (~③))と式を立てて (F0 & CC) | (~F0 & ~AA) = C5をimm8として指定する

【別解】 表を作る

2進
①F0 1 1 1 1 0 0 0 0
②CC 1 1 0 0 1 1 0 0
③AA 1 0 1 0 1 0 1 0
①のビットが立っているとき②のビットをそのまま、立っていないとき③のビットを反転 1 1 0 0 0 1 0 1

C5をimm8として指定する

例3 ①②③のうちふたつ以上ビットが立っていたら1、そうでないとき0をセットする

表を作る

2進
①F0 1 1 1 1 0 0 0 0
②CC 1 1 0 0 1 1 0 0
③AA 1 0 1 0 1 0 1 0
①②③のうちふたつ以上ビットが立っていたら1、そうでないとき0 1 1 1 0 1 0 0 0

E8をimm8として指定する

VPTERNLOGx imm8 計算機


x86/x64 SIMD命令一覧表  フィードバック