aboutsummaryrefslogtreecommitdiff
path: root/src/lexer-sse4_1.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer-sse4_1.c')
-rw-r--r--src/lexer-sse4_1.c43
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;
+}