OLD | NEW |
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/bootstrap.h" | 8 #include "vm/bootstrap.h" |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/constant_propagator.h" | 10 #include "vm/constant_propagator.h" |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
120 | 120 |
121 | 121 |
122 static int LowestFirst(const intptr_t* a, const intptr_t* b) { | 122 static int LowestFirst(const intptr_t* a, const intptr_t* b) { |
123 return *a - *b; | 123 return *a - *b; |
124 } | 124 } |
125 | 125 |
126 | 126 |
127 CheckClassInstr::CheckClassInstr(Value* value, | 127 CheckClassInstr::CheckClassInstr(Value* value, |
128 intptr_t deopt_id, | 128 intptr_t deopt_id, |
129 const ICData& unary_checks, | 129 const ICData& unary_checks, |
130 intptr_t token_pos) | 130 TokenPosition token_pos) |
131 : TemplateInstruction(deopt_id), | 131 : TemplateInstruction(deopt_id), |
132 unary_checks_(unary_checks), | 132 unary_checks_(unary_checks), |
133 cids_(unary_checks.NumberOfChecks()), | 133 cids_(unary_checks.NumberOfChecks()), |
134 licm_hoisted_(false), | 134 licm_hoisted_(false), |
135 token_pos_(token_pos) { | 135 token_pos_(token_pos) { |
136 ASSERT(unary_checks.IsZoneHandle()); | 136 ASSERT(unary_checks.IsZoneHandle()); |
137 // Expected useful check data. | 137 // Expected useful check data. |
138 ASSERT(!unary_checks_.IsNull()); | 138 ASSERT(!unary_checks_.IsNull()); |
139 ASSERT(unary_checks_.NumberOfChecks() > 0); | 139 ASSERT(unary_checks_.NumberOfChecks() > 0); |
140 ASSERT(unary_checks_.NumArgsTested() == 1); | 140 ASSERT(unary_checks_.NumArgsTested() == 1); |
(...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
413 } | 413 } |
414 | 414 |
415 | 415 |
416 const Field& LoadStaticFieldInstr::StaticField() const { | 416 const Field& LoadStaticFieldInstr::StaticField() const { |
417 Field& field = Field::Handle(); | 417 Field& field = Field::Handle(); |
418 field ^= field_value()->BoundConstant().raw(); | 418 field ^= field_value()->BoundConstant().raw(); |
419 return field; | 419 return field; |
420 } | 420 } |
421 | 421 |
422 | 422 |
423 ConstantInstr::ConstantInstr(const Object& value, intptr_t token_pos) | 423 ConstantInstr::ConstantInstr(const Object& value, TokenPosition token_pos) |
424 : value_(value), | 424 : value_(value), |
425 token_pos_(token_pos) { | 425 token_pos_(token_pos) { |
426 // Check that the value is not an incorrect Integer representation. | 426 // Check that the value is not an incorrect Integer representation. |
427 ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoSmi()); | 427 ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoSmi()); |
428 ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoInt64()); | 428 ASSERT(!value.IsBigint() || !Bigint::Cast(value).FitsIntoInt64()); |
429 ASSERT(!value.IsMint() || !Smi::IsValid(Mint::Cast(value).AsInt64Value())); | 429 ASSERT(!value.IsMint() || !Smi::IsValid(Mint::Cast(value).AsInt64Value())); |
430 } | 430 } |
431 | 431 |
432 | 432 |
433 bool ConstantInstr::AttributesEqual(Instruction* other) const { | 433 bool ConstantInstr::AttributesEqual(Instruction* other) const { |
(...skipping 2293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2727 UNREACHABLE(); | 2727 UNREACHABLE(); |
2728 return NULL; | 2728 return NULL; |
2729 } | 2729 } |
2730 | 2730 |
2731 | 2731 |
2732 void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2732 void JoinEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2733 __ Bind(compiler->GetJumpLabel(this)); | 2733 __ Bind(compiler->GetJumpLabel(this)); |
2734 if (!compiler->is_optimizing()) { | 2734 if (!compiler->is_optimizing()) { |
2735 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 2735 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
2736 GetDeoptId(), | 2736 GetDeoptId(), |
2737 Token::kNoSourcePos); | 2737 TokenPosition::kNoSource); |
2738 } | 2738 } |
2739 if (HasParallelMove()) { | 2739 if (HasParallelMove()) { |
2740 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 2740 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
2741 } | 2741 } |
2742 } | 2742 } |
2743 | 2743 |
2744 | 2744 |
2745 LocationSummary* TargetEntryInstr::MakeLocationSummary(Zone* zone, | 2745 LocationSummary* TargetEntryInstr::MakeLocationSummary(Zone* zone, |
2746 bool optimizing) const { | 2746 bool optimizing) const { |
2747 UNREACHABLE(); | 2747 UNREACHABLE(); |
2748 return NULL; | 2748 return NULL; |
2749 } | 2749 } |
2750 | 2750 |
2751 | 2751 |
2752 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2752 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2753 __ Bind(compiler->GetJumpLabel(this)); | 2753 __ Bind(compiler->GetJumpLabel(this)); |
2754 if (!compiler->is_optimizing()) { | 2754 if (!compiler->is_optimizing()) { |
2755 if (compiler->NeedsEdgeCounter(this)) { | 2755 if (compiler->NeedsEdgeCounter(this)) { |
2756 compiler->EmitEdgeCounter(preorder_number()); | 2756 compiler->EmitEdgeCounter(preorder_number()); |
2757 } | 2757 } |
2758 // The deoptimization descriptor points after the edge counter code for | 2758 // The deoptimization descriptor points after the edge counter code for |
2759 // uniformity with ARM and MIPS, where we can reuse pattern matching | 2759 // uniformity with ARM and MIPS, where we can reuse pattern matching |
2760 // code that matches backwards from the end of the pattern. | 2760 // code that matches backwards from the end of the pattern. |
2761 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 2761 compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, |
2762 GetDeoptId(), | 2762 GetDeoptId(), |
2763 Token::kNoSourcePos); | 2763 TokenPosition::kNoSource); |
2764 } | 2764 } |
2765 if (HasParallelMove()) { | 2765 if (HasParallelMove()) { |
2766 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 2766 compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
2767 } | 2767 } |
2768 } | 2768 } |
2769 | 2769 |
2770 | 2770 |
2771 void IndirectGotoInstr::ComputeOffsetTable() { | 2771 void IndirectGotoInstr::ComputeOffsetTable() { |
2772 if (GetBlock()->offset() < 0) { | 2772 if (GetBlock()->offset() < 0) { |
2773 // Don't generate a table when contained in an unreachable block. | 2773 // Don't generate a table when contained in an unreachable block. |
(...skipping 180 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2954 | 2954 |
2955 | 2955 |
2956 void DropTempsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2956 void DropTempsInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
2957 ASSERT(!compiler->is_optimizing()); | 2957 ASSERT(!compiler->is_optimizing()); |
2958 // Assert that register assignment is correct. | 2958 // Assert that register assignment is correct. |
2959 ASSERT((InputCount() == 0) || (locs()->out(0).reg() == locs()->in(0).reg())); | 2959 ASSERT((InputCount() == 0) || (locs()->out(0).reg() == locs()->in(0).reg())); |
2960 __ Drop(num_temps()); | 2960 __ Drop(num_temps()); |
2961 } | 2961 } |
2962 | 2962 |
2963 | 2963 |
2964 StrictCompareInstr::StrictCompareInstr(intptr_t token_pos, | 2964 StrictCompareInstr::StrictCompareInstr(TokenPosition token_pos, |
2965 Token::Kind kind, | 2965 Token::Kind kind, |
2966 Value* left, | 2966 Value* left, |
2967 Value* right, | 2967 Value* right, |
2968 bool needs_number_check) | 2968 bool needs_number_check) |
2969 : ComparisonInstr(token_pos, | 2969 : ComparisonInstr(token_pos, |
2970 kind, | 2970 kind, |
2971 left, | 2971 left, |
2972 right, | 2972 right, |
2973 Thread::Current()->GetNextDeoptId()), | 2973 Thread::Current()->GetNextDeoptId()), |
2974 needs_number_check_(needs_number_check) { | 2974 needs_number_check_(needs_number_check) { |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3512 const String& concatenated = String::ZoneHandle(zone, | 3512 const String& concatenated = String::ZoneHandle(zone, |
3513 Symbols::FromConcatAll(pieces)); | 3513 Symbols::FromConcatAll(pieces)); |
3514 return flow_graph->GetConstant(concatenated); | 3514 return flow_graph->GetConstant(concatenated); |
3515 } | 3515 } |
3516 | 3516 |
3517 | 3517 |
3518 InvokeMathCFunctionInstr::InvokeMathCFunctionInstr( | 3518 InvokeMathCFunctionInstr::InvokeMathCFunctionInstr( |
3519 ZoneGrowableArray<Value*>* inputs, | 3519 ZoneGrowableArray<Value*>* inputs, |
3520 intptr_t deopt_id, | 3520 intptr_t deopt_id, |
3521 MethodRecognizer::Kind recognized_kind, | 3521 MethodRecognizer::Kind recognized_kind, |
3522 intptr_t token_pos) | 3522 TokenPosition token_pos) |
3523 : PureDefinition(deopt_id), | 3523 : PureDefinition(deopt_id), |
3524 inputs_(inputs), | 3524 inputs_(inputs), |
3525 recognized_kind_(recognized_kind), | 3525 recognized_kind_(recognized_kind), |
3526 token_pos_(token_pos) { | 3526 token_pos_(token_pos) { |
3527 ASSERT(inputs_->length() == ArgumentCountFor(recognized_kind_)); | 3527 ASSERT(inputs_->length() == ArgumentCountFor(recognized_kind_)); |
3528 for (intptr_t i = 0; i < inputs_->length(); ++i) { | 3528 for (intptr_t i = 0; i < inputs_->length(); ++i) { |
3529 ASSERT((*inputs)[i] != NULL); | 3529 ASSERT((*inputs)[i] != NULL); |
3530 (*inputs)[i]->set_instruction(this); | 3530 (*inputs)[i]->set_instruction(this); |
3531 (*inputs)[i]->set_use_index(i); | 3531 (*inputs)[i]->set_use_index(i); |
3532 } | 3532 } |
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3697 set_native_c_function(native_function); | 3697 set_native_c_function(native_function); |
3698 function().SetIsNativeAutoSetupScope(auto_setup_scope); | 3698 function().SetIsNativeAutoSetupScope(auto_setup_scope); |
3699 Dart_NativeEntryResolver resolver = library.native_entry_resolver(); | 3699 Dart_NativeEntryResolver resolver = library.native_entry_resolver(); |
3700 bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver); | 3700 bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver); |
3701 set_is_bootstrap_native(is_bootstrap_native); | 3701 set_is_bootstrap_native(is_bootstrap_native); |
3702 } | 3702 } |
3703 | 3703 |
3704 #undef __ | 3704 #undef __ |
3705 | 3705 |
3706 } // namespace dart | 3706 } // namespace dart |
OLD | NEW |