Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1204)

Unified Diff: runtime/vm/intermediate_language.cc

Issue 12775009: Optimize TypedData operators [] and []= in the same way as ScalarList. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: fixed x64 build and MethodRecognizer Created 7 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/intermediate_language.cc
===================================================================
--- runtime/vm/intermediate_language.cc (revision 19943)
+++ runtime/vm/intermediate_language.cc (working copy)
@@ -271,6 +271,7 @@
// List of libraries where methods can be recognized.
return (library.raw() == Library::CoreLibrary())
|| (library.raw() == Library::MathLibrary())
+ || (library.raw() == Library::TypedDataLibrary())
|| (library.raw() == Library::ScalarlistLibrary());
}
@@ -1112,6 +1113,7 @@
case MethodRecognizer::kObjectArrayLength:
case MethodRecognizer::kImmutableArrayLength:
case MethodRecognizer::kByteArrayBaseLength:
+ case MethodRecognizer::kTypedDataLength:
case MethodRecognizer::kStringBaseLength:
return true;
default:
@@ -1122,6 +1124,10 @@
MethodRecognizer::Kind LoadFieldInstr::RecognizedKindFromArrayCid(
intptr_t cid) {
+ if (RawObject::IsTypedDataClassId(cid) ||
+ RawObject::IsExternalTypedDataClassId(cid)) {
+ return MethodRecognizer::kTypedDataLength;
+ }
switch (cid) {
case kArrayCid:
return MethodRecognizer::kObjectArrayLength;
@@ -1924,7 +1930,8 @@
return;
}
if ((range_ == NULL) &&
- (recognized_kind() == MethodRecognizer::kByteArrayBaseLength)) {
+ (recognized_kind() == MethodRecognizer::kByteArrayBaseLength ||
+ recognized_kind() == MethodRecognizer::kTypedDataLength)) {
range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
return;
}
@@ -1942,6 +1949,7 @@
void LoadIndexedInstr::InferRange() {
switch (class_id()) {
case kInt8ArrayCid:
+ case kTypedDataInt8ArrayCid:
range_ = new Range(RangeBoundary::FromConstant(-128),
RangeBoundary::FromConstant(127));
break;
@@ -1949,14 +1957,21 @@
case kUint8ClampedArrayCid:
case kExternalUint8ArrayCid:
case kExternalUint8ClampedArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+
Kevin Millikin (Google) 2013/03/14 10:09:12 There's an extra blank line here.
Florian Schneider 2013/03/14 14:03:09 Done.
range_ = new Range(RangeBoundary::FromConstant(0),
RangeBoundary::FromConstant(255));
break;
case kInt16ArrayCid:
+ case kTypedDataInt16ArrayCid:
range_ = new Range(RangeBoundary::FromConstant(-32768),
RangeBoundary::FromConstant(32767));
break;
case kUint16ArrayCid:
+ case kTypedDataUint16ArrayCid:
range_ = new Range(RangeBoundary::FromConstant(0),
RangeBoundary::FromConstant(65535));
break;
@@ -2190,6 +2205,12 @@
intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) {
+ if (RawObject::IsExternalTypedDataClassId(class_id)) {
+ return ExternalTypedData::length_offset();
+ }
+ if (RawObject::IsTypedDataClassId(class_id)) {
+ return TypedData::length_offset();
+ }
switch (class_id) {
case kGrowableObjectArrayCid:
return GrowableObjectArray::length_offset();

Powered by Google App Engine
This is Rietveld 408576698