_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 部分版权。 经超威半导体公司许可转载

另请参阅

_mm_insert_si64, _mm_inserti_si64
编译器内部函数