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

Side by Side Diff: src/code-stubs.h

Issue 14307006: Make it possible to Crankshaft all kinds of stubs. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 7 years, 8 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/code-stubs-arm.h ('k') | src/code-stubs.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 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 // result in a traversable stack. 169 // result in a traversable stack.
170 virtual bool SometimesSetsUpAFrame() { return true; } 170 virtual bool SometimesSetsUpAFrame() { return true; }
171 171
172 // Lookup the code in the (possibly custom) cache. 172 // Lookup the code in the (possibly custom) cache.
173 bool FindCodeInCache(Code** code_out, Isolate* isolate); 173 bool FindCodeInCache(Code** code_out, Isolate* isolate);
174 174
175 // Returns information for computing the number key. 175 // Returns information for computing the number key.
176 virtual Major MajorKey() = 0; 176 virtual Major MajorKey() = 0;
177 virtual int MinorKey() = 0; 177 virtual int MinorKey() = 0;
178 178
179 virtual InlineCacheState GetICState() {
180 return UNINITIALIZED;
181 }
182 virtual Code::ExtraICState GetExtraICState() {
183 return Code::kNoExtraICState;
184 }
185
179 protected: 186 protected:
180 static bool CanUseFPRegisters(); 187 static bool CanUseFPRegisters();
181 188
182 // Generates the assembler code for the stub. 189 // Generates the assembler code for the stub.
183 virtual Handle<Code> GenerateCode() = 0; 190 virtual Handle<Code> GenerateCode() = 0;
184 191
185 // BinaryOpStub needs to override this.
186 virtual InlineCacheState GetICState() {
187 return UNINITIALIZED;
188 }
189 virtual Code::ExtraICState GetExtraICState() {
190 return Code::kNoExtraICState;
191 }
192 virtual Code::StubType GetStubType() { 192 virtual Code::StubType GetStubType() {
193 return Code::NORMAL; 193 return Code::NORMAL;
194 } 194 }
195 195
196 // Returns whether the code generated for this stub needs to be allocated as 196 // Returns whether the code generated for this stub needs to be allocated as
197 // a fixed (non-moveable) code object. 197 // a fixed (non-moveable) code object.
198 virtual bool NeedsImmovableCode() { return false; } 198 virtual bool NeedsImmovableCode() { return false; }
199 199
200 private: 200 private:
201 // Perform bookkeeping required after code generation when stub code is 201 // Perform bookkeeping required after code generation when stub code is
202 // initially generated. 202 // initially generated.
203 void RecordCodeGeneration(Code* code, Isolate* isolate); 203 void RecordCodeGeneration(Code* code, Isolate* isolate);
204 204
205 // Finish the code object after it has been generated. 205 // Finish the code object after it has been generated.
206 virtual void FinishCode(Handle<Code> code) { } 206 virtual void FinishCode(Handle<Code> code) { }
207 207
208 // Activate newly generated stub. Is called after 208 // Activate newly generated stub. Is called after
209 // registering stub in the stub cache. 209 // registering stub in the stub cache.
210 virtual void Activate(Code* code) { } 210 virtual void Activate(Code* code) { }
211 211
212 // BinaryOpStub needs to override this. 212 // BinaryOpStub needs to override this.
213 virtual int GetCodeKind(); 213 virtual Code::Kind GetCodeKind() const;
214 214
215 // Add the code to a specialized cache, specific to an individual 215 // Add the code to a specialized cache, specific to an individual
216 // stub type. Please note, this method must add the code object to a 216 // stub type. Please note, this method must add the code object to a
217 // roots object, otherwise we will remove the code during GC. 217 // roots object, otherwise we will remove the code during GC.
218 virtual void AddToSpecialCache(Handle<Code> new_object) { } 218 virtual void AddToSpecialCache(Handle<Code> new_object) { }
219 219
220 // Find code in a specialized cache, work is delegated to the specific stub. 220 // Find code in a specialized cache, work is delegated to the specific stub.
221 virtual bool FindCodeInSpecialCache(Code** code_out, Isolate* isolate) { 221 virtual bool FindCodeInSpecialCache(Code** code_out, Isolate* isolate) {
222 return false; 222 return false;
223 } 223 }
(...skipping 18 matching lines...) Expand all
242 242
243 friend class BreakPointIterator; 243 friend class BreakPointIterator;
244 }; 244 };
245 245
246 246
247 class PlatformCodeStub : public CodeStub { 247 class PlatformCodeStub : public CodeStub {
248 public: 248 public:
249 // Retrieve the code for the stub. Generate the code if needed. 249 // Retrieve the code for the stub. Generate the code if needed.
250 virtual Handle<Code> GenerateCode(); 250 virtual Handle<Code> GenerateCode();
251 251
252 virtual int GetCodeKind() { return Code::STUB; } 252 virtual Code::Kind GetCodeKind() const { return Code::STUB; }
253 virtual int GetStubFlags() { return -1; } 253 virtual int GetStubFlags() { return -1; }
254 254
255 protected: 255 protected:
256 // Generates the assembler code for the stub. 256 // Generates the assembler code for the stub.
257 virtual void Generate(MacroAssembler* masm) = 0; 257 virtual void Generate(MacroAssembler* masm) = 0;
258 }; 258 };
259 259
260 260
261 enum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE }; 261 enum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE };
262 262
(...skipping 16 matching lines...) Expand all
279 return register_param_count_; 279 return register_param_count_;
280 } 280 }
281 }; 281 };
282 282
283 283
284 class HydrogenCodeStub : public CodeStub { 284 class HydrogenCodeStub : public CodeStub {
285 public: 285 public:
286 // Retrieve the code for the stub. Generate the code if needed. 286 // Retrieve the code for the stub. Generate the code if needed.
287 virtual Handle<Code> GenerateCode() = 0; 287 virtual Handle<Code> GenerateCode() = 0;
288 288
289 virtual int GetCodeKind() { return Code::COMPILED_STUB; } 289 virtual Code::Kind GetCodeKind() const { return Code::STUB; }
290 290
291 CodeStubInterfaceDescriptor* GetInterfaceDescriptor(Isolate* isolate) { 291 CodeStubInterfaceDescriptor* GetInterfaceDescriptor(Isolate* isolate) {
292 return isolate->code_stub_interface_descriptor(MajorKey()); 292 return isolate->code_stub_interface_descriptor(MajorKey());
293 } 293 }
294 294
295 virtual void InitializeInterfaceDescriptor( 295 virtual void InitializeInterfaceDescriptor(
296 Isolate* isolate, 296 Isolate* isolate,
297 CodeStubInterfaceDescriptor* descriptor) = 0; 297 CodeStubInterfaceDescriptor* descriptor) = 0;
298 }; 298 };
299 299
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
599 virtual CodeStub::Major MajorKey() { return MathPow; } 599 virtual CodeStub::Major MajorKey() { return MathPow; }
600 virtual int MinorKey() { return exponent_type_; } 600 virtual int MinorKey() { return exponent_type_; }
601 601
602 ExponentType exponent_type_; 602 ExponentType exponent_type_;
603 }; 603 };
604 604
605 605
606 class ICStub: public PlatformCodeStub { 606 class ICStub: public PlatformCodeStub {
607 public: 607 public:
608 explicit ICStub(Code::Kind kind) : kind_(kind) { } 608 explicit ICStub(Code::Kind kind) : kind_(kind) { }
609 virtual int GetCodeKind() { return kind_; } 609 virtual Code::Kind GetCodeKind() const { return kind_; }
610 virtual InlineCacheState GetICState() { return MONOMORPHIC; } 610 virtual InlineCacheState GetICState() { return MONOMORPHIC; }
611 611
612 bool Describes(Code* code) { 612 bool Describes(Code* code) {
613 return GetMajorKey(code) == MajorKey() && code->stub_info() == MinorKey(); 613 return GetMajorKey(code) == MajorKey() && code->stub_info() == MinorKey();
614 } 614 }
615 615
616 protected: 616 protected:
617 class KindBits: public BitField<Code::Kind, 0, 4> {}; 617 class KindBits: public BitField<Code::Kind, 0, 4> {};
618 virtual void FinishCode(Handle<Code> code) { 618 virtual void FinishCode(Handle<Code> code) {
619 code->set_stub_info(MinorKey()); 619 code->set_stub_info(MinorKey());
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
685 virtual void Generate(MacroAssembler* masm); 685 virtual void Generate(MacroAssembler* masm);
686 686
687 private: 687 private:
688 virtual CodeStub::Major MajorKey() { return StoreArrayLength; } 688 virtual CodeStub::Major MajorKey() { return StoreArrayLength; }
689 }; 689 };
690 690
691 691
692 class HandlerStub: public ICStub { 692 class HandlerStub: public ICStub {
693 public: 693 public:
694 explicit HandlerStub(Code::Kind kind) : ICStub(kind) { } 694 explicit HandlerStub(Code::Kind kind) : ICStub(kind) { }
695 virtual int GetCodeKind() { return Code::STUB; } 695 virtual Code::Kind GetCodeKind() const { return Code::STUB; }
696 virtual int GetStubFlags() { return kind(); } 696 virtual int GetStubFlags() { return kind(); }
697 }; 697 };
698 698
699 699
700 class LoadFieldStub: public HandlerStub { 700 class LoadFieldStub: public HandlerStub {
701 public: 701 public:
702 LoadFieldStub(Register reg, bool inobject, int index) 702 LoadFieldStub(Register reg, bool inobject, int index)
703 : HandlerStub(Code::LOAD_IC), 703 : HandlerStub(Code::LOAD_IC),
704 reg_(reg), 704 reg_(reg),
705 inobject_(inobject), 705 inobject_(inobject),
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 void GenerateReturn(MacroAssembler* masm); 823 void GenerateReturn(MacroAssembler* masm);
824 void GenerateSmiStub(MacroAssembler* masm); 824 void GenerateSmiStub(MacroAssembler* masm);
825 void GenerateStringStub(MacroAssembler* masm); 825 void GenerateStringStub(MacroAssembler* masm);
826 void GenerateTypeTransition(MacroAssembler* masm); 826 void GenerateTypeTransition(MacroAssembler* masm);
827 void GenerateTypeTransitionWithSavedArgs(MacroAssembler* masm); 827 void GenerateTypeTransitionWithSavedArgs(MacroAssembler* masm);
828 void GenerateUninitializedStub(MacroAssembler* masm); 828 void GenerateUninitializedStub(MacroAssembler* masm);
829 829
830 // Entirely platform-specific methods are defined as static helper 830 // Entirely platform-specific methods are defined as static helper
831 // functions in the <arch>/code-stubs-<arch>.cc files. 831 // functions in the <arch>/code-stubs-<arch>.cc files.
832 832
833 virtual int GetCodeKind() { return Code::BINARY_OP_IC; } 833 virtual Code::Kind GetCodeKind() const { return Code::BINARY_OP_IC; }
834 834
835 virtual InlineCacheState GetICState() { 835 virtual InlineCacheState GetICState() {
836 return BinaryOpIC::ToState(Max(left_type_, right_type_)); 836 return BinaryOpIC::ToState(Max(left_type_, right_type_));
837 } 837 }
838 838
839 virtual void FinishCode(Handle<Code> code) { 839 virtual void FinishCode(Handle<Code> code) {
840 code->set_stub_info(MinorKey()); 840 code->set_stub_info(MinorKey());
841 } 841 }
842 842
843 friend class CodeGenerator; 843 friend class CodeGenerator;
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 class RightStateField: public BitField<int, 7, 4> { }; 877 class RightStateField: public BitField<int, 7, 4> { };
878 class HandlerStateField: public BitField<int, 11, 4> { }; 878 class HandlerStateField: public BitField<int, 11, 4> { };
879 879
880 virtual void FinishCode(Handle<Code> code) { 880 virtual void FinishCode(Handle<Code> code) {
881 code->set_stub_info(MinorKey()); 881 code->set_stub_info(MinorKey());
882 } 882 }
883 883
884 virtual CodeStub::Major MajorKey() { return CompareIC; } 884 virtual CodeStub::Major MajorKey() { return CompareIC; }
885 virtual int MinorKey(); 885 virtual int MinorKey();
886 886
887 virtual int GetCodeKind() { return Code::COMPARE_IC; } 887 virtual Code::Kind GetCodeKind() const { return Code::COMPARE_IC; }
888 888
889 void GenerateSmis(MacroAssembler* masm); 889 void GenerateSmis(MacroAssembler* masm);
890 void GenerateNumbers(MacroAssembler* masm); 890 void GenerateNumbers(MacroAssembler* masm);
891 void GenerateInternalizedStrings(MacroAssembler* masm); 891 void GenerateInternalizedStrings(MacroAssembler* masm);
892 void GenerateStrings(MacroAssembler* masm); 892 void GenerateStrings(MacroAssembler* masm);
893 void GenerateUniqueNames(MacroAssembler* masm); 893 void GenerateUniqueNames(MacroAssembler* masm);
894 void GenerateObjects(MacroAssembler* masm); 894 void GenerateObjects(MacroAssembler* masm);
895 void GenerateMiss(MacroAssembler* masm); 895 void GenerateMiss(MacroAssembler* masm);
896 void GenerateKnownObjects(MacroAssembler* masm); 896 void GenerateKnownObjects(MacroAssembler* masm);
897 void GenerateGeneric(MacroAssembler* masm); 897 void GenerateGeneric(MacroAssembler* masm);
(...skipping 643 matching lines...) Expand 10 before | Expand all | Expand 10 after
1541 EnumSet<Type, byte> set_; 1541 EnumSet<Type, byte> set_;
1542 }; 1542 };
1543 1543
1544 static Types no_types() { return Types(); } 1544 static Types no_types() { return Types(); }
1545 static Types all_types() { return Types((1 << NUMBER_OF_TYPES) - 1); } 1545 static Types all_types() { return Types((1 << NUMBER_OF_TYPES) - 1); }
1546 1546
1547 explicit ToBooleanStub(Register tos, Types types = Types()) 1547 explicit ToBooleanStub(Register tos, Types types = Types())
1548 : tos_(tos), types_(types) { } 1548 : tos_(tos), types_(types) { }
1549 1549
1550 void Generate(MacroAssembler* masm); 1550 void Generate(MacroAssembler* masm);
1551 virtual int GetCodeKind() { return Code::TO_BOOLEAN_IC; } 1551 virtual Code::Kind GetCodeKind() const { return Code::TO_BOOLEAN_IC; }
1552 virtual void PrintName(StringStream* stream); 1552 virtual void PrintName(StringStream* stream);
1553 1553
1554 virtual bool SometimesSetsUpAFrame() { return false; } 1554 virtual bool SometimesSetsUpAFrame() { return false; }
1555 1555
1556 private: 1556 private:
1557 Major MajorKey() { return ToBoolean; } 1557 Major MajorKey() { return ToBoolean; }
1558 int MinorKey() { return (tos_.code() << NUMBER_OF_TYPES) | types_.ToByte(); } 1558 int MinorKey() { return (tos_.code() << NUMBER_OF_TYPES) | types_.ToByte(); }
1559 1559
1560 virtual void FinishCode(Handle<Code> code) { 1560 virtual void FinishCode(Handle<Code> code) {
1561 code->set_to_boolean_state(types_.ToByte()); 1561 code->set_to_boolean_state(types_.ToByte());
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
1688 1688
1689 // The current function entry hook. 1689 // The current function entry hook.
1690 static FunctionEntryHook entry_hook_; 1690 static FunctionEntryHook entry_hook_;
1691 1691
1692 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub); 1692 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub);
1693 }; 1693 };
1694 1694
1695 } } // namespace v8::internal 1695 } } // namespace v8::internal
1696 1696
1697 #endif // V8_CODE_STUBS_H_ 1697 #endif // V8_CODE_STUBS_H_
OLDNEW
« no previous file with comments | « src/arm/code-stubs-arm.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698