Index: src/arm/ic-arm.cc |
=================================================================== |
--- src/arm/ic-arm.cc (revision 4501) |
+++ src/arm/ic-arm.cc (working copy) |
@@ -61,6 +61,7 @@ |
// dictionary. |
// |
// r2 - holds the name of the property and is unchanged. |
+ // r4 - used as temporary. |
Label done; |
@@ -108,25 +109,25 @@ |
static const int kProbes = 4; |
for (int i = 0; i < kProbes; i++) { |
// Compute the masked index: (hash + i + i * i) & mask. |
- __ ldr(t1, FieldMemOperand(r2, String::kHashFieldOffset)); |
+ __ ldr(r4, FieldMemOperand(r2, String::kHashFieldOffset)); |
if (i > 0) { |
// Add the probe offset (i + i * i) left shifted to avoid right shifting |
// the hash in a separate instruction. The value hash + i + i * i is right |
// shifted in the following and instruction. |
ASSERT(StringDictionary::GetProbeOffset(i) < |
1 << (32 - String::kHashFieldOffset)); |
- __ add(t1, t1, Operand( |
+ __ add(r4, r4, Operand( |
StringDictionary::GetProbeOffset(i) << String::kHashShift)); |
} |
- __ and_(t1, r3, Operand(t1, LSR, String::kHashShift)); |
+ __ and_(r4, r3, Operand(r4, LSR, String::kHashShift)); |
// Scale the index by multiplying by the element size. |
ASSERT(StringDictionary::kEntrySize == 3); |
- __ add(t1, t1, Operand(t1, LSL, 1)); // t1 = t1 * 3 |
+ __ add(r4, r4, Operand(r4, LSL, 1)); // r4 = r4 * 3 |
// Check if the key is identical to the name. |
- __ add(t1, t0, Operand(t1, LSL, 2)); |
- __ ldr(ip, FieldMemOperand(t1, kElementsStartOffset)); |
+ __ add(r4, t0, Operand(r4, LSL, 2)); |
+ __ ldr(ip, FieldMemOperand(r4, kElementsStartOffset)); |
__ cmp(r2, Operand(ip)); |
if (i != kProbes - 1) { |
__ b(eq, &done); |
@@ -136,13 +137,13 @@ |
} |
// Check that the value is a normal property. |
- __ bind(&done); // t1 == t0 + 4*index |
- __ ldr(r3, FieldMemOperand(t1, kElementsStartOffset + 2 * kPointerSize)); |
+ __ bind(&done); // r4 == t0 + 4*index |
+ __ ldr(r3, FieldMemOperand(r4, kElementsStartOffset + 2 * kPointerSize)); |
__ tst(r3, Operand(PropertyDetails::TypeField::mask() << kSmiTagSize)); |
__ b(ne, miss); |
// Get the value at the masked, scaled index and return. |
- __ ldr(t1, FieldMemOperand(t1, kElementsStartOffset + 1 * kPointerSize)); |
+ __ ldr(t1, FieldMemOperand(r4, kElementsStartOffset + 1 * kPointerSize)); |
} |
@@ -239,12 +240,11 @@ |
// ----------- S t a t e ------------- |
// -- r2 : name |
// -- lr : return address |
- // -- [sp] : receiver |
+ // -- r0 : receiver |
+ // -- sp[0] : receiver |
// ----------------------------------- |
Label miss; |
- __ ldr(r0, MemOperand(sp, 0)); |
- |
StubCompiler::GenerateLoadArrayLength(masm, r0, r3, &miss); |
__ bind(&miss); |
StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); |
@@ -255,12 +255,11 @@ |
// ----------- S t a t e ------------- |
// -- r2 : name |
// -- lr : return address |
- // -- [sp] : receiver |
+ // -- r0 : receiver |
+ // -- sp[0] : receiver |
// ----------------------------------- |
Label miss; |
- __ ldr(r0, MemOperand(sp, 0)); |
- |
StubCompiler::GenerateLoadStringLength(masm, r0, r1, r3, &miss); |
// Cache miss: Jump to runtime. |
__ bind(&miss); |
@@ -272,13 +271,11 @@ |
// ----------- S t a t e ------------- |
// -- r2 : name |
// -- lr : return address |
- // -- [sp] : receiver |
+ // -- r0 : receiver |
+ // -- sp[0] : receiver |
// ----------------------------------- |
Label miss; |
- // Load receiver. |
- __ ldr(r0, MemOperand(sp, 0)); |
- |
StubCompiler::GenerateLoadFunctionPrototype(masm, r0, r1, r3, &miss); |
__ bind(&miss); |
StubCompiler::GenerateLoadMiss(masm, Code::LOAD_IC); |
@@ -351,7 +348,8 @@ |
static void GenerateNormalHelper(MacroAssembler* masm, |
int argc, |
bool is_global_object, |
- Label* miss) { |
+ Label* miss, |
+ Register scratch) { |
// Search dictionary - put result in register r1. |
GenerateDictionaryLoad(masm, miss, r0, r1); |
@@ -360,7 +358,7 @@ |
__ b(eq, miss); |
// Check that the value is a JSFunction. |
- __ CompareObjectType(r1, r0, r0, JS_FUNCTION_TYPE); |
+ __ CompareObjectType(r1, scratch, scratch, JS_FUNCTION_TYPE); |
__ b(ne, miss); |
// Patch the receiver with the global proxy if necessary. |
@@ -409,7 +407,7 @@ |
__ ldrb(r3, FieldMemOperand(r3, Map::kBitFieldOffset)); |
__ tst(r3, Operand(1 << Map::kIsAccessCheckNeeded)); |
__ b(ne, &miss); |
- GenerateNormalHelper(masm, argc, true, &miss); |
+ GenerateNormalHelper(masm, argc, true, &miss, r4); |
// Accessing non-global object: Check for access to global proxy. |
Label global_proxy, invoke; |
@@ -422,7 +420,7 @@ |
__ tst(r3, Operand(1 << Map::kIsAccessCheckNeeded)); |
__ b(ne, &miss); |
__ bind(&invoke); |
- GenerateNormalHelper(masm, argc, false, &miss); |
+ GenerateNormalHelper(masm, argc, false, &miss, r4); |
// Global object access: Check access rights. |
__ bind(&global_proxy); |
@@ -489,10 +487,10 @@ |
// ----------- S t a t e ------------- |
// -- r2 : name |
// -- lr : return address |
- // -- [sp] : receiver |
+ // -- r0 : receiver |
+ // -- sp[0] : receiver |
// ----------------------------------- |
- __ ldr(r0, MemOperand(sp, 0)); |
// Probe the stub cache. |
Code::Flags flags = Code::ComputeFlags(Code::LOAD_IC, |
NOT_IN_LOOP, |
@@ -508,11 +506,11 @@ |
// ----------- S t a t e ------------- |
// -- r2 : name |
// -- lr : return address |
- // -- [sp] : receiver |
+ // -- r0 : receiver |
+ // -- sp[0] : receiver |
// ----------------------------------- |
Label miss, probe, global; |
- __ ldr(r0, MemOperand(sp, 0)); |
// Check that the receiver isn't a smi. |
__ tst(r0, Operand(kSmiTagMask)); |
__ b(eq, &miss); |
@@ -551,11 +549,12 @@ |
// ----------- S t a t e ------------- |
// -- r2 : name |
// -- lr : return address |
- // -- [sp] : receiver |
+ // -- r0 : receiver |
+ // -- sp[0] : receiver |
// ----------------------------------- |
- __ ldr(r3, MemOperand(sp, 0)); |
- __ stm(db_w, sp, r2.bit() | r3.bit()); |
+ __ mov(r3, r0); |
+ __ Push(r3, r2); |
// Perform tail call to the entry. |
ExternalReference ref = ExternalReference(IC_Utility(kLoadIC_Miss)); |