2017-02-02 3 views
2

Je dois effectuer une arithmétique de champ Galois rapide dans mon application. J'ai une fonction de multiplication écrite en assembly qui a été optimisée pour ma plateforme, un microcontrôleur MSP430. Cette fonction calcule le produit de deux grands nombres de taille arbitraire, mais chaque nombre doit être représenté comme un tableau d'entiers de 16 bits. Cependant, dans mon projet, un élément de champ Galois est représenté par un tableau de 16 entiers de 64 bits. Comment puis-je convertir ma matrice de 16 entiers de 64 bits en une représentation nécessaire à ma fonction de multiplication optimisée basée sur l'assemblage (c'est-à-dire un tableau de 64 entiers de 16 bits)? Bien sûr, le simple fait de lancer le tableau en tant que (UInt16 *) ne fonctionne pas.Comment convertir un tableau de UInt64 en un tableau de UInt16 pour effectuer une multiplication multi-précision?

Le MSP430 est une architecture little-endian. Merci d'avance pour toute suggestion.

+0

Utiliser le décalage de bits et le masquage. –

+1

Pas clair ce que vous avez l'intention. Si vous avez des entiers de 64 bits de toute façon, pourquoi ne pas laisser cela au compilateur? – Olaf

+1

Sur une machine little-endian, vous pouvez simplement 'memcpy()' le contenu de 'uint64 []' à 'uint16 []'. – EOF

Répondre

0

Comme mentionné par @JohnBollinger j'ai pu réinterpréter simplement les octets du tableau de uint64_t comme un tableau de uint16_t par coulée. Pour une raison quelconque, je pensais que les octets devaient être réorganisés d'une manière ou d'une autre, mais après les tests, j'obtiens les bons résultats. Cela n'a pas fonctionné pour moi d'abord à cause d'autres problèmes indépendants.

0

Je ne suis pas certain si c'est ce que vous voulez et cette solution est incomplète dans le sens où elle sert simplement d'exemple. De plus, il est très fiable sur la plate-forme. Cela fonctionne sur ma machine (little_endian). J'utilise Code: Blocks sous windows.

typedef struct { 
      uint16_t lo_word0; 
      uint16_t hi_word0; 
      uint16_t lo_word1; 
      uint16_t hi_word1; 
       }struct_t; 



    int main() 
    { 
     uint64_t buff_64[4]={0xaaaabbbbccccdddd,0xbbbbccccddddeeee,0x1111222233334444,0x8888aaaabbbbcccc}; 
     uint16_t buff_16[16]; 
     /*Please note that you may use simply: 
     memcpy(buff_16,buff_64,32); 
     however that would result in reverse order 
     with respect to the code below */ 

     struct_t *ptr = (struct_t *)buff_64; 

     for(int j=0; j<16; ptr++) 
     { 
     buff_16[(j++)%16]=ptr->hi_word1; 
     buff_16[(j++)%16]=ptr->lo_word1; 
     buff_16[(j++)%16]=ptr->hi_word0; 
     buff_16[(j++)%16]=ptr->lo_word0; 

     } 
     // The check 
     for(int j=0;j<16;j++) 
     printf("%x\n",buff_16[j]); 

     return 0; 
     }