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); |