_mm_clmulepi64_si128
[本文档仅供预览,并可能在以后的版本中更改。 Blank topics are included as placeholders.]
Microsoft 专用
发出命令 pclmulqdq。 此命令执行两个 64 位整数的乘法。 乘法不计算移位。
__m128i _mm_clmulepi64_si128 (
__m128i v1,
__m128i v2,
const int imm8
);
参数
Parameter |
说明 |
[in] v1 |
MULTIPLY 的第一个参数。 |
[in] v2 |
MULTIPLY 的第二个参数。 |
[in] imm8 |
指示的常数使用的输入参数的哪些部分作为操作数。 |
返回值
该产品通过乘以 64 位 v1 和 64 位计算 v2。
要求
内部 |
体系结构 |
_mm_clmulepi64_si128 |
x86, x64 |
头文件wmmintrin.h
备注
使用下表来确定哪些一半 v1 和 v2 用于计算该产品。
bit 的 4 imm8 |
bit 的 0 imm8 |
产品 |
---|---|---|
0 |
0 |
v1[63:0] * v2[63:0] |
0 |
1 |
v1[127:64] * v2[63:0] |
1 |
0 |
v1[63:0] * v2[127:64] |
1 |
1 |
v1[127:64] * v2[127:64] |
示例
#include <wmmintrin.h>
#include <stdio.h>
int main()
{
__m128i a;
__m128i b;
a.m128i_i64[1] = 2;
a.m128i_i64[0] = -1284;
b.m128i_i64[1] = 25;
b.m128i_i64[0] = 65535;
// _mm_clmulepi64_si128 only looks at the least significant bit of each
// hexadecimal integer
const int product1 = 0x11;
const int product2 = 0x00;
const int product3 = 0xF2;
int expect1 = int ( a.m128i_i64[1] * b.m128i_i64[1] );
int expect2 = int ( a.m128i_i64[0] * b.m128i_i64[0] );
int expect3 = int ( a.m128i_i64[0] * b.m128i_i64[1] );
__m128i result1 = _mm_clmulepi64_si128( a, b, product1 );
__m128i result2 = _mm_clmulepi64_si128( a, b, product2 );
__m128i result3 = _mm_clmulepi64_si128( a, b, product3 );
printf_s("%I64d times %I64d without a carry bit: %I64d\n",
a.m128i_i64[1], b.m128i_i64[1], result1.m128i_i64[0]);
printf_s("%I64d times %I64d without a carry bit: %I64d\n",
a.m128i_i64[0], b.m128i_i64[0], result2.m128i_i64[0]);
printf_s("%I64d times %I64d without a carry bit: %I64d\n",
a.m128i_i64[0], b.m128i_i64[1], result3.m128i_i64[0]);
return 0;
}