Index: src/mips/ic-mips.cc |
diff --git a/src/mips/ic-mips.cc b/src/mips/ic-mips.cc |
index 080631aaa84134385a88e9998fadf41c187a8869..24db0ce0f0deaae2ba600d62719d50ed079deba2 100644 |
--- a/src/mips/ic-mips.cc |
+++ b/src/mips/ic-mips.cc |
@@ -322,6 +322,8 @@ void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { |
// -- ra : return address |
// -- a0 : receiver |
// ----------------------------------- |
+ ASSERT(a0.is(ReceiverRegister())); |
+ ASSERT(a2.is(NameRegister())); |
// Probe the stub cache. |
Code::Flags flags = Code::ComputeHandlerFlags(Code::LOAD_IC); |
@@ -339,6 +341,9 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) { |
// -- lr : return address |
// -- a0 : receiver |
// ----------------------------------- |
+ ASSERT(a0.is(ReceiverRegister())); |
+ ASSERT(a2.is(NameRegister())); |
+ |
Label miss, slow; |
GenerateNameDictionaryReceiverCheck(masm, a0, a1, a3, t0, &miss); |
@@ -357,18 +362,18 @@ void LoadIC::GenerateNormal(MacroAssembler* masm) { |
} |
+// A register that isn't one of the parameters to the load ic. |
+static const Register LoadIC_TempRegister() { return a3; } |
+ |
+ |
void LoadIC::GenerateMiss(MacroAssembler* masm) { |
- // ----------- S t a t e ------------- |
- // -- a2 : name |
- // -- ra : return address |
- // -- a0 : receiver |
- // ----------------------------------- |
+ // The return address is on the stack. |
Isolate* isolate = masm->isolate(); |
__ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, t0); |
- __ mov(a3, a0); |
- __ Push(a3, a2); |
+ __ mov(LoadIC_TempRegister(), ReceiverRegister()); |
+ __ Push(LoadIC_TempRegister(), NameRegister()); |
// Perform tail call to the entry. |
ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss), isolate); |
@@ -377,14 +382,10 @@ void LoadIC::GenerateMiss(MacroAssembler* masm) { |
void LoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
- // ---------- S t a t e -------------- |
- // -- a2 : name |
- // -- ra : return address |
- // -- a0 : receiver |
- // ----------------------------------- |
+ // The return address is on the stack. |
- __ mov(a3, a0); |
- __ Push(a3, a2); |
+ __ mov(LoadIC_TempRegister(), ReceiverRegister()); |
+ __ Push(LoadIC_TempRegister(), NameRegister()); |
__ TailCallRuntime(Runtime::kGetProperty, 2, 1); |
} |
@@ -486,6 +487,8 @@ void KeyedLoadIC::GenerateSloppyArguments(MacroAssembler* masm) { |
// -- a0 : key |
// -- a1 : receiver |
// ----------------------------------- |
+ ASSERT(a1.is(ReceiverRegister())); |
+ ASSERT(a0.is(NameRegister())); |
Label slow, notin; |
MemOperand mapped_location = |
GenerateMappedArgumentsLookup(masm, a1, a0, a2, a3, t0, ¬in, &slow); |
@@ -541,16 +544,12 @@ void KeyedStoreIC::GenerateSloppyArguments(MacroAssembler* masm) { |
void KeyedLoadIC::GenerateMiss(MacroAssembler* masm) { |
- // ---------- S t a t e -------------- |
- // -- ra : return address |
- // -- a0 : key |
- // -- a1 : receiver |
- // ----------------------------------- |
+ // The return address is on the stack. |
Isolate* isolate = masm->isolate(); |
__ IncrementCounter(isolate->counters()->keyed_load_miss(), 1, a3, t0); |
- __ Push(a1, a0); |
+ __ Push(ReceiverRegister(), NameRegister()); |
// Perform tail call to the entry. |
ExternalReference ref = |
@@ -568,13 +567,9 @@ const Register KeyedLoadIC::NameRegister() { return a0; } |
void KeyedLoadIC::GenerateRuntimeGetProperty(MacroAssembler* masm) { |
- // ---------- S t a t e -------------- |
- // -- ra : return address |
- // -- a0 : key |
- // -- a1 : receiver |
- // ----------------------------------- |
+ // The return address is on the stack. |
- __ Push(a1, a0); |
+ __ Push(ReceiverRegister(), NameRegister()); |
__ TailCallRuntime(Runtime::kKeyedGetProperty, 2, 1); |
} |
@@ -589,8 +584,10 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { |
Label slow, check_name, index_smi, index_name, property_array_property; |
Label probe_dictionary, check_number_dictionary; |
- Register key = a0; |
- Register receiver = a1; |
+ Register key = NameRegister(); |
+ Register receiver = ReceiverRegister(); |
+ ASSERT(key.is(a0)); |
+ ASSERT(receiver.is(a1)); |
Isolate* isolate = masm->isolate(); |
@@ -759,17 +756,14 @@ void KeyedLoadIC::GenerateGeneric(MacroAssembler* masm) { |
void KeyedLoadIC::GenerateString(MacroAssembler* masm) { |
- // ---------- S t a t e -------------- |
- // -- ra : return address |
- // -- a0 : key (index) |
- // -- a1 : receiver |
- // ----------------------------------- |
+ // Return address is on the stack. |
Label miss; |
- Register receiver = a1; |
- Register index = a0; |
+ Register receiver = ReceiverRegister(); |
+ Register index = NameRegister(); |
Register scratch = a3; |
Register result = v0; |
+ ASSERT(!scratch.is(receiver) && !scratch.is(index)); |
StringCharAtGenerator char_at_generator(receiver, |
index, |
@@ -1078,30 +1072,33 @@ void KeyedStoreIC::GenerateGeneric(MacroAssembler* masm, |
void KeyedLoadIC::GenerateIndexedInterceptor(MacroAssembler* masm) { |
- // ---------- S t a t e -------------- |
- // -- ra : return address |
- // -- a0 : key |
- // -- a1 : receiver |
- // ----------------------------------- |
+ // Return address is on the stack. |
Label slow; |
+ Register receiver = ReceiverRegister(); |
+ Register key = NameRegister(); |
+ Register scratch1 = a2; |
+ Register scratch2 = a3; |
+ ASSERT(!scratch1.is(receiver) && !scratch1.is(key)); |
+ ASSERT(!scratch2.is(receiver) && !scratch2.is(key)); |
+ |
// Check that the receiver isn't a smi. |
- __ JumpIfSmi(a1, &slow); |
+ __ JumpIfSmi(receiver, &slow); |
// Check that the key is an array index, that is Uint32. |
- __ And(t0, a0, Operand(kSmiTagMask | kSmiSignMask)); |
+ __ And(t0, key, Operand(kSmiTagMask | kSmiSignMask)); |
__ Branch(&slow, ne, t0, Operand(zero_reg)); |
// Get the map of the receiver. |
- __ lw(a2, FieldMemOperand(a1, HeapObject::kMapOffset)); |
+ __ lw(scratch1, FieldMemOperand(receiver, HeapObject::kMapOffset)); |
// Check that it has indexed interceptor and access checks |
// are not enabled for this object. |
- __ lbu(a3, FieldMemOperand(a2, Map::kBitFieldOffset)); |
- __ And(a3, a3, Operand(kSlowCaseBitFieldMask)); |
- __ Branch(&slow, ne, a3, Operand(1 << Map::kHasIndexedInterceptor)); |
+ __ lbu(scratch2, FieldMemOperand(scratch1, Map::kBitFieldOffset)); |
+ __ And(scratch2, scratch2, Operand(kSlowCaseBitFieldMask)); |
+ __ Branch(&slow, ne, scratch2, Operand(1 << Map::kHasIndexedInterceptor)); |
// Everything is fine, call runtime. |
- __ Push(a1, a0); // Receiver, key. |
+ __ Push(receiver, key); // Receiver, key. |
// Perform tail call to the entry. |
__ TailCallExternalReference(ExternalReference( |