VGATHERDPD, VGATHERQPD

Gather valores en coma flotante de precisión doble empaquetados Usando

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
VEX.128.66.0F38.W1 92 /rVGATHERDPD xmm1, vm32x, xmm2RMVValidoValidoUsando índices de dwords especificados en vm32x, reúne a valores en coma flotante de precisión doble de memoria condicionada a la máscara especificada por xmm2. Los ele-s acumulados condicionalmente se fusionan en xmm1.
VEX.128.66.0F38.W1 93 /rVGATHERQPD xmm1, vm64x, xmm2RMVValidoValidoUsando índices de qword especificados en vm64x, reúne a valores en coma flotante de precisión doble de memoria condicionada a la máscara especificada por xmm2. Los ele-s acumulados condicionalmente se fusionan en xmm1.
VEX.256.66.0F38.W1 92 /rVGATHERDPD ymm1, vm32x, ymm2RMVValidoValidoUsando índices de dwords especificados en vm32x, reúne a valores en coma flotante de precisión doble de memoria condicionada a la máscara especificada por ymm2. Los ele-s acumulados condicionalmente se fusionan en ymm1.
VEX.256.66.0F38.W1 93 /rVGATHERQPD ymm1, vm64y, ymm2RMVValidoValidoUsando índices de qword especificados en vm64y, recoja valores en coma flotante de precisión doble de memoria condicionada a la máscara especificada por ymm2. Los ele-s acumulados condicionalmente se fusionan en ymm1.

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.

RMV

  1. modrm.reg lectura y escriturabyte ModRM, campo reg (bits 5-3)
  2. BaseReg (R): VSIB:base,
  3. vex.vvvv lectura y escrituraprefijo VEX, campo vvvv (invertido)

Coste medido

Cargando las mediciones de arch-data...

Descripción

La instrucción carga condicionalmente hasta 2 o 4 valores en coma flotante de precisión doble de las direcciones de memoria especificadas por el operando de memoria (el segundo operando) y utilizando índices de qword. El operando de memoria utiliza la forma VSIB del byte SIB para especificar un registro de proposito general operando como base común, un registro vectorial para una serie de índices relativos a la base y un factor de escala constante.

La máscara operando (el tercer operando) especifica la operación de carga condicional de cada dirección de memoria y la actualización correspondiente de cada elemento de datos del operando de destino (el primer operando). La condicionalidad es especificada por el bit mas significativo de cada elemento de datos del registro de máscaras. Si no se establece el bit de máscara de un elemento, el elemento correspondiente del registro de destino se deja sin cambios. El ancho del elemento de datos en el registro de destino y el registro de máscaras son idénticos. El registro completo de máscaras se establecerá a cero por esta instrucción a menos que la instrucción cause una excepción.

Usando índices de dwords en la mitad inferior del registro de máscaras, la instrucción carga condicionalmente hasta 2 o 4 valores en coma flotante de precisión doble desde el VSIB que se dirige a operando de memoria, y actualiza el registro de destino.

Esta instrucción puede suspenderse por una excepción si por lo menos un elemento ya está recogido (es decir, si la excepción es activada por un elemento que no sea el más adecuado con su conjunto de bits de máscara). Cuando esto sucede, el registro de destino y la máscara operando se actualizan parcialmente; los elementos que se han reunido se colocan en el registro de destino y tienen sus bits de máscara fijados a cero. Si alguna trampa o interrupción está pendiente de elementos ya recogidos, serán entregados en lugar de la excepción; en este caso, EFLAG.RF se establece a uno por lo que un punto de instrucción no es re-triggered cuando la instrucción es continuada.

Si el tamaño de los datos y el tamaño de índice son diferentes, parte del registro de destino y parte del registro de máscaras no corresponden a ningún elemento que se esté reuniendo. Esta instrucción establece esas partes a cero. Puede hacer esto a uno o ambos registros, incluso si la instrucción desencadena una excepción, e incluso si la instrucción desencadena la excepción antes de reunir elementos.

VEX.128 versión: La instrucción reunirá dos valores en coma flotante de precisión doble. Para índices de dwords, sólo se utilizan los dos índices inferiores en el índice de vectores.

VEX.256 versión: La instrucción recogerá cuatro valores en coma flotante de precisión doble. Para índices de dwords, sólo se utilizan los cuatro índices inferiores en el índice de vectores.

Note that:

64 modelo de gestión de memoria.

Los elementos más cercanos a la LSB del destino serán completados (y no culpar). Los elementos individuales más cercanos al MSB pueden o no ser completados. Si un elemento dado desencadena múltiples fallas, se entregan en el orden convencional.

la izquierda de un defecto uno puede ser recogido antes de la culpa es entregado. Una aplicación dada de esta instrucción es repetible - dados los mismos valores de entrada y estado arquitectónico, se reunirá el mismo conjunto de elementos a la izquierda del fallo.

es la implementación específica, y algunas implementaciones pueden utilizar cargas más grandes que el tamaño del elemento de datos o elementos de carga un número indeterminado de veces.

modo bit, si la escala es mayor que uno). En este caso, los bits mas significativo más allá del número de bits de dirección son ignorados.

Operación

DEST := SRC1;
BASE_ADDR: base register encoded in VSIB addressing;
VINDEX: the vector index register encoded by VSIB addressing;
SCALE: scale factor encoded by SIB:[7:6];
DISP: optional 1, 4 byte displacement;
MASK := SRC3;

VGATHERDPD (VEX.128 version)
MASK[MAXVL-1:128] := 0;
FOR j := 0 to 1

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 1
    k := j * 32;
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX[k+31:k])*SCALE + DISP;
    IF MASK[63+i] THEN

          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits the instruction
    FI;
    MASK[i +63: i] := 0;
ENDFOR
DEST[MAXVL-1:128] := 0;


VGATHERQPD (VEX.128 version)
MASK[MAXVL-1:128] := 0;
FOR j := 0 to 1

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 1
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX1[i+63:i])*SCALE + DISP;
    IF MASK[63+i] THEN

          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits this instruction
    FI;
    MASK[i +63: i] := 0;
ENDFOR
DEST[MAXVL-1:128] := 0;

VGATHERQPD (VEX.256 version)
MASK[MAXVL-1:256] := 0;
FOR j := 0 to 3

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 3
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX1[i+63:i])*SCALE + DISP;
    IF MASK[63+i] THEN

          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits the instruction
    FI;
    MASK[i +63: i] := 0;
ENDFOR
DEST[MAXVL-1:256] := 0;

VGATHERDPD (VEX.256 version)
MASK[MAXVL-1:256] := 0;
FOR j := 0 to 3

    i := j * 64;
    IF MASK[63+i] THEN

          MASK[i +63:i] := FFFFFFFF_FFFFFFFFH; // extend from most significant bit
    ELSE

          MASK[i +63:i] := 0;
    FI;
ENDFOR
FOR j := 0 to 3
    k := j * 32;
    i := j * 64;
    DATA_ADDR := BASE_ADDR + (SignExtend(VINDEX1[k+31:k])*SCALE + DISP;


    IF MASK[63+i] THEN
          DEST[i +63:i] := FETCH_64BITS(DATA_ADDR); // a fault exits the instruction

    FI;
    MASK[i +63:i] := 0;
ENDFOR
DEST[MAXVL-1:256] := 0;

Intel C/C++ compilador intrínseco

VGATHERDPD: __m128d _mm_i32gather_pd (double const * base, __m128i index, const int scale);
VGATHERDPD: __m128d _mm_mask_i32gather_pd (__m128d src, double const * base, __m128i index, __m128d mask, const int scale);
VGATHERDPD: __m256d _mm256_i32gather_pd (double const * base, __m128i index, const int scale);
VGATHERDPD: __m256d _mm256_mask_i32gather_pd (__m256d src, double const * base, __m128i index, __m256d mask, const int scale);
VGATHERQPD: __m128d _mm_i64gather_pd (double const * base, __m128i index, const int scale);
VGATHERQPD: __m128d _mm_mask_i64gather_pd (__m128d src, double const * base, __m128i index, __m128d mask, const int scale);
VGATHERQPD: __m256d _mm256_i64gather_pd (double const * base, __m256i index, const int scale);
VGATHERQPD: __m256d _mm256_mask_i64gather_pd (__m256d src, double const * base, __m256i index, __m256d mask, const int scale);

SIMD coma flotante Excepciones

None.

Otras excepciones

Ver Tabla 2-27, "Tipo 12 Condiciones de Excepción de Clase".

Fuentes