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

Side by Side 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: ARM/MIPS build, comments, rebased 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/intermediate_language.h" 5 #include "vm/intermediate_language.h"
6 6
7 #include "vm/bit_vector.h" 7 #include "vm/bit_vector.h"
8 #include "vm/dart_entry.h" 8 #include "vm/dart_entry.h"
9 #include "vm/flow_graph_allocator.h" 9 #include "vm/flow_graph_allocator.h"
10 #include "vm/flow_graph_builder.h" 10 #include "vm/flow_graph_builder.h"
(...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after
264 // Both names are private. Mangle test_name before comparison. 264 // Both names are private. Mangle test_name before comparison.
265 const String& test_name_symbol = String::Handle(Symbols::New(test_name)); 265 const String& test_name_symbol = String::Handle(Symbols::New(test_name));
266 return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name); 266 return String::Handle(lib.PrivateName(test_name_symbol)).Equals(name);
267 } 267 }
268 268
269 269
270 static bool IsRecognizedLibrary(const Library& library) { 270 static bool IsRecognizedLibrary(const Library& library) {
271 // List of libraries where methods can be recognized. 271 // List of libraries where methods can be recognized.
272 return (library.raw() == Library::CoreLibrary()) 272 return (library.raw() == Library::CoreLibrary())
273 || (library.raw() == Library::MathLibrary()) 273 || (library.raw() == Library::MathLibrary())
274 || (library.raw() == Library::TypedDataLibrary())
274 || (library.raw() == Library::ScalarlistLibrary()); 275 || (library.raw() == Library::ScalarlistLibrary());
275 } 276 }
276 277
277 278
278 MethodRecognizer::Kind MethodRecognizer::RecognizeKind( 279 MethodRecognizer::Kind MethodRecognizer::RecognizeKind(
279 const Function& function) { 280 const Function& function) {
280 const Class& function_class = Class::Handle(function.Owner()); 281 const Class& function_class = Class::Handle(function.Owner());
281 const Library& lib = Library::Handle(function_class.library()); 282 const Library& lib = Library::Handle(function_class.library());
282 if (!IsRecognizedLibrary(lib)) { 283 if (!IsRecognizedLibrary(lib)) {
283 return kUnknown; 284 return kUnknown;
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after
1105 Definition* Definition::Canonicalize(FlowGraphOptimizer* optimizer) { 1106 Definition* Definition::Canonicalize(FlowGraphOptimizer* optimizer) {
1106 return this; 1107 return this;
1107 } 1108 }
1108 1109
1109 1110
1110 bool LoadFieldInstr::IsImmutableLengthLoad() const { 1111 bool LoadFieldInstr::IsImmutableLengthLoad() const {
1111 switch (recognized_kind()) { 1112 switch (recognized_kind()) {
1112 case MethodRecognizer::kObjectArrayLength: 1113 case MethodRecognizer::kObjectArrayLength:
1113 case MethodRecognizer::kImmutableArrayLength: 1114 case MethodRecognizer::kImmutableArrayLength:
1114 case MethodRecognizer::kByteArrayBaseLength: 1115 case MethodRecognizer::kByteArrayBaseLength:
1116 case MethodRecognizer::kTypedDataLength:
1115 case MethodRecognizer::kStringBaseLength: 1117 case MethodRecognizer::kStringBaseLength:
1116 return true; 1118 return true;
1117 default: 1119 default:
1118 return false; 1120 return false;
1119 } 1121 }
1120 } 1122 }
1121 1123
1122 1124
1123 MethodRecognizer::Kind LoadFieldInstr::RecognizedKindFromArrayCid( 1125 MethodRecognizer::Kind LoadFieldInstr::RecognizedKindFromArrayCid(
1124 intptr_t cid) { 1126 intptr_t cid) {
1127 if (RawObject::IsTypedDataClassId(cid) ||
1128 RawObject::IsExternalTypedDataClassId(cid)) {
1129 return MethodRecognizer::kTypedDataLength;
1130 }
1125 switch (cid) { 1131 switch (cid) {
1126 case kArrayCid: 1132 case kArrayCid:
1127 return MethodRecognizer::kObjectArrayLength; 1133 return MethodRecognizer::kObjectArrayLength;
1128 case kImmutableArrayCid: 1134 case kImmutableArrayCid:
1129 return MethodRecognizer::kImmutableArrayLength; 1135 return MethodRecognizer::kImmutableArrayLength;
1130 case kGrowableObjectArrayCid: 1136 case kGrowableObjectArrayCid:
1131 return MethodRecognizer::kGrowableArrayLength; 1137 return MethodRecognizer::kGrowableArrayLength;
1132 case kInt8ArrayCid: 1138 case kInt8ArrayCid:
1133 case kUint8ArrayCid: 1139 case kUint8ArrayCid:
1134 case kUint8ClampedArrayCid: 1140 case kUint8ClampedArrayCid:
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after
1917 1923
1918 void LoadFieldInstr::InferRange() { 1924 void LoadFieldInstr::InferRange() {
1919 if ((range_ == NULL) && 1925 if ((range_ == NULL) &&
1920 ((recognized_kind() == MethodRecognizer::kObjectArrayLength) || 1926 ((recognized_kind() == MethodRecognizer::kObjectArrayLength) ||
1921 (recognized_kind() == MethodRecognizer::kImmutableArrayLength))) { 1927 (recognized_kind() == MethodRecognizer::kImmutableArrayLength))) {
1922 range_ = new Range(RangeBoundary::FromConstant(0), 1928 range_ = new Range(RangeBoundary::FromConstant(0),
1923 RangeBoundary::FromConstant(Array::kMaxElements)); 1929 RangeBoundary::FromConstant(Array::kMaxElements));
1924 return; 1930 return;
1925 } 1931 }
1926 if ((range_ == NULL) && 1932 if ((range_ == NULL) &&
1927 (recognized_kind() == MethodRecognizer::kByteArrayBaseLength)) { 1933 (recognized_kind() == MethodRecognizer::kByteArrayBaseLength ||
1934 recognized_kind() == MethodRecognizer::kTypedDataLength)) {
1928 range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi()); 1935 range_ = new Range(RangeBoundary::FromConstant(0), RangeBoundary::MaxSmi());
1929 return; 1936 return;
1930 } 1937 }
1931 if ((range_ == NULL) && 1938 if ((range_ == NULL) &&
1932 (recognized_kind() == MethodRecognizer::kStringBaseLength)) { 1939 (recognized_kind() == MethodRecognizer::kStringBaseLength)) {
1933 range_ = new Range(RangeBoundary::FromConstant(0), 1940 range_ = new Range(RangeBoundary::FromConstant(0),
1934 RangeBoundary::FromConstant(String::kMaxElements)); 1941 RangeBoundary::FromConstant(String::kMaxElements));
1935 return; 1942 return;
1936 } 1943 }
1937 Definition::InferRange(); 1944 Definition::InferRange();
1938 } 1945 }
1939 1946
1940 1947
1941 1948
1942 void LoadIndexedInstr::InferRange() { 1949 void LoadIndexedInstr::InferRange() {
1943 switch (class_id()) { 1950 switch (class_id()) {
1944 case kInt8ArrayCid: 1951 case kInt8ArrayCid:
1952 case kTypedDataInt8ArrayCid:
1945 range_ = new Range(RangeBoundary::FromConstant(-128), 1953 range_ = new Range(RangeBoundary::FromConstant(-128),
1946 RangeBoundary::FromConstant(127)); 1954 RangeBoundary::FromConstant(127));
1947 break; 1955 break;
1948 case kUint8ArrayCid: 1956 case kUint8ArrayCid:
1949 case kUint8ClampedArrayCid: 1957 case kUint8ClampedArrayCid:
1950 case kExternalUint8ArrayCid: 1958 case kExternalUint8ArrayCid:
1951 case kExternalUint8ClampedArrayCid: 1959 case kExternalUint8ClampedArrayCid:
1960 case kTypedDataUint8ArrayCid:
1961 case kTypedDataUint8ClampedArrayCid:
1962 case kExternalTypedDataUint8ArrayCid:
1963 case kExternalTypedDataUint8ClampedArrayCid:
1952 range_ = new Range(RangeBoundary::FromConstant(0), 1964 range_ = new Range(RangeBoundary::FromConstant(0),
1953 RangeBoundary::FromConstant(255)); 1965 RangeBoundary::FromConstant(255));
1954 break; 1966 break;
1955 case kInt16ArrayCid: 1967 case kInt16ArrayCid:
1968 case kTypedDataInt16ArrayCid:
1956 range_ = new Range(RangeBoundary::FromConstant(-32768), 1969 range_ = new Range(RangeBoundary::FromConstant(-32768),
1957 RangeBoundary::FromConstant(32767)); 1970 RangeBoundary::FromConstant(32767));
1958 break; 1971 break;
1959 case kUint16ArrayCid: 1972 case kUint16ArrayCid:
1973 case kTypedDataUint16ArrayCid:
1960 range_ = new Range(RangeBoundary::FromConstant(0), 1974 range_ = new Range(RangeBoundary::FromConstant(0),
1961 RangeBoundary::FromConstant(65535)); 1975 RangeBoundary::FromConstant(65535));
1962 break; 1976 break;
1963 case kOneByteStringCid: 1977 case kOneByteStringCid:
1964 range_ = new Range(RangeBoundary::FromConstant(0), 1978 range_ = new Range(RangeBoundary::FromConstant(0),
1965 RangeBoundary::FromConstant(0xFF)); 1979 RangeBoundary::FromConstant(0xFF));
1966 break; 1980 break;
1967 case kTwoByteStringCid: 1981 case kTwoByteStringCid:
1968 range_ = new Range(RangeBoundary::FromConstant(0), 1982 range_ = new Range(RangeBoundary::FromConstant(0),
1969 RangeBoundary::FromConstant(0xFFFF)); 1983 RangeBoundary::FromConstant(0xFFFF));
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
2183 do { 2197 do {
2184 if (DependOnSameSymbol(max, length)) return max.offset() < length.offset(); 2198 if (DependOnSameSymbol(max, length)) return max.offset() < length.offset();
2185 } while (CanonicalizeMaxBoundary(&max) || CanonicalizeMinBoundary(&length)); 2199 } while (CanonicalizeMaxBoundary(&max) || CanonicalizeMinBoundary(&length));
2186 2200
2187 // Failed to prove that maximum is bounded with array length. 2201 // Failed to prove that maximum is bounded with array length.
2188 return false; 2202 return false;
2189 } 2203 }
2190 2204
2191 2205
2192 intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) { 2206 intptr_t CheckArrayBoundInstr::LengthOffsetFor(intptr_t class_id) {
2207 if (RawObject::IsExternalTypedDataClassId(class_id)) {
2208 return ExternalTypedData::length_offset();
2209 }
2210 if (RawObject::IsTypedDataClassId(class_id)) {
2211 return TypedData::length_offset();
2212 }
2193 switch (class_id) { 2213 switch (class_id) {
2194 case kGrowableObjectArrayCid: 2214 case kGrowableObjectArrayCid:
2195 return GrowableObjectArray::length_offset(); 2215 return GrowableObjectArray::length_offset();
2196 case kOneByteStringCid: 2216 case kOneByteStringCid:
2197 case kTwoByteStringCid: 2217 case kTwoByteStringCid:
2198 return String::length_offset(); 2218 return String::length_offset();
2199 case kArrayCid: 2219 case kArrayCid:
2200 case kImmutableArrayCid: 2220 case kImmutableArrayCid:
2201 return Array::length_offset(); 2221 return Array::length_offset();
2202 case kInt8ArrayCid: 2222 case kInt8ArrayCid:
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
2303 default: 2323 default:
2304 UNREACHABLE(); 2324 UNREACHABLE();
2305 } 2325 }
2306 return kPowRuntimeEntry; 2326 return kPowRuntimeEntry;
2307 } 2327 }
2308 2328
2309 2329
2310 #undef __ 2330 #undef __
2311 2331
2312 } // namespace dart 2332 } // namespace dart
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language.h ('k') | runtime/vm/intermediate_language_ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698