_mm256_permute2_pd

Se requiere Visual Studio 2010 SP1.

Específicos de Microsoft

Genera la instrucción XOP YMM vpermil2pd para seleccionar los valores de punto flotante de sus primeros dos orígenes, con puesta a cero opcional.

__m256 _mm_permute2_pd (
   __m256d src1,
   __m256d src2,
   __m256i selector,
   int control
); 

Parámetros

  • [in] src1
    Un parámetro de 256 bits que contiene cuatro valores de punto flotante de 64 bits.

  • [in] src2
    Un parámetro de 256 bits que contiene cuatro valores de punto flotante de 64 bits.

  • [in] selector
    Un parámetro de 256 bits que contiene cuatro valores de punto flotante de 64 bits.

  • [in] control
    Un parámetro entero de 32 bits que controla el método para decidir si hay valores cero en el resultado.

Valor devuelto

Un resultado de 256 bits r que contiene cuatro valores de punto flotante de 64 bits.

Cada valor en los 128 bits más significativos del resultado es cero o un valor elegido de los dos valores de punto flotante de 64 bits en los 128 bits más significativos de src1 y src2. Cada valor en los 128 bits menos significativos del resultado es cero o un valor elegido de los dos valores de punto flotante de 64 bits en los 128 bits menos significativos de src1 y src2.

Requisitos

Intrínseco

Arquitectura

_mm256_permute2_pd

XOP

Archivo de encabezado <intrin.h>

Comentarios

Cada una de las dos palabras cuádruples en los 128 bits más significativos de selector selecciona el valor de su correspondiente palabra cuádruple del resultado de uno de los cuatro valores de punto flotante de 64 bits en los 128 bits más significativos de src1 y src2. El valor cero puede reemplazar este valor antes de escribirse en el resultado, dependiendo del valor de control y del valor del bit 3 de la palabra cuádruple selector. De igual forma, cada una de las dos palabras cuádruples en los 128 bits menos significativos de selector selecciona un valor de uno de los cuatro valores de punto flotante de 64 bits en los 128 bits menos significativos de src1 y src2, y este valor también puede sustituirse por cero.

Para cada palabra cuádruple en los 128 bits más significativos de selector, el segundo y tercer bits de orden inferior seleccionan uno de los valores de punto flotante en src1 o src2, con valores de 0 a 1, seleccionando src1 [2] a [3], y valores de 2 a 3, seleccionando src2 [2] a src2 [3]. Para cada palabra cuádruple en los 128 bits menos significativos de selector, el segundo y tercer bits de orden inferior seleccionan uno de los valores de punto flotante en src1 o src2, con valores de 0 a 1, seleccionando src1 [0] a [1], y valores de 2 a 3, seleccionando src2 [0] a src2 [1].

El próximo bit de cada palabra cuádruple en selector se conocerá como el bit de "coincidencia" que aparece a continuación. Se ignora el bit de orden inferior y los 60 bits de orden superior de palabra cuádruple en selector.

El cuarto origen, control, determina las condiciones bajo las que los valores de resultado estarán establecidos en 0. El valor de control debe ser 0, 1, 2, o 3. Si control es 0 o 1, el valor de punto flotante seleccionado se escribe en el destino. Si control es 2, a continuación, el valor de punto flotante seleccionado se escribe en el destino si el bit de la coincidencia correspondiente en selector es 0, pero se escribe el cero si el bit de la coincidencia es 1. Si control es 3, a continuación, el valor de punto flotante seleccionado se escribe en el destino si el bit de la coincidencia correspondiente es 1, pero se escribe el cero si el bit de la coincidencia es 0.

La instrucción vpermil2pd forma parte de la familia XOP de instrucciones. Antes de utilizar este intrínseco, debe asegurarse de que el procesador admite esta instrucción. Para determinar la compatibilidad del hardware para obtener esta instrucción, llame a __cpuid intrínseco con InfoType = 0x80000001 y compruebe el bit 11 de CPUInfo [2] (ECX). Este bit es 1 cuando se admite la instrucción, de lo contrario es 0.

Ejemplo

#include <stdio.h>
#include <intrin.h>
int main()
{
    __m256d a, b, d;
    __m256i select;
    int i;
    for (i = 0; i < 4; i++) {
        a.m256d_f64[i] = i;
        b.m256d_f64[i] = i + 4;
    }
    select.m256i_i64[0] = 2 << 1;
    select.m256i_i64[1] = (1 << 1) + 8; // turn on match bit
    select.m256i_i64[2] = 0 << 1;
    select.m256i_i64[3] = (3 << 1) + 8; // turn on match bit

    
    d = _mm256_permute2_pd(a, b, select, 0); // just select, don't zero
    printf_s("%.3lf %.3lf %.3lf %.3lf\n", d.m256d_f64[0],
             d.m256d_f64[1], d.m256d_f64[2], d.m256d_f64[3]);
    d = _mm256_permute2_pd(a, b, select, 2); // zero if match is 1
    printf_s("%.3lf %.3lf %.3lf %.3lf\n", d.m256d_f64[0],
             d.m256d_f64[1], d.m256d_f64[2], d.m256d_f64[3]);
    d = _mm256_permute2_pd(a, b, select, 3); // zero if match is 0
    printf_s("%.3lf %.3lf %.3lf %.3lf\n", d.m256d_f64[0],
             d.m256d_f64[1], d.m256d_f64[2], d.m256d_f64[3]);
}
  

Vea también

Referencia

__cpuid, __cpuidex

Otros recursos

_mm256_permute2_ps

_mm_permute2_pd

Intrínsecos XOP agregados para Visual Studio 2010 SP1

Historial de cambios

Fecha

Historial

Motivo

Marzo de 2011

Se agrega este contenido.

Cambio de características de SP1.