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

Side by Side Diff: src/x64/stub-cache-x64.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/stub-cache.h ('k') | no next file » | 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 2585 matching lines...) Expand 10 before | Expand all | Expand 10 after
2596 DO_SMI_CHECK); 2596 DO_SMI_CHECK);
2597 2597
2598 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); 2598 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss();
2599 __ jmp(ic, RelocInfo::CODE_TARGET); 2599 __ jmp(ic, RelocInfo::CODE_TARGET);
2600 2600
2601 // Return the generated code. 2601 // Return the generated code.
2602 return GetCode(NORMAL, NULL); 2602 return GetCode(NORMAL, NULL);
2603 } 2603 }
2604 2604
2605 2605
2606 MaybeObject* KeyedStoreStubCompiler::CompileStoreElementWithTransition( 2606 MaybeObject* KeyedStoreStubCompiler::CompileStorePolymorphic(
2607 Map* transitioned_map, 2607 MapList* receiver_maps,
2608 Map* untransitioned_map_1, 2608 CodeList* handler_stubs,
2609 Map* untransitioned_map_2) { 2609 MapList* transitioned_maps) {
2610 // ----------- S t a t e ------------- 2610 // ----------- S t a t e -------------
2611 // -- rax : value 2611 // -- rax : value
2612 // -- rcx : key 2612 // -- rcx : key
2613 // -- rdx : receiver
2614 // -- rsp[0] : return address
2615 // -----------------------------------
2616
2617 // The order of map occurrences in the generated code below is important.
2618 // Both IC code and Crankshaft rely on |transitioned_map| being the first
2619 // map in the stub.
2620
2621 Code* notransition_stub;
2622 ElementsKind elements_kind = transitioned_map->elements_kind();
2623 bool is_js_array = transitioned_map->instance_type() == JS_ARRAY_TYPE;
2624 MaybeObject* maybe_stub =
2625 KeyedStoreElementStub(is_js_array, elements_kind).TryGetCode();
2626 if (!maybe_stub->To(&notransition_stub)) return maybe_stub;
2627
2628 Label just_store, miss;
2629 __ JumpIfSmi(rdx, &miss, Label::kNear);
2630 __ movq(rbx, FieldOperand(rdx, HeapObject::kMapOffset));
2631 // rbx: receiver->map().
2632 __ Cmp(rbx, Handle<Map>(transitioned_map));
2633 __ j(equal, &just_store);
2634 ASSERT_NE(untransitioned_map_1, NULL);
2635 __ Cmp(rbx, Handle<Map>(untransitioned_map_1));
2636 Code* generic_stub = (strict_mode_ == kStrictMode)
2637 ? isolate()->builtins()->builtin(Builtins::kKeyedStoreIC_Generic_Strict)
2638 : isolate()->builtins()->builtin(Builtins::kKeyedStoreIC_Generic);
2639 __ j(equal, Handle<Code>(generic_stub), RelocInfo::CODE_TARGET);
2640 if (untransitioned_map_2 != NULL) {
2641 __ Cmp(rbx, Handle<Map>(untransitioned_map_2));
2642 __ j(equal, Handle<Code>(generic_stub), RelocInfo::CODE_TARGET);
2643 }
2644 __ bind(&miss);
2645 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss();
2646 __ jmp(ic, RelocInfo::CODE_TARGET);
2647
2648 __ bind(&just_store);
2649 __ jmp(Handle<Code>(notransition_stub), RelocInfo::CODE_TARGET);
2650
2651 // Return the generated code.
2652 return GetCode(NORMAL, NULL, MEGAMORPHIC);
2653 }
2654
2655
2656 MaybeObject* KeyedStoreStubCompiler::CompileStoreMegamorphic(
2657 MapList* receiver_maps,
2658 CodeList* handler_ics) {
2659 // ----------- S t a t e -------------
2660 // -- rax : value
2661 // -- rcx : key
2662 // -- rdx : receiver 2613 // -- rdx : receiver
2663 // -- rsp[0] : return address 2614 // -- rsp[0] : return address
2664 // ----------------------------------- 2615 // -----------------------------------
2665 Label miss; 2616 Label miss;
2666 __ JumpIfSmi(rdx, &miss); 2617 __ JumpIfSmi(rdx, &miss, Label::kNear);
2667 2618
2668 Register map_reg = rbx; 2619 __ movq(rdi, FieldOperand(rdx, HeapObject::kMapOffset));
2669 __ movq(map_reg, FieldOperand(rdx, HeapObject::kMapOffset));
2670 int receiver_count = receiver_maps->length(); 2620 int receiver_count = receiver_maps->length();
2671 for (int current = 0; current < receiver_count; ++current) { 2621 for (int i = 0; i < receiver_count; ++i) {
2672 // Check map and tail call if there's a match 2622 // Check map and tail call if there's a match
2673 Handle<Map> map(receiver_maps->at(current)); 2623 Handle<Map> map(receiver_maps->at(i));
2674 __ Cmp(map_reg, map); 2624 __ Cmp(rdi, map);
2675 __ j(equal, 2625 if (transitioned_maps->at(i) == NULL) {
2676 Handle<Code>(handler_ics->at(current)), 2626 __ j(equal, Handle<Code>(handler_stubs->at(i)), RelocInfo::CODE_TARGET);
2677 RelocInfo::CODE_TARGET); 2627 } else {
2628 Label next_map;
2629 __ j(not_equal, &next_map, Label::kNear);
2630 __ movq(rbx,
2631 Handle<Map>(transitioned_maps->at(i)),
2632 RelocInfo::EMBEDDED_OBJECT);
2633 __ jmp(Handle<Code>(handler_stubs->at(i)), RelocInfo::CODE_TARGET);
2634 __ bind(&next_map);
2635 }
2678 } 2636 }
2679 2637
2680 __ bind(&miss); 2638 __ bind(&miss);
2681 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss(); 2639 Handle<Code> ic = isolate()->builtins()->KeyedStoreIC_Miss();
2682 __ jmp(ic, RelocInfo::CODE_TARGET); 2640 __ jmp(ic, RelocInfo::CODE_TARGET);
2683 2641
2684 // Return the generated code. 2642 // Return the generated code.
2685 return GetCode(NORMAL, NULL, MEGAMORPHIC); 2643 return GetCode(NORMAL, NULL, MEGAMORPHIC);
2686 } 2644 }
2687 2645
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
3103 DO_SMI_CHECK); 3061 DO_SMI_CHECK);
3104 3062
3105 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss(); 3063 Handle<Code> ic = isolate()->builtins()->KeyedLoadIC_Miss();
3106 __ jmp(ic, RelocInfo::CODE_TARGET); 3064 __ jmp(ic, RelocInfo::CODE_TARGET);
3107 3065
3108 // Return the generated code. 3066 // Return the generated code.
3109 return GetCode(NORMAL, NULL); 3067 return GetCode(NORMAL, NULL);
3110 } 3068 }
3111 3069
3112 3070
3113 MaybeObject* KeyedLoadStubCompiler::CompileLoadMegamorphic( 3071 MaybeObject* KeyedLoadStubCompiler::CompileLoadPolymorphic(
3114 MapList* receiver_maps, 3072 MapList* receiver_maps,
3115 CodeList* handler_ics) { 3073 CodeList* handler_ics) {
3116 // ----------- S t a t e ------------- 3074 // ----------- S t a t e -------------
3117 // -- rax : key 3075 // -- rax : key
3118 // -- rdx : receiver 3076 // -- rdx : receiver
3119 // -- rsp[0] : return address 3077 // -- rsp[0] : return address
3120 // ----------------------------------- 3078 // -----------------------------------
3121 Label miss; 3079 Label miss;
3122 __ JumpIfSmi(rdx, &miss); 3080 __ JumpIfSmi(rdx, &miss);
3123 3081
(...skipping 720 matching lines...) Expand 10 before | Expand all | Expand 10 after
3844 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss(); 3802 Handle<Code> ic_miss = masm->isolate()->builtins()->KeyedStoreIC_Miss();
3845 __ jmp(ic_miss, RelocInfo::CODE_TARGET); 3803 __ jmp(ic_miss, RelocInfo::CODE_TARGET);
3846 } 3804 }
3847 3805
3848 3806
3849 #undef __ 3807 #undef __
3850 3808
3851 } } // namespace v8::internal 3809 } } // namespace v8::internal
3852 3810
3853 #endif // V8_TARGET_ARCH_X64 3811 #endif // V8_TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « src/stub-cache.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698