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