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

Unified Diff: runtime/vm/intrinsifier_x64.cc

Issue 23480098: Setup the pool pointer when entering Dart from C++ so the intrinsic functions may rely on it being … (Closed) Base URL: https://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/dart_api_impl_test.cc ('k') | runtime/vm/stub_code_x64.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/intrinsifier_x64.cc
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index cdfa888a3c9e5678f2cb5c3ca355f3c058951713..83180beb4bf9fc58743fd39ff70aa7a72ff9785b 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -915,11 +915,12 @@ void Intrinsifier::Integer_greaterEqualThan(Assembler* assembler) {
// can be Smi, Mint, Bigint or double.
void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
Label fall_through, true_label, check_for_mint;
+ const intptr_t kReceiverOffset = 2;
+ const intptr_t kArgumentOffset = 1;
+
// For integer receiver '===' check first.
- // 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));
+ __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
+ __ movq(RCX, Address(RSP, + kReceiverOffset * kWordSize));
__ cmpq(RAX, RCX);
__ j(EQUAL, &true_label, Assembler::kNearJump);
__ orq(RAX, RCX);
@@ -927,28 +928,25 @@ void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
__ j(NOT_ZERO, &check_for_mint, Assembler::kNearJump);
// Both arguments are smi, '===' is good enough.
__ LoadObject(RAX, Bool::False(), PP);
- __ LeaveFrameWithPP();
__ ret();
__ Bind(&true_label);
__ 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, + 5 * kWordSize)); // Receiver.
+ __ movq(RAX, Address(RSP, + kReceiverOffset * kWordSize));
__ 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, + 4 * kWordSize));
+ __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
__ CompareClassId(RAX, kDoubleCid);
__ j(EQUAL, &fall_through);
__ LoadObject(RAX, Bool::False(), PP);
- __ LeaveFrameWithPP();
__ ret();
__ Bind(&receiver_not_smi);
@@ -956,17 +954,15 @@ void Intrinsifier::Integer_equalToInteger(Assembler* assembler) {
__ CompareClassId(RAX, kMintCid);
__ j(NOT_EQUAL, &fall_through);
// Receiver is Mint, return false if right is Smi.
- __ movq(RAX, Address(RSP, + 4 * kWordSize)); // Right argument.
+ __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
__ testq(RAX, Immediate(kSmiTagMask));
__ j(NOT_ZERO, &fall_through);
// Smi == Mint -> false.
__ LoadObject(RAX, Bool::False(), PP);
- __ LeaveFrameWithPP();
__ ret();
// TODO(srdjan): Implement Mint == Mint comparison.
__ Bind(&fall_through);
- __ LeaveFrameWithPP();
}
@@ -1351,24 +1347,19 @@ void Intrinsifier::Random_nextState(Assembler* assembler) {
__ ret();
}
-
// Identity comparison.
void Intrinsifier::Object_equal(Assembler* assembler) {
Label is_true;
- // 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));
+ const intptr_t kReceiverOffset = 2;
+ const intptr_t kArgumentOffset = 1;
+
+ __ movq(RAX, Address(RSP, + kArgumentOffset * kWordSize));
+ __ cmpq(RAX, Address(RSP, + kReceiverOffset * kWordSize));
__ j(EQUAL, &is_true, Assembler::kNearJump);
- __ movq(RAX, Immediate(reinterpret_cast<int64_t>(Bool::False().raw())));
__ LoadObject(RAX, Bool::False(), PP);
- __ LeaveFrameWithPP();
__ ret();
__ Bind(&is_true);
__ LoadObject(RAX, Bool::True(), PP);
- __ LeaveFrameWithPP();
__ ret();
}
« no previous file with comments | « runtime/vm/dart_api_impl_test.cc ('k') | runtime/vm/stub_code_x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698