Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1300)

Unified Diff: runtime/vm/intermediate_language_x64.cc

Issue 10879005: Split BinaryOp into BinarySmiOp and BinaryMintOp. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/intermediate_language_x64.cc
===================================================================
--- runtime/vm/intermediate_language_x64.cc (revision 11125)
+++ runtime/vm/intermediate_language_x64.cc (working copy)
@@ -1427,25 +1427,8 @@
}
-LocationSummary* BinaryOpComp::MakeLocationSummary() const {
+LocationSummary* BinarySmiOpComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
-
- // Double operation are handled in DoubleBinaryOpComp.
- ASSERT(operands_type() != kDoubleOperands);
-
- if (operands_type() == kMintOperands) {
- ASSERT(op_kind() == Token::kBIT_AND);
- const intptr_t kNumTemps = 0;
- LocationSummary* summary =
- new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
- summary->set_in(0, Location::RegisterLocation(RAX));
- summary->set_in(1, Location::RegisterLocation(RCX));
- summary->set_out(Location::RegisterLocation(RAX));
- return summary;
- }
-
- ASSERT(operands_type() == kSmiOperands);
-
if (op_kind() == Token::kTRUNCDIV) {
const intptr_t kNumTemps = 3;
LocationSummary* summary =
@@ -1491,16 +1474,16 @@
}
-static void EmitSmiBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) {
- Register left = comp->locs()->in(0).reg();
- Register right = comp->locs()->in(1).reg();
- Register result = comp->locs()->out().reg();
- Register temp = comp->locs()->temp(0).reg();
+void BinarySmiOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
+ Register left = locs()->in(0).reg();
+ Register right = locs()->in(1).reg();
+ Register result = locs()->out().reg();
+ Register temp = locs()->temp(0).reg();
ASSERT(left == result);
- const bool left_is_smi = comp->left()->ResultCid() == kSmiCid;
- const bool right_is_smi = comp->right()->ResultCid() == kSmiCid;
+ const bool left_is_smi = this->left()->ResultCid() == kSmiCid;
+ const bool right_is_smi = this->right()->ResultCid() == kSmiCid;
bool can_deopt;
- switch (comp->op_kind()) {
+ switch (op_kind()) {
case Token::kBIT_AND:
case Token::kBIT_OR:
case Token::kBIT_XOR:
@@ -1511,9 +1494,9 @@
}
Label* deopt = NULL;
if (can_deopt) {
- deopt = compiler->AddDeoptStub(comp->instance_call()->deopt_id(),
- comp->instance_call()->try_index(),
- kDeoptSmiBinaryOp);
+ deopt = compiler->AddDeoptStub(instance_call()->deopt_id(),
+ instance_call()->try_index(),
+ kDeoptBinarySmiOp);
}
if (!left_is_smi || !right_is_smi) {
__ movq(temp, left);
@@ -1521,7 +1504,7 @@
__ testq(temp, Immediate(kSmiTagMask));
__ j(NOT_ZERO, deopt);
}
- switch (comp->op_kind()) {
+ switch (op_kind()) {
case Token::kADD: {
__ addq(left, right);
__ j(OVERFLOW, deopt);
@@ -1561,9 +1544,9 @@
ASSERT(left == RAX);
ASSERT((right != RDX) && (right != RAX));
ASSERT((temp != RDX) && (temp != RAX));
- ASSERT(comp->locs()->temp(1).reg() == RDX);
+ ASSERT(locs()->temp(1).reg() == RDX);
ASSERT(result == RAX);
- Register right_temp = comp->locs()->temp(2).reg();
+ Register right_temp = locs()->temp(2).reg();
__ movq(right_temp, right);
__ SmiUntag(left);
__ SmiUntag(right_temp);
@@ -1600,7 +1583,7 @@
__ cmpq(right,
Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
__ j(ABOVE_EQUAL, &call_method, Assembler::kNearJump);
- Register right_temp = comp->locs()->temp(1).reg();
+ Register right_temp = locs()->temp(1).reg();
ASSERT(right_temp == RCX); // Count must be in RCX
__ movq(right_temp, right);
__ SmiUntag(right_temp);
@@ -1615,19 +1598,19 @@
{
__ Bind(&call_method);
Function& target = Function::ZoneHandle(
- comp->ic_data()->GetTargetForReceiverClassId(kSmiCid));
+ ic_data()->GetTargetForReceiverClassId(kSmiCid));
ASSERT(!target.IsNull());
const intptr_t kArgumentCount = 2;
__ pushq(temp);
__ pushq(right);
compiler->GenerateStaticCall(
- comp->instance_call()->deopt_id(),
- comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
+ instance_call()->deopt_id(),
+ instance_call()->token_pos(),
+ instance_call()->try_index(),
target,
kArgumentCount,
Array::Handle(), // No argument names.
- comp->locs()->stack_bitmap());
+ locs()->stack_bitmap());
ASSERT(result == RAX);
}
__ Bind(&done);
@@ -1658,19 +1641,32 @@
}
-static void EmitMintBinaryOp(FlowGraphCompiler* compiler, BinaryOpComp* comp) {
+LocationSummary* BinaryMintOpComp::MakeLocationSummary() const {
+ ASSERT(op_kind() == Token::kBIT_AND);
+ const intptr_t kNumInputs = 2;
+ const intptr_t kNumTemps = 0;
+ LocationSummary* summary =
+ new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall);
+ summary->set_in(0, Location::RegisterLocation(RAX));
+ summary->set_in(1, Location::RegisterLocation(RCX));
+ summary->set_out(Location::RegisterLocation(RAX));
+ return summary;
+}
+
+
+void BinaryMintOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
// TODO(regis): For now, we only support Token::kBIT_AND for a Mint or Smi
// receiver and a Mint or Smi argument. We fall back to the run time call if
// both receiver and argument are Mint or if one of them is Mint and the other
// is a negative Smi.
- Register left = comp->locs()->in(0).reg();
- Register right = comp->locs()->in(1).reg();
- Register result = comp->locs()->out().reg();
+ Register left = locs()->in(0).reg();
+ Register right = locs()->in(1).reg();
+ Register result = locs()->out().reg();
ASSERT(left == result);
- ASSERT(comp->op_kind() == Token::kBIT_AND);
- Label* deopt = compiler->AddDeoptStub(comp->instance_call()->deopt_id(),
- comp->instance_call()->try_index(),
- kDeoptMintBinaryOp);
+ ASSERT(op_kind() == Token::kBIT_AND);
+ Label* deopt = compiler->AddDeoptStub(instance_call()->deopt_id(),
+ instance_call()->try_index(),
+ kDeoptBinaryMintOp);
Label mint_static_call, smi_static_call, non_smi, smi_smi, done;
__ testq(left, Immediate(kSmiTagMask)); // Is receiver Smi?
__ j(NOT_ZERO, &non_smi);
@@ -1707,20 +1703,20 @@
__ Bind(&smi_static_call);
{
Function& target = Function::ZoneHandle(
- comp->ic_data()->GetTargetForReceiverClassId(kSmiCid));
+ ic_data()->GetTargetForReceiverClassId(kSmiCid));
if (target.IsNull()) {
__ jmp(deopt);
} else {
__ pushq(left);
__ pushq(right);
compiler->GenerateStaticCall(
- comp->instance_call()->deopt_id(),
- comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
+ instance_call()->deopt_id(),
+ instance_call()->token_pos(),
+ instance_call()->try_index(),
target,
- comp->instance_call()->ArgumentCount(),
- comp->instance_call()->argument_names(),
- comp->locs()->stack_bitmap());
+ instance_call()->ArgumentCount(),
+ instance_call()->argument_names(),
+ locs()->stack_bitmap());
ASSERT(result == RAX);
__ jmp(&done);
}
@@ -1729,20 +1725,20 @@
__ Bind(&mint_static_call);
{
Function& target = Function::ZoneHandle(
- comp->ic_data()->GetTargetForReceiverClassId(kMintCid));
+ ic_data()->GetTargetForReceiverClassId(kMintCid));
if (target.IsNull()) {
__ jmp(deopt);
} else {
__ pushq(left);
__ pushq(right);
compiler->GenerateStaticCall(
- comp->instance_call()->deopt_id(),
- comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
+ instance_call()->deopt_id(),
+ instance_call()->token_pos(),
+ instance_call()->try_index(),
target,
- comp->instance_call()->ArgumentCount(),
- comp->instance_call()->argument_names(),
- comp->locs()->stack_bitmap());
+ instance_call()->ArgumentCount(),
+ instance_call()->argument_names(),
+ locs()->stack_bitmap());
ASSERT(result == RAX);
}
}
@@ -1750,28 +1746,12 @@
}
-void BinaryOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
- switch (operands_type()) {
- case kSmiOperands:
- EmitSmiBinaryOp(compiler, this);
- break;
-
- case kMintOperands:
- EmitMintBinaryOp(compiler, this);
- break;
-
- default:
- UNREACHABLE();
- }
-}
-
-
-LocationSummary* DoubleBinaryOpComp::MakeLocationSummary() const {
+LocationSummary* BinaryDoubleOpComp::MakeLocationSummary() const {
return MakeCallSummary(); // Calls into a stub for allocation.
}
-void DoubleBinaryOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
+void BinaryDoubleOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
Register left = RBX;
Register right = RCX;
Register temp = RDX;
@@ -1793,7 +1773,7 @@
Label* deopt = compiler->AddDeoptStub(instance_call()->deopt_id(),
instance_call()->try_index(),
- kDeoptDoubleBinaryOp);
+ kDeoptBinaryDoubleOp);
// Binary operation of two Smi's produces a Smi not a double.
__ movq(temp, left);
« runtime/vm/intermediate_language.cc ('K') | « runtime/vm/intermediate_language_ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698