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

Unified Diff: runtime/vm/intrinsifier_x64.cc

Issue 22825023: Uses an object pool on x64 (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 3 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 | « runtime/vm/intermediate_language_x64.cc ('k') | runtime/vm/object_x64_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intrinsifier_x64.cc
===================================================================
--- runtime/vm/intrinsifier_x64.cc (revision 27291)
+++ runtime/vm/intrinsifier_x64.cc (working copy)
@@ -117,15 +117,14 @@
// RCX: new object end address.
// RDI: iterator which initially points to the start of the variable
// data area to be initialized.
- const Immediate& raw_null =
- Immediate(reinterpret_cast<intptr_t>(Object::null()));
+ __ LoadObject(R12, Object::Handle(), PP);
__ leaq(RDI, FieldAddress(RAX, sizeof(RawArray)));
Label done;
Label init_loop;
__ Bind(&init_loop);
__ cmpq(RDI, RCX);
__ j(ABOVE_EQUAL, &done, Assembler::kNearJump);
- __ movq(Address(RDI, 0), raw_null);
+ __ movq(Address(RDI, 0), R12);
__ addq(RDI, Immediate(kWordSize));
__ jmp(&init_loop, Assembler::kNearJump);
__ Bind(&done);
@@ -392,9 +391,7 @@
__ StoreIntoObject(RDX,
FieldAddress(RDX, RCX, TIMES_4, Array::data_offset()),
RAX);
- const Immediate& raw_null =
- Immediate(reinterpret_cast<int64_t>(Object::null()));
- __ movq(RAX, raw_null);
+ __ LoadObject(RAX, Object::Handle(), PP);
__ ret();
__ Bind(&fall_through);
}
@@ -879,10 +876,10 @@
// RAX contains the right argument.
__ cmpq(Address(RSP, + 2 * kWordSize), RAX);
__ j(true_condition, &true_label, Assembler::kNearJump);
- __ LoadObject(RAX, Bool::False());
+ __ LoadObject(RAX, Bool::False(), PP);
__ ret();
__ Bind(&true_label);
- __ LoadObject(RAX, Bool::True());
+ __ LoadObject(RAX, Bool::True(), PP);
__ ret();
__ Bind(&fall_through);
}
@@ -919,34 +916,39 @@
void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
Label fall_through, true_label, check_for_mint;
// For integer receiver '===' check first.
- __ movq(RAX, Address(RSP, + 1 * kWordSize));
- __ movq(RCX, Address(RSP, + 2 * kWordSize));
+ // Entering a dart frame so we can use the PP for loading True and False.
+ __ EnterDartFrame(0);
+ __ movq(RAX, Address(RSP, + 4 * kWordSize));
+ __ movq(RCX, Address(RSP, + 5 * kWordSize));
__ cmpq(RAX, RCX);
__ j(EQUAL, &true_label, Assembler::kNearJump);
__ orq(RAX, RCX);
__ testq(RAX, Immediate(kSmiTagMask));
__ j(NOT_ZERO, &check_for_mint, Assembler::kNearJump);
// Both arguments are smi, '===' is good enough.
- __ LoadObject(RAX, Bool::False());
+ __ LoadObject(RAX, Bool::False(), PP);
+ __ LeaveFrameWithPP();
__ ret();
__ Bind(&true_label);
- __ LoadObject(RAX, Bool::True());
+ __ LoadObject(RAX, Bool::True(), PP);
+ __ LeaveFrameWithPP();
__ ret();
// At least one of the arguments was not Smi.
Label receiver_not_smi;
__ Bind(&check_for_mint);
- __ movq(RAX, Address(RSP, + 2 * kWordSize)); // Receiver.
+ __ movq(RAX, Address(RSP, + 5 * kWordSize)); // Receiver.
__ testq(RAX, Immediate(kSmiTagMask));
__ j(NOT_ZERO, &receiver_not_smi);
// Left (receiver) is Smi, return false if right is not Double.
// Note that an instance of Mint or Bigint never contains a value that can be
// represented by Smi.
- __ movq(RAX, Address(RSP, + 1 * kWordSize));
+ __ movq(RAX, Address(RSP, + 4 * kWordSize));
__ CompareClassId(RAX, kDoubleCid);
__ j(EQUAL, &fall_through);
- __ LoadObject(RAX, Bool::False());
+ __ LoadObject(RAX, Bool::False(), PP);
+ __ LeaveFrameWithPP();
__ ret();
__ Bind(&receiver_not_smi);
@@ -954,14 +956,17 @@
__ CompareClassId(RAX, kMintCid);
__ j(NOT_EQUAL, &fall_through);
// Receiver is Mint, return false if right is Smi.
- __ movq(RAX, Address(RSP, + 1 * kWordSize)); // Right argument.
+ __ movq(RAX, Address(RSP, + 4 * kWordSize)); // Right argument.
__ testq(RAX, Immediate(kSmiTagMask));
__ j(NOT_ZERO, &fall_through);
- __ LoadObject(RAX, Bool::False()); // Smi == Mint -> false.
+ // Smi == Mint -> false.
+ __ LoadObject(RAX, Bool::False(), PP);
+ __ LeaveFrameWithPP();
__ ret();
// TODO(srdjan): Implement Mint == Mint comparison.
__ Bind(&fall_through);
+ __ LeaveFrameWithPP();
}
@@ -1041,10 +1046,10 @@
__ j(true_condition, &is_true, Assembler::kNearJump);
// Fall through false.
__ Bind(&is_false);
- __ LoadObject(RAX, Bool::False());
+ __ LoadObject(RAX, Bool::False(), PP);
__ ret();
__ Bind(&is_true);
- __ LoadObject(RAX, Bool::True());
+ __ LoadObject(RAX, Bool::True(), PP);
__ ret();
__ Bind(&is_smi);
__ SmiUntag(RAX);
@@ -1178,10 +1183,10 @@
__ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
__ comisd(XMM0, XMM0);
__ j(PARITY_EVEN, &is_true, Assembler::kNearJump); // NaN -> true;
- __ LoadObject(RAX, Bool::False());
+ __ LoadObject(RAX, Bool::False(), PP);
__ ret();
__ Bind(&is_true);
- __ LoadObject(RAX, Bool::True());
+ __ LoadObject(RAX, Bool::True(), PP);
__ ret();
}
@@ -1196,10 +1201,10 @@
__ j(EQUAL, &is_zero, Assembler::kNearJump); // Check for negative zero.
__ j(ABOVE_EQUAL, &is_false, Assembler::kNearJump); // >= 0 -> false.
__ Bind(&is_true);
- __ LoadObject(RAX, Bool::True());
+ __ LoadObject(RAX, Bool::True(), PP);
__ ret();
__ Bind(&is_false);
- __ LoadObject(RAX, Bool::False());
+ __ LoadObject(RAX, Bool::False(), PP);
__ ret();
__ Bind(&is_zero);
// Check for negative zero (get the sign bit).
@@ -1347,17 +1352,23 @@
}
-
// Identity comparison.
void Intrinsifier::Object_equal(Assembler* assembler) {
Label is_true;
- __ movq(RAX, Address(RSP, + 1 * kWordSize));
- __ cmpq(RAX, Address(RSP, + 2 * kWordSize));
+ // This intrinsic is used from the API even when we have not entered any
+ // Dart frame, yet, so the PP would otherwise be null in this case unless
+ // we enter a Dart frame here.
+ __ EnterDartFrame(0);
+ __ movq(RAX, Address(RSP, + 4 * kWordSize));
+ __ cmpq(RAX, Address(RSP, + 5 * kWordSize));
__ j(EQUAL, &is_true, Assembler::kNearJump);
- __ LoadObject(RAX, Bool::False());
+ __ movq(RAX, Immediate(reinterpret_cast<int64_t>(Bool::False().raw())));
+ __ LoadObject(RAX, Bool::False(), PP);
+ __ LeaveFrameWithPP();
__ ret();
__ Bind(&is_true);
- __ LoadObject(RAX, Bool::True());
+ __ LoadObject(RAX, Bool::True(), PP);
+ __ LeaveFrameWithPP();
__ ret();
}
@@ -1417,10 +1428,10 @@
__ movq(RAX, FieldAddress(RAX, String::length_offset()));
__ cmpq(RAX, Immediate(Smi::RawValue(0)));
__ j(EQUAL, &is_true, Assembler::kNearJump);
- __ LoadObject(RAX, Bool::False());
+ __ LoadObject(RAX, Bool::False(), PP);
__ ret();
__ Bind(&is_true);
- __ LoadObject(RAX, Bool::True());
+ __ LoadObject(RAX, Bool::True(), PP);
__ ret();
}
« no previous file with comments | « runtime/vm/intermediate_language_x64.cc ('k') | runtime/vm/object_x64_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698