_mm_extract_si64, _mm_extracti_si64

Section spécifique à Microsoft

Génère l’instruction extrq pour extraire les bits spécifiés des 64 bits bas de son premier argument.

Syntaxe

__m128i _mm_extract_si64(
   __m128i Source,
   __m128i Descriptor
);
__m128i _mm_extracti_si64(
   __m128i Source,
   int Length,
   int Index
);

Paramètres

Source
[in] Champ 128 bits avec des données d’entrée dans ses 64 bits inférieurs.

Descripteur
[in] Champ 128 bits qui décrit le champ de bits à extraire.

Durée
[in] Entier qui spécifie la longueur du champ à extraire.

Index
[in] Entier qui spécifie l’index du champ à extraire

Valeur retournée

Champ 128 bits avec le champ extrait dans ses bits les moins significatifs.

Spécifications

Intrinsic Architecture
_mm_extract_si64 SSE4a
_mm_extracti_si64 SSE4a

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

Notes

Ces intrinsèques génèrent l’instruction extrq pour extraire des bits de la source. Il existe deux versions : _mm_extracti_si64 la version immédiate et _mm_extract_si64 la version non immédiate. Chaque version extrait du champ Source un champ de bits défini par sa longueur et l’index de son bit le moins significatif. Les valeurs de la longueur et de l’index sont prises mod 64, donc -1 et 127 sont interprétées comme 63. Si la somme de l’index (réduit) et de la longueur (réduite) du champ est supérieure à 64, les résultats ne sont pas définis. La valeur zéro pour la longueur du champ est interprétée comme 64. Si la longueur du champ et l’index de bits sont à la fois zéro, les bits 63:0 de la source sont extraits. Si la longueur du champ est égale à zéro, mais que l’index bit n’est pas égal à zéro, les résultats ne sont pas définis.

Dans un appel à _mm_extract_si64, le descripteur contient l’index en bits 13:8 et la longueur de champ des données à extraire en bits 5:0.

Si vous appelez _mm_extracti_si64 avec des arguments que le compilateur ne peut pas déterminer pour être des constantes entières, le compilateur génère du code pour packer ces valeurs dans un registre XMM (Descriptor) et appeler _mm_extract_si64.

Pour déterminer la prise en charge matérielle de l’instruction, appelez l’intrinsèque extrq __cpuid avec InfoType=0x80000001 et vérifiez le bit 6 de CPUInfo[2] (ECX). Ce bit sera 1 si l’instruction est prise en charge, et 0 sinon. Si vous exécutez du code qui utilise ce matériel intrinsèque qui ne prend pas en charge l’instruction extrq , les résultats sont imprévisibles.

Exemple

// Compile this sample with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;

union {
    __m128i m;
    unsigned __int64 ui64[2];
} source, descriptor, result1, result2, result3;

int
main()
{
    source.ui64[0] =     0xfedcba9876543210ll;
    descriptor.ui64[0] = 0x0000000000000b1bll;

    result1.m = _mm_extract_si64 (source.m, descriptor.m);
    result2.m = _mm_extracti_si64(source.m, 27, 11);
    result3.ui64[0] = (source.ui64[0] >> 11) & 0x7ffffff;

    cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
    cout << "result2 = 0x" << result2.ui64[0] << endl;
    cout << "result3 = 0x" << result3.ui64[0] << endl;
}
result1 = 0x30eca86
result2 = 0x30eca86
result3 = 0x30eca86

FIN de la section spécifique à Microsoft

Portions Copyright 2007 by Advanced Micro Devices, Inc. Tous les droits réservés. Reproduit avec l’autorisation d’Advanced Micro Devices, Inc.

Voir aussi

_mm_insert_si64, _mm_inserti_si64
Intrinsèques du compilateur