Chromium Code Reviews| Index: src/x64/ic-x64.cc |
| diff --git a/src/x64/ic-x64.cc b/src/x64/ic-x64.cc |
| index caa8d4c83fbe029ca74cc0e7ecb864f466d2198a..6ed3a87970c22fc40a114b406f8ed0f8b7164993 100644 |
| --- a/src/x64/ic-x64.cc |
| +++ b/src/x64/ic-x64.cc |
| @@ -35,46 +35,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 r0, |
| - Register r1, |
| - Label* miss) { |
| - // Register usage: |
| - // receiver: holds the receiver on entry and is unchanged. |
| - // r0: used to hold receiver instance type. |
| - // Holds the property dictionary on fall through. |
| - // r1: used to hold receivers map. |
| - |
| - __ JumpIfSmi(receiver, miss); |
| - |
| - // Check that the receiver is a valid JS object. |
| - __ movp(r1, FieldOperand(receiver, HeapObject::kMapOffset)); |
| - __ movb(r0, FieldOperand(r1, Map::kInstanceTypeOffset)); |
| - __ cmpb(r0, Immediate(FIRST_SPEC_OBJECT_TYPE)); |
| - __ j(below, miss); |
| - |
| - // If this assert fails, we have to check upper bound too. |
| - STATIC_ASSERT(LAST_TYPE == LAST_SPEC_OBJECT_TYPE); |
| - |
| - GenerateGlobalInstanceTypeCheck(masm, r0, miss); |
| - |
| - // Check for non-global object that requires access check. |
| - __ testb(FieldOperand(r1, Map::kBitFieldOffset), |
| - Immediate((1 << Map::kIsAccessCheckNeeded) | |
| - (1 << Map::kHasNamedInterceptor))); |
| - __ j(not_zero, miss); |
| - |
| - __ movp(r0, FieldOperand(receiver, JSObject::kPropertiesOffset)); |
| - __ CompareRoot(FieldOperand(r0, HeapObject::kMapOffset), |
| - Heap::kHashTableMapRootIndex); |
| - __ j(not_equal, miss); |
| -} |
| - |
| - |
| - |
| // Helper function used to load a property from a dictionary backing storage. |
| // This function may return false negatives, so miss_label |
| // must always call a backup property load that is complete. |
| @@ -957,29 +917,23 @@ void LoadIC::GenerateMegamorphic(MacroAssembler* masm) { |
| void LoadIC::GenerateNormal(MacroAssembler* masm) { |
| - // ----------- S t a t e ------------- |
| - // -- rdx : receiver |
| - // -- rcx : name |
| - // -- rsp[0] : return address |
| - // ----------------------------------- |
| - ASSERT(rdx.is(ReceiverRegister())); |
| - ASSERT(rcx.is(NameRegister())); |
| - Label miss, slow; |
| - |
| - GenerateNameDictionaryReceiverCheck(masm, rdx, rax, rbx, &miss); |
| - |
| - // rax: elements |
| - // Search the dictionary placing the result in rax. |
| - GenerateDictionaryLoad(masm, &slow, rax, rcx, rbx, rdi, rax); |
| + // The return address is on the stack. |
|
Toon Verwaest
2014/07/14 15:11:58
That comment is a bit superfluous given that that'
Jakob Kummerow
2014/07/14 15:27:13
Done.
|
| + |
| + Register dictionary = rax; |
| + ASSERT(!dictionary.is(ReceiverRegister())); |
| + ASSERT(!dictionary.is(NameRegister())); |
| + |
| + Label slow; |
| + |
| + __ movp(dictionary, |
| + FieldOperand(ReceiverRegister(), JSObject::kPropertiesOffset)); |
| + GenerateDictionaryLoad(masm, &slow, dictionary, NameRegister(), rbx, rdi, |
| + rax); |
| __ ret(0); |
| // Dictionary load failed, go slow (but don't miss). |
| __ bind(&slow); |
| GenerateRuntimeGetProperty(masm); |
| - |
| - // Cache miss: Jump to runtime. |
| - __ bind(&miss); |
| - GenerateMiss(masm); |
| } |
| @@ -1122,12 +1076,12 @@ void StoreIC::GenerateNormal(MacroAssembler* masm) { |
| Register receiver = ReceiverRegister(); |
| Register name = NameRegister(); |
| Register value = ValueRegister(); |
| + Register dictionary = rbx; |
| Label miss; |
| - GenerateNameDictionaryReceiverCheck(masm, receiver, rbx, rdi, &miss); |
| - |
| - GenerateDictionaryStore(masm, &miss, rbx, name, value, r8, r9); |
| + __ movp(dictionary, FieldOperand(receiver, JSObject::kPropertiesOffset)); |
| + GenerateDictionaryStore(masm, &miss, dictionary, name, value, r8, r9); |
| Counters* counters = masm->isolate()->counters(); |
| __ IncrementCounter(counters->store_normal_hit(), 1); |
| __ ret(0); |