_mm_extract_si64,_mm_extracti_si64
Microsoft 特定的
產生指令, extrq
從第一個引數的低 64 位擷取指定的位。
語法
__m128i _mm_extract_si64(
__m128i Source,
__m128i Descriptor
);
__m128i _mm_extracti_si64(
__m128i Source,
int Length,
int Index
);
參數
來源
[in]128 位欄位,其輸入資料位於較低的 64 位。
描述 符
[in]描述要擷取之位欄位的 128 位欄位。
長度
[in]整數,指定要擷取的欄位長度。
Index
[in]整數,指定要擷取之欄位的索引
傳回值
具有最不重要位中擷取欄位的 128 位欄位。
需求
內建 | 架構 |
---|---|
_mm_extract_si64 |
SSE4a |
_mm_extracti_si64 |
SSE4a |
標頭檔 < intrin.h>
備註
這些內建函式會產生 extrq
從 Source 擷取位的 指令。 有兩個版本: _mm_extracti_si64
是立即版本,而且 _mm_extract_si64
是非立即版本。 每個版本都會從 Source 擷取其長度和最小有效位的索引所定義的位欄位。 長度和索引的值會採用 mod 64,因此 -1 和 127 都會解譯為 63。 如果 (縮減) 索引和 (縮減) 欄位長度的總和大於 64,則結果會未定義。 欄位長度的零值會解譯為 64。 如果欄位長度和位索引都是零,則會擷取 Source 的 位 63:0。 如果欄位長度為零,但位索引為非零,則結果為未定義。
在 對 的呼叫 _mm_extract_si64
中 ,描述元 包含位 13:8 中的索引,以及要以位 5:0 擷取之資料的欄位長度。
如果您使用編譯器無法判斷為整數常數的引數進行呼叫 _mm_extracti_si64
,編譯器會產生程式碼,以將這些值封裝到 XMM 暫存器 ( 描述元 ),並呼叫 _mm_extract_si64
。
若要判斷指令的硬體支援 extrq
,請使用 呼叫 __cpuid
內建函式, InfoType=0x80000001
並檢查 的 CPUInfo[2] (ECX)
位 6。 如果支援指令,則此位會是 1,否則為 0。 如果您執行的程式碼會使用此不支援指示的內部硬體 extrq
,則結果無法預測。
範例
// 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 特定的
部分著作權 2007 由 Advanced Micro Devices, Inc.保留擁有權利。 由 Advanced Micro Devices, Inc. 的許可權重現。
另請參閱
意見反映
https://aka.ms/ContentUserFeedback。
即將推出:我們會在 2024 年淘汰 GitHub 問題,並以全新的意見反應系統取代並作為內容意見反應的渠道。 如需更多資訊,請參閱:提交及檢視以下的意見反映: