From 10977e05404f4362ca17ee8f5d592abfee3834f5 Mon Sep 17 00:00:00 2001 From: "fschneider@google.com" Date: Fri, 10 Aug 2012 10:34:38 +0000 Subject: [PATCH] Match input operand count of BranchInstr with the input location count. For now this is achieved by making the branch instruction push its arguments itself in the case it performs an instance call. Also remove the result location from the location summary of BranchInstr in the instance call case since it does never produce a result. Review URL: https://chromiumcodereview.appspot.com//10823258 git-svn-id: https://dart.googlecode.com/svn/branches/bleeding_edge/dart@10488 260f80e4-7a28-3924-810f-c04153c831b5 --- runtime/vm/intermediate_language_ia32.cc | 15 ++++++++++++--- runtime/vm/intermediate_language_x64.cc | 15 ++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc index 13d11e8e954..9f44781c018 100644 --- a/runtime/vm/intermediate_language_ia32.cc +++ b/runtime/vm/intermediate_language_ia32.cc @@ -1999,7 +1999,13 @@ LocationSummary* BranchInstr::MakeLocationSummary() const { // Otherwise polymorphic dispatch. } // Call. - return Computation::MakeCallSummary(); + const intptr_t kNumInputs = 2; + const intptr_t kNumTemps = 0; + LocationSummary* locs = + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); + locs->set_in(0, Location::RegisterLocation(EAX)); + locs->set_in(1, Location::RegisterLocation(ECX)); + return locs; } @@ -2032,6 +2038,10 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { } // Otherwise polymorphic dispatch? } + Register left = locs()->in(0).reg(); + Register right = locs()->in(1).reg(); + __ pushl(left); + __ pushl(right); // Not equal is always split into '==' and negate, Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL; Token::Kind call_kind = (kind() == Token::kNE) ? Token::kEQ : kind(); @@ -2050,8 +2060,7 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { kNumArguments, Array::ZoneHandle(), // No optional arguments. kNumArgsChecked); - ASSERT(locs()->out().reg() == EAX); - __ CompareObject(locs()->out().reg(), compiler->bool_true()); + __ CompareObject(EAX, compiler->bool_true()); EmitBranchOnCondition(compiler, branch_condition); } diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc index cd36da8685b..b4846c5db6c 100644 --- a/runtime/vm/intermediate_language_x64.cc +++ b/runtime/vm/intermediate_language_x64.cc @@ -2005,7 +2005,13 @@ LocationSummary* BranchInstr::MakeLocationSummary() const { // Otherwise polymorphic dispatch. } // Call. - return Computation::MakeCallSummary(); + const intptr_t kNumInputs = 2; + const intptr_t kNumTemps = 0; + LocationSummary* locs = + new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); + locs->set_in(0, Location::RegisterLocation(RAX)); + locs->set_in(1, Location::RegisterLocation(RCX)); + return locs; } @@ -2038,6 +2044,10 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { } // Otherwise polymorphic dispatch? } + Register left = locs()->in(0).reg(); + Register right = locs()->in(1).reg(); + __ pushq(left); + __ pushq(right); // Not equal is always split into '==' and negate, Condition branch_condition = (kind() == Token::kNE) ? NOT_EQUAL : EQUAL; Token::Kind call_kind = (kind() == Token::kNE) ? Token::kEQ : kind(); @@ -2056,8 +2066,7 @@ void BranchInstr::EmitNativeCode(FlowGraphCompiler* compiler) { kNumArguments, Array::ZoneHandle(), // No optional arguments. kNumArgsChecked); - ASSERT(locs()->out().reg() == RAX); - __ CompareObject(locs()->out().reg(), compiler->bool_true()); + __ CompareObject(RAX, compiler->bool_true()); EmitBranchOnCondition(compiler, branch_condition); }