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

Unified Diff: runtime/vm/flow_graph_optimizer.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/flow_graph_optimizer.cc
===================================================================
--- runtime/vm/flow_graph_optimizer.cc (revision 19943)
+++ runtime/vm/flow_graph_optimizer.cc (working copy)
@@ -716,6 +716,13 @@
case kExternalUint8ClampedArrayCid:
case kInt16ArrayCid:
case kUint16ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
// Check that value is always smi.
value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2);
if ((value_check.NumberOfChecks() != 1) ||
@@ -724,7 +731,9 @@
}
break;
case kInt32ArrayCid:
- case kUint32ArrayCid: {
+ case kUint32ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid: {
if (!CanUnboxInt32()) return false;
// Check that value is always smi or mint, if the platform has unboxed
// mints (ia32 with at least SSE 4.1).
@@ -742,7 +751,9 @@
break;
}
case kFloat32ArrayCid:
- case kFloat64ArrayCid: {
+ case kFloat64ArrayCid:
+ case kTypedDataFloat32ArrayCid:
+ case kTypedDataFloat64ArrayCid: {
// Check that value is always double.
value_check = call->ic_data()->AsUnaryClassChecksForArgNr(2);
if ((value_check.NumberOfChecks() != 1) ||
@@ -853,12 +864,26 @@
case kUint16ArrayCid:
case kInt32ArrayCid:
case kUint32ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid:
ASSERT(value_type.IsIntType());
// Fall through.
case kFloat32ArrayCid:
- case kFloat64ArrayCid: {
+ case kFloat64ArrayCid:
+ case kTypedDataFloat32ArrayCid:
+ case kTypedDataFloat64ArrayCid: {
type_args = instantiator = flow_graph_->constant_null();
- ASSERT((class_id != kFloat32ArrayCid && class_id != kFloat64ArrayCid) ||
+ ASSERT((class_id != kFloat32ArrayCid &&
+ class_id != kFloat64ArrayCid &&
+ class_id != kTypedDataFloat32ArrayCid &&
+ class_id != kTypedDataFloat64ArrayCid) ||
value_type.IsDoubleType());
ASSERT(value_type.IsInstantiated());
break;
@@ -925,9 +950,20 @@
case kExternalUint8ClampedArrayCid:
case kInt16ArrayCid:
case kUint16ArrayCid:
+ case kTypedDataFloat32ArrayCid:
+ case kTypedDataFloat64ArrayCid:
+ case kTypedDataInt8ArrayCid:
+ case kTypedDataUint8ArrayCid:
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ case kTypedDataInt16ArrayCid:
+ case kTypedDataUint16ArrayCid:
break;
case kInt32ArrayCid:
- case kUint32ArrayCid: {
+ case kUint32ArrayCid:
+ case kTypedDataInt32ArrayCid:
+ case kTypedDataUint32ArrayCid: {
if (!CanUnboxInt32()) return false;
// Set deopt_id if we can optimistically assume that the result is Smi.
@@ -1327,6 +1363,11 @@
return Array::length_offset();
case MethodRecognizer::kByteArrayBaseLength:
return ByteArray::length_offset();
+ case MethodRecognizer::kTypedDataLength:
+ // .length is defined in _TypedList which is the base class for internal
+ // and external typed data.
+ ASSERT(TypedData::length_offset() == ExternalTypedData::length_offset());
+ return TypedData::length_offset();
case MethodRecognizer::kGrowableArrayLength:
return GrowableObjectArray::length_offset();
default:
@@ -1365,6 +1406,7 @@
case MethodRecognizer::kObjectArrayLength:
case MethodRecognizer::kImmutableArrayLength:
case MethodRecognizer::kByteArrayBaseLength:
+ case MethodRecognizer::kTypedDataLength:
case MethodRecognizer::kGrowableArrayLength: {
if (!ic_data.HasOneTarget()) {
// TODO(srdjan): Implement for mutiple targets.
@@ -1373,7 +1415,8 @@
const bool is_immutable =
(recognized_kind == MethodRecognizer::kObjectArrayLength) ||
(recognized_kind == MethodRecognizer::kImmutableArrayLength) ||
- (recognized_kind == MethodRecognizer::kByteArrayBaseLength);
+ (recognized_kind == MethodRecognizer::kByteArrayBaseLength) ||
+ (recognized_kind == MethodRecognizer::kTypedDataLength);
InlineArrayLengthGetter(call,
OffsetForLengthGetter(recognized_kind),
is_immutable,
@@ -1900,8 +1943,7 @@
return;
}
- if ((op_kind == Token::kASSIGN_INDEX) &&
- TryReplaceWithStoreIndexed(instr)) {
+ if ((op_kind == Token::kASSIGN_INDEX) && TryReplaceWithStoreIndexed(instr)) {
return;
}
if ((op_kind == Token::kINDEX) && TryReplaceWithLoadIndexed(instr)) {

Powered by Google App Engine
This is Rietveld 408576698