Partager via


_mm256_permute2_ps

Visual Studio 2010 SP1 est requis

Spécifique à Microsoft

Génère le vpermil2ps de l'instruction YMM XOP pour sélectionner des valeurs à virgule flottante de ses deux premières sources, avec remise à zéro facultative.

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

Paramètres

  • [in] src1
    Paramètre de 256 bits qui contient huit valeurs à virgule flottante de 32 bits.

  • [in] src2
    Paramètre de 256 bits qui contient huit valeurs à virgule flottante de 32 bits.

  • [in] selector
    Paramètre de 256 bits qui contient huit valeurs du sélecteur de l'entier 32 bits.

  • [in] control
    Paramètre de l'entier de 32 bits qui contrôle la méthode permettant de décider si les valeurs du résultat doivent être remises à zéro.

Valeur de retour

Résultat r de 256 bits qui contient huit valeurs à virgule flottante de 32 bits.

Chaque valeur dans les 128 bits hauts du résultat est nulle ou a la valeur sélectionnée parmi les quatre valeurs à virgule flottante de 32 bits dans les 128 bits de poids fort de src1 et src2. Chaque valeur dans les 128 bits de poids faible du résultat est nulle ou a la valeur sélectionnée parmi les quatre valeurs à virgule flottante de 32 bits dans les 128 bits de poids faible de src1 et src2.

Configuration requise

Intrinsèque

Architecture

_mm256_permute2_ps

XOP

Fichier d'en-tête <intrin.h>

Notes

Chacun des quatre mots doubles dans les 128 bits de poids fort de selector sélectionne la valeur de son mot double correspondant du résultat de l'une des huit valeurs à virgule flottante de 32 bits dans les 128 bits de poids fort de src1 et src2. Cette valeur peut être remplacée par zéro avant d'être écrite dans le résultat, en fonction de la valeur de control et la valeur du bit 3 du mot double selector. De la même façon, chacun des quatre mots doubles dans les 128 bits de poids faible de selector sélectionne une valeur parmi l'une des huit valeurs à virgule flottante de 32 bits dans les 128 bits de poids faible de src1 et src2, et cette valeur peut également être remplacée par zéro.

Pour chaque mot double dans les 128 bits de poids fort de selector, les trois bits de poids faible sélectionnent l'une des valeurs à virgule flottante dans src1 ou src2, avec les valeurs comprises entre 0 et 3 sélectionnant src1[4] à src1[7] et les valeurs comprises entre 4 et 7 sélectionnant src2[4] à src2[7]. Pour chaque mot double dans les 128 bits de poids faible de selector, les trois bits de poids faible sélectionnent l'une des valeurs à virgule flottante dans src1 ou src2, avec les valeurs comprises entre 0 et 3 sélectionnant src1[0] à src1[3] et les valeurs comprises entre 4 et 7 sélectionnant src2[0] à src2[3].

Le bit suivant de chaque mot double dans selector est appelé « bit correspondant » ci-après. Les 28 bits de poids fort de chaque mot double dans selector sont ignorés.

La quatrième source, control, détermine les conditions sous lesquelles les valeurs du résultat ont la valeur 0. La valeur de control doit être 0, 1, 2 ou 3. Si control est 0 ou 1, la valeur à virgule flottante sélectionnée est écrite dans la destination. Si control a la valeur 2, la valeur à virgule flottante sélectionnée est écrite dans la destination si le bit correspondant dans selector a la valeur 0, mais la valeur zéro est écrite si le bit de correspondance a la valeur 1. If control a la valeur 3, la valeur à virgule flottante sélectionnée est écrite dans la destination si le bit correspondant a la valeur 1, mais la valeur zéro est écrite si le bit de correspondance a la valeur 0.

L'instruction vpermil2ps fait partie de la famille XOP des instructions. Avant d'utiliser cette fonction intrinsèque, vous devez vérifier que le processeur prend en charge cette instruction. Pour déterminer la prise en charge du matériel pour cette instruction, appelez la fonction intrinsèque __cpuid avec InfoType = 0x80000001 et vérifiez le bit 11 de CPUInfo[2] (ECX). Ce bit est égal à 1 lorsque l'instruction est prise en charge, sinon il est égal à 0.

Exemple

#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");
}
  

Voir aussi

Référence

__cpuid, __cpuidex

Autres ressources

_mm256_permute2_pd

_mm_permute2_ps

Fonctions XOP intrinsèques ajoutées pour Visual Studio 2010 SP1

Historique des modifications

Date

Historique

Motif

Mars 2011

Ce contenu a été ajouté.

Modifications de fonctionnalités dans le SP1.