Advertisement
Guest User

Untitled

a guest
Sep 19th, 2019
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.79 KB | None | 0 0
  1. uintptr_t LineOffsets(const char* source, uintptr_t size, uint32_t* buffer)
  2. {
  3.     const __m128i crvec = _mm_set1_epi8('\r');
  4.     const __m128i nlvec = _mm_set1_epi8('\n');
  5.  
  6.     uintptr_t bufferOffset = 0;
  7.     for (uintptr_t offset = 0; offset < size;)
  8.     {
  9.         __m128i srcvec = _mm_loadu_si128((const __m128i*)(source + offset));
  10.  
  11.         uint32_t crmask = _mm_movemask_epi8(_mm_cmpeq_epi8(srcvec, crvec));
  12.         uint32_t nlmask = _mm_movemask_epi8(_mm_cmpeq_epi8(srcvec, nlvec));
  13.  
  14.         uint32_t mask = (nlmask | ((crmask << 1) & ~nlmask) >> 1) << 1;
  15.  
  16.         for (uintptr_t i = 0; i < 15; ++i)
  17.             buffer[bufferOffset + i] = offset + _tzcnt_u32(_pdep_u32(1 << i, mask));
  18.  
  19.         bufferOffset += _popcnt32(mask);
  20.         offset += 15;
  21.     }
  22.  
  23.     return bufferOffset;
  24. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement