Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- uintptr_t LineOffsets(const char* source, uintptr_t size, uint32_t* buffer)
- {
- const __m128i crvec = _mm_set1_epi8('\r');
- const __m128i nlvec = _mm_set1_epi8('\n');
- uintptr_t bufferOffset = 0;
- for (uintptr_t offset = 0; offset < size;)
- {
- __m128i srcvec = _mm_loadu_si128((const __m128i*)(source + offset));
- uint32_t crmask = _mm_movemask_epi8(_mm_cmpeq_epi8(srcvec, crvec));
- uint32_t nlmask = _mm_movemask_epi8(_mm_cmpeq_epi8(srcvec, nlvec));
- uint32_t mask = (nlmask | ((crmask << 1) & ~nlmask) >> 1) << 1;
- for (uintptr_t i = 0; i < 15; ++i)
- buffer[bufferOffset + i] = offset + _tzcnt_u32(_pdep_u32(1 << i, mask));
- bufferOffset += _popcnt32(mask);
- offset += 15;
- }
- return bufferOffset;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement