@@ -261,14 +261,6 @@ static size_t find_byte(const T* data, size_t start, size_t end, T byte) {
261261 return (T*)p - data;
262262}
263263
264- template <typename T>
265- bool contain_byte (const T* __restrict data, const size_t length, const signed char byte) {
266- if (length == 0 ) {
267- return false ;
268- }
269- return nullptr != std::memchr (reinterpret_cast <const void *>(data), byte, length);
270- }
271-
272264inline size_t find_one (const std::vector<uint8_t >& vec, size_t start) {
273265 return find_byte<uint8_t >(vec, start, 1 );
274266}
@@ -281,5 +273,58 @@ inline size_t find_zero(const std::vector<uint8_t>& vec, size_t start) {
281273 return find_byte<uint8_t >(vec, start, 0 );
282274}
283275
276+ inline bool contain_one (const uint8_t * __restrict data, size_t size) {
277+ size_t i = 0 ;
278+ #if defined(__AVX2__)
279+ for (; i + 32 <= size; i += 32 ) {
280+ __m256i chunk = _mm256_loadu_si256 (reinterpret_cast <const __m256i*>(data + i));
281+ if (!_mm256_testz_si256 (chunk, chunk)) {
282+ return true ;
283+ }
284+ }
285+ #elif defined(__SSE2__)
286+ const __m128i zero = _mm_setzero_si128 ();
287+ for (; i + 16 <= size; i += 16 ) {
288+ __m128i chunk = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(data + i));
289+ if (_mm_movemask_epi8 (_mm_cmpeq_epi8 (chunk, zero)) != 0xFFFF ) {
290+ return true ;
291+ }
292+ }
293+ #endif
294+ for (; i < size; ++i) {
295+ if (data[i]) {
296+ return true ;
297+ }
298+ }
299+ return false ;
300+ }
301+
302+ inline bool contain_zero (const uint8_t * __restrict data, size_t size) {
303+ size_t i = 0 ;
304+ #if defined(__AVX2__)
305+ const __m256i zero = _mm256_setzero_si256 ();
306+ for (; i + 32 <= size; i += 32 ) {
307+ __m256i chunk = _mm256_loadu_si256 (reinterpret_cast <const __m256i*>(data + i));
308+ if (_mm256_movemask_epi8 (_mm256_cmpeq_epi8 (chunk, zero)) != 0 ) {
309+ return true ;
310+ }
311+ }
312+ #elif defined(__SSE2__)
313+ const __m128i zero = _mm_setzero_si128 ();
314+ for (; i + 16 <= size; i += 16 ) {
315+ __m128i chunk = _mm_loadu_si128 (reinterpret_cast <const __m128i*>(data + i));
316+ if (_mm_movemask_epi8 (_mm_cmpeq_epi8 (chunk, zero)) != 0 ) {
317+ return true ;
318+ }
319+ }
320+ #endif
321+ for (; i < size; ++i) {
322+ if (!data[i]) {
323+ return true ;
324+ }
325+ }
326+ return false ;
327+ }
328+
284329} // namespace doris::simd
285330#include " common/compile_check_end.h"
0 commit comments