19#if (defined(__AVX2__) || defined(__SSE2__)) && !defined(CSV_NO_SIMD)
26# define CSV_TZCNT32(x) _tzcnt_u32(x)
28# define CSV_TZCNT32(x) static_cast<unsigned>(__builtin_ctz(x))
46#if defined(__AVX2__) && !defined(CSV_NO_SIMD)
47 v_delim = _mm256_set1_epi8(delimiter);
48 v_quote = _mm256_set1_epi8(quote_char);
49 v_lf = _mm256_set1_epi8(
'\n');
50 v_cr = _mm256_set1_epi8(
'\r');
51#elif defined(__SSE2__) && !defined(CSV_NO_SIMD)
52 v_delim = _mm_set1_epi8(delimiter);
53 v_quote = _mm_set1_epi8(quote_char);
54 v_lf = _mm_set1_epi8(
'\n');
55 v_cr = _mm_set1_epi8(
'\r');
57 (void)delimiter; (void)quote_char;
61#if defined(__AVX2__) && !defined(CSV_NO_SIMD)
62 __m256i v_delim, v_quote, v_lf, v_cr;
63#elif defined(__SSE2__) && !defined(CSV_NO_SIMD)
64 __m128i v_delim, v_quote, v_lf, v_cr;
80 inline size_t find_next_non_special(
86#if defined(__AVX2__) && !defined(CSV_NO_SIMD)
87 while (pos + 32 <= data.size()) {
88 __m256i bytes = _mm256_loadu_si256(
reinterpret_cast<const __m256i*
>(data.data() + pos));
89 __m256i special = _mm256_cmpeq_epi8(bytes, sentinels.v_delim);
90 special = _mm256_or_si256(special, _mm256_cmpeq_epi8(bytes, sentinels.v_quote));
91 special = _mm256_or_si256(special, _mm256_cmpeq_epi8(bytes, sentinels.v_lf));
92 special = _mm256_or_si256(special, _mm256_cmpeq_epi8(bytes, sentinels.v_cr));
93 int mask = _mm256_movemask_epi8(special);
96 return pos + CSV_TZCNT32(
static_cast<unsigned>(mask));
99#elif defined(__SSE2__) && !defined(CSV_NO_SIMD)
100 while (pos + 16 <= data.size()) {
101 __m128i bytes = _mm_loadu_si128(
reinterpret_cast<const __m128i*
>(data.data() + pos));
102 __m128i special = _mm_cmpeq_epi8(bytes, sentinels.v_delim);
103 special = _mm_or_si128(special, _mm_cmpeq_epi8(bytes, sentinels.v_quote));
104 special = _mm_or_si128(special, _mm_cmpeq_epi8(bytes, sentinels.v_lf));
105 special = _mm_or_si128(special, _mm_cmpeq_epi8(bytes, sentinels.v_cr));
106 int mask = _mm_movemask_epi8(special);
109 return pos + CSV_TZCNT32(
static_cast<unsigned>(mask));
113 (void)data; (void)sentinels;
A standalone header file containing shared code.
The all encompassing namespace.
nonstd::string_view string_view
The string_view class used by this library.