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
This commit is contained in:
fschneider@google.com 2012-08-10 10:34:38 +00:00
parent 97e89233ca
commit 10977e0540
2 changed files with 24 additions and 6 deletions

View file

@ -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);
}

View file

@ -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);
}