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