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

Side by Side Diff: src/stub-cache.h

Issue 148593004: A64: Synchronize with r18084. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 10 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/serialize.cc ('k') | src/stub-cache.cc » ('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 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 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 Handle<JSObject> StubHolder(Handle<JSObject> receiver, 80 Handle<JSObject> StubHolder(Handle<JSObject> receiver,
81 Handle<JSObject> holder); 81 Handle<JSObject> holder);
82 82
83 Handle<Code> FindIC(Handle<Name> name, 83 Handle<Code> FindIC(Handle<Name> name,
84 Handle<Map> stub_holder_map, 84 Handle<Map> stub_holder_map,
85 Code::Kind kind, 85 Code::Kind kind,
86 Code::ExtraICState extra_state = Code::kNoExtraICState, 86 Code::ExtraICState extra_state = Code::kNoExtraICState,
87 InlineCacheHolderFlag cache_holder = OWN_MAP); 87 InlineCacheHolderFlag cache_holder = OWN_MAP);
88 88
89 Handle<Code> FindHandler(Handle<Name> name, 89 Handle<Code> FindHandler(Handle<Name> name,
90 Handle<HeapObject> stub_holder, 90 Handle<Map> map,
91 Code::Kind kind, 91 Code::Kind kind,
92 InlineCacheHolderFlag cache_holder = OWN_MAP, 92 InlineCacheHolderFlag cache_holder = OWN_MAP,
93 StrictModeFlag strict_mode = kNonStrictMode); 93 StrictModeFlag strict_mode = kNonStrictMode);
94 94
95 Handle<Code> ComputeMonomorphicIC(Handle<Name> name, 95 Handle<Code> ComputeMonomorphicIC(Handle<Name> name,
96 Handle<Type> type, 96 Handle<Type> type,
97 Handle<Code> handler, 97 Handle<Code> handler,
98 StrictModeFlag strict_mode); 98 StrictModeFlag strict_mode);
99 99
100 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<Object> object); 100 Handle<Code> ComputeLoadNonexistent(Handle<Name> name, Handle<Type> type);
101 101
102 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map); 102 Handle<Code> ComputeKeyedLoadElement(Handle<Map> receiver_map);
103 103
104 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map, 104 Handle<Code> ComputeKeyedStoreElement(Handle<Map> receiver_map,
105 StrictModeFlag strict_mode, 105 StrictModeFlag strict_mode,
106 KeyedAccessStoreMode store_mode); 106 KeyedAccessStoreMode store_mode);
107 107
108 Handle<Code> ComputeCallField(int argc, 108 Handle<Code> ComputeCallField(int argc,
109 Code::Kind, 109 Code::Kind,
110 Code::ExtraICState extra_state, 110 Code::ExtraICState extra_state,
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
436 436
437 // Generate code to check that a global property cell is empty. Create 437 // Generate code to check that a global property cell is empty. Create
438 // the property cell at compilation time if no cell exists for the 438 // the property cell at compilation time if no cell exists for the
439 // property. 439 // property.
440 static void GenerateCheckPropertyCell(MacroAssembler* masm, 440 static void GenerateCheckPropertyCell(MacroAssembler* masm,
441 Handle<JSGlobalObject> global, 441 Handle<JSGlobalObject> global,
442 Handle<Name> name, 442 Handle<Name> name,
443 Register scratch, 443 Register scratch,
444 Label* miss); 444 Label* miss);
445 445
446 // Calls GenerateCheckPropertyCell for each global object in the prototype
447 // chain from object to (but not including) holder.
448 static void GenerateCheckPropertyCells(MacroAssembler* masm,
449 Handle<JSObject> object,
450 Handle<JSObject> holder,
451 Handle<Name> name,
452 Register scratch,
453 Label* miss);
454
455 static void TailCallBuiltin(MacroAssembler* masm, Builtins::Name name); 446 static void TailCallBuiltin(MacroAssembler* masm, Builtins::Name name);
456 447
457 // Generates code that verifies that the property holder has not changed 448 // Generates code that verifies that the property holder has not changed
458 // (checking maps of objects in the prototype chain for fast and global 449 // (checking maps of objects in the prototype chain for fast and global
459 // objects or doing negative lookup for slow objects, ensures that the 450 // objects or doing negative lookup for slow objects, ensures that the
460 // property cells for global objects are still empty) and checks that the map 451 // property cells for global objects are still empty) and checks that the map
461 // of the holder has not changed. If necessary the function also generates 452 // of the holder has not changed. If necessary the function also generates
462 // code for security check in case of global object holders. Helps to make 453 // code for security check in case of global object holders. Helps to make
463 // sure that the current IC is still valid. 454 // sure that the current IC is still valid.
464 // 455 //
465 // The scratch and holder registers are always clobbered, but the object 456 // The scratch and holder registers are always clobbered, but the object
466 // register is only clobbered if it the same as the holder register. The 457 // register is only clobbered if it the same as the holder register. The
467 // function returns a register containing the holder - either object_reg or 458 // function returns a register containing the holder - either object_reg or
468 // holder_reg. 459 // holder_reg.
469 // The function can optionally (when save_at_depth != 460 // The function can optionally (when save_at_depth !=
470 // kInvalidProtoDepth) save the object at the given depth by moving 461 // kInvalidProtoDepth) save the object at the given depth by moving
471 // it to [esp + kPointerSize]. 462 // it to [esp + kPointerSize].
472 Register CheckPrototypes(Handle<JSObject> object, 463 Register CheckPrototypes(Handle<Type> type,
473 Register object_reg, 464 Register object_reg,
474 Handle<JSObject> holder, 465 Handle<JSObject> holder,
475 Register holder_reg, 466 Register holder_reg,
476 Register scratch1, 467 Register scratch1,
477 Register scratch2, 468 Register scratch2,
478 Handle<Name> name, 469 Handle<Name> name,
479 Label* miss, 470 Label* miss,
480 PrototypeCheckType check = CHECK_ALL_MAPS) { 471 PrototypeCheckType check = CHECK_ALL_MAPS) {
481 return CheckPrototypes(object, object_reg, holder, holder_reg, scratch1, 472 return CheckPrototypes(type, object_reg, holder, holder_reg, scratch1,
482 scratch2, name, kInvalidProtoDepth, miss, check); 473 scratch2, name, kInvalidProtoDepth, miss, check);
483 } 474 }
484 475
485 Register CheckPrototypes(Handle<JSObject> object, 476 Register CheckPrototypes(Handle<Type> type,
486 Register object_reg, 477 Register object_reg,
487 Handle<JSObject> holder, 478 Handle<JSObject> holder,
488 Register holder_reg, 479 Register holder_reg,
489 Register scratch1, 480 Register scratch1,
490 Register scratch2, 481 Register scratch2,
491 Handle<Name> name, 482 Handle<Name> name,
492 int save_at_depth, 483 int save_at_depth,
493 Label* miss, 484 Label* miss,
494 PrototypeCheckType check = CHECK_ALL_MAPS); 485 PrototypeCheckType check = CHECK_ALL_MAPS);
495 486
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
551 case Code::LOAD_IC: return Builtins::kLoadIC_Miss; 542 case Code::LOAD_IC: return Builtins::kLoadIC_Miss;
552 case Code::STORE_IC: return Builtins::kStoreIC_Miss; 543 case Code::STORE_IC: return Builtins::kStoreIC_Miss;
553 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss; 544 case Code::KEYED_LOAD_IC: return Builtins::kKeyedLoadIC_Miss;
554 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss; 545 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Miss;
555 default: UNREACHABLE(); 546 default: UNREACHABLE();
556 } 547 }
557 return Builtins::kLoadIC_Miss; 548 return Builtins::kLoadIC_Miss;
558 } 549 }
559 550
560 protected: 551 protected:
561 virtual Register HandlerFrontendHeader(Handle<Object> object, 552 virtual Register HandlerFrontendHeader(Handle<Type> type,
562 Register object_reg, 553 Register object_reg,
563 Handle<JSObject> holder, 554 Handle<JSObject> holder,
564 Handle<Name> name, 555 Handle<Name> name,
565 Label* miss) = 0; 556 Label* miss) = 0;
566 557
567 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0; 558 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss) = 0;
568 559
569 Register HandlerFrontend(Handle<Object> object, 560 Register HandlerFrontend(Handle<Type> type,
570 Register object_reg, 561 Register object_reg,
571 Handle<JSObject> holder, 562 Handle<JSObject> holder,
572 Handle<Name> name); 563 Handle<Name> name);
573 564
574 Handle<Code> GetCode(Code::Kind kind, 565 Handle<Code> GetCode(Code::Kind kind,
575 Code::StubType type, 566 Code::StubType type,
576 Handle<Name> name); 567 Handle<Name> name);
577 568
578 Handle<Code> GetICCode(Code::Kind kind, 569 Handle<Code> GetICCode(Code::Kind kind,
579 Code::StubType type, 570 Code::StubType type,
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
617 608
618 609
619 class LoadStubCompiler: public BaseLoadStoreStubCompiler { 610 class LoadStubCompiler: public BaseLoadStoreStubCompiler {
620 public: 611 public:
621 LoadStubCompiler(Isolate* isolate, 612 LoadStubCompiler(Isolate* isolate,
622 InlineCacheHolderFlag cache_holder = OWN_MAP, 613 InlineCacheHolderFlag cache_holder = OWN_MAP,
623 Code::Kind kind = Code::LOAD_IC) 614 Code::Kind kind = Code::LOAD_IC)
624 : BaseLoadStoreStubCompiler(isolate, kind, cache_holder) { } 615 : BaseLoadStoreStubCompiler(isolate, kind, cache_holder) { }
625 virtual ~LoadStubCompiler() { } 616 virtual ~LoadStubCompiler() { }
626 617
627 Handle<Code> CompileLoadField(Handle<Object> object, 618 Handle<Code> CompileLoadField(Handle<Type> type,
628 Handle<JSObject> holder, 619 Handle<JSObject> holder,
629 Handle<Name> name, 620 Handle<Name> name,
630 PropertyIndex index, 621 PropertyIndex index,
631 Representation representation); 622 Representation representation);
632 623
633 Handle<Code> CompileLoadCallback(Handle<Object> object, 624 Handle<Code> CompileLoadCallback(Handle<Type> type,
634 Handle<JSObject> holder, 625 Handle<JSObject> holder,
635 Handle<Name> name, 626 Handle<Name> name,
636 Handle<ExecutableAccessorInfo> callback); 627 Handle<ExecutableAccessorInfo> callback);
637 628
638 Handle<Code> CompileLoadCallback(Handle<Object> object, 629 Handle<Code> CompileLoadCallback(Handle<Type> type,
639 Handle<JSObject> holder, 630 Handle<JSObject> holder,
640 Handle<Name> name, 631 Handle<Name> name,
641 const CallOptimization& call_optimization); 632 const CallOptimization& call_optimization);
642 633
643 Handle<Code> CompileLoadConstant(Handle<Object> object, 634 Handle<Code> CompileLoadConstant(Handle<Type> type,
644 Handle<JSObject> holder, 635 Handle<JSObject> holder,
645 Handle<Name> name, 636 Handle<Name> name,
646 Handle<Object> value); 637 Handle<Object> value);
647 638
648 Handle<Code> CompileLoadInterceptor(Handle<Object> object, 639 Handle<Code> CompileLoadInterceptor(Handle<Type> type,
649 Handle<JSObject> holder, 640 Handle<JSObject> holder,
650 Handle<Name> name); 641 Handle<Name> name);
651 642
652 Handle<Code> CompileLoadViaGetter(Handle<Object> object, 643 Handle<Code> CompileLoadViaGetter(Handle<Type> type,
653 Handle<JSObject> holder, 644 Handle<JSObject> holder,
654 Handle<Name> name, 645 Handle<Name> name,
655 Handle<JSFunction> getter); 646 Handle<JSFunction> getter);
656 647
657 static void GenerateLoadViaGetter(MacroAssembler* masm, 648 static void GenerateLoadViaGetter(MacroAssembler* masm,
658 Register receiver, 649 Register receiver,
659 Handle<JSFunction> getter); 650 Handle<JSFunction> getter);
660 651
661 Handle<Code> CompileLoadNonexistent(Handle<Object> object, 652 Handle<Code> CompileLoadNonexistent(Handle<Type> type,
662 Handle<JSObject> last, 653 Handle<JSObject> last,
663 Handle<Name> name, 654 Handle<Name> name);
664 Handle<JSGlobalObject> global);
665 655
666 Handle<Code> CompileLoadGlobal(Handle<Object> object, 656 Handle<Code> CompileLoadGlobal(Handle<Type> type,
667 Handle<GlobalObject> holder, 657 Handle<GlobalObject> holder,
668 Handle<PropertyCell> cell, 658 Handle<PropertyCell> cell,
669 Handle<Name> name, 659 Handle<Name> name,
670 bool is_dont_delete); 660 bool is_dont_delete);
671 661
672 static Register* registers(); 662 static Register* registers();
673 663
674 protected: 664 protected:
675 virtual Register HandlerFrontendHeader(Handle<Object> object, 665 virtual Register HandlerFrontendHeader(Handle<Type> type,
676 Register object_reg, 666 Register object_reg,
677 Handle<JSObject> holder, 667 Handle<JSObject> holder,
678 Handle<Name> name, 668 Handle<Name> name,
679 Label* miss); 669 Label* miss);
680 670
681 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); 671 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss);
682 672
683 Register CallbackHandlerFrontend(Handle<Object> object, 673 Register CallbackHandlerFrontend(Handle<Type> type,
684 Register object_reg, 674 Register object_reg,
685 Handle<JSObject> holder, 675 Handle<JSObject> holder,
686 Handle<Name> name, 676 Handle<Name> name,
687 Handle<Object> callback); 677 Handle<Object> callback);
688 void NonexistentHandlerFrontend(Handle<Object> object, 678 void NonexistentHandlerFrontend(Handle<Type> type,
689 Handle<JSObject> last, 679 Handle<JSObject> last,
690 Handle<Name> name, 680 Handle<Name> name);
691 Handle<JSGlobalObject> global);
692 681
693 void GenerateLoadField(Register reg, 682 void GenerateLoadField(Register reg,
694 Handle<JSObject> holder, 683 Handle<JSObject> holder,
695 PropertyIndex field, 684 PropertyIndex field,
696 Representation representation); 685 Representation representation);
697 void GenerateLoadConstant(Handle<Object> value); 686 void GenerateLoadConstant(Handle<Object> value);
698 void GenerateLoadCallback(Register reg, 687 void GenerateLoadCallback(Register reg,
699 Handle<ExecutableAccessorInfo> callback); 688 Handle<ExecutableAccessorInfo> callback);
700 void GenerateLoadCallback(const CallOptimization& call_optimization); 689 void GenerateLoadCallback(const CallOptimization& call_optimization);
701 void GenerateLoadInterceptor(Register holder_reg, 690 void GenerateLoadInterceptor(Register holder_reg,
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
814 static Builtins::Name SlowBuiltin(Code::Kind kind) { 803 static Builtins::Name SlowBuiltin(Code::Kind kind) {
815 switch (kind) { 804 switch (kind) {
816 case Code::STORE_IC: return Builtins::kStoreIC_Slow; 805 case Code::STORE_IC: return Builtins::kStoreIC_Slow;
817 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow; 806 case Code::KEYED_STORE_IC: return Builtins::kKeyedStoreIC_Slow;
818 default: UNREACHABLE(); 807 default: UNREACHABLE();
819 } 808 }
820 return Builtins::kStoreIC_Slow; 809 return Builtins::kStoreIC_Slow;
821 } 810 }
822 811
823 protected: 812 protected:
824 virtual Register HandlerFrontendHeader(Handle<Object> object, 813 virtual Register HandlerFrontendHeader(Handle<Type> type,
825 Register object_reg, 814 Register object_reg,
826 Handle<JSObject> holder, 815 Handle<JSObject> holder,
827 Handle<Name> name, 816 Handle<Name> name,
828 Label* miss); 817 Label* miss);
829 818
830 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss); 819 virtual void HandlerFrontendFooter(Handle<Name> name, Label* miss);
831 void GenerateRestoreName(MacroAssembler* masm, 820 void GenerateRestoreName(MacroAssembler* masm,
832 Label* label, 821 Label* label,
833 Handle<Name> name); 822 Handle<Name> name);
834 823
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after
1050 Handle<JSFunction> constant_function_; 1039 Handle<JSFunction> constant_function_;
1051 bool is_simple_api_call_; 1040 bool is_simple_api_call_;
1052 Handle<FunctionTemplateInfo> expected_receiver_type_; 1041 Handle<FunctionTemplateInfo> expected_receiver_type_;
1053 Handle<CallHandlerInfo> api_call_info_; 1042 Handle<CallHandlerInfo> api_call_info_;
1054 }; 1043 };
1055 1044
1056 1045
1057 } } // namespace v8::internal 1046 } } // namespace v8::internal
1058 1047
1059 #endif // V8_STUB_CACHE_H_ 1048 #endif // V8_STUB_CACHE_H_
OLDNEW
« no previous file with comments | « src/serialize.cc ('k') | src/stub-cache.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698