_mm_extract_si64, _mm_extracti_si64
Sezione specifica Microsoft
Genera l'istruzione extrq
per estrarre i bit specificati dai 64 bit bassi del primo argomento.
Sintassi
__m128i _mm_extract_si64(
__m128i Source,
__m128i Descriptor
);
__m128i _mm_extracti_si64(
__m128i Source,
int Length,
int Index
);
Parametri
Origine
[in] Campo a 128 bit con dati di input nei 64 bit inferiori.
Descrittore
[in] Campo a 128 bit che descrive il campo di bit da estrarre.
Lunghezza
[in] Intero che specifica la lunghezza del campo da estrarre.
Indice
[in] Intero che specifica l'indice del campo da estrarre
Valore restituito
Campo a 128 bit con il campo estratto nei bit meno significativi.
Requisiti
Intrinsic | Architettura |
---|---|
_mm_extract_si64 |
SSE4a |
_mm_extracti_si64 |
SSE4a |
<File di intestazione intrin.h>
Osservazioni:
Questi oggetti intrinseci generano l'istruzione extrq
per estrarre i bit dall'origine. Esistono due versioni: _mm_extracti_si64
è la versione immediata ed _mm_extract_si64
è quella non immediata. Ogni versione estrae da Source un campo di bit definito dalla relativa lunghezza e dall'indice del bit meno significativo. I valori della lunghezza e dell'indice vengono acquisiti mod 64, quindi sia -1 che 127 vengono interpretati come 63. Se la somma dell'indice (ridotto) e della lunghezza del campo (ridotta) è maggiore di 64, i risultati non sono definiti. Il valore zero per la lunghezza del campo viene interpretato come 64. Se la lunghezza del campo e l'indice di bit sono entrambi zero, vengono estratti i bit 63:0 di Source . Se la lunghezza del campo è zero ma l'indice di bit è diverso da zero, i risultati non sono definiti.
In una chiamata a _mm_extract_si64
, il descrittore contiene l'indice in bit 13:8 e la lunghezza del campo dei dati da estrarre in bit 5:0.
Se si chiama _mm_extracti_si64
con argomenti che il compilatore non può determinare come costanti integer, il compilatore genera il codice per comprimere tali valori in un registro XMM (Descrittore) e per chiamare _mm_extract_si64
.
Per determinare il supporto hardware per l'istruzione extrq
, chiamare l'oggetto __cpuid
intrinseco con InfoType=0x80000001
e controllare il bit 6 di CPUInfo[2] (ECX)
. Questo bit sarà 1 se l'istruzione è supportata e 0 in caso contrario. Se si esegue codice che usa questo hardware intrinseco che non supporta l'istruzione extrq
, i risultati sono imprevedibili.
Esempio
// 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
Fine sezione specifica Microsoft
Parti copyright 2007 di Advanced Micro Devices, Inc. Tutti i diritti riservati. Riprodotto con l'autorizzazione da Advanced Micro Devices, Inc.
Vedi anche
_mm_insert_si64, _mm_inserti_si64
Intrinseci del compilatore