_mm_insert_si64, _mm_inserti_si64
Section spécifique à Microsoft
Génère l’instruction insertq
pour insérer des bits à partir de son deuxième opérande dans son premier opérande.
Syntaxe
__m128i _mm_insert_si64(
__m128i Source1,
__m128i Source2
);
__m128i _mm_inserti_si64(
__m128i Source1,
__m128i Source2
int Length,
int Index
);
Paramètres
Source1
[in] Champ 128 bits contenant des données d’entrée dans ses 64 bits inférieurs, dans lequel un champ sera inséré.
Source2
[in] Champ 128 bits contenant les données à insérer dans ses bits faibles. Pour _mm_insert_si64
, contient également un descripteur de champ dans ses bits élevés.
Durée
[in] Constante entière qui spécifie la longueur du champ à insérer.
Index
[in] Constante entière qui spécifie l’index du bit le moins significatif du champ dans lequel les données seront insérées.
Valeur retournée
Champ 128 bits, dont les 64 bits inférieurs contiennent les 64 bits d’origine de Source1, avec le champ de bits spécifié remplacé par les bits faibles de Source2. Les 64 bits supérieurs de la valeur de retour ne sont pas définis.
Spécifications
Intrinsic | Architecture |
---|---|
_mm_insert_si64 |
SSE4a |
_mm_inserti_si64 |
SSE4a |
Fichier<d’en-tête intrin.h>
Notes
Ces intrinsèques génèrent l’instruction insertq
pour insérer des bits de Source2 dans Source1. Il existe deux versions : _mm_inserti_si64
, est la version immédiate et _mm_insert_si64
est la version non immédiate. Chaque version extrait un champ de bits d’une longueur donnée de Source2 et l’insère dans Source1. Les bits extraits sont les bits les moins significatifs de Source2. Le champ Source1 dans lequel ces bits seront insérés est défini par la 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 binaire (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 zéro, les bits 63:0 de Source2 sont insérés dans Source1. Si la longueur du champ est égale à zéro, mais que l’index binaire n’est pas égal à zéro, les résultats ne sont pas définis.
Dans un appel à _mm_insert_si64, la longueur du champ est contenue dans les bits 77:72 de Source2 et l’index en bits 69:64.
Si vous appelez _mm_inserti_si64
avec des arguments que le compilateur ne peut pas déterminer comme des constantes entières, le compilateur génère du code pour packer ces valeurs dans un registre XMM et appeler _mm_insert_si64
.
Pour déterminer la prise en charge matérielle de l’instruction, appelez l’intrinsèque insertq
__cpuid
avec InfoType=0x80000001
et vérifiez le bit 6 de CPUInfo[2] (ECX)
. Ce bit est 1 si l’instruction est prise en charge, et 0 sinon. Si vous exécutez du code qui utilise l’intrinsèque sur le matériel qui ne prend pas en charge l’instruction insertq
, 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];
} source1, source2, source3, result1, result2, result3;
int
main()
{
__int64 mask;
source1.ui64[0] = 0xffffffffffffffffll;
source2.ui64[0] = 0xfedcba9876543210ll;
source2.ui64[1] = 0xc10;
source3.ui64[0] = source2.ui64[0];
result1.m = _mm_insert_si64 (source1.m, source2.m);
result2.m = _mm_inserti_si64(source1.m, source3.m, 16, 12);
mask = 0xffff << 12;
mask = ~mask;
result3.ui64[0] = (source1.ui64[0] & mask) |
((source2.ui64[0] & 0xffff) << 12);
cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
cout << "result2 = 0x" << result2.ui64[0] << endl;
cout << "result3 = 0x" << result3.ui64[0] << endl;
}
result1 = 0xfffffffff3210fff
result2 = 0xfffffffff3210fff
result3 = 0xfffffffff3210fff
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_extract_si64, _mm_extracti_si64
Intrinsèques du compilateur