Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: src/ia32/stub-cache-ia32.cc

Issue 8233011: Refactor and fix polymorphic KeyedStoreIC creation (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fix nits Created 9 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/arm/stub-cache-arm.cc ('k') | src/ic.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 2737 matching lines...) Expand 10 before | Expand all | Expand 10 after
2748 DO_SMI_CHECK); 2748 DO_SMI_CHECK);
2749 2749
2750 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); 2750 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss();
2751 __ jmp(ic, RelocInfo::CODE_TARGET); 2751 __ jmp(ic, RelocInfo::CODE_TARGET);
2752 2752
2753 // Return the generated code. 2753 // Return the generated code.
2754 return GetCode(NORMAL, NULL); 2754 return GetCode(NORMAL, NULL);
2755 } 2755 }
2756 2756
2757 2757
2758 MaybeObject* KeyedStoreStubCompiler::CompileStoreElementWithTransition( 2758 MaybeObject* KeyedStoreStubCompiler::CompileStorePolymorphic(
2759 Map* transitioned_map, 2759 MapList* receiver_maps,
2760 Map* untransitioned_map_1, 2760 CodeList* handler_stubs,
2761 Map* untransitioned_map_2) { 2761 MapList* transitioned_maps) {
2762 // ----------- S t a t e ------------- 2762 // ----------- S t a t e -------------
2763 // -- eax : value 2763 // -- eax : value
2764 // -- ecx : key 2764 // -- ecx : key
2765 // -- edx : receiver
2766 // -- esp[0] : return address
2767 // -----------------------------------
2768
2769 // The order of map occurrences in the generated code below is important.
2770 // Both IC code and Crankshaft rely on |transitioned_map| being the first
2771 // map in the stub.
2772
2773 Code* notransition_stub;
2774 ElementsKind elements_kind = transitioned_map->elements_kind();
2775 bool is_jsarray = transitioned_map->instance_type() == JS_ARRAY_TYPE;
2776 MaybeObject* maybe_stub =
2777 KeyedStoreElementStub(is_jsarray, elements_kind).TryGetCode();
2778 if (!maybe_stub->To(&notransition_stub)) return maybe_stub;
2779
2780 Label just_store, miss;
2781 __ JumpIfSmi(edx, &miss, Label::kNear);
2782 __ mov(ebx, FieldOperand(edx, HeapObject::kMapOffset));
2783 // ebx: receiver->map().
2784 __ cmp(ebx, Handle<Map>(transitioned_map));
2785 __ j(equal, &just_store);
2786 ASSERT_NE(untransitioned_map_1, NULL);
2787 __ cmp(ebx, Handle<Map>(untransitioned_map_1));
2788 // TODO(jkummerow): When we have specialized code to do the transition,
2789 // call that code here, then jump to just_store when the call returns.
2790 // <temporary: just use the generic stub>
2791 Code* generic_stub = (strict_mode_ == kStrictMode)
2792 ? isolate()->builtins()->builtin(Builtins::kKeyedStoreIC_Generic_Strict)
2793 : isolate()->builtins()->builtin(Builtins::kKeyedStoreIC_Generic);
2794 __ j(equal, Handle<Code>(generic_stub));
2795 // </temporary>
2796 if (untransitioned_map_2 != NULL) {
2797 __ cmp(ebx, Handle<Map>(untransitioned_map_2));
2798 // <temporary: see above, same here>
2799 __ j(equal, Handle<Code>(generic_stub));
2800 // </temporary>
2801 }
2802 __ bind(&miss);
2803 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss();
2804 __ jmp(ic, RelocInfo::CODE_TARGET);
2805
2806 __ bind(&just_store);
2807 __ jmp(Handle<Code>(notransition_stub), RelocInfo::CODE_TARGET);
2808
2809 // Return the generated code.
2810 return GetCode(NORMAL, NULL, MEGAMORPHIC);
2811 }
2812
2813
2814 MaybeObject* KeyedStoreStubCompiler::CompileStoreMegamorphic(
2815 MapList* receiver_maps,
2816 CodeList* handler_ics) {
2817 // ----------- S t a t e -------------
2818 // -- eax : value
2819 // -- ecx : key
2820 // -- edx : receiver 2765 // -- edx : receiver
2821 // -- esp[0] : return address 2766 // -- esp[0] : return address
2822 // ----------------------------------- 2767 // -----------------------------------
2823 Label miss; 2768 Label miss;
2824 __ JumpIfSmi(edx, &miss); 2769 __ JumpIfSmi(edx, &miss, Label::kNear);
2825 2770 __ mov(edi, FieldOperand(edx, HeapObject::kMapOffset));
2826 Register map_reg = ebx; 2771 // ebx: receiver->map().
2827 __ mov(map_reg, FieldOperand(edx, HeapObject::kMapOffset)); 2772 for (int i = 0; i < receiver_maps->length(); ++i) {
2828 int receiver_count = receiver_maps->length(); 2773 Handle<Map> map(receiver_maps->at(i));
2829 for (int current = 0; current < receiver_count; ++current) { 2774 __ cmp(edi, map);
2830 Handle<Map> map(receiver_maps->at(current)); 2775 if (transitioned_maps->at(i) == NULL) {
2831 __ cmp(map_reg, map); 2776 __ j(equal, Handle<Code>(handler_stubs->at(i)));
2832 __ j(equal, Handle<Code>(handler_ics->at(current))); 2777 } else {
2778 Label next_map;
2779 __ j(not_equal, &next_map, Label::kNear);
2780 __ mov(ebx, Immediate(Handle<Map>(transitioned_maps->at(i))));
2781 __ jmp(Handle<Code>(handler_stubs->at(i)), RelocInfo::CODE_TARGET);
2782 __ bind(&next_map);
2783 }
2833 } 2784 }
2834 __ bind(&miss); 2785 __ bind(&miss);
2835 Handle<Code> miss_ic = isolate()->builtins()->KeyedStoreIC_Miss(); 2786 Handle<Code> miss_ic = isolate()->builtins()->KeyedStoreIC_Miss();
2836 __ jmp(miss_ic, RelocInfo::CODE_TARGET); 2787 __ jmp(miss_ic, RelocInfo::CODE_TARGET);
2837 2788
2838 // Return the generated code. 2789 // Return the generated code.
2839 return GetCode(NORMAL, NULL, MEGAMORPHIC); 2790 return GetCode(NORMAL, NULL, MEGAMORPHIC);
2840 } 2791 }
2841 2792
2842 2793
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after
3262 Handle<Code>(stub), 3213 Handle<Code>(stub),
3263 DO_SMI_CHECK); 3214 DO_SMI_CHECK);
3264 3215
3265 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC); 3216 GenerateLoadMiss(masm(), Code::KEYED_LOAD_IC);
3266 3217
3267 // Return the generated code. 3218 // Return the generated code.
3268 return GetCode(NORMAL, NULL); 3219 return GetCode(NORMAL, NULL);
3269 } 3220 }
3270 3221
3271 3222
3272 MaybeObject* KeyedLoadStubCompiler::CompileLoadMegamorphic( 3223 MaybeObject* KeyedLoadStubCompiler::CompileLoadPolymorphic(
3273 MapList* receiver_maps, 3224 MapList* receiver_maps,
3274 CodeList* handler_ics) { 3225 CodeList* handler_ics) {
3275 // ----------- S t a t e ------------- 3226 // ----------- S t a t e -------------
3276 // -- eax : key 3227 // -- eax : key
3277 // -- edx : receiver 3228 // -- edx : receiver
3278 // -- esp[0] : return address 3229 // -- esp[0] : return address
3279 // ----------------------------------- 3230 // -----------------------------------
3280 Label miss; 3231 Label miss;
3281 __ JumpIfSmi(edx, &miss); 3232 __ JumpIfSmi(edx, &miss);
3282 3233
(...skipping 792 matching lines...) Expand 10 before | Expand all | Expand 10 after
4075 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); 4026 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss();
4076 __ jmp(ic_miss, RelocInfo::CODE_TARGET); 4027 __ jmp(ic_miss, RelocInfo::CODE_TARGET);
4077 } 4028 }
4078 4029
4079 4030
4080 #undef __ 4031 #undef __
4081 4032
4082 } } // namespace v8::internal 4033 } } // namespace v8::internal
4083 4034
4084 #endif // V8_TARGET_ARCH_IA32 4035 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/arm/stub-cache-arm.cc ('k') | src/ic.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698