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.