Was this page helpful?
Your feedback about this content is important. Let us know what you think.
Additional feedback?
1500 characters remaining
Export (0) Print
Expand All
Expand Minimize
Important This document may not represent best practices for current development, links to downloads and other resources may no longer be valid. Current recommended version can be found here.

_mm_clmulepi64_si128

Updated: July 2008

Microsoft Specific

Emits the instruction pclmulqdq. This instruction performs a multiplication of two 64-bit integers. The multiplication does not calculate a carry bit.

__m128i _mm_clmulepi64_si128 (
   __m128i v1,
   __m128i v2,
   const int imm8
);

Parameter

Description

[in] v1

The first parameter to multiply.

[in] v2

The second parameter to multiply.

[in] imm8

A constant that indicates which halves of the input parameters to use as operands.

The product calculated by multiplying 64 bits of v1 and 64 bits of v2.

Intrinsic

Architecture

_mm_clmulepi64_si128

x86, x64

Header file <wmmintrin.h>

Use the following table to determine which halves of v1 and v2 are used to calculate the product.

Bit 4 of imm8

Bit 0 of imm8

Product

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;
}
2 times 25 without a carry bit: 50 -1284 times 65535 without a carry bit: 50419284 -1284 times 25 without a carry bit: -32036

Date

History

Reason

July 2008

Added the documentation for this new feature.

SP1 feature change.

Community Additions

ADD
Show:
© 2015 Microsoft