_mm_extract_si64, _mm_extracti_si64
Specyficzne dla firmy Microsoft
Generuje instrukcję extrq
wyodrębniania określonych bitów z niskich 64 bitów pierwszego argumentu.
Składnia
__m128i _mm_extract_si64(
__m128i Source,
__m128i Descriptor
);
__m128i _mm_extracti_si64(
__m128i Source,
int Length,
int Index
);
Parametry
Source
[in] Pole 128-bitowe z danymi wejściowymi w niższych 64 bitach.
Deskryptora
[in] Pole 128-bitowe opisujące pole bitowe do wyodrębnienia.
Długość
[in] Liczba całkowita określająca długość pola do wyodrębnienia.
Indeks
[in] Liczba całkowita określająca indeks pola do wyodrębnienia
Wartość zwracana
Pole 128-bitowe z wyodrębnionym polem w jego najmniej znaczących bitach.
Wymagania
Nieodłączny | Architektura |
---|---|
_mm_extract_si64 |
SSE4a |
_mm_extracti_si64 |
SSE4a |
Plik<nagłówka intrin.h>
Uwagi
Te funkcje wewnętrzne generują instrukcję extrq
wyodrębniania bitów ze źródła. Istnieją dwie wersje: _mm_extracti_si64
jest wersją natychmiastową i _mm_extract_si64
nie jest natychmiastowa. Każda wersja wyodrębnia pole bitowe ze źródła zdefiniowane przez jego długość i indeks najmniejszego znaczącego bitu. Wartości długości i indeksu są pobierane mod 64, więc obie wartości -1 i 127 są interpretowane jako 63. Jeśli suma (zmniejszona) indeksu i (zmniejszona) długość pola jest większa niż 64, wyniki są niezdefiniowane. Wartość zero dla długości pola jest interpretowana jako 64. Jeśli długość pola i indeks bitowy są zerowe, wyodrębniane są bity 63:0 źródła . Jeśli długość pola wynosi zero, ale indeks bitowy jest inny niż zero, wyniki są niezdefiniowane.
W wywołaniu metody _mm_extract_si64
deskryptor zawiera indeks w bitach 13:8 i długość pola danych do wyodrębnienia w bitach 5:0.
Jeśli wywołasz metodę _mm_extracti_si64
z argumentami, których kompilator nie może określić jako stałe całkowite, kompilator generuje kod, aby spakować te wartości do rejestru XMM (deskryptora) i wywołania metody _mm_extract_si64
.
Aby określić obsługę sprzętu extrq
instrukcji, wywołaj __cpuid
funkcję wewnętrzną za pomocą InfoType=0x80000001
polecenia i sprawdź bit 6 z CPUInfo[2] (ECX)
. Ten bit będzie mieć wartość 1, jeśli instrukcja jest obsługiwana, a w przeciwnym razie 0. Jeśli uruchamiasz kod korzystający z tego wewnętrznego sprzętu, który nie obsługuje extrq
instrukcji, wyniki są nieprzewidywalne.
Przykład
// 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
END Microsoft Specific
Części Copyright 2007 firmy Advanced Micro Devices, Inc. Wszelkie prawa zastrzeżone. Odtworzony z uprawnieniami firmy Advanced Micro Devices, Inc.
Zobacz też
_mm_insert_si64, _mm_inserti_si64
Funkcje wewnętrzne kompilatora