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/ic/call-optimization.h" | 9 #include "src/ic/call-optimization.h" |
10 #include "src/ic/handler-compiler.h" | 10 #include "src/ic/handler-compiler.h" |
11 | 11 |
12 namespace v8 { | 12 namespace v8 { |
13 namespace internal { | 13 namespace internal { |
14 | 14 |
15 #define __ ACCESS_MASM(masm) | 15 #define __ ACCESS_MASM(masm) |
16 | 16 |
17 | 17 |
18 void ElementHandlerCompiler::GenerateLoadDictionaryElement( | 18 void ElementHandlerCompiler::GenerateLoadDictionaryElement( |
19 MacroAssembler* masm) { | 19 MacroAssembler* masm) { |
20 // ----------- S t a t e ------------- | 20 // ----------- S t a t e ------------- |
21 // -- ecx : key | 21 // -- ecx : key |
22 // -- edx : receiver | 22 // -- edx : receiver |
23 // -- esp[0] : return address | 23 // -- esp[0] : return address |
24 // ----------------------------------- | 24 // ----------------------------------- |
25 DCHECK(edx.is(LoadIC::ReceiverRegister())); | 25 DCHECK(edx.is(LoadConvention::ReceiverRegister())); |
26 DCHECK(ecx.is(LoadIC::NameRegister())); | 26 DCHECK(ecx.is(LoadConvention::NameRegister())); |
27 Label slow, miss; | 27 Label slow, miss; |
28 | 28 |
29 // This stub is meant to be tail-jumped to, the receiver must already | 29 // This stub is meant to be tail-jumped to, the receiver must already |
30 // have been verified by the caller to not be a smi. | 30 // have been verified by the caller to not be a smi. |
31 __ JumpIfNotSmi(ecx, &miss); | 31 __ JumpIfNotSmi(ecx, &miss); |
32 __ mov(ebx, ecx); | 32 __ mov(ebx, ecx); |
33 __ SmiUntag(ebx); | 33 __ SmiUntag(ebx); |
34 __ mov(eax, FieldOperand(edx, JSObject::kElementsOffset)); | 34 __ mov(eax, FieldOperand(edx, JSObject::kElementsOffset)); |
35 | 35 |
36 // Push receiver on the stack to free up a register for the dictionary | 36 // Push receiver on the stack to free up a register for the dictionary |
(...skipping 283 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 static void CompileCallLoadPropertyWithInterceptor( | 320 static void CompileCallLoadPropertyWithInterceptor( |
321 MacroAssembler* masm, Register receiver, Register holder, Register name, | 321 MacroAssembler* masm, Register receiver, Register holder, Register name, |
322 Handle<JSObject> holder_obj, IC::UtilityId id) { | 322 Handle<JSObject> holder_obj, IC::UtilityId id) { |
323 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); | 323 PushInterceptorArguments(masm, receiver, holder, name, holder_obj); |
324 __ CallExternalReference(ExternalReference(IC_Utility(id), masm->isolate()), | 324 __ CallExternalReference(ExternalReference(IC_Utility(id), masm->isolate()), |
325 NamedLoadHandlerCompiler::kInterceptorArgsLength); | 325 NamedLoadHandlerCompiler::kInterceptorArgsLength); |
326 } | 326 } |
327 | 327 |
328 | 328 |
329 static void StoreIC_PushArgs(MacroAssembler* masm) { | 329 static void StoreIC_PushArgs(MacroAssembler* masm) { |
330 Register receiver = StoreIC::ReceiverRegister(); | 330 Register receiver = StoreConvention::ReceiverRegister(); |
331 Register name = StoreIC::NameRegister(); | 331 Register name = StoreConvention::NameRegister(); |
332 Register value = StoreIC::ValueRegister(); | 332 Register value = StoreConvention::ValueRegister(); |
333 | 333 |
334 DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value)); | 334 DCHECK(!ebx.is(receiver) && !ebx.is(name) && !ebx.is(value)); |
335 | 335 |
336 __ pop(ebx); | 336 __ pop(ebx); |
337 __ push(receiver); | 337 __ push(receiver); |
338 __ push(name); | 338 __ push(name); |
339 __ push(value); | 339 __ push(value); |
340 __ push(ebx); | 340 __ push(ebx); |
341 } | 341 } |
342 | 342 |
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 // Do tail-call to the runtime system. | 847 // Do tail-call to the runtime system. |
848 ExternalReference store_ic_property = ExternalReference( | 848 ExternalReference store_ic_property = ExternalReference( |
849 IC_Utility(IC::kStorePropertyWithInterceptor), isolate()); | 849 IC_Utility(IC::kStorePropertyWithInterceptor), isolate()); |
850 __ TailCallExternalReference(store_ic_property, 3, 1); | 850 __ TailCallExternalReference(store_ic_property, 3, 1); |
851 | 851 |
852 // Return the generated code. | 852 // Return the generated code. |
853 return GetCode(kind(), Code::FAST, name); | 853 return GetCode(kind(), Code::FAST, name); |
854 } | 854 } |
855 | 855 |
856 | 856 |
857 Register NamedStoreHandlerCompiler::value() { return StoreIC::ValueRegister(); } | 857 Register NamedStoreHandlerCompiler::value() { |
| 858 return StoreConvention::ValueRegister(); |
| 859 } |
858 | 860 |
859 | 861 |
860 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( | 862 Handle<Code> NamedLoadHandlerCompiler::CompileLoadGlobal( |
861 Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) { | 863 Handle<PropertyCell> cell, Handle<Name> name, bool is_configurable) { |
862 Label miss; | 864 Label miss; |
863 | 865 |
864 FrontendHeader(receiver(), name, &miss); | 866 FrontendHeader(receiver(), name, &miss); |
865 // Get the value from the cell. | 867 // Get the value from the cell. |
866 Register result = StoreIC::ValueRegister(); | 868 Register result = StoreConvention::ValueRegister(); |
867 if (masm()->serializer_enabled()) { | 869 if (masm()->serializer_enabled()) { |
868 __ mov(result, Immediate(cell)); | 870 __ mov(result, Immediate(cell)); |
869 __ mov(result, FieldOperand(result, PropertyCell::kValueOffset)); | 871 __ mov(result, FieldOperand(result, PropertyCell::kValueOffset)); |
870 } else { | 872 } else { |
871 __ mov(result, Operand::ForCell(cell)); | 873 __ mov(result, Operand::ForCell(cell)); |
872 } | 874 } |
873 | 875 |
874 // Check for deleted property if property can actually be deleted. | 876 // Check for deleted property if property can actually be deleted. |
875 if (is_configurable) { | 877 if (is_configurable) { |
876 __ cmp(result, factory()->the_hole_value()); | 878 __ cmp(result, factory()->the_hole_value()); |
(...skipping 13 matching lines...) Expand all Loading... |
890 // Return the generated code. | 892 // Return the generated code. |
891 return GetCode(kind(), Code::NORMAL, name); | 893 return GetCode(kind(), Code::NORMAL, name); |
892 } | 894 } |
893 | 895 |
894 | 896 |
895 #undef __ | 897 #undef __ |
896 } | 898 } |
897 } // namespace v8::internal | 899 } // namespace v8::internal |
898 | 900 |
899 #endif // V8_TARGET_ARCH_X87 | 901 #endif // V8_TARGET_ARCH_X87 |
OLD | NEW |