| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 2753 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2764 | 2764 |
| 2765 NonexistentHandlerFrontend(object, last, name, &success, global); | 2765 NonexistentHandlerFrontend(object, last, name, &success, global); |
| 2766 | 2766 |
| 2767 __ bind(&success); | 2767 __ bind(&success); |
| 2768 // Return undefined if maps of the full prototype chain are still the | 2768 // Return undefined if maps of the full prototype chain are still the |
| 2769 // same and no global property with this name contains a value. | 2769 // same and no global property with this name contains a value. |
| 2770 __ LoadRoot(rax, Heap::kUndefinedValueRootIndex); | 2770 __ LoadRoot(rax, Heap::kUndefinedValueRootIndex); |
| 2771 __ ret(0); | 2771 __ ret(0); |
| 2772 | 2772 |
| 2773 // Return the generated code. | 2773 // Return the generated code. |
| 2774 return GetCode(Code::HANDLER_FRAGMENT, Code::NONEXISTENT, name); | 2774 return GetCode(kind(), Code::NONEXISTENT, name); |
| 2775 } | 2775 } |
| 2776 | 2776 |
| 2777 | 2777 |
| 2778 Register* LoadStubCompiler::registers() { | 2778 Register* LoadStubCompiler::registers() { |
| 2779 // receiver, name, scratch1, scratch2, scratch3, scratch4. | 2779 // receiver, name, scratch1, scratch2, scratch3, scratch4. |
| 2780 static Register registers[] = { rax, rcx, rdx, rbx, rdi, r8 }; | 2780 static Register registers[] = { rax, rcx, rdx, rbx, rdi, r8 }; |
| 2781 return registers; | 2781 return registers; |
| 2782 } | 2782 } |
| 2783 | 2783 |
| 2784 | 2784 |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2864 | 2864 |
| 2865 HandlerFrontendFooter(&success, &miss); | 2865 HandlerFrontendFooter(&success, &miss); |
| 2866 __ bind(&success); | 2866 __ bind(&success); |
| 2867 | 2867 |
| 2868 Counters* counters = isolate()->counters(); | 2868 Counters* counters = isolate()->counters(); |
| 2869 __ IncrementCounter(counters->named_load_global_stub(), 1); | 2869 __ IncrementCounter(counters->named_load_global_stub(), 1); |
| 2870 __ movq(rax, rbx); | 2870 __ movq(rax, rbx); |
| 2871 __ ret(0); | 2871 __ ret(0); |
| 2872 | 2872 |
| 2873 // Return the generated code. | 2873 // Return the generated code. |
| 2874 return GetCode(Code::IC_FRAGMENT, Code::NORMAL, name); | 2874 return GetICCode(kind(), Code::NORMAL, name); |
| 2875 } | 2875 } |
| 2876 | 2876 |
| 2877 | 2877 |
| 2878 Handle<Code> KeyedLoadStubCompiler::CompileLoadElement( | 2878 Handle<Code> KeyedLoadStubCompiler::CompileLoadElement( |
| 2879 Handle<Map> receiver_map) { | 2879 Handle<Map> receiver_map) { |
| 2880 // ----------- S t a t e ------------- | 2880 // ----------- S t a t e ------------- |
| 2881 // -- rax : key | 2881 // -- rax : key |
| 2882 // -- rdx : receiver | 2882 // -- rdx : receiver |
| 2883 // -- rsp[0] : return address | 2883 // -- rsp[0] : return address |
| 2884 // ----------------------------------- | 2884 // ----------------------------------- |
| 2885 ElementsKind elements_kind = receiver_map->elements_kind(); | 2885 ElementsKind elements_kind = receiver_map->elements_kind(); |
| 2886 if (receiver_map->has_fast_elements() || | 2886 if (receiver_map->has_fast_elements() || |
| 2887 receiver_map->has_external_array_elements()) { | 2887 receiver_map->has_external_array_elements()) { |
| 2888 Handle<Code> stub = KeyedLoadFastElementStub( | 2888 Handle<Code> stub = KeyedLoadFastElementStub( |
| 2889 receiver_map->instance_type() == JS_ARRAY_TYPE, | 2889 receiver_map->instance_type() == JS_ARRAY_TYPE, |
| 2890 elements_kind).GetCode(isolate()); | 2890 elements_kind).GetCode(isolate()); |
| 2891 __ DispatchMap(rdx, receiver_map, stub, DO_SMI_CHECK); | 2891 __ DispatchMap(rdx, receiver_map, stub, DO_SMI_CHECK); |
| 2892 } else { | 2892 } else { |
| 2893 Handle<Code> stub = | 2893 Handle<Code> stub = |
| 2894 KeyedLoadDictionaryElementStub().GetCode(isolate()); | 2894 KeyedLoadDictionaryElementStub().GetCode(isolate()); |
| 2895 __ DispatchMap(rdx, receiver_map, stub, DO_SMI_CHECK); | 2895 __ DispatchMap(rdx, receiver_map, stub, DO_SMI_CHECK); |
| 2896 } | 2896 } |
| 2897 | 2897 |
| 2898 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); | 2898 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); |
| 2899 | 2899 |
| 2900 // Return the generated code. | 2900 // Return the generated code. |
| 2901 return GetCode(Code::IC_FRAGMENT, Code::NORMAL, factory()->empty_string()); | 2901 return GetICCode(kind(), Code::NORMAL, factory()->empty_string()); |
| 2902 } | 2902 } |
| 2903 | 2903 |
| 2904 | 2904 |
| 2905 Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC( | 2905 Handle<Code> BaseLoadStubCompiler::CompilePolymorphicIC( |
| 2906 MapHandleList* receiver_maps, | 2906 MapHandleList* receiver_maps, |
| 2907 CodeHandleList* handlers, | 2907 CodeHandleList* handlers, |
| 2908 Handle<Name> name, | 2908 Handle<Name> name, |
| 2909 Code::StubType type, | 2909 Code::StubType type, |
| 2910 IcCheckType check) { | 2910 IcCheckType check) { |
| 2911 Label miss; | 2911 Label miss; |
| (...skipping 11 matching lines...) Expand all Loading... |
| 2923 __ Cmp(map_reg, receiver_maps->at(current)); | 2923 __ Cmp(map_reg, receiver_maps->at(current)); |
| 2924 __ j(equal, handlers->at(current), RelocInfo::CODE_TARGET); | 2924 __ j(equal, handlers->at(current), RelocInfo::CODE_TARGET); |
| 2925 } | 2925 } |
| 2926 | 2926 |
| 2927 __ bind(&miss); | 2927 __ bind(&miss); |
| 2928 GenerateLoadMiss(masm(), kind()); | 2928 GenerateLoadMiss(masm(), kind()); |
| 2929 | 2929 |
| 2930 // Return the generated code. | 2930 // Return the generated code. |
| 2931 InlineCacheState state = | 2931 InlineCacheState state = |
| 2932 receiver_maps->length() > 1 ? POLYMORPHIC : MONOMORPHIC; | 2932 receiver_maps->length() > 1 ? POLYMORPHIC : MONOMORPHIC; |
| 2933 return GetCode(Code::IC_FRAGMENT, type, name, state); | 2933 return GetICCode(kind(), type, name, state); |
| 2934 } | 2934 } |
| 2935 | 2935 |
| 2936 | 2936 |
| 2937 // Specialized stub for constructing objects from functions which only have only | 2937 // Specialized stub for constructing objects from functions which only have only |
| 2938 // simple assignments of the form this.x = ...; in their body. | 2938 // simple assignments of the form this.x = ...; in their body. |
| 2939 Handle<Code> ConstructStubCompiler::CompileConstructStub( | 2939 Handle<Code> ConstructStubCompiler::CompileConstructStub( |
| 2940 Handle<JSFunction> function) { | 2940 Handle<JSFunction> function) { |
| 2941 // ----------- S t a t e ------------- | 2941 // ----------- S t a t e ------------- |
| 2942 // -- rax : argc | 2942 // -- rax : argc |
| 2943 // -- rdi : constructor | 2943 // -- rdi : constructor |
| (...skipping 662 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3606 __ jmp(ic_slow, RelocInfo::CODE_TARGET); | 3606 __ jmp(ic_slow, RelocInfo::CODE_TARGET); |
| 3607 } | 3607 } |
| 3608 } | 3608 } |
| 3609 | 3609 |
| 3610 | 3610 |
| 3611 #undef __ | 3611 #undef __ |
| 3612 | 3612 |
| 3613 } } // namespace v8::internal | 3613 } } // namespace v8::internal |
| 3614 | 3614 |
| 3615 #endif // V8_TARGET_ARCH_X64 | 3615 #endif // V8_TARGET_ARCH_X64 |
| OLD | NEW |