| Index: src/arm/ic-arm.cc
|
| diff --git a/src/arm/ic-arm.cc b/src/arm/ic-arm.cc
|
| index c49b161036a01b7d9f8c5630629a7e7211cff3c0..9a92f33c89ee2e6a6c12dfdce32fda293a4aa7c9 100644
|
| --- a/src/arm/ic-arm.cc
|
| +++ b/src/arm/ic-arm.cc
|
| @@ -39,48 +39,6 @@ static void GenerateGlobalInstanceTypeCheck(MacroAssembler* masm,
|
| }
|
|
|
|
|
| -// Generated code falls through if the receiver is a regular non-global
|
| -// JS object with slow properties and no interceptors.
|
| -static void GenerateNameDictionaryReceiverCheck(MacroAssembler* masm,
|
| - Register receiver,
|
| - Register elements,
|
| - Register t0,
|
| - Register t1,
|
| - Label* miss) {
|
| - // Register usage:
|
| - // receiver: holds the receiver on entry and is unchanged.
|
| - // elements: holds the property dictionary on fall through.
|
| - // Scratch registers:
|
| - // t0: used to holds the receiver map.
|
| - // t1: used to holds the receiver instance type, receiver bit mask and
|
| - // elements map.
|
| -
|
| - // Check that the receiver isn't a smi.
|
| - __ JumpIfSmi(receiver, miss);
|
| -
|
| - // Check that the receiver is a valid JS object.
|
| - __ CompareObjectType(receiver, t0, t1, FIRST_SPEC_OBJECT_TYPE);
|
| - __ b(lt, miss);
|
| -
|
| - // If this assert fails, we have to check upper bound too.
|
| - STATIC_ASSERT(LAST_TYPE == LAST_SPEC_OBJECT_TYPE);
|
| -
|
| - GenerateGlobalInstanceTypeCheck(masm, t1, miss);
|
| -
|
| - // Check that the global object does not require access checks.
|
| - __ ldrb(t1, FieldMemOperand(t0, Map::kBitFieldOffset));
|
| - __ tst(t1, Operand((1 << Map::kIsAccessCheckNeeded) |
|
| - (1 << Map::kHasNamedInterceptor)));
|
| - __ b(ne, miss);
|
| -
|
| - __ ldr(elements, FieldMemOperand(receiver, JSObject::kPropertiesOffset));
|
| - __ ldr(t1, FieldMemOperand(elements, HeapObject::kMapOffset));
|
| - __ LoadRoot(ip, Heap::kHashTableMapRootIndex);
|
| - __ cmp(t1, ip);
|
| - __ b(ne, miss);
|
| -}
|
| -
|
| -
|
| // Helper function used from LoadIC GenerateNormal.
|
| //
|
| // elements: Property dictionary. It is not clobbered if a jump to the miss
|
| @@ -328,29 +286,20 @@ void LoadIC::GenerateMegamorphic(MacroAssembler* masm) {
|
|
|
|
|
| void LoadIC::GenerateNormal(MacroAssembler* masm) {
|
| - // ----------- S t a t e -------------
|
| - // -- r2 : name
|
| - // -- lr : return address
|
| - // -- r1 : receiver
|
| - // -----------------------------------
|
| - ASSERT(r1.is(ReceiverRegister()));
|
| - ASSERT(r2.is(NameRegister()));
|
| -
|
| - Label miss, slow;
|
| + Register dictionary = r0;
|
| + ASSERT(!dictionary.is(ReceiverRegister()));
|
| + ASSERT(!dictionary.is(NameRegister()));
|
|
|
| - GenerateNameDictionaryReceiverCheck(masm, r1, r0, r3, r4, &miss);
|
| + Label slow;
|
|
|
| - // r0: elements
|
| - GenerateDictionaryLoad(masm, &slow, r0, r2, r0, r3, r4);
|
| + __ ldr(dictionary,
|
| + FieldMemOperand(ReceiverRegister(), JSObject::kPropertiesOffset));
|
| + GenerateDictionaryLoad(masm, &slow, dictionary, NameRegister(), r0, r3, r4);
|
| __ Ret();
|
|
|
| // Dictionary load failed, go slow (but don't miss).
|
| __ bind(&slow);
|
| GenerateRuntimeGetProperty(masm);
|
| -
|
| - // Cache miss: Jump to runtime.
|
| - __ bind(&miss);
|
| - GenerateMiss(masm);
|
| }
|
|
|
|
|
| @@ -1148,13 +1097,14 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) {
|
| Register receiver = ReceiverRegister();
|
| Register name = NameRegister();
|
| Register value = ValueRegister();
|
| + Register dictionary = r3;
|
| ASSERT(receiver.is(r1));
|
| ASSERT(name.is(r2));
|
| ASSERT(value.is(r0));
|
|
|
| - GenerateNameDictionaryReceiverCheck(masm, receiver, r3, r4, r5, &miss);
|
| + __ ldr(dictionary, FieldMemOperand(receiver, JSObject::kPropertiesOffset));
|
|
|
| - GenerateDictionaryStore(masm, &miss, r3, name, value, r4, r5);
|
| + GenerateDictionaryStore(masm, &miss, dictionary, name, value, r4, r5);
|
| Counters* counters = masm->isolate()->counters();
|
| __ IncrementCounter(counters->store_normal_hit(),
|
| 1, r4, r5);
|
|
|