_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