Du côté de l’AVX512

Le jeu d’instructions AVX512 propose 2 nouvelles instructions permettant de réaliser respectivement

  • 2 produits de polynômes de degré au plus 63 dans \({\mathbb F}_2[x]\)
__m256i _mm256_clmulepi64_epi128 (__m256i b, __m256i c, const int Imm8)
  • 4 produits de polynômes de degré au plus 63 dans \({\mathbb F}_2[x]\)
__m512i _mm512_clmulepi64_epi128 (__m512i b, __m512i c, const int Imm8)

Pour réaliser simultanément les produits \(P(x)Q(x)\) et \(R(x)S(X)\), les polynômes \(P(x)\) et \(Q(x)\) doivent être placés chacun dans l’un des 4 mots \((b_3,b_2,b_1,b_0)\) de 64 bits de la variable b. De même, \(R(x)\) et \(S(x)\) doivent être placés chacun dans l’un des 4 mots \((c_3,c_2,c_1,c_0)\) de 64 bits de la variable c.

   255                  191                  127                  63                   0
   |--------------------|--------------------|--------------------|--------------------|
B: |________B_3_________|________B_2_________|________B_1_________|________B_0_________|
                      192                  128                   64

   255                  191                  127                  63                   0
   |--------------------|--------------------|--------------------|--------------------|
C: |________C_3_________|________C_2_________|________C_1_________|________C_0_________|
                      192                  128                   64

La constante Imm8 permet de spécifier où se trouvent les opérandes à multiplier et le résultat (2 mots de 128 bits) est stocké dans un registre de 256 bits.

  • si imm8=0, l’opération effectuée est \(B_0(x)C_0(x)\) et \(B_2(x)C_2(x)\),
  • si imm8=1, l’opération effectuée est \(B_1(x)C_0(x)\) et \(B_3(x)C_2(x)\),
  • si imm8=16, l’opération effectuée est \(B_0(x)C_1(x)\) et \(B_2(x)C_3(x)\),
  • si imm8=17, l’opération effectuée est \(B_1(x)C_1(x)\) et \(B_3(x)C_3(x)\).

Pour réaliser simultanément 4 produits de polynômes de type \(P_i(x)Q_i(x)\), chaque \(P_i(x)\) devra être placé dans l’un des 8 mots de 64 bits de la variable b et chaque \(Q_i(x)\) devra être placé dans l’un des 8 mots de 64 bits de la variable c.

   511        447        383        319        255        191        127        63         0
   |----------|----------|----------|----------|----------|----------|----------|----------|
B: |___B_7____|____B_6___|____B_5___|____B_4___|___B_3____|____B_2___|____B_1___|____B_0___|
            448        384        320        256        192        128         64

   511        447        383        319        255        191        127        63         0
   |----------|----------|----------|----------|----------|----------|----------|----------|
C: |___C_7____|____C_6___|____C_5___|____C_4___|___C_3____|____C_2___|____C_1___|____C_0___|
            448        384        320        256        192        128         64

La constante Imm8 permet de spécifier où se trouvent les opérandes à multiplier et le résultat (4 mots de 128 bits) est stocké dans un registre de 512 bits.

  • si imm8=0, l’opération effectuée est \(B_0(x)C_0(x)\) , \(B_2(x)C_2(x)\) , \(B_4(x)C_4(x)\) et \(B_6(x)C_6(x)\),
  • si imm8=1, l’opération effectuée est \(B_1(x)C_0(x)\) , \(B_3(x)C_2(x)\) , \(B_5(x)C_4(x)\) et \(B_7(x)C_6(x)\),
  • si imm8=16, l’opération effectuée est \(B_0(x)C_1(x)\), \(B_2(x)C_3(x)\) , \(B_4(x)C_5(x)\) et \(B_6(x)C_7(x)\),
  • si imm8=17, l’opération effectuée est \(B_1(x)C_1(x)\), \(B_3(x)C_3(x)\) , \(B_5(x)C_5(x)\) et \(B_7(x)C_7(x)\).