| OLD | NEW | 
|---|
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. | 
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be | 
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. | 
| 4 | 4 | 
| 5 #include "src/v8.h" | 5 #include "src/v8.h" | 
| 6 | 6 | 
| 7 #if V8_TARGET_ARCH_X87 | 7 #if V8_TARGET_ARCH_X87 | 
| 8 | 8 | 
| 9 #include "src/codegen.h" | 9 #include "src/codegen.h" | 
| 10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" | 
| (...skipping 491 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 502   __ mov(unmapped_location, value); | 502   __ mov(unmapped_location, value); | 
| 503   __ lea(edi, unmapped_location); | 503   __ lea(edi, unmapped_location); | 
| 504   __ mov(edx, value); | 504   __ mov(edx, value); | 
| 505   __ RecordWrite(ebx, edi, edx, kDontSaveFPRegs); | 505   __ RecordWrite(ebx, edi, edx, kDontSaveFPRegs); | 
| 506   __ Ret(); | 506   __ Ret(); | 
| 507   __ bind(&slow); | 507   __ bind(&slow); | 
| 508   GenerateMiss(masm); | 508   GenerateMiss(masm); | 
| 509 } | 509 } | 
| 510 | 510 | 
| 511 | 511 | 
| 512 static void KeyedStoreGenerateGenericHelper( | 512 static void KeyedStoreGenerateMegamorphicHelper( | 
| 513     MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, | 513     MacroAssembler* masm, Label* fast_object, Label* fast_double, Label* slow, | 
| 514     KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length) { | 514     KeyedStoreCheckMap check_map, KeyedStoreIncrementLength increment_length) { | 
| 515   Label transition_smi_elements; | 515   Label transition_smi_elements; | 
| 516   Label finish_object_store, non_double_value, transition_double_elements; | 516   Label finish_object_store, non_double_value, transition_double_elements; | 
| 517   Label fast_double_without_map_check; | 517   Label fast_double_without_map_check; | 
| 518   Register receiver = StoreDescriptor::ReceiverRegister(); | 518   Register receiver = StoreDescriptor::ReceiverRegister(); | 
| 519   Register key = StoreDescriptor::NameRegister(); | 519   Register key = StoreDescriptor::NameRegister(); | 
| 520   Register value = StoreDescriptor::ValueRegister(); | 520   Register value = StoreDescriptor::ValueRegister(); | 
| 521   DCHECK(receiver.is(edx)); | 521   DCHECK(receiver.is(edx)); | 
| 522   DCHECK(key.is(ecx)); | 522   DCHECK(key.is(ecx)); | 
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 640   __ LoadTransitionedArrayMapConditional(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS, | 640   __ LoadTransitionedArrayMapConditional(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS, | 
| 641                                          ebx, edi, slow); | 641                                          ebx, edi, slow); | 
| 642   mode = AllocationSite::GetMode(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS); | 642   mode = AllocationSite::GetMode(FAST_DOUBLE_ELEMENTS, FAST_ELEMENTS); | 
| 643   ElementsTransitionGenerator::GenerateDoubleToObject(masm, receiver, key, | 643   ElementsTransitionGenerator::GenerateDoubleToObject(masm, receiver, key, | 
| 644                                                       value, ebx, mode, slow); | 644                                                       value, ebx, mode, slow); | 
| 645   __ mov(ebx, FieldOperand(receiver, JSObject::kElementsOffset)); | 645   __ mov(ebx, FieldOperand(receiver, JSObject::kElementsOffset)); | 
| 646   __ jmp(&finish_object_store); | 646   __ jmp(&finish_object_store); | 
| 647 } | 647 } | 
| 648 | 648 | 
| 649 | 649 | 
| 650 void KeyedStoreIC::GenerateGeneric( | 650 void KeyedStoreIC::GenerateMegamorphic(MacroAssembler* masm, | 
| 651     MacroAssembler* masm, StrictMode strict_mode, | 651                                        StrictMode strict_mode) { | 
| 652     KeyedStoreStubCacheRequirement handler_requirement) { |  | 
| 653   // Return address is on the stack. | 652   // Return address is on the stack. | 
| 654   Label slow, fast_object, fast_object_grow; | 653   Label slow, fast_object, fast_object_grow; | 
| 655   Label fast_double, fast_double_grow; | 654   Label fast_double, fast_double_grow; | 
| 656   Label array, extra, check_if_double_array, maybe_name_key, miss; | 655   Label array, extra, check_if_double_array, maybe_name_key, miss; | 
| 657   Register receiver = StoreDescriptor::ReceiverRegister(); | 656   Register receiver = StoreDescriptor::ReceiverRegister(); | 
| 658   Register key = StoreDescriptor::NameRegister(); | 657   Register key = StoreDescriptor::NameRegister(); | 
| 659   DCHECK(receiver.is(edx)); | 658   DCHECK(receiver.is(edx)); | 
| 660   DCHECK(key.is(ecx)); | 659   DCHECK(key.is(ecx)); | 
| 661 | 660 | 
| 662   // Check that the object isn't a smi. | 661   // Check that the object isn't a smi. | 
| (...skipping 28 matching lines...) Expand all  Loading... | 
| 691 | 690 | 
| 692   __ bind(&maybe_name_key); | 691   __ bind(&maybe_name_key); | 
| 693   __ mov(ebx, FieldOperand(key, HeapObject::kMapOffset)); | 692   __ mov(ebx, FieldOperand(key, HeapObject::kMapOffset)); | 
| 694   __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 693   __ movzx_b(ebx, FieldOperand(ebx, Map::kInstanceTypeOffset)); | 
| 695   __ JumpIfNotUniqueNameInstanceType(ebx, &slow); | 694   __ JumpIfNotUniqueNameInstanceType(ebx, &slow); | 
| 696   Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 695   Code::Flags flags = Code::RemoveTypeAndHolderFromFlags( | 
| 697       Code::ComputeHandlerFlags(Code::STORE_IC)); | 696       Code::ComputeHandlerFlags(Code::STORE_IC)); | 
| 698   masm->isolate()->stub_cache()->GenerateProbe(masm, flags, false, receiver, | 697   masm->isolate()->stub_cache()->GenerateProbe(masm, flags, false, receiver, | 
| 699                                                key, ebx, no_reg); | 698                                                key, ebx, no_reg); | 
| 700   // Cache miss. | 699   // Cache miss. | 
| 701   if (handler_requirement == kCallRuntimeOnMissingHandler) { | 700   __ jmp(&miss); | 
| 702     __ jmp(&slow); |  | 
| 703   } else { |  | 
| 704     DCHECK(handler_requirement == kMissOnMissingHandler); |  | 
| 705     __ jmp(&miss); |  | 
| 706   } |  | 
| 707 | 701 | 
| 708   // Extra capacity case: Check if there is extra capacity to | 702   // Extra capacity case: Check if there is extra capacity to | 
| 709   // perform the store and update the length. Used for adding one | 703   // perform the store and update the length. Used for adding one | 
| 710   // element to the array by writing to array[array.length]. | 704   // element to the array by writing to array[array.length]. | 
| 711   __ bind(&extra); | 705   __ bind(&extra); | 
| 712   // receiver is a JSArray. | 706   // receiver is a JSArray. | 
| 713   // key is a smi. | 707   // key is a smi. | 
| 714   // ebx: receiver->elements, a FixedArray | 708   // ebx: receiver->elements, a FixedArray | 
| 715   // edi: receiver map | 709   // edi: receiver map | 
| 716   // flags: compare (key, receiver.length()) | 710   // flags: compare (key, receiver.length()) | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 735   // receiver is a JSArray. | 729   // receiver is a JSArray. | 
| 736   // key is a smi. | 730   // key is a smi. | 
| 737   // edi: receiver map | 731   // edi: receiver map | 
| 738   __ mov(ebx, FieldOperand(receiver, JSObject::kElementsOffset)); | 732   __ mov(ebx, FieldOperand(receiver, JSObject::kElementsOffset)); | 
| 739 | 733 | 
| 740   // Check the key against the length in the array and fall through to the | 734   // Check the key against the length in the array and fall through to the | 
| 741   // common store code. | 735   // common store code. | 
| 742   __ cmp(key, FieldOperand(receiver, JSArray::kLengthOffset));  // Compare smis. | 736   __ cmp(key, FieldOperand(receiver, JSArray::kLengthOffset));  // Compare smis. | 
| 743   __ j(above_equal, &extra); | 737   __ j(above_equal, &extra); | 
| 744 | 738 | 
| 745   KeyedStoreGenerateGenericHelper(masm, &fast_object, &fast_double, &slow, | 739   KeyedStoreGenerateMegamorphicHelper(masm, &fast_object, &fast_double, &slow, | 
| 746                                   kCheckMap, kDontIncrementLength); | 740                                       kCheckMap, kDontIncrementLength); | 
| 747   KeyedStoreGenerateGenericHelper(masm, &fast_object_grow, &fast_double_grow, | 741   KeyedStoreGenerateMegamorphicHelper(masm, &fast_object_grow, | 
| 748                                   &slow, kDontCheckMap, kIncrementLength); | 742                                       &fast_double_grow, &slow, kDontCheckMap, | 
|  | 743                                       kIncrementLength); | 
| 749 | 744 | 
| 750   if (handler_requirement == kMissOnMissingHandler) { | 745   __ bind(&miss); | 
| 751     __ bind(&miss); | 746   GenerateMiss(masm); | 
| 752     GenerateMiss(masm); |  | 
| 753   } |  | 
| 754 } | 747 } | 
| 755 | 748 | 
| 756 | 749 | 
| 757 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 750 void LoadIC::GenerateNormal(MacroAssembler* masm) { | 
| 758   Register dictionary = eax; | 751   Register dictionary = eax; | 
| 759   DCHECK(!dictionary.is(LoadDescriptor::ReceiverRegister())); | 752   DCHECK(!dictionary.is(LoadDescriptor::ReceiverRegister())); | 
| 760   DCHECK(!dictionary.is(LoadDescriptor::NameRegister())); | 753   DCHECK(!dictionary.is(LoadDescriptor::NameRegister())); | 
| 761 | 754 | 
| 762   Label slow; | 755   Label slow; | 
| 763 | 756 | 
| (...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 973   Condition cc = | 966   Condition cc = | 
| 974       (check == ENABLE_INLINED_SMI_CHECK) | 967       (check == ENABLE_INLINED_SMI_CHECK) | 
| 975           ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) | 968           ? (*jmp_address == Assembler::kJncShortOpcode ? not_zero : zero) | 
| 976           : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); | 969           : (*jmp_address == Assembler::kJnzShortOpcode ? not_carry : carry); | 
| 977   *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 970   *jmp_address = static_cast<byte>(Assembler::kJccShortPrefix | cc); | 
| 978 } | 971 } | 
| 979 } | 972 } | 
| 980 }  // namespace v8::internal | 973 }  // namespace v8::internal | 
| 981 | 974 | 
| 982 #endif  // V8_TARGET_ARCH_X87 | 975 #endif  // V8_TARGET_ARCH_X87 | 
| OLD | NEW | 
|---|