aboutsummaryrefslogtreecommitdiff
path: root/strutil.cc
diff options
context:
space:
mode:
authorShinichiro Hamaji <shinichiro.hamaji@gmail.com>2016-02-17 17:32:20 +0900
committerShinichiro Hamaji <shinichiro.hamaji@gmail.com>2016-02-17 17:32:20 +0900
commitad21a4541aeb75a6ef6221cd1a97d41e0bc95ce7 (patch)
tree51e7057b794cbbfab83888c25275c1f0a9b7552d /strutil.cc
parent92a4738218523292a0cec0310023eed194025f24 (diff)
downloadkati-ad21a4541aeb75a6ef6221cd1a97d41e0bc95ce7.tar.gz
[C++] Use SSE 4.2 in FindEndOfLine
Diffstat (limited to 'strutil.cc')
-rw-r--r--strutil.cc25
1 files changed, 25 insertions, 0 deletions
diff --git a/strutil.cc b/strutil.cc
index 652d977..bcef302 100644
--- a/strutil.cc
+++ b/strutil.cc
@@ -423,6 +423,30 @@ size_t FindThreeOutsideParen(StringPiece s, char c1, char c2, char c3) {
}
size_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt) {
+#ifdef __SSE4_2__
+ static const char ranges[] = "\n\n\\\\";
+ while (e < s.size()) {
+ e += SkipUntilSSE42(s.data() + e, s.size() - e, ranges, 4);
+ char c = s[e];
+ if (c == '\\') {
+ if (s[e+1] == '\n') {
+ e += 2;
+ ++*lf_cnt;
+ } else if (s[e+1] == '\r' && s[e+2] == '\n') {
+ e += 3;
+ ++*lf_cnt;
+ } else if (s[e+1] == '\\') {
+ e += 2;
+ } else {
+ e++;
+ }
+ } else if (c == '\n') {
+ ++*lf_cnt;
+ return e;
+ }
+ }
+ return e;
+#else
bool prev_backslash = false;
for (; e < s.size(); e++) {
char c = s[e];
@@ -439,6 +463,7 @@ size_t FindEndOfLine(StringPiece s, size_t e, size_t* lf_cnt) {
}
}
return e;
+#endif
}
StringPiece TrimLeadingCurdir(StringPiece s) {