Reviewers: Dmitry Lomov (chromium),

Message:
PTAL

Description:
Optimize typed-array length loading.

Please review this at https://chromiumcodereview.appspot.com/23484060/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+36, -6 lines):
  M src/hydrogen-instructions.h
  M src/hydrogen.h
  M src/hydrogen.cc
  M src/ic.cc


Index: src/hydrogen-instructions.h
diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
index 5128ed32809ed0b56ac8b86aa600ead77a3a5ba1..5b91bb588887e821364ba63c5115867215c5eab3 100644
--- a/src/hydrogen-instructions.h
+++ b/src/hydrogen-instructions.h
@@ -5670,6 +5670,13 @@ class HObjectAccess V8_FINAL {
                 ? Representation::Smi() : Representation::Tagged());
   }

+  static HObjectAccess ForTypedArrayLength() {
+    return HObjectAccess(
+        kInobject,
+        JSTypedArray::kLengthOffset,
+        Representation::Tagged());
+  }
+
   static HObjectAccess ForAllocationSiteTransitionInfo() {
     return HObjectAccess(kInobject, AllocationSite::kTransitionInfoOffset);
   }
Index: src/hydrogen.cc
diff --git a/src/hydrogen.cc b/src/hydrogen.cc
index 824a3cd9dbf850cfa6e25ec255b81d9301d6d573..b5cebbe327e10f9612bfd8cdee581ed7fc80b0d2 100644
--- a/src/hydrogen.cc
+++ b/src/hydrogen.cc
@@ -4630,6 +4630,13 @@ bool HOptimizedGraphBuilder::PropertyAccessInfo::CanLoadAsMonomorphic(
     return true;
   }

+  if (IsTypedArrayLength()) {
+    for (int i = 1; i < types->length(); ++i) {
+ if (types->at(i)->instance_type() != JS_TYPED_ARRAY_TYPE) return false;
+    }
+    return true;
+  }
+
   for (int i = 1; i < types->length(); ++i) {
     PropertyAccessInfo test_info(isolate(), types->at(i), name_);
     if (!test_info.IsCompatibleForLoad(this)) return false;
@@ -4657,6 +4664,11 @@ HInstruction* HOptimizedGraphBuilder::BuildLoadMonomorphic(
             info->map()->elements_kind()));
   }

+  if (info->IsTypedArrayLength()) {
+    return New<HLoadNamedField>(
+        checked_object, HObjectAccess::ForTypedArrayLength());
+  }
+
   HValue* checked_holder = checked_object;
   if (info->has_holder()) {
     Handle<JSObject> prototype(JSObject::cast(info->map()->prototype()));
Index: src/hydrogen.h
diff --git a/src/hydrogen.h b/src/hydrogen.h
index 7516e9c55e6f4cc729db665f68024e6107317124..50e22f5287ac83001e5f024b2bffeeaacac7a780 100644
--- a/src/hydrogen.h
+++ b/src/hydrogen.h
@@ -1982,6 +1982,11 @@ class HOptimizedGraphBuilder V8_FINAL
           name_->Equals(isolate()->heap()->length_string());
     }

+    bool IsTypedArrayLength() {
+      return map_->instance_type() == JS_TYPED_ARRAY_TYPE &&
+          name_->Equals(isolate()->heap()->length_string());
+    }
+
     bool has_holder() { return !holder_.is_null(); }

     LookupResult* lookup() { return &lookup_; }
Index: src/ic.cc
diff --git a/src/ic.cc b/src/ic.cc
index 163172d8eb4df42e68c395c528f1864fb68ca49c..782c5fac12dadb9d4faf0ff976a0bedafe59c8d8 100644
--- a/src/ic.cc
+++ b/src/ic.cc
@@ -1371,12 +1371,18 @@ Handle<Code> LoadIC::ComputeLoadHandler(LookupResult* lookup,
         }
         return isolate()->stub_cache()->ComputeLoadViaGetter(
             name, receiver, holder, function);
-      } else if (receiver->IsJSArray() &&
-                 name->Equals(isolate()->heap()->length_string())) {
-        PropertyIndex lengthIndex = PropertyIndex::NewHeaderIndex(
-            JSArray::kLengthOffset / kPointerSize);
-        return isolate()->stub_cache()->ComputeLoadField(
-            name, receiver, holder, lengthIndex, Representation::Tagged());
+      } else if (name->Equals(isolate()->heap()->length_string())) {
+        if (receiver->IsJSArray()) {
+          PropertyIndex lengthIndex = PropertyIndex::NewHeaderIndex(
+              JSArray::kLengthOffset / kPointerSize);
+          return isolate()->stub_cache()->ComputeLoadField(
+ name, receiver, holder, lengthIndex, Representation::Tagged());
+        } else if (receiver->IsJSTypedArray()) {
+          PropertyIndex lengthIndex = PropertyIndex::NewHeaderIndex(
+              JSTypedArray::kLengthOffset / kPointerSize);
+          return isolate()->stub_cache()->ComputeLoadField(
+ name, receiver, holder, lengthIndex, Representation::Tagged());
+        }
       }
       // TODO(dcarney): Handle correctly.
       if (callback->IsDeclaredAccessorInfo()) break;


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to