mirror of
https://github.com/dart-lang/sdk
synced 2024-10-06 06:27:29 +00:00
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:
parent
97e89233ca
commit
10977e0540
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue