Index: runtime/vm/intermediate_language.cc |
=================================================================== |
--- runtime/vm/intermediate_language.cc (revision 17245) |
+++ runtime/vm/intermediate_language.cc (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
// for details. All rights reserved. Use of this source code is governed by a |
// BSD-style license that can be found in the LICENSE file. |
@@ -1902,116 +1902,7 @@ |
UNREACHABLE(); |
} |
-LocationSummary* ThrowInstr::MakeLocationSummary() const { |
- return new LocationSummary(0, 0, LocationSummary::kCall); |
-} |
- |
- |
-void ThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- compiler->GenerateCallRuntime(token_pos(), |
- kThrowRuntimeEntry, |
- locs()); |
- __ int3(); |
-} |
- |
- |
-LocationSummary* ReThrowInstr::MakeLocationSummary() const { |
- return new LocationSummary(0, 0, LocationSummary::kCall); |
-} |
- |
- |
-void ReThrowInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- compiler->GenerateCallRuntime(token_pos(), |
- kReThrowRuntimeEntry, |
- locs()); |
- __ int3(); |
-} |
- |
- |
-LocationSummary* GotoInstr::MakeLocationSummary() const { |
- return new LocationSummary(0, 0, LocationSummary::kNoCall); |
-} |
- |
- |
-void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- // Add deoptimization descriptor for deoptimizing instructions |
- // that may be inserted before this instruction. |
- if (!compiler->is_optimizing()) { |
- compiler->AddCurrentDescriptor(PcDescriptors::kDeoptBefore, |
- GetDeoptId(), |
- 0); // No token position. |
- } |
- |
- if (HasParallelMove()) { |
- compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |
- } |
- |
- // We can fall through if the successor is the next block in the list. |
- // Otherwise, we need a jump. |
- if (!compiler->IsNextBlock(successor())) { |
- __ jmp(compiler->GetBlockLabel(successor())); |
- } |
-} |
- |
- |
-static Condition NegateCondition(Condition condition) { |
- switch (condition) { |
- case EQUAL: return NOT_EQUAL; |
- case NOT_EQUAL: return EQUAL; |
- case LESS: return GREATER_EQUAL; |
- case LESS_EQUAL: return GREATER; |
- case GREATER: return LESS_EQUAL; |
- case GREATER_EQUAL: return LESS; |
- case BELOW: return ABOVE_EQUAL; |
- case BELOW_EQUAL: return ABOVE; |
- case ABOVE: return BELOW_EQUAL; |
- case ABOVE_EQUAL: return BELOW; |
- default: |
- OS::Print("Error %d\n", condition); |
- UNIMPLEMENTED(); |
- return EQUAL; |
- } |
-} |
- |
- |
-void ControlInstruction::EmitBranchOnValue(FlowGraphCompiler* compiler, |
- bool value) { |
- if (value && compiler->IsNextBlock(false_successor())) { |
- __ jmp(compiler->GetBlockLabel(true_successor())); |
- } else if (!value && compiler->IsNextBlock(true_successor())) { |
- __ jmp(compiler->GetBlockLabel(false_successor())); |
- } |
-} |
- |
- |
-void ControlInstruction::EmitBranchOnCondition(FlowGraphCompiler* compiler, |
- Condition true_condition) { |
- if (compiler->IsNextBlock(false_successor())) { |
- // If the next block is the false successor we will fall through to it. |
- __ j(true_condition, compiler->GetBlockLabel(true_successor())); |
- } else { |
- // If the next block is the true successor we negate comparison and fall |
- // through to it. |
- ASSERT(compiler->IsNextBlock(true_successor())); |
- Condition false_condition = NegateCondition(true_condition); |
- __ j(false_condition, compiler->GetBlockLabel(false_successor())); |
- } |
-} |
- |
- |
-LocationSummary* CurrentContextInstr::MakeLocationSummary() const { |
- return LocationSummary::Make(0, |
- Location::RequiresRegister(), |
- LocationSummary::kNoCall); |
-} |
- |
- |
-void CurrentContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- __ MoveRegister(locs()->out().reg(), CTX); |
-} |
- |
- |
LocationSummary* StoreContextInstr::MakeLocationSummary() const { |
const intptr_t kNumInputs = 1; |
const intptr_t kNumTemps = 0; |
@@ -2037,107 +1928,6 @@ |
} |
-LocationSummary* StrictCompareInstr::MakeLocationSummary() const { |
- const intptr_t kNumInputs = 2; |
- const intptr_t kNumTemps = 0; |
- LocationSummary* locs = |
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
- locs->set_in(0, Location::RegisterOrConstant(left())); |
- locs->set_in(1, Location::RegisterOrConstant(right())); |
- locs->set_out(Location::RequiresRegister()); |
- return locs; |
-} |
- |
- |
-// Special code for numbers (compare values instead of references.) |
-void StrictCompareInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
- Location left = locs()->in(0); |
- Location right = locs()->in(1); |
- if (left.IsConstant() && right.IsConstant()) { |
- // TODO(vegorov): should be eliminated earlier by constant propagation. |
- const bool result = (kind() == Token::kEQ_STRICT) ? |
- left.constant().raw() == right.constant().raw() : |
- left.constant().raw() != right.constant().raw(); |
- __ LoadObject(locs()->out().reg(), result ? Bool::True() : Bool::False()); |
- return; |
- } |
- if (left.IsConstant()) { |
- compiler->EmitEqualityRegConstCompare(right.reg(), |
- left.constant(), |
- needs_number_check()); |
- } else if (right.IsConstant()) { |
- compiler->EmitEqualityRegConstCompare(left.reg(), |
- right.constant(), |
- needs_number_check()); |
- } else { |
- compiler->EmitEqualityRegRegCompare(left.reg(), |
- right.reg(), |
- needs_number_check()); |
- } |
- |
- Register result = locs()->out().reg(); |
- Label load_true, done; |
- Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL; |
- __ j(true_condition, &load_true, Assembler::kNearJump); |
- __ LoadObject(result, Bool::False()); |
- __ jmp(&done, Assembler::kNearJump); |
- __ Bind(&load_true); |
- __ LoadObject(result, Bool::True()); |
- __ Bind(&done); |
-} |
- |
- |
-void StrictCompareInstr::EmitBranchCode(FlowGraphCompiler* compiler, |
- BranchInstr* branch) { |
- ASSERT(kind() == Token::kEQ_STRICT || kind() == Token::kNE_STRICT); |
- Location left = locs()->in(0); |
- Location right = locs()->in(1); |
- if (left.IsConstant() && right.IsConstant()) { |
- // TODO(vegorov): should be eliminated earlier by constant propagation. |
- const bool result = (kind() == Token::kEQ_STRICT) ? |
- left.constant().raw() == right.constant().raw() : |
- left.constant().raw() != right.constant().raw(); |
- branch->EmitBranchOnValue(compiler, result); |
- return; |
- } |
- if (left.IsConstant()) { |
- compiler->EmitEqualityRegConstCompare(right.reg(), |
- left.constant(), |
- needs_number_check()); |
- } else if (right.IsConstant()) { |
- compiler->EmitEqualityRegConstCompare(left.reg(), |
- right.constant(), |
- needs_number_check()); |
- } else { |
- compiler->EmitEqualityRegRegCompare(left.reg(), |
- right.reg(), |
- needs_number_check()); |
- } |
- |
- Condition true_condition = (kind() == Token::kEQ_STRICT) ? EQUAL : NOT_EQUAL; |
- branch->EmitBranchOnCondition(compiler, true_condition); |
-} |
- |
- |
-void ClosureCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- // The arguments to the stub include the closure, as does the arguments |
- // descriptor. |
- Register temp_reg = locs()->temp(0).reg(); |
- int argument_count = ArgumentCount(); |
- const Array& arguments_descriptor = |
- Array::ZoneHandle(ArgumentsDescriptor::New(argument_count, |
- argument_names())); |
- __ LoadObject(temp_reg, arguments_descriptor); |
- compiler->GenerateDartCall(deopt_id(), |
- token_pos(), |
- &StubCode::CallClosureFunctionLabel(), |
- PcDescriptors::kOther, |
- locs()); |
- __ Drop(argument_count); |
-} |
- |
- |
LocationSummary* InstanceCallInstr::MakeLocationSummary() const { |
return MakeCallSummary(); |
} |
@@ -2225,107 +2015,6 @@ |
} |
-LocationSummary* BooleanNegateInstr::MakeLocationSummary() const { |
- return LocationSummary::Make(1, |
- Location::RequiresRegister(), |
- LocationSummary::kNoCall); |
-} |
- |
- |
-void BooleanNegateInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- Register value = locs()->in(0).reg(); |
- Register result = locs()->out().reg(); |
- |
- Label done; |
- __ LoadObject(result, Bool::True()); |
- __ CompareRegisters(result, value); |
- __ j(NOT_EQUAL, &done, Assembler::kNearJump); |
- __ LoadObject(result, Bool::False()); |
- __ Bind(&done); |
-} |
- |
- |
-LocationSummary* ChainContextInstr::MakeLocationSummary() const { |
- return LocationSummary::Make(1, |
- Location::NoLocation(), |
- LocationSummary::kNoCall); |
-} |
- |
- |
-void ChainContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- Register context_value = locs()->in(0).reg(); |
- |
- // Chain the new context in context_value to its parent in CTX. |
- __ StoreIntoObject(context_value, |
- FieldAddress(context_value, Context::parent_offset()), |
- CTX); |
- // Set new context as current context. |
- __ MoveRegister(CTX, context_value); |
-} |
- |
- |
-LocationSummary* StoreVMFieldInstr::MakeLocationSummary() const { |
- const intptr_t kNumInputs = 2; |
- const intptr_t kNumTemps = 0; |
- LocationSummary* locs = |
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
- locs->set_in(0, value()->NeedsStoreBuffer() ? Location::WritableRegister() |
- : Location::RequiresRegister()); |
- locs->set_in(1, Location::RequiresRegister()); |
- return locs; |
-} |
- |
- |
-void StoreVMFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- Register value_reg = locs()->in(0).reg(); |
- Register dest_reg = locs()->in(1).reg(); |
- |
- if (value()->NeedsStoreBuffer()) { |
- __ StoreIntoObject(dest_reg, FieldAddress(dest_reg, offset_in_bytes()), |
- value_reg); |
- } else { |
- __ StoreIntoObjectNoBarrier( |
- dest_reg, FieldAddress(dest_reg, offset_in_bytes()), value_reg); |
- } |
-} |
- |
- |
-LocationSummary* AllocateObjectInstr::MakeLocationSummary() const { |
- return MakeCallSummary(); |
-} |
- |
- |
-void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- const Class& cls = Class::ZoneHandle(constructor().Owner()); |
- const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls)); |
- const ExternalLabel label(cls.ToCString(), stub.EntryPoint()); |
- compiler->GenerateCall(token_pos(), |
- &label, |
- PcDescriptors::kOther, |
- locs()); |
- __ Drop(ArgumentCount()); // Discard arguments. |
-} |
- |
- |
-LocationSummary* CreateClosureInstr::MakeLocationSummary() const { |
- return MakeCallSummary(); |
-} |
- |
- |
-void CreateClosureInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
- const Function& closure_function = function(); |
- ASSERT(!closure_function.IsImplicitStaticClosureFunction()); |
- const Code& stub = Code::Handle( |
- StubCode::GetAllocationStubForClosure(closure_function)); |
- const ExternalLabel label(closure_function.ToCString(), stub.EntryPoint()); |
- compiler->GenerateCall(token_pos(), |
- &label, |
- PcDescriptors::kOther, |
- locs()); |
- __ Drop(2); // Discard type arguments and receiver. |
-} |
- |
- |
Environment* Environment::From(const GrowableArray<Definition*>& definitions, |
intptr_t fixed_parameter_count, |
const Function& function) { |
@@ -3005,7 +2694,6 @@ |
} |
} |
- |
#undef __ |
} // namespace dart |