| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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_builder.h" | 9 #include "vm/flow_graph_builder.h" |
| 10 #include "vm/flow_graph_compiler.h" | 10 #include "vm/flow_graph_compiler.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 163 void CreateArrayComp::SetInputAt(intptr_t i, Value* value) { | 163 void CreateArrayComp::SetInputAt(intptr_t i, Value* value) { |
| 164 if (i == 0) { | 164 if (i == 0) { |
| 165 inputs_[0] = value; | 165 inputs_[0] = value; |
| 166 } else { | 166 } else { |
| 167 (*elements_)[i - 1] = value; | 167 (*elements_)[i - 1] = value; |
| 168 } | 168 } |
| 169 } | 169 } |
| 170 | 170 |
| 171 | 171 |
| 172 intptr_t BranchInstr::InputCount() const { | 172 intptr_t BranchInstr::InputCount() const { |
| 173 return 1; | 173 return is_fused_with_comparison() ? fused_with_comparison_->InputCount() : 1; |
| 174 } | 174 } |
| 175 | 175 |
| 176 | 176 |
| 177 Value* BranchInstr::InputAt(intptr_t i) const { | 177 Value* BranchInstr::InputAt(intptr_t i) const { |
| 178 if (is_fused_with_comparison()) { |
| 179 return fused_with_comparison_->InputAt(i); |
| 180 } |
| 178 if (i == 0) return value(); | 181 if (i == 0) return value(); |
| 179 UNREACHABLE(); | 182 UNREACHABLE(); |
| 180 return NULL; | 183 return NULL; |
| 181 } | 184 } |
| 182 | 185 |
| 183 | 186 |
| 184 void BranchInstr::SetInputAt(intptr_t i, Value* value) { | 187 void BranchInstr::SetInputAt(intptr_t i, Value* value) { |
| 188 ASSERT(!is_fused_with_comparison()); |
| 185 if (i == 0) { | 189 if (i == 0) { |
| 186 value_ = value; | 190 value_ = value; |
| 187 return; | 191 return; |
| 188 } | 192 } |
| 189 UNREACHABLE(); | 193 UNREACHABLE(); |
| 190 } | 194 } |
| 191 | 195 |
| 192 | 196 |
| 193 intptr_t ParallelMoveInstr::InputCount() const { | 197 intptr_t ParallelMoveInstr::InputCount() const { |
| 194 UNREACHABLE(); | 198 UNREACHABLE(); |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 978 compiler->GenerateCallRuntime(cid(), | 982 compiler->GenerateCallRuntime(cid(), |
| 979 token_pos(), | 983 token_pos(), |
| 980 try_index(), | 984 try_index(), |
| 981 kReThrowRuntimeEntry); | 985 kReThrowRuntimeEntry); |
| 982 __ int3(); | 986 __ int3(); |
| 983 } | 987 } |
| 984 | 988 |
| 985 | 989 |
| 986 LocationSummary* BranchInstr::MakeLocationSummary() const { | 990 LocationSummary* BranchInstr::MakeLocationSummary() const { |
| 987 if (is_fused_with_comparison()) { | 991 if (is_fused_with_comparison()) { |
| 988 return LocationSummary::Make(0, | 992 return fused_with_comparison_->locs(); |
| 989 Location::NoLocation(), | |
| 990 LocationSummary::kNoCall, | |
| 991 LocationSummary::kBranch); | |
| 992 } else { | 993 } else { |
| 993 const int kNumInputs = 1; | 994 const int kNumInputs = 1; |
| 994 const int kNumTemps = 0; | 995 const int kNumTemps = 0; |
| 995 LocationSummary* locs = new LocationSummary(kNumInputs, | 996 LocationSummary* locs = new LocationSummary(kNumInputs, |
| 996 kNumTemps, | 997 kNumTemps, |
| 997 LocationSummary::kNoCall, | 998 LocationSummary::kNoCall); |
| 998 LocationSummary::kBranch); | |
| 999 locs->set_in(0, Location::RequiresRegister()); | 999 locs->set_in(0, Location::RequiresRegister()); |
| 1000 return locs; | 1000 return locs; |
| 1001 } | 1001 } |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 | 1004 |
| 1005 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 1005 void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 1006 // If branch was fused with a comparision then no code needs to be emitted. | 1006 if (is_fused_with_comparison()) { |
| 1007 if (!is_fused_with_comparison()) { | 1007 fused_with_comparison_->EmitNativeCode(compiler); |
| 1008 } else { |
| 1008 Register value = locs()->in(0).reg(); | 1009 Register value = locs()->in(0).reg(); |
| 1009 __ CompareObject(value, compiler->bool_true()); | 1010 __ CompareObject(value, compiler->bool_true()); |
| 1010 EmitBranchOnCondition(compiler, EQUAL); | 1011 EmitBranchOnCondition(compiler, EQUAL); |
| 1011 } | 1012 } |
| 1012 } | 1013 } |
| 1013 | 1014 |
| 1014 | 1015 |
| 1015 static Condition NegateCondition(Condition condition) { | 1016 static Condition NegateCondition(Condition condition) { |
| 1016 switch (condition) { | 1017 switch (condition) { |
| 1017 case EQUAL: return NOT_EQUAL; | 1018 case EQUAL: return NOT_EQUAL; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1074 ASSERT(locs()->in(0).reg() == CTX); | 1075 ASSERT(locs()->in(0).reg() == CTX); |
| 1075 } | 1076 } |
| 1076 | 1077 |
| 1077 | 1078 |
| 1078 LocationSummary* StrictCompareComp::MakeLocationSummary() const { | 1079 LocationSummary* StrictCompareComp::MakeLocationSummary() const { |
| 1079 if (is_fused_with_branch()) { | 1080 if (is_fused_with_branch()) { |
| 1080 const intptr_t kNumInputs = 2; | 1081 const intptr_t kNumInputs = 2; |
| 1081 const intptr_t kNumTemps = 0; | 1082 const intptr_t kNumTemps = 0; |
| 1082 LocationSummary* locs = new LocationSummary(kNumInputs, | 1083 LocationSummary* locs = new LocationSummary(kNumInputs, |
| 1083 kNumTemps, | 1084 kNumTemps, |
| 1084 LocationSummary::kNoCall, | 1085 LocationSummary::kNoCall); |
| 1085 LocationSummary::kBranch); | |
| 1086 locs->set_in(0, Location::RequiresRegister()); | 1086 locs->set_in(0, Location::RequiresRegister()); |
| 1087 locs->set_in(1, Location::RequiresRegister()); | 1087 locs->set_in(1, Location::RequiresRegister()); |
| 1088 return locs; | 1088 return locs; |
| 1089 } else { | 1089 } else { |
| 1090 return LocationSummary::Make(2, Location::SameAsFirstInput()); | 1090 return LocationSummary::Make(2, Location::SameAsFirstInput()); |
| 1091 } | 1091 } |
| 1092 } | 1092 } |
| 1093 | 1093 |
| 1094 | 1094 |
| 1095 void StrictCompareComp::EmitNativeCode(FlowGraphCompiler* compiler) { | 1095 void StrictCompareComp::EmitNativeCode(FlowGraphCompiler* compiler) { |
| (...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1308 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint()); | 1308 const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint()); |
| 1309 compiler->GenerateCall(token_pos(), try_index(), &label, | 1309 compiler->GenerateCall(token_pos(), try_index(), &label, |
| 1310 PcDescriptors::kOther); | 1310 PcDescriptors::kOther); |
| 1311 __ Drop(2); // Discard type arguments and receiver. | 1311 __ Drop(2); // Discard type arguments and receiver. |
| 1312 } | 1312 } |
| 1313 | 1313 |
| 1314 | 1314 |
| 1315 #undef __ | 1315 #undef __ |
| 1316 | 1316 |
| 1317 } // namespace dart | 1317 } // namespace dart |
| OLD | NEW |