Share via


_mm256_permute2_ps

Se requiere Visual Studio 2010 SP1.

Específicos de Microsoft

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

__m256 _mm_permute2_ps (
   __m256 src1,
   __m256 src2,
   __m256i selector,
   int control
); 

Parámetros

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

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

  • [in] selector
    Un parámetro de 256 bits que contiene ocho valores de selector enteros de 32 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 ocho valores de punto flotante de 32 bits.

Cada valor en los 128 bits más significativos del resultado es cero o un valor elegido de los cuatro valores de punto flotante de 32 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 cuatro valores de punto flotante de 32 bits en los 128 bits menos significativos de src1 y src2.

Requisitos

Intrínseco

Arquitectura

_mm256_permute2_ps

XOP

Archivo de encabezado <intrin.h>

Comentarios

Cada una de las cuatro palabras dobles en los 128 bits más significativos de selector selecciona el valor de su correspondiente palabra doble del resultado de uno de los ocho valores de punto flotante de 32 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 doble selector. De igual forma, cada una de las cuatro palabras dobles en los 128 bits menos significativos de selector selecciona un valor de uno de los ocho valores de punto flotante de 32 bits en los 128 bits menos significativos de src1 y src2, y este valor también puede sustituirse por cero.

Para cada palabra doble en los 128 bits más significativos de selector, los tres bits de orden inferior seleccionan uno de los valores de punto flotante en src1 o src2, con valores de 0 a 3, seleccionando src1 [4] a [7], y valores de 4 a 7, seleccionando src2 [4] a src2 [7]. Para cada palabra doble en los 128 bits menos significativos de selector, los tres bits de orden inferior seleccionan uno de los valores de punto flotante en src1 o src2, con valores de 0 a 3, seleccionando src1 [0] a [3], y valores de 4 a 7, seleccionando src2 [0] a src2 [3].

El próximo bit de cada palabra doble en selector se conocerá como el bit de "coincidencia" que aparece a continuación. Se ignoran los 28 bits de orden superior de cada palabra doble 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 vpermil2ps 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()
{
    __m256 a, b, d;
    __m256i select;
    int i;
    for (i = 0; i < 8; i++) {
        a.m256_f32[i] = i;
        b.m256_f32[i] = i+8;
    }
    select.m256i_i32[0] = 5;
    select.m256i_i32[1] = 1 + 8; // turn on match bit
    select.m256i_i32[2] = 2;
    select.m256i_i32[3] = 6 + 8; // turn on match bit
    select.m256i_i32[4] = 5 + 8; // turn on match bit
    select.m256i_i32[5] = 1;
    select.m256i_i32[6] = 2 + 8; // turn on match bit
    select.m256i_i32[7] = 6;

    d = _mm256_permute2_ps(a, b, select, 0); // just select, don't zero
    for (i = 0; i < 8; i++) printf_s(" %6.3f", d.m256_f32[i]);
    printf_s("\n");
    d = _mm256_permute2_ps(a, b, select, 2); // zero if match is 1
    for (i = 0; i < 8; i++) printf_s(" %6.3f", d.m256_f32[i]);
    printf_s("\n");
    d = _mm256_permute2_ps(a, b, select, 3); // zero if match is 0
    for (i = 0; i < 8; i++) printf_s(" %6.3f", d.m256_f32[i]);
    printf_s("\n");
}
  

Vea también

Referencia

__cpuid, __cpuidex

Otros recursos

_mm256_permute2_pd

_mm_permute2_ps

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.