diff options
| author | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2016-02-17 17:32:20 +0900 |
|---|---|---|
| committer | Shinichiro Hamaji <shinichiro.hamaji@gmail.com> | 2016-02-17 17:32:20 +0900 |
| commit | ad21a4541aeb75a6ef6221cd1a97d41e0bc95ce7 (patch) | |
| tree | 51e7057b794cbbfab83888c25275c1f0a9b7552d | |
| parent | 92a4738218523292a0cec0310023eed194025f24 (diff) | |
| download | platform_build_kati-ad21a4541aeb75a6ef6221cd1a97d41e0bc95ce7.tar.gz platform_build_kati-ad21a4541aeb75a6ef6221cd1a97d41e0bc95ce7.tar.bz2 platform_build_kati-ad21a4541aeb75a6ef6221cd1a97d41e0bc95ce7.zip | |
[C++] Use SSE 4.2 in FindEndOfLine
| -rw-r--r-- | strutil.cc | 25 |
1 files changed, 25 insertions, 0 deletions
@@ -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) { |
