_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;
}
          
        

请参见

参考

编译器内部函数