Reviewers: Christian Plesner Hansen,

Message:
Small review, please.

Description:
Optimization of single character indexOf. Gives small improvement on
GCC4.2, but large improvement on GCC 4.3 (which was much worse on that
particular code).

Please review this at http://codereview.chromium.org/13045

Affected files:
   M src/runtime.cc


Index: src/runtime.cc
diff --git a/src/runtime.cc b/src/runtime.cc
index  
8ff2f8d44e2d0212d1a6a075ff7991cabd666845..5512f8323a99e42769fff93167d07ce64693fec0
  
100644
--- a/src/runtime.cc
+++ b/src/runtime.cc
@@ -1241,11 +1241,8 @@ static int BoyerMooreIndexOf(Vector<const schar>  
subject,

  template <typename schar>
  static int SingleCharIndexOf(Vector<const schar> string,
-                             uc16 pattern_char,
+                             schar pattern_char,
                               int start_index) {
-  if (sizeof(schar) == 1 && pattern_char > String::kMaxAsciiCharCode) {
-    return -1;
-  }
    for (int i = start_index, n = string.length(); i < n; i++) {
      if (pattern_char == string[i]) {
        return i;
@@ -1380,9 +1377,19 @@ int Runtime::StringMatch(Handle<String> sub,
    if (pattern_length == 1) {
      AssertNoAllocation no_heap_allocation;  // ensure vectors stay valid
      if (sub_shape.IsAsciiRepresentation()) {
-      return SingleCharIndexOf(sub->ToAsciiVector(),
-                               pat->Get(pat_shape, 0),
-                               start_index);
+      uc16 pchar = pat->Get(pat_shape, 0);
+      if (pchar > String::kMaxAsciiCharCode) {
+        return -1;
+      }
+      Vector<const char> ascii_vector =
+        sub->ToAsciiVector().SubVector(start_index, subject_length);
+      void* pos = memchr(ascii_vector.start(),
+                         static_cast<const char>(pchar),
+                         static_cast<size_t>(ascii_vector.length()));
+      if (pos == NULL) {
+        return -1;
+      }
+      return reinterpret_cast<char*>(pos) - ascii_vector.start() +  
start_index;
      }
      return SingleCharIndexOf(sub->ToUC16Vector(),
                               pat->Get(pat_shape, 0),



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to