diff options
Diffstat (limited to 'src/lexer-sse4_1.c')
-rw-r--r-- | src/lexer-sse4_1.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/lexer-sse4_1.c b/src/lexer-sse4_1.c new file mode 100644 index 0000000..16df370 --- /dev/null +++ b/src/lexer-sse4_1.c @@ -0,0 +1,43 @@ +#include <stdbool.h> +#include <stddef.h> +#include <x86intrin.h> + +#include "common.h" +#include "types.h" + +#define MIN(x, y) ((x) < (y) ? (x) : (y)) + +bool +skpcmnt(const uchar **ptr, const uchar *end) +{ + int nst = 1; + const uchar *p = *ptr, needles[] = {'/', '*', 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0}; + const __m128i set = _mm_loadu_si128((const __m128i *)needles); + + while (likely(p < end)) { + ptrdiff_t len = end - p; + size_t blksz = MIN(len, 16); + __m128i blk = _mm_loadu_si128((const __m128i *)p); + int off = _mm_cmpestri(set, 2, blk, blksz, _SIDD_CMP_EQUAL_ANY); + + if (off == 16) { + p += 16; + continue; + } + + if (p[off] == '*' && p[off + 1] == '/') { + p += off + 2; + if (--nst == 0) { + *ptr = p; + return true; + } + } else if (p[off] == '/' && p[off + 1] == '*') { + p += off + 2; + nst++; + } else + p += off + 1; + } + + return false; +} |