Share via


_mm_clmulepi64_si128

[Cette documentation constitue un aperçu et peut faire l'objet de modifications avec les versions ultérieures. Blank topics are included as placeholders.]

Spécifique à Microsoft

émet le **pclmulqdq d'**instruction. Cette instruction effectue une multiplication de deux entiers 64 bits. La multiplication ne calcule pas un bit pour distribuer.

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

Paramètres

Paramètre

Description

[in] v1

Le premier paramètre en multiplier.

[in] v2

Le deuxième paramètre à multiplier.

[in] imm8

Une constante qui indique les parties des paramètres d'entrée à utiliser comme opérandes.

Valeur de retour

Le produit a calculé en multipliant 64 bits d' v1 et 64 bits de v2.

Configuration requise

Intrinsèque

Architecture

_mm_clmulepi64_si128

x86, x64

fichier d'en-tête <wmmintrin.h>

Notes

Utilisez le tableau suivant pour déterminer les parties d' v1 et d' v2 sont utilisées pour calculer le produit.

Les plateformes 4 bits d' imm8

Les plateformes 0 bits d' imm8

Produit

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]

Exemple

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

Voir aussi

Référence

intrinsèques du compilateur