_mm_extract_si64、_mm_extracti_si64
Microsoft 专用
生成从第一个参数的低 64 位中提取指定位的 extrq
指令。
语法
__m128i _mm_extract_si64(
__m128i Source,
__m128i Descriptor
);
__m128i _mm_extracti_si64(
__m128i Source,
int Length,
int Index
);
参数
Source
[in] 一个 128 位字段,其输入数据位于较低的 64 位。
描述符
[in] 描述要提取的位字段的 128 位字段。
长度
[in] 一个整数,指定要提取的字段的长度。
Index
[in] 一个整数,指定要提取的索引的长度。
返回值
一个 128 位字段,其中提取的字段位于其最小有效位中。
要求
Intrinsic | 体系结构 |
---|---|
_mm_extract_si64 |
SSE4a |
_mm_extracti_si64 |
SSE4a |
头文件<intrin.h>
注解
这些内部函数生成从源中提取位的 extrq
指令。 有两个版本:_mm_extracti_si64
是即时版本,_mm_extract_si64
是非即时版本。 每个版本从源中提取一个位字段,该字段由其长度和最小有效位的索引定义。 长度和索引的值取 mod 64,因此 -1 和 127 都解释为 63。 如果(缩小的)索引和(减少的)字段长度之和大于 64,则结果未定义。 字段长度的零值被解释为 64。 如果字段长度和位索引均为零,则提取源的位 63:0。 如果字段长度为零,但位索引不为零,则结果未定义。
在调用 _mm_extract_si64
中,描述符包含位为 13:8 的索引,以及要以位 5:0 提取的数据的字段长度。
如果使用编译器无法确定为整数常量的参数调用 _mm_extracti_si64
,则编译器将生成代码以将这些值打包到 XMM 寄存器(描述符)中并调用 _mm_extract_si64
。
若要确定 extrq
指令的硬件支持,请调用具有 InfoType=0x80000001
的 __cpuid
内部函数,并检查 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
结束 Microsoft 专用
超威半导体公司保留 2007 部分版权。 经超威半导体公司许可转载