2017-02-02 3 views
2

내 응용 프로그램에서 빠른 갈루아 필드 연산을 수행해야합니다. 내 플랫폼, MSP430 마이크로 컨트롤러에 최적화 된 어셈블리로 작성된 곱셈 함수가 있습니다. 이 함수는 두 개의 큰 임의의 크기의 곱을 계산하지만 각 숫자는 16 비트 정수의 배열로 표시되어야합니다. 그러나, 내 프로젝트에서 갈로아 필드 요소는 16 64 비트 정수의 배열로 표현됩니다. 16 비트 64 비트 정수 배열을 최적화 된 어셈블리 기반 곱셈 함수 (즉, 64 비트 정수 배열)에 필요한 표현으로 변환하려면 어떻게해야합니까? 물론 단순히 배열을 (UInt16 *)으로 캐스팅하지 않아도됩니다.다중 정밀도 곱셈을 수행하기 위해 UInt64 배열을 UInt16 배열로 변환하려면 어떻게해야합니까?

MSP430은 리틀 엔디안 아키텍처입니다. 제안에 대해 미리 감사드립니다.

+0

비트 이동 및 마스킹을 사용하십시오. –

+1

의도 한 것이 분명하지 않습니다. 어쨌든 64 비트 정수가 있다면 컴파일러에 맡기지 않으시겠습니까? – Olaf

+1

리틀 엔디안 머신에서는'uint64 []'의 내용을'memcpy()'로'uint16 []'로 간단히 지정할 수 있습니다. – EOF

답변

0

는 단순히 캐스트 uint16_t의 배열로서 uint64_t의 배열의 바이트를 재 해석 할 수 있었다. 어떤 이유로, 바이트를 어떻게 든 재 배열해야한다고 생각했지만 테스트를 마친 후에 올바른 결과를 얻고 있습니다. 다른 관련이없는 문제로 인해 처음에는이 기능이 작동하지 않았습니다.

0

이것이 원하는 것이고이 솔루션이 불완전하다는 점이 확실하지 않습니다. 단지 예제로만 사용됩니다. 또한 매우 플랫폼 의존성이 높습니다. 내 컴퓨터에서 작동합니다 (little_endian). 나는 Code : Blocks를 윈도우 아래에서 사용하고있다. @JohnBollinger에서 언급 한 바와 같이

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