Advertisement
Guest User

simd morton encode

a guest
Dec 22nd, 2013
376
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.01 KB | None | 0 0
  1. template<typename T>
  2. void show_binary(const T& a)
  3. {
  4.     const char* beg = reinterpret_cast<const char*>(&a);
  5.     const char* end = beg + sizeof(a);
  6.     while(beg != end)
  7.         std::cout << std::bitset<CHAR_BIT>(*beg++) << ' ';
  8.     std::cout << std::endl;
  9. }
  10.  
  11. static uint32_t encode_morton(int x, int y) {
  12.     static const __m128i SB[] = {
  13.         _mm_set1_epi32(0x55555555),
  14.         _mm_set1_epi32(0x33333333),
  15.         _mm_set1_epi32(0x0F0F0F0F),
  16.         _mm_set1_epi32(0x00FF00FF)
  17.     };
  18.     const __m128i x_bit1 = _mm_set1_epi32( x );
  19.     const __m128i y_bit1 = _mm_set1_epi32( y );
  20.     const __m128i shf_x1 = _mm_slli_epi32(x_bit1, S[3]);
  21.     const __m128i shf_y1 = _mm_slli_epi32(x_bit1, S[3]);
  22.     const __m128i and_x1 =  _mm_and_si128(shf_x1, SB[3]);
  23.     const __m128i and_y1 =  _mm_and_si128(shf_y1, SB[3]);
  24.     const __m128i x_bit2 =   _mm_or_si128(x_bit1, and_x1);
  25.     const __m128i y_bit2 =   _mm_or_si128(y_bit1, and_y1);
  26.     const __m128i shf_x2 = _mm_slli_epi32(x_bit2, S[2]);
  27.     const __m128i shf_y2 = _mm_slli_epi32(y_bit2, S[2]);
  28.     const __m128i and_x2 =  _mm_and_si128(shf_x2, SB[2]);
  29.     const __m128i and_y2 =  _mm_and_si128(shf_y2, SB[2]);
  30.     const __m128i x_bit3 =   _mm_or_si128(x_bit2, and_x2);
  31.     const __m128i y_bit3 =   _mm_or_si128(y_bit2, and_y2);
  32.     const __m128i shf_x3 = _mm_slli_epi32(x_bit3, S[1]);
  33.     const __m128i shf_y3 = _mm_slli_epi32(y_bit3, S[1]);
  34.     const __m128i and_x3 =  _mm_and_si128(shf_x3, SB[1]);
  35.     const __m128i and_y3 =  _mm_and_si128(shf_y3, SB[1]);
  36.     const __m128i x_bit4 =   _mm_or_si128(x_bit3, and_x3);
  37.     const __m128i y_bit4 =   _mm_or_si128(y_bit3, and_y3);
  38.     const __m128i shf_x4 = _mm_slli_epi32(x_bit4, S[0]);
  39.     const __m128i shf_y4 = _mm_slli_epi32(y_bit4, S[0]);
  40.     const __m128i and_x4 =  _mm_and_si128(shf_x4, SB[0]);
  41.     const __m128i and_y4 =  _mm_and_si128(shf_y4, SB[0]);
  42.     const __m128i x_bit5 =   _mm_or_si128(x_bit4, and_x4);
  43.     const __m128i y_bit5 =   _mm_or_si128(y_bit4, and_y4);
  44.     const __m128i morton =   _mm_or_si128(x_bit5, _mm_slli_epi32(y_bit5,1));
  45.  
  46.     show_binary(morton);
  47.     return (((uint32_t*)&morton)[0]);
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement