_mm_insert_si64, _mm_inserti_si64

Microsoft 专用

生成 insertq 指令,以将位从其第二个操作数插入到其第一个操作数中。

语法

__m128i _mm_insert_si64(
   __m128i Source1,
   __m128i Source2
);
__m128i _mm_inserti_si64(
   __m128i Source1,
   __m128i Source2
   int Length,
   int Index
);

参数

Source1
[in] 一个 128 位的字段,输入数据在其低 64 位,其中将插入一个字段。

Source2
[in] 一个 128 位字段,其中包含要在其低位中插入的数据。 对于 _mm_insert_si64,还包含其高位的字段描述符。

长度
[in] 一个整数常量,指定要插入的字段的长度。

Index
[in] 一个整数常量,指定要插入数据的字段的最低有效位的索引。

返回值

一个 128 位字段,其较低的 64 位包含原始低 64 位 Source1,指定的位字段替换为 Source2 的低位。 返回值的高 64 位未定义。

要求

Intrinsic 体系结构
_mm_insert_si64 SSE4a
_mm_inserti_si64 SSE4a

头文件<intrin.h>

注解

这些内部函数生成 insertq 指令,用于将来自 Source2 的位插入到 Source1 中。 有两个版本:_mm_inserti_si64 是即时版本,_mm_insert_si64 是非即时版本。 每个版本从 Source2 中提取给定长度的位字段,并将其插入 Source1 中。 提取的位是 Source2 的最低有效位。 将插入这些位的字段 Source1 由其最低有效位的长度和索引定义。 长度和索引的值取 mod 64,因此 -1 和 127 都解释为 63。 如果(缩小的)位索引和(减少的)字段长度之和大于 64,则结果未定义。 字段长度的零值被解释为 64。 如果字段长度和位索引均为零,则将 Source2 的位 63:0 插入到 Source1 中。 如果字段长度为零,但位索引不为零,则结果未定义。

在调用 _mm_insert_si64 时,字段长度包含在 Source2 的 77:72 位中,索引包含在位 69:64 中。

如果使用编译器无法确定为整数常量的参数调用 _mm_inserti_si64,则编译器将生成代码以将这些值打包到 XMM 寄存器中并调用 _mm_insert_si64

若要确定 insertq 指令的硬件支持,请调用具有 InfoType=0x80000001__cpuid 内部函数,并检查 CPUInfo[2] (ECX) 的第 6 位。 如果支持该指令,则此位为 1,否则为 0。 如果在不支持 insertq 指令的硬件上运行使用内部函数的代码,则结果是不可预测的。

示例

// Compile this sample with: /EHsc
#include <iostream>
#include <intrin.h>
using namespace std;

union {
    __m128i m;
    unsigned __int64 ui64[2];
} source1, source2, source3, result1, result2, result3;

int
main()
{

    __int64 mask;

    source1.ui64[0] = 0xffffffffffffffffll;
    source2.ui64[0] = 0xfedcba9876543210ll;
    source2.ui64[1] = 0xc10;
    source3.ui64[0] = source2.ui64[0];

    result1.m = _mm_insert_si64 (source1.m, source2.m);
    result2.m = _mm_inserti_si64(source1.m, source3.m, 16, 12);
    mask = 0xffff << 12;
    mask = ~mask;
    result3.ui64[0] = (source1.ui64[0] & mask) |
                      ((source2.ui64[0] & 0xffff) << 12);

    cout << hex << "result1 = 0x" << result1.ui64[0] << endl;
    cout << "result2 = 0x" << result2.ui64[0] << endl;
    cout << "result3 = 0x" << result3.ui64[0] << endl;

}
result1 = 0xfffffffff3210fff
result2 = 0xfffffffff3210fff
result3 = 0xfffffffff3210fff

结束 Microsoft 专用

超威半导体公司保留 2007 部分版权。 经超威半导体公司许可转载

另请参阅

_mm_extract_si64, _mm_extracti_si64
编译器内部函数