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

Unified Diff: vm/intermediate_language_x64.cc

Issue 10850014: Separate double binary operation into a separate instruction class. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/runtime/
Patch Set: added ia32 Created 8 years, 5 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
« no previous file with comments | « vm/intermediate_language_ia32.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: vm/intermediate_language_x64.cc
===================================================================
--- vm/intermediate_language_x64.cc (revision 10161)
+++ vm/intermediate_language_x64.cc (working copy)
@@ -1515,9 +1515,8 @@
LocationSummary* BinaryOpComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 2;
- if (operands_type() == kDoubleOperands) {
- return MakeCallSummary(); // Calls into a stub for allocation.
- }
+ // Double operation are handled in DoubleBinaryOpComp.
+ ASSERT(operands_type() != kDoubleOperands);
if (operands_type() == kMintOperands) {
ASSERT(op_kind() == Token::kBIT_AND);
@@ -1821,19 +1820,39 @@
}
-static void EmitDoubleBinaryOp(FlowGraphCompiler* compiler,
- BinaryOpComp* comp) {
+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 {
+ return MakeCallSummary(); // Calls into a stub for allocation.
+}
+
+
+void DoubleBinaryOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
Register left = RBX;
Register right = RCX;
Register temp = RDX;
- Register result = comp->locs()->out().reg();
+ Register result = locs()->out().reg();
const Class& double_class = compiler->double_class();
const Code& stub =
Code::Handle(StubCode::GetAllocationStubForClass(double_class));
const ExternalLabel label(double_class.ToCString(), stub.EntryPoint());
- compiler->GenerateCall(comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
+ compiler->GenerateCall(instance_call()->token_pos(),
+ instance_call()->try_index(),
&label,
PcDescriptors::kOther);
// Newly allocated object is now in the result register (RAX).
@@ -1841,9 +1860,9 @@
__ popq(right);
__ popq(left);
- Label* deopt = compiler->AddDeoptStub(comp->instance_call()->cid(),
- comp->instance_call()->token_pos(),
- comp->instance_call()->try_index(),
+ Label* deopt = compiler->AddDeoptStub(instance_call()->cid(),
+ instance_call()->token_pos(),
+ instance_call()->try_index(),
kDeoptDoubleBinaryOp,
left,
right);
@@ -1851,7 +1870,7 @@
compiler->LoadDoubleOrSmiToXmm(XMM0, left, temp, deopt);
compiler->LoadDoubleOrSmiToXmm(XMM1, right, temp, deopt);
- switch (comp->op_kind()) {
+ switch (op_kind()) {
case Token::kADD: __ addsd(XMM0, XMM1); break;
case Token::kSUB: __ subsd(XMM0, XMM1); break;
case Token::kMUL: __ mulsd(XMM0, XMM1); break;
@@ -1863,26 +1882,6 @@
}
-void BinaryOpComp::EmitNativeCode(FlowGraphCompiler* compiler) {
- switch (operands_type()) {
- case kSmiOperands:
- EmitSmiBinaryOp(compiler, this);
- break;
-
- case kMintOperands:
- EmitMintBinaryOp(compiler, this);
- break;
-
- case kDoubleOperands:
- EmitDoubleBinaryOp(compiler, this);
- break;
-
- default:
- UNREACHABLE();
- }
-}
-
-
LocationSummary* UnarySmiOpComp::MakeLocationSummary() const {
const intptr_t kNumInputs = 1;
const intptr_t kNumTemps = 0;
« no previous file with comments | « vm/intermediate_language_ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698