1 #ifndef _MEMCHR_SSE2_H_
2 #define _MEMCHR_SSE2_H_ "$Id: memchrSSE2.h 316 2020-03-26 16:18:40Z geoff $"
24 #define _memchr_bsf(x) (_BitScanForward(&x, x), x)
26 #include <xmmintrin.h>
27 #define _memchr_bsf(x) __builtin_ctz(x)
30 inline void *
memchrSSE2(
const void *ptr,
int c,
size_t len)
32 const char *p =
reinterpret_cast<const char*
>(ptr);
34 __m128i c16 = _mm_set1_epi8(
static_cast<char>(c));
36 size_t ip =
reinterpret_cast<size_t>(p);
40 __m128i x = *(
const __m128i*)ip;
41 __m128i a = _mm_cmpeq_epi8(x, c16);
42 unsigned long mask = _mm_movemask_epi8(a);
43 mask &= 0xffffffffUL << n;
52 __m128i x = *(
const __m128i*)&p[0];
53 __m128i y = *(
const __m128i*)&p[16];
54 __m128i a = _mm_cmpeq_epi8(x, c16);
55 __m128i b = _mm_cmpeq_epi8(y, c16);
56 unsigned long mask = (_mm_movemask_epi8(b) << 16) | _mm_movemask_epi8(a);
65 if (*p == c)
return (
void*)p;
74 const char *
const top = p;
75 __m128i c16 = _mm_set1_epi8(0);
77 size_t ip =
reinterpret_cast<size_t>(p);
81 __m128i x = *(
const __m128i*)ip;
82 __m128i a = _mm_cmpeq_epi8(x, c16);
83 unsigned long mask = _mm_movemask_epi8(a);
84 mask &= 0xffffffffUL << n;
93 assert((
reinterpret_cast<size_t>(p) & 15) == 0);
94 if (
reinterpret_cast<size_t>(p) & 31) {
95 __m128i x = *(
const __m128i*)&p[0];
96 __m128i a = _mm_cmpeq_epi8(x, c16);
97 unsigned long mask = _mm_movemask_epi8(a);
103 assert((
reinterpret_cast<size_t>(p) & 31) == 0);
105 __m128i x = *(
const __m128i*)&p[0];
106 __m128i y = *(
const __m128i*)&p[16];
107 __m128i a = _mm_cmpeq_epi8(x, c16);
108 __m128i b = _mm_cmpeq_epi8(y, c16);
109 unsigned long mask = (_mm_movemask_epi8(b) << 16) | _mm_movemask_epi8(a);