VPTERNLOGD, VPTERNLOGQ

Bitwise Ternary Logic

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
EVEX.128.66.0F3A.W0 25 /r ibVPTERNLOGD xmm1 {k1}{z}, xmm2, xmm3/m128/m32bcst, imm8AValidoValidoBitwise ternary logic takingxmm1, xmm2, yAVX512FOxmm3/m128/m32bcstoperandos de origenyAVX10.1escribir el resultadoxmm1por debajomáscara de escritura k1con dword granularidad. El valor inmediato determina la función binaria específica que se está implementando.
EVEX.256.66.0F3A.W0 25 /r ibVPTERNLOGD ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcst, imm8AValidoValidoBitwise ternary logic takingymm1, ymm2, yAVX512FOymm3/m256/m32bcstoperandos de origenyAVX10.1escribir el resultadoymm1por debajomáscara de escritura k1con dword granularidad. El valor inmediato determina la función binaria específica que se está implementando.
EVEX.512.66.0F3A.W0 25 /r ibVPTERNLOGD zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst, imm8AValidoValidoBitwise ternary logic takingzmm1, zmm2, yAVX10.1 zmm3/m512/m32bcstoperandos de origeny escribir el resultadozmm1por debajomáscara de escritura k1con dword granularidad. El valor inmediato determina la función binaria específica que se está implementando.
EVEX.128.66.0F3A.W1 25 /r ibVPTERNLOGQ xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst, imm8AValidoValidoBitwise ternary logic takingxmm1, xmm2, yAVX512FOxmm3/m128/m64bcstoperandos de origenyAVX10.1escribir el resultadoxmm1por debajomáscara de escritura k1con granularidad qword. El valor inmediato determina la función binaria específica que se está implementando.
EVEX.256.66.0F3A.W1 25 /r ibVPTERNLOGQ ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst, imm8AValidoValidoBitwise ternary logic takingymm1, ymm2, yAVX512FOymm3/m256/m64bcstoperandos de origenyAVX10.1escribir el resultadoymm1por debajomáscara de escritura k1con granularidad qword. El valor inmediato determina la función binaria específica que se está implementando.
EVEX.512.66.0F3A.W1 25 /r ibVPTERNLOGQ zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst, imm8AValidoValidoBitwise ternary logic takingzmm1, zmm2, yAVX10.1 zmm3/m512/m64bcstoperandos de origeny escribir el resultadozmm1por debajomáscara de escritura k1con granularidad qword. El valor inmediato determina la función binaria específica que se está implementando.

Codificacion de operandos

Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.

A

  1. modrm.reg lectura y escriturabyte ModRM, campo reg (bits 5-3)
  2. evex.vvvv lecturaprefijo EVEX, campo vvvv (invertido)
  3. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide
  4. imm8byte inmediato que sigue a la instruccion

Tupla: Full

Coste medido

Cargando las mediciones de arch-data...

Descripción

VPTERNLOGD/Q toma tres bits de longitud de 512 bits (en el primero, segundo y tercer operando) como datos de entrada para formar un conjunto de 512 índices, cada índice se compone de un poco de cada vector de entrada. El byte imm8 especifica una tabla lógica booleana que produce un valor binario para cada valor índice de 3 bits. El resultado booleano final de 512 bits está escrito al operando de destino (el primer operando) utilizando la máscara de escritura k1 con la granularidad del elemento de doble palabra o elemento de cuadripa en el destino.

El operando de destino es un registro ZMM (EVEX.512)/YMM (EVEX.256)/XMM (EVEX.128). El primer operando de origen es un registro ZMM/YMM/XMM. La segunda fuente puede ser un ZMM/YMM/XMM registro, un 512/256/128-bit ubicación de memoria o un vector 512/256/128-bit transmitido desde una ubicación de memoria de 32/64-bit El destino que operand es un ZMM registro actualizado condicionalmente con writemask k1.

En el cuadro 5-20 se muestran dos ejemplos de funciones booleanas especificadas por valores inmediatos 0xE2 y 0xE4, con el resultado de búsqueda enumerado en la cuarta columna siguiendo las tres columnas que contienen todos los valores posibles del índice de 3 bits.

Ejemplos de VPTERNLOGD/Q Imm8 Valores de la función booleana e índice de entrada

00000000
00110010
01000101
01100110
10001000
10111011
11011101
11111111

Operación

VPTERNLOGD (EVEX encoded versions)

(KL, VL) = (4, 128), (8, 256), (16, 512)

FOR j := 0 TO KL-1

   i := j * 32

   IF k1[j] OR *no writemask*

        THEN

                FOR k := 0 TO 31

                IF (EVEX.b = 1) AND (SRC2 *is memory*)

                      THEN DEST[j][k] := imm[(DEST[i+k] << 2) + (SRC1[ i+k ] << 1) + SRC2[ k ]]

                      ELSE DEST[j][k] := imm[(DEST[i+k] << 2) + (SRC1[ i+k ] << 1) + SRC2[ i+k ]]

                FI;

                           ; table lookup of immediate bellow;

   ELSE

        IF *merging-masking*                 ; merging-masking

                THEN *DEST[31+i:i] remains unchanged*

                ELSE                         ; zeroing-masking

                DEST[31+i:i] := 0

        FI;

   FI;

ENDFOR;


DEST[MAXVL-1:VL] := 0

VPTERNLOGQ (EVEX encoded versions)

(KL, VL) = (2, 128), (4, 256), (8, 512)

FOR j := 0 TO KL-1

i := j * 64

IF k1[j] OR *no writemask*

     THEN

             FOR k := 0 TO 63

                  IF (EVEX.b = 1) AND (SRC2 *is memory*)

                       THEN DEST[j][k] := imm[(DEST[i+k] << 2) + (SRC1[ i+k ] << 1) + SRC2[ k ]]

                       ELSE DEST[j][k] := imm[(DEST[i+k] << 2) + (SRC1[ i+k ] << 1) + SRC2[ i+k ]]

                  FI;                    ; table lookup of immediate bellow;

     ELSE

             IF *merging-masking*             ; merging-masking

                  THEN *DEST[63+i:i] remains unchanged*

                  ELSE                        ; zeroing-masking

                       DEST[63+i:i] := 0

             FI;

FI;

ENDFOR;

DEST[MAXVL-1:VL] := 0

Intel C/C++ compilador intrínseco

VPTERNLOGD __m512i _mm512_ternarylogic_epi32(__m512i a, __m512i b, int imm);
VPTERNLOGD __m512i _mm512_mask_ternarylogic_epi32(__m512i s, __mmask16 m, __m512i a, __m512i b, int imm);
VPTERNLOGD __m512i _mm512_maskz_ternarylogic_epi32(__mmask m, __m512i a, __m512i b, int imm);
VPTERNLOGD __m256i _mm256_ternarylogic_epi32(__m256i a, __m256i b, int imm);
VPTERNLOGD __m256i _mm256_mask_ternarylogic_epi32(__m256i s, __mmask8 m, __m256i a, __m256i b, int imm);
VPTERNLOGD __m256i _mm256_maskz_ternarylogic_epi32( __mmask8 m, __m256i a, __m256i b, int imm);
VPTERNLOGD __m128i _mm_ternarylogic_epi32(__m128i a, __m128i b, int imm);
VPTERNLOGD __m128i _mm_mask_ternarylogic_epi32(__m128i s, __mmask8 m, __m128i a, __m128i b, int imm);
VPTERNLOGD __m128i _mm_maskz_ternarylogic_epi32( __mmask8 m, __m128i a, __m128i b, int imm);
VPTERNLOGQ __m512i _mm512_ternarylogic_epi64(__m512i a, __m512i b, int imm);
VPTERNLOGQ __m512i _mm512_mask_ternarylogic_epi64(__m512i s, __mmask8 m, __m512i a, __m512i b, int imm);
VPTERNLOGQ __m512i _mm512_maskz_ternarylogic_epi64( __mmask8 m, __m512i a, __m512i b, int imm);
VPTERNLOGQ __m256i _mm256_ternarylogic_epi64(__m256i a, __m256i b, int imm);
VPTERNLOGQ __m256i _mm256_mask_ternarylogic_epi64(__m256i s, __mmask8 m, __m256i a, __m256i b, int imm);
VPTERNLOGQ __m256i _mm256_maskz_ternarylogic_epi64( __mmask8 m, __m256i a, __m256i b, int imm);
VPTERNLOGQ __m128i _mm_ternarylogic_epi64(__m128i a, __m128i b, int imm);
VPTERNLOGQ __m128i _mm_mask_ternarylogic_epi64(__m128i s, __mmask8 m, __m128i a, __m128i b, int imm);
VPTERNLOGQ __m128i _mm_maskz_ternarylogic_epi64( __mmask8 m, __m128i a, __m128i b, int imm);

SIMD coma flotante Excepciones

None.

Otras excepciones

Ver Tabla 2-51, "Tipo E4 Clase Condiciones de Excepción".

Fuentes