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命令一覧表
フィードバック