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

Side by Side Diff: runtime/vm/intermediate_language.h

Issue 12871010: Replace scalarlist optimizations and split external array loads into two IL instructions. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: 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/il_printer.cc ('k') | runtime/vm/intermediate_language.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 #ifndef VM_INTERMEDIATE_LANGUAGE_H_ 5 #ifndef VM_INTERMEDIATE_LANGUAGE_H_
6 #define VM_INTERMEDIATE_LANGUAGE_H_ 6 #define VM_INTERMEDIATE_LANGUAGE_H_
7 7
8 #include "vm/allocation.h" 8 #include "vm/allocation.h"
9 #include "vm/ast.h" 9 #include "vm/ast.h"
10 #include "vm/growable_array.h" 10 #include "vm/growable_array.h"
(...skipping 20 matching lines...) Expand all
31 class Range; 31 class Range;
32 32
33 33
34 // TODO(srdjan): Unify with INTRINSIC_LIST. 34 // TODO(srdjan): Unify with INTRINSIC_LIST.
35 // (class-name, function-name, recognized enum, fingerprint). 35 // (class-name, function-name, recognized enum, fingerprint).
36 // See intrinsifier for fingerprint computation. 36 // See intrinsifier for fingerprint computation.
37 #define RECOGNIZED_LIST(V) \ 37 #define RECOGNIZED_LIST(V) \
38 V(_ObjectArray, get:length, ObjectArrayLength, 405297088) \ 38 V(_ObjectArray, get:length, ObjectArrayLength, 405297088) \
39 V(_ImmutableArray, get:length, ImmutableArrayLength, 433698233) \ 39 V(_ImmutableArray, get:length, ImmutableArrayLength, 433698233) \
40 V(_TypedList, get:length, TypedDataLength, 231908172) \ 40 V(_TypedList, get:length, TypedDataLength, 231908172) \
41 V(_ByteArrayBase, get:length, ByteArrayBaseLength, 1098081765) \ 41 V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 380843687) \
42 V(_ByteArrayBase, _getInt8, ByteArrayBaseGetInt8, 261365835) \ 42 V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 380843687) \
43 V(_ByteArrayBase, _getUint8, ByteArrayBaseGetUint8, 261365835) \ 43 V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 380843687) \
44 V(_ByteArrayBase, _getInt16, ByteArrayBaseGetInt16, 261365835) \ 44 V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 380843687) \
45 V(_ByteArrayBase, _getUint16, ByteArrayBaseGetUint16, 261365835) \ 45 V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 380843687) \
46 V(_ByteArrayBase, _getInt32, ByteArrayBaseGetInt32, 261365835) \ 46 V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 380843687) \
47 V(_ByteArrayBase, _getUint32, ByteArrayBaseGetUint32, 261365835) \ 47 V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 979971573) \
48 V(_ByteArrayBase, _getFloat32, ByteArrayBaseGetFloat32, 434247298) \ 48 V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 979971573) \
49 V(_ByteArrayBase, _getFloat64, ByteArrayBaseGetFloat64, 434247298) \ 49 V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 287047804) \
50 V(_ByteArrayBase, _setInt8, ByteArrayBaseSetInt8, 501962848) \ 50 V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 287047804) \
51 V(_ByteArrayBase, _setUint8, ByteArrayBaseSetUint8, 501962848) \ 51 V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 287047804) \
52 V(_ByteArrayBase, _setInt16, ByteArrayBaseSetInt16, 501962848) \ 52 V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 287047804) \
53 V(_ByteArrayBase, _setUint16, ByteArrayBaseSetUint16, 501962848) \ 53 V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 287047804) \
54 V(_ByteArrayBase, _setInt32, ByteArrayBaseSetInt32, 501962848) \ 54 V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 287047804) \
55 V(_ByteArrayBase, _setUint32, ByteArrayBaseSetUint32, 501962848) \ 55 V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1032541114) \
56 V(_ByteArrayBase, _setFloat32, ByteArrayBaseSetFloat32, 864506525) \ 56 V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 1032541114) \
57 V(_ByteArrayBase, _setFloat64, ByteArrayBaseSetFloat64, 864506525) \
58 V(_Float32Array, _getIndexed, Float32ArrayGetIndexed, 734006846) \
59 V(_Float64Array, _getIndexed, Float64ArrayGetIndexed, 498074772) \
60 V(_Int8Array, _getIndexed, Int8ArrayGetIndexed, 712069760) \
61 V(_Uint8Array, _getIndexed, Uint8ArrayGetIndexed, 535849990) \
62 V(_Uint8ClampedArray, _getIndexed, Uint8ClampedArrayGetIndexed, 873344956) \
63 V(_ExternalUint8Array, _getIndexed, ExternalUint8ArrayGetIndexed, 402720239) \
64 V(_ExternalUint8ClampedArray, _getIndexed, \
65 ExternalUint8ClampedArrayGetIndexed, 682839007) \
66 V(_Int16Array, _getIndexed, Int16ArrayGetIndexed, 313999108) \
67 V(_Uint16Array, _getIndexed, Uint16ArrayGetIndexed, 539701175) \
68 V(_Int32Array, _getIndexed, Int32ArrayGetIndexed, 655321526) \
69 V(_Uint32Array, _getIndexed, Uint32ArrayGetIndexed, 1060443550) \
70 V(_Float32Array, _setIndexed, Float32ArraySetIndexed, 1040992157) \
71 V(_Float64Array, _setIndexed, Float64ArraySetIndexed, 330158324) \
72 V(_Int8Array, _setIndexed, Int8ArraySetIndexed, 680713569) \
73 V(_Uint8Array, _setIndexed, Uint8ArraySetIndexed, 785627791) \
74 V(_Uint8ClampedArray, _setIndexed, Uint8ClampedArraySetIndexed, 464766374) \
75 V(_ExternalUint8Array, _setIndexed, ExternalUint8ArraySetIndexed, 159706697) \
76 V(_ExternalUint8ClampedArray, _setIndexed, \
77 ExternalUint8ClampedArraySetIndexed, 335716123) \
78 V(_Int16Array, _setIndexed, Int16ArraySetIndexed, 12169534) \
79 V(_Uint16Array, _setIndexed, Uint16ArraySetIndexed, 36054302) \
80 V(_Int32Array, _setIndexed, Int32ArraySetIndexed, 306194131) \
81 V(_Uint32Array, _setIndexed, Uint32ArraySetIndexed, 410753485) \
82 V(_GrowableObjectArray, get:length, GrowableArrayLength, 725548050) \ 57 V(_GrowableObjectArray, get:length, GrowableArrayLength, 725548050) \
83 V(_GrowableObjectArray, get:_capacity, GrowableArrayCapacity, 725548050) \ 58 V(_GrowableObjectArray, get:_capacity, GrowableArrayCapacity, 725548050) \
84 V(_StringBase, get:length, StringBaseLength, 320803993) \ 59 V(_StringBase, get:length, StringBaseLength, 320803993) \
85 V(_StringBase, get:isEmpty, StringBaseIsEmpty, 711547329) \ 60 V(_StringBase, get:isEmpty, StringBaseIsEmpty, 711547329) \
86 V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 984449525) \ 61 V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 984449525) \
87 V(_StringBase, [], StringBaseCharAt, 1062366987) \ 62 V(_StringBase, [], StringBaseCharAt, 1062366987) \
88 V(_IntegerImplementation, toDouble, IntegerToDouble, 733149324) \ 63 V(_IntegerImplementation, toDouble, IntegerToDouble, 733149324) \
89 V(_Double, toInt, DoubleToInteger, 362666636) \ 64 V(_Double, toInt, DoubleToInteger, 362666636) \
90 V(_Double, truncateToDouble, DoubleTruncate, 620870996) \ 65 V(_Double, truncateToDouble, DoubleTruncate, 620870996) \
91 V(_Double, roundToDouble, DoubleRound, 620870996) \ 66 V(_Double, roundToDouble, DoubleRound, 620870996) \
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 Value* next_use_; 318 Value* next_use_;
344 Instruction* instruction_; 319 Instruction* instruction_;
345 intptr_t use_index_; 320 intptr_t use_index_;
346 321
347 CompileType* reaching_type_; 322 CompileType* reaching_type_;
348 323
349 DISALLOW_COPY_AND_ASSIGN(Value); 324 DISALLOW_COPY_AND_ASSIGN(Value);
350 }; 325 };
351 326
352 327
353 enum Representation {
354 kTagged,
355 kUnboxedDouble,
356 kUnboxedMint
357 };
358
359
360 // An embedded container with N elements of type T. Used (with partial 328 // An embedded container with N elements of type T. Used (with partial
361 // specialization for N=0) because embedded arrays cannot have size 0. 329 // specialization for N=0) because embedded arrays cannot have size 0.
362 template<typename T, intptr_t N> 330 template<typename T, intptr_t N>
363 class EmbeddedArray { 331 class EmbeddedArray {
364 public: 332 public:
365 EmbeddedArray() : elements_() { } 333 EmbeddedArray() : elements_() { }
366 334
367 intptr_t length() const { return N; } 335 intptr_t length() const { return N; }
368 336
369 const T& operator[](intptr_t i) const { 337 const T& operator[](intptr_t i) const {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
446 M(LoadStaticField) \ 414 M(LoadStaticField) \
447 M(StoreStaticField) \ 415 M(StoreStaticField) \
448 M(BooleanNegate) \ 416 M(BooleanNegate) \
449 M(InstanceOf) \ 417 M(InstanceOf) \
450 M(CreateArray) \ 418 M(CreateArray) \
451 M(CreateClosure) \ 419 M(CreateClosure) \
452 M(AllocateObject) \ 420 M(AllocateObject) \
453 M(AllocateObjectWithBoundsCheck) \ 421 M(AllocateObjectWithBoundsCheck) \
454 M(LoadField) \ 422 M(LoadField) \
455 M(StoreVMField) \ 423 M(StoreVMField) \
424 M(LoadUntagged) \
456 M(InstantiateTypeArguments) \ 425 M(InstantiateTypeArguments) \
457 M(ExtractConstructorTypeArguments) \ 426 M(ExtractConstructorTypeArguments) \
458 M(ExtractConstructorInstantiator) \ 427 M(ExtractConstructorInstantiator) \
459 M(AllocateContext) \ 428 M(AllocateContext) \
460 M(ChainContext) \ 429 M(ChainContext) \
461 M(CloneContext) \ 430 M(CloneContext) \
462 M(CatchEntry) \ 431 M(CatchEntry) \
463 M(BinarySmiOp) \ 432 M(BinarySmiOp) \
464 M(UnarySmiOp) \ 433 M(UnarySmiOp) \
465 M(CheckStackOverflow) \ 434 M(CheckStackOverflow) \
(...skipping 2402 matching lines...) Expand 10 before | Expand all | Expand 10 after
2868 intptr_t deopt_id) 2837 intptr_t deopt_id)
2869 : index_scale_(index_scale), class_id_(class_id) { 2838 : index_scale_(index_scale), class_id_(class_id) {
2870 SetInputAt(0, array); 2839 SetInputAt(0, array);
2871 SetInputAt(1, index); 2840 SetInputAt(1, index);
2872 deopt_id_ = deopt_id; 2841 deopt_id_ = deopt_id;
2873 } 2842 }
2874 2843
2875 DECLARE_INSTRUCTION(LoadIndexed) 2844 DECLARE_INSTRUCTION(LoadIndexed)
2876 virtual CompileType ComputeType() const; 2845 virtual CompileType ComputeType() const;
2877 2846
2847 virtual Representation RequiredInputRepresentation(intptr_t idx) const {
2848 ASSERT(idx == 0 || idx == 1);
2849 // The array may be tagged or untagged (for external arrays).
2850 if (idx == 0) return kNoRepresentation;
2851 return kTagged;
2852 }
2853
2854 bool IsExternal() const {
2855 return array()->definition()->representation() == kUntagged;
2856 }
2857
2878 Value* array() const { return inputs_[0]; } 2858 Value* array() const { return inputs_[0]; }
2879 Value* index() const { return inputs_[1]; } 2859 Value* index() const { return inputs_[1]; }
2880 intptr_t index_scale() const { return index_scale_; } 2860 intptr_t index_scale() const { return index_scale_; }
2881 intptr_t class_id() const { return class_id_; } 2861 intptr_t class_id() const { return class_id_; }
2882 2862
2883 virtual bool CanDeoptimize() const { 2863 virtual bool CanDeoptimize() const {
2884 return deopt_id_ != Isolate::kNoDeoptId; 2864 return deopt_id_ != Isolate::kNoDeoptId;
2885 } 2865 }
2886 2866
2887 virtual bool HasSideEffect() const { return false; } 2867 virtual bool HasSideEffect() const { return false; }
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2962 return value()->NeedsStoreBuffer() 2942 return value()->NeedsStoreBuffer()
2963 && (emit_store_barrier_ == kEmitStoreBarrier); 2943 && (emit_store_barrier_ == kEmitStoreBarrier);
2964 } 2944 }
2965 2945
2966 virtual bool CanDeoptimize() const { return false; } 2946 virtual bool CanDeoptimize() const { return false; }
2967 2947
2968 virtual bool HasSideEffect() const { return true; } 2948 virtual bool HasSideEffect() const { return true; }
2969 2949
2970 virtual Representation RequiredInputRepresentation(intptr_t idx) const; 2950 virtual Representation RequiredInputRepresentation(intptr_t idx) const;
2971 2951
2952 bool IsExternal() const {
2953 return array()->definition()->representation() == kUntagged;
2954 }
2955
2972 virtual intptr_t DeoptimizationTarget() const { 2956 virtual intptr_t DeoptimizationTarget() const {
2973 // Direct access since this instruction cannot deoptimize, and the deopt-id 2957 // Direct access since this instruction cannot deoptimize, and the deopt-id
2974 // was inherited from another instruction that could deoptimize. 2958 // was inherited from another instruction that could deoptimize.
2975 return deopt_id_; 2959 return deopt_id_;
2976 } 2960 }
2977 2961
2978 private: 2962 private:
2979 const StoreBarrierType emit_store_barrier_; 2963 const StoreBarrierType emit_store_barrier_;
2980 const intptr_t index_scale_; 2964 const intptr_t index_scale_;
2981 const intptr_t class_id_; 2965 const intptr_t class_id_;
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
3183 3167
3184 private: 3168 private:
3185 const Function& function_; 3169 const Function& function_;
3186 ZoneGrowableArray<PushArgumentInstr*>* arguments_; 3170 ZoneGrowableArray<PushArgumentInstr*>* arguments_;
3187 intptr_t token_pos_; 3171 intptr_t token_pos_;
3188 3172
3189 DISALLOW_COPY_AND_ASSIGN(CreateClosureInstr); 3173 DISALLOW_COPY_AND_ASSIGN(CreateClosureInstr);
3190 }; 3174 };
3191 3175
3192 3176
3177 class LoadUntaggedInstr : public TemplateDefinition<1> {
3178 public:
3179 explicit LoadUntaggedInstr(Value* object, intptr_t offset) : offset_(offset) {
3180 SetInputAt(0, object);
3181 }
3182
3183 virtual Representation representation() const {
3184 return kUntagged;
3185 }
3186 DECLARE_INSTRUCTION(LoadUntagged)
3187 virtual CompileType ComputeType() const;
3188
3189 Value* object() const { return inputs_[0]; }
3190 intptr_t offset() const { return offset_; }
3191
3192 virtual bool CanDeoptimize() const { return false; }
3193
3194 virtual bool HasSideEffect() const { return false; }
3195
3196 virtual bool AttributesEqual(Instruction* other) const { return true; }
3197
3198 // This instruction must not be moved without the indexed access that
3199 // depends on it (e.g. out of loops). GC may cause collect
3200 // the array while the external data-array is still accessed.
3201 virtual bool AffectedBySideEffect() const { return true; }
3202
3203 private:
3204 intptr_t offset_;
3205
3206 DISALLOW_COPY_AND_ASSIGN(LoadUntaggedInstr);
3207 };
3208
3209
3193 class LoadFieldInstr : public TemplateDefinition<1> { 3210 class LoadFieldInstr : public TemplateDefinition<1> {
3194 public: 3211 public:
3195 LoadFieldInstr(Value* value, 3212 LoadFieldInstr(Value* value,
3196 intptr_t offset_in_bytes, 3213 intptr_t offset_in_bytes,
3197 const AbstractType& type, 3214 const AbstractType& type,
3198 bool immutable = false) 3215 bool immutable = false)
3199 : offset_in_bytes_(offset_in_bytes), 3216 : offset_in_bytes_(offset_in_bytes),
3200 type_(type), 3217 type_(type),
3201 result_cid_(kDynamicCid), 3218 result_cid_(kDynamicCid),
3202 immutable_(immutable), 3219 immutable_(immutable),
(...skipping 1331 matching lines...) Expand 10 before | Expand all | Expand 10 after
4534 ForwardInstructionIterator* current_iterator_; 4551 ForwardInstructionIterator* current_iterator_;
4535 4552
4536 private: 4553 private:
4537 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor); 4554 DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor);
4538 }; 4555 };
4539 4556
4540 4557
4541 } // namespace dart 4558 } // namespace dart
4542 4559
4543 #endif // VM_INTERMEDIATE_LANGUAGE_H_ 4560 #endif // VM_INTERMEDIATE_LANGUAGE_H_
OLDNEW
« no previous file with comments | « runtime/vm/il_printer.cc ('k') | runtime/vm/intermediate_language.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698