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

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

Issue 10701054: Enable stub generation using Hydrogen/Lithium (again) (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Merge with latest Created 8 years 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/builtins.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 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
155 // GC. This means that we must be statically sure that no GC can occur while 155 // GC. This means that we must be statically sure that no GC can occur while
156 // they are running. If that is the case they should override this to return 156 // they are running. If that is the case they should override this to return
157 // true, which will cause an assertion if we try to call something that can 157 // true, which will cause an assertion if we try to call something that can
158 // GC or if we try to put a stack frame on top of the junk, which would not 158 // GC or if we try to put a stack frame on top of the junk, which would not
159 // result in a traversable stack. 159 // result in a traversable stack.
160 virtual bool SometimesSetsUpAFrame() { return true; } 160 virtual bool SometimesSetsUpAFrame() { return true; }
161 161
162 // Lookup the code in the (possibly custom) cache. 162 // Lookup the code in the (possibly custom) cache.
163 bool FindCodeInCache(Code** code_out, Isolate* isolate); 163 bool FindCodeInCache(Code** code_out, Isolate* isolate);
164 164
165 // Returns information for computing the number key.
166 virtual Major MajorKey() = 0;
167 virtual int MinorKey() = 0;
168
165 protected: 169 protected:
166 static bool CanUseFPRegisters(); 170 static bool CanUseFPRegisters();
167 171
172 // Generates the assembler code for the stub.
173 virtual Handle<Code> GenerateCode() = 0;
174
175 // BinaryOpStub needs to override this.
176 virtual InlineCacheState GetICState() {
177 return UNINITIALIZED;
178 }
179
180 // Returns whether the code generated for this stub needs to be allocated as
181 // a fixed (non-moveable) code object.
182 virtual bool NeedsImmovableCode() { return false; }
183
168 private: 184 private:
169 // Nonvirtual wrapper around the stub-specific Generate function. Call
170 // this function to set up the macro assembler and generate the code.
171 void GenerateCode(MacroAssembler* masm);
172
173 // Generates the assembler code for the stub.
174 virtual void Generate(MacroAssembler* masm) = 0;
175
176 // Perform bookkeeping required after code generation when stub code is 185 // Perform bookkeeping required after code generation when stub code is
177 // initially generated. 186 // initially generated.
178 void RecordCodeGeneration(Code* code, MacroAssembler* masm); 187 void RecordCodeGeneration(Code* code, Isolate* isolate);
179 188
180 // Finish the code object after it has been generated. 189 // Finish the code object after it has been generated.
181 virtual void FinishCode(Handle<Code> code) { } 190 virtual void FinishCode(Handle<Code> code) { }
182 191
183 // Activate newly generated stub. Is called after 192 // Activate newly generated stub. Is called after
184 // registering stub in the stub cache. 193 // registering stub in the stub cache.
185 virtual void Activate(Code* code) { } 194 virtual void Activate(Code* code) { }
186 195
187 // Returns information for computing the number key.
188 virtual Major MajorKey() = 0;
189 virtual int MinorKey() = 0;
190
191 // BinaryOpStub needs to override this. 196 // BinaryOpStub needs to override this.
192 virtual int GetCodeKind(); 197 virtual int GetCodeKind();
193 198
194 // BinaryOpStub needs to override this.
195 virtual InlineCacheState GetICState() {
196 return UNINITIALIZED;
197 }
198
199 // Add the code to a specialized cache, specific to an individual 199 // Add the code to a specialized cache, specific to an individual
200 // stub type. Please note, this method must add the code object to a 200 // stub type. Please note, this method must add the code object to a
201 // roots object, otherwise we will remove the code during GC. 201 // roots object, otherwise we will remove the code during GC.
202 virtual void AddToSpecialCache(Handle<Code> new_object) { } 202 virtual void AddToSpecialCache(Handle<Code> new_object) { }
203 203
204 // Find code in a specialized cache, work is delegated to the specific stub. 204 // Find code in a specialized cache, work is delegated to the specific stub.
205 virtual bool FindCodeInSpecialCache(Code** code_out, Isolate* isolate) { 205 virtual bool FindCodeInSpecialCache(Code** code_out, Isolate* isolate) {
206 return false; 206 return false;
207 } 207 }
208 208
209 // If a stub uses a special cache override this. 209 // If a stub uses a special cache override this.
210 virtual bool UseSpecialCache() { return false; } 210 virtual bool UseSpecialCache() { return false; }
211 211
212 // Returns a name for logging/debugging purposes. 212 // Returns a name for logging/debugging purposes.
213 SmartArrayPointer<const char> GetName(); 213 SmartArrayPointer<const char> GetName();
214 virtual void PrintName(StringStream* stream); 214 virtual void PrintName(StringStream* stream);
215 215
216 // Returns whether the code generated for this stub needs to be allocated as
217 // a fixed (non-moveable) code object.
218 virtual bool NeedsImmovableCode() { return false; }
219
220 // Computes the key based on major and minor. 216 // Computes the key based on major and minor.
221 uint32_t GetKey() { 217 uint32_t GetKey() {
222 ASSERT(static_cast<int>(MajorKey()) < NUMBER_OF_IDS); 218 ASSERT(static_cast<int>(MajorKey()) < NUMBER_OF_IDS);
223 return MinorKeyBits::encode(MinorKey()) | 219 return MinorKeyBits::encode(MinorKey()) |
224 MajorKeyBits::encode(MajorKey()); 220 MajorKeyBits::encode(MajorKey());
225 } 221 }
226 222
227 class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {}; 223 class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {};
228 class MinorKeyBits: public BitField<uint32_t, 224 class MinorKeyBits: public BitField<uint32_t,
229 kStubMajorKeyBits, kStubMinorKeyBits> {}; // NOLINT 225 kStubMajorKeyBits, kStubMinorKeyBits> {}; // NOLINT
230 226
231 friend class BreakPointIterator; 227 friend class BreakPointIterator;
232 }; 228 };
233 229
234 230
231 class PlatformCodeStub : public CodeStub {
232 public:
233 // Retrieve the code for the stub. Generate the code if needed.
234 virtual Handle<Code> GenerateCode();
235
236 virtual int GetCodeKind() { return Code::STUB; }
237
238 protected:
239 // Generates the assembler code for the stub.
240 virtual void Generate(MacroAssembler* masm) = 0;
241 };
242
243
244 struct CodeStubInterfaceDescriptor {
245 int number_of_register_params;
246 Register* register_params;
247 Handle<Code> deoptimization_handler;
248 };
249
250
251 class HGraph;
252 struct Register;
253 class HydrogenCodeStub : public CodeStub {
254 public:
255 // Retrieve the code for the stub. Generate the code if needed.
256 virtual Handle<Code> GenerateCode() = 0;
257
258 virtual int GetCodeKind() { return Code::COMPILED_STUB; }
259
260 virtual CodeStubInterfaceDescriptor* GetInterfaceDescriptor(
261 Isolate* isolate) = 0;
262
263 protected:
264 Handle<Code> CodeFromGraph(HGraph* graph);
265 };
266
267
235 // Helper interface to prepare to/restore after making runtime calls. 268 // Helper interface to prepare to/restore after making runtime calls.
236 class RuntimeCallHelper { 269 class RuntimeCallHelper {
237 public: 270 public:
238 virtual ~RuntimeCallHelper() {} 271 virtual ~RuntimeCallHelper() {}
239 272
240 virtual void BeforeCall(MacroAssembler* masm) const = 0; 273 virtual void BeforeCall(MacroAssembler* masm) const = 0;
241 274
242 virtual void AfterCall(MacroAssembler* masm) const = 0; 275 virtual void AfterCall(MacroAssembler* masm) const = 0;
243 276
244 protected: 277 protected:
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
282 class NopRuntimeCallHelper : public RuntimeCallHelper { 315 class NopRuntimeCallHelper : public RuntimeCallHelper {
283 public: 316 public:
284 NopRuntimeCallHelper() {} 317 NopRuntimeCallHelper() {}
285 318
286 virtual void BeforeCall(MacroAssembler* masm) const {} 319 virtual void BeforeCall(MacroAssembler* masm) const {}
287 320
288 virtual void AfterCall(MacroAssembler* masm) const {} 321 virtual void AfterCall(MacroAssembler* masm) const {}
289 }; 322 };
290 323
291 324
292 class StackCheckStub : public CodeStub { 325 class StackCheckStub : public PlatformCodeStub {
293 public: 326 public:
294 StackCheckStub() { } 327 StackCheckStub() { }
295 328
296 void Generate(MacroAssembler* masm); 329 void Generate(MacroAssembler* masm);
297 330
298 private: 331 private:
299 Major MajorKey() { return StackCheck; } 332 Major MajorKey() { return StackCheck; }
300 int MinorKey() { return 0; } 333 int MinorKey() { return 0; }
301 }; 334 };
302 335
303 336
304 class InterruptStub : public CodeStub { 337 class InterruptStub : public PlatformCodeStub {
305 public: 338 public:
306 InterruptStub() { } 339 InterruptStub() { }
307 340
308 void Generate(MacroAssembler* masm); 341 void Generate(MacroAssembler* masm);
309 342
310 private: 343 private:
311 Major MajorKey() { return Interrupt; } 344 Major MajorKey() { return Interrupt; }
312 int MinorKey() { return 0; } 345 int MinorKey() { return 0; }
313 }; 346 };
314 347
315 348
316 class ToNumberStub: public CodeStub { 349 class ToNumberStub: public PlatformCodeStub {
317 public: 350 public:
318 ToNumberStub() { } 351 ToNumberStub() { }
319 352
320 void Generate(MacroAssembler* masm); 353 void Generate(MacroAssembler* masm);
321 354
322 private: 355 private:
323 Major MajorKey() { return ToNumber; } 356 Major MajorKey() { return ToNumber; }
324 int MinorKey() { return 0; } 357 int MinorKey() { return 0; }
325 }; 358 };
326 359
327 360
328 class FastNewClosureStub : public CodeStub { 361 class FastNewClosureStub : public PlatformCodeStub {
329 public: 362 public:
330 explicit FastNewClosureStub(LanguageMode language_mode) 363 explicit FastNewClosureStub(LanguageMode language_mode)
331 : language_mode_(language_mode) { } 364 : language_mode_(language_mode) { }
332 365
333 void Generate(MacroAssembler* masm); 366 void Generate(MacroAssembler* masm);
334 367
335 private: 368 private:
336 Major MajorKey() { return FastNewClosure; } 369 Major MajorKey() { return FastNewClosure; }
337 int MinorKey() { return language_mode_ == CLASSIC_MODE 370 int MinorKey() { return language_mode_ == CLASSIC_MODE
338 ? kNonStrictMode : kStrictMode; } 371 ? kNonStrictMode : kStrictMode; }
339 372
340 LanguageMode language_mode_; 373 LanguageMode language_mode_;
341 }; 374 };
342 375
343 376
344 class FastNewContextStub : public CodeStub { 377 class FastNewContextStub : public PlatformCodeStub {
345 public: 378 public:
346 static const int kMaximumSlots = 64; 379 static const int kMaximumSlots = 64;
347 380
348 explicit FastNewContextStub(int slots) : slots_(slots) { 381 explicit FastNewContextStub(int slots) : slots_(slots) {
349 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); 382 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots);
350 } 383 }
351 384
352 void Generate(MacroAssembler* masm); 385 void Generate(MacroAssembler* masm);
353 386
354 private: 387 private:
355 int slots_; 388 int slots_;
356 389
357 Major MajorKey() { return FastNewContext; } 390 Major MajorKey() { return FastNewContext; }
358 int MinorKey() { return slots_; } 391 int MinorKey() { return slots_; }
359 }; 392 };
360 393
361 394
362 class FastNewBlockContextStub : public CodeStub { 395 class FastNewBlockContextStub : public PlatformCodeStub {
363 public: 396 public:
364 static const int kMaximumSlots = 64; 397 static const int kMaximumSlots = 64;
365 398
366 explicit FastNewBlockContextStub(int slots) : slots_(slots) { 399 explicit FastNewBlockContextStub(int slots) : slots_(slots) {
367 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); 400 ASSERT(slots_ > 0 && slots_ <= kMaximumSlots);
368 } 401 }
369 402
370 void Generate(MacroAssembler* masm); 403 void Generate(MacroAssembler* masm);
371 404
372 private: 405 private:
373 int slots_; 406 int slots_;
374 407
375 Major MajorKey() { return FastNewBlockContext; } 408 Major MajorKey() { return FastNewBlockContext; }
376 int MinorKey() { return slots_; } 409 int MinorKey() { return slots_; }
377 }; 410 };
378 411
379 412
380 class FastCloneShallowArrayStub : public CodeStub { 413 class FastCloneShallowArrayStub : public PlatformCodeStub {
381 public: 414 public:
382 // Maximum length of copied elements array. 415 // Maximum length of copied elements array.
383 static const int kMaximumClonedLength = 8; 416 static const int kMaximumClonedLength = 8;
384 417
385 enum Mode { 418 enum Mode {
386 CLONE_ELEMENTS, 419 CLONE_ELEMENTS,
387 CLONE_DOUBLE_ELEMENTS, 420 CLONE_DOUBLE_ELEMENTS,
388 COPY_ON_WRITE_ELEMENTS, 421 COPY_ON_WRITE_ELEMENTS,
389 CLONE_ANY_ELEMENTS 422 CLONE_ANY_ELEMENTS
390 }; 423 };
(...skipping 12 matching lines...) Expand all
403 int length_; 436 int length_;
404 437
405 Major MajorKey() { return FastCloneShallowArray; } 438 Major MajorKey() { return FastCloneShallowArray; }
406 int MinorKey() { 439 int MinorKey() {
407 ASSERT(mode_ == 0 || mode_ == 1 || mode_ == 2 || mode_ == 3); 440 ASSERT(mode_ == 0 || mode_ == 1 || mode_ == 2 || mode_ == 3);
408 return length_ * 4 + mode_; 441 return length_ * 4 + mode_;
409 } 442 }
410 }; 443 };
411 444
412 445
413 class FastCloneShallowObjectStub : public CodeStub { 446 class FastCloneShallowObjectStub : public PlatformCodeStub {
414 public: 447 public:
415 // Maximum number of properties in copied object. 448 // Maximum number of properties in copied object.
416 static const int kMaximumClonedProperties = 6; 449 static const int kMaximumClonedProperties = 6;
417 450
418 explicit FastCloneShallowObjectStub(int length) : length_(length) { 451 explicit FastCloneShallowObjectStub(int length) : length_(length) {
419 ASSERT_GE(length_, 0); 452 ASSERT_GE(length_, 0);
420 ASSERT_LE(length_, kMaximumClonedProperties); 453 ASSERT_LE(length_, kMaximumClonedProperties);
421 } 454 }
422 455
423 void Generate(MacroAssembler* masm); 456 void Generate(MacroAssembler* masm);
424 457
425 private: 458 private:
426 int length_; 459 int length_;
427 460
428 Major MajorKey() { return FastCloneShallowObject; } 461 Major MajorKey() { return FastCloneShallowObject; }
429 int MinorKey() { return length_; } 462 int MinorKey() { return length_; }
430 }; 463 };
431 464
432 465
433 class InstanceofStub: public CodeStub { 466 class InstanceofStub: public PlatformCodeStub {
434 public: 467 public:
435 enum Flags { 468 enum Flags {
436 kNoFlags = 0, 469 kNoFlags = 0,
437 kArgsInRegisters = 1 << 0, 470 kArgsInRegisters = 1 << 0,
438 kCallSiteInlineCheck = 1 << 1, 471 kCallSiteInlineCheck = 1 << 1,
439 kReturnTrueFalseObject = 1 << 2 472 kReturnTrueFalseObject = 1 << 2
440 }; 473 };
441 474
442 explicit InstanceofStub(Flags flags) : flags_(flags) { } 475 explicit InstanceofStub(Flags flags) : flags_(flags) { }
443 476
(...skipping 17 matching lines...) Expand all
461 bool ReturnTrueFalseObject() const { 494 bool ReturnTrueFalseObject() const {
462 return (flags_ & kReturnTrueFalseObject) != 0; 495 return (flags_ & kReturnTrueFalseObject) != 0;
463 } 496 }
464 497
465 virtual void PrintName(StringStream* stream); 498 virtual void PrintName(StringStream* stream);
466 499
467 Flags flags_; 500 Flags flags_;
468 }; 501 };
469 502
470 503
471 class MathPowStub: public CodeStub { 504 class MathPowStub: public PlatformCodeStub {
472 public: 505 public:
473 enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK}; 506 enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK};
474 507
475 explicit MathPowStub(ExponentType exponent_type) 508 explicit MathPowStub(ExponentType exponent_type)
476 : exponent_type_(exponent_type) { } 509 : exponent_type_(exponent_type) { }
477 virtual void Generate(MacroAssembler* masm); 510 virtual void Generate(MacroAssembler* masm);
478 511
479 private: 512 private:
480 virtual CodeStub::Major MajorKey() { return MathPow; } 513 virtual CodeStub::Major MajorKey() { return MathPow; }
481 virtual int MinorKey() { return exponent_type_; } 514 virtual int MinorKey() { return exponent_type_; }
482 515
483 ExponentType exponent_type_; 516 ExponentType exponent_type_;
484 }; 517 };
485 518
486 519
487 class BinaryOpStub: public CodeStub { 520 class BinaryOpStub: public PlatformCodeStub {
488 public: 521 public:
489 BinaryOpStub(Token::Value op, OverwriteMode mode) 522 BinaryOpStub(Token::Value op, OverwriteMode mode)
490 : op_(op), 523 : op_(op),
491 mode_(mode), 524 mode_(mode),
492 platform_specific_bit_(false), 525 platform_specific_bit_(false),
493 left_type_(BinaryOpIC::UNINITIALIZED), 526 left_type_(BinaryOpIC::UNINITIALIZED),
494 right_type_(BinaryOpIC::UNINITIALIZED), 527 right_type_(BinaryOpIC::UNINITIALIZED),
495 result_type_(BinaryOpIC::UNINITIALIZED) { 528 result_type_(BinaryOpIC::UNINITIALIZED) {
496 Initialize(); 529 Initialize();
497 ASSERT(OpBits::is_valid(Token::NUM_TOKENS)); 530 ASSERT(OpBits::is_valid(Token::NUM_TOKENS));
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
593 } 626 }
594 627
595 virtual void FinishCode(Handle<Code> code) { 628 virtual void FinishCode(Handle<Code> code) {
596 code->set_stub_info(MinorKey()); 629 code->set_stub_info(MinorKey());
597 } 630 }
598 631
599 friend class CodeGenerator; 632 friend class CodeGenerator;
600 }; 633 };
601 634
602 635
603 class ICCompareStub: public CodeStub { 636 class ICCompareStub: public PlatformCodeStub {
604 public: 637 public:
605 ICCompareStub(Token::Value op, 638 ICCompareStub(Token::Value op,
606 CompareIC::State left, 639 CompareIC::State left,
607 CompareIC::State right, 640 CompareIC::State right,
608 CompareIC::State handler) 641 CompareIC::State handler)
609 : op_(op), 642 : op_(op),
610 left_(left), 643 left_(left),
611 right_(right), 644 right_(right),
612 state_(handler) { 645 state_(handler) {
613 ASSERT(Token::IsCompareOp(op)); 646 ASSERT(Token::IsCompareOp(op));
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
659 virtual bool UseSpecialCache() { return state_ == CompareIC::KNOWN_OBJECTS; } 692 virtual bool UseSpecialCache() { return state_ == CompareIC::KNOWN_OBJECTS; }
660 693
661 Token::Value op_; 694 Token::Value op_;
662 CompareIC::State left_; 695 CompareIC::State left_;
663 CompareIC::State right_; 696 CompareIC::State right_;
664 CompareIC::State state_; 697 CompareIC::State state_;
665 Handle<Map> known_map_; 698 Handle<Map> known_map_;
666 }; 699 };
667 700
668 701
669 class CEntryStub : public CodeStub { 702 class CEntryStub : public PlatformCodeStub {
670 public: 703 public:
671 explicit CEntryStub(int result_size, 704 explicit CEntryStub(int result_size,
672 SaveFPRegsMode save_doubles = kDontSaveFPRegs) 705 SaveFPRegsMode save_doubles = kDontSaveFPRegs)
673 : result_size_(result_size), save_doubles_(save_doubles) { } 706 : result_size_(result_size), save_doubles_(save_doubles) { }
674 707
675 void Generate(MacroAssembler* masm); 708 void Generate(MacroAssembler* masm);
676 709
677 // The version of this stub that doesn't save doubles is generated ahead of 710 // The version of this stub that doesn't save doubles is generated ahead of
678 // time, so it's OK to call it from other stubs that can't cope with GC during 711 // time, so it's OK to call it from other stubs that can't cope with GC during
679 // their code generation. On machines that always have gp registers (x64) we 712 // their code generation. On machines that always have gp registers (x64) we
(...skipping 13 matching lines...) Expand all
693 const int result_size_; 726 const int result_size_;
694 SaveFPRegsMode save_doubles_; 727 SaveFPRegsMode save_doubles_;
695 728
696 Major MajorKey() { return CEntry; } 729 Major MajorKey() { return CEntry; }
697 int MinorKey(); 730 int MinorKey();
698 731
699 bool NeedsImmovableCode(); 732 bool NeedsImmovableCode();
700 }; 733 };
701 734
702 735
703 class JSEntryStub : public CodeStub { 736 class JSEntryStub : public PlatformCodeStub {
704 public: 737 public:
705 JSEntryStub() { } 738 JSEntryStub() { }
706 739
707 void Generate(MacroAssembler* masm) { GenerateBody(masm, false); } 740 void Generate(MacroAssembler* masm) { GenerateBody(masm, false); }
708 741
709 protected: 742 protected:
710 void GenerateBody(MacroAssembler* masm, bool is_construct); 743 void GenerateBody(MacroAssembler* masm, bool is_construct);
711 744
712 private: 745 private:
713 Major MajorKey() { return JSEntry; } 746 Major MajorKey() { return JSEntry; }
(...skipping 13 matching lines...) Expand all
727 760
728 private: 761 private:
729 int MinorKey() { return 1; } 762 int MinorKey() { return 1; }
730 763
731 virtual void PrintName(StringStream* stream) { 764 virtual void PrintName(StringStream* stream) {
732 stream->Add("JSConstructEntryStub"); 765 stream->Add("JSConstructEntryStub");
733 } 766 }
734 }; 767 };
735 768
736 769
737 class ArgumentsAccessStub: public CodeStub { 770 class ArgumentsAccessStub: public PlatformCodeStub {
738 public: 771 public:
739 enum Type { 772 enum Type {
740 READ_ELEMENT, 773 READ_ELEMENT,
741 NEW_NON_STRICT_FAST, 774 NEW_NON_STRICT_FAST,
742 NEW_NON_STRICT_SLOW, 775 NEW_NON_STRICT_SLOW,
743 NEW_STRICT 776 NEW_STRICT
744 }; 777 };
745 778
746 explicit ArgumentsAccessStub(Type type) : type_(type) { } 779 explicit ArgumentsAccessStub(Type type) : type_(type) { }
747 780
748 private: 781 private:
749 Type type_; 782 Type type_;
750 783
751 Major MajorKey() { return ArgumentsAccess; } 784 Major MajorKey() { return ArgumentsAccess; }
752 int MinorKey() { return type_; } 785 int MinorKey() { return type_; }
753 786
754 void Generate(MacroAssembler* masm); 787 void Generate(MacroAssembler* masm);
755 void GenerateReadElement(MacroAssembler* masm); 788 void GenerateReadElement(MacroAssembler* masm);
756 void GenerateNewStrict(MacroAssembler* masm); 789 void GenerateNewStrict(MacroAssembler* masm);
757 void GenerateNewNonStrictFast(MacroAssembler* masm); 790 void GenerateNewNonStrictFast(MacroAssembler* masm);
758 void GenerateNewNonStrictSlow(MacroAssembler* masm); 791 void GenerateNewNonStrictSlow(MacroAssembler* masm);
759 792
760 virtual void PrintName(StringStream* stream); 793 virtual void PrintName(StringStream* stream);
761 }; 794 };
762 795
763 796
764 class RegExpExecStub: public CodeStub { 797 class RegExpExecStub: public PlatformCodeStub {
765 public: 798 public:
766 RegExpExecStub() { } 799 RegExpExecStub() { }
767 800
768 private: 801 private:
769 Major MajorKey() { return RegExpExec; } 802 Major MajorKey() { return RegExpExec; }
770 int MinorKey() { return 0; } 803 int MinorKey() { return 0; }
771 804
772 void Generate(MacroAssembler* masm); 805 void Generate(MacroAssembler* masm);
773 }; 806 };
774 807
775 808
776 class RegExpConstructResultStub: public CodeStub { 809 class RegExpConstructResultStub: public PlatformCodeStub {
777 public: 810 public:
778 RegExpConstructResultStub() { } 811 RegExpConstructResultStub() { }
779 812
780 private: 813 private:
781 Major MajorKey() { return RegExpConstructResult; } 814 Major MajorKey() { return RegExpConstructResult; }
782 int MinorKey() { return 0; } 815 int MinorKey() { return 0; }
783 816
784 void Generate(MacroAssembler* masm); 817 void Generate(MacroAssembler* masm);
785 }; 818 };
786 819
787 820
788 class CallFunctionStub: public CodeStub { 821 class CallFunctionStub: public PlatformCodeStub {
789 public: 822 public:
790 CallFunctionStub(int argc, CallFunctionFlags flags) 823 CallFunctionStub(int argc, CallFunctionFlags flags)
791 : argc_(argc), flags_(flags) { } 824 : argc_(argc), flags_(flags) { }
792 825
793 void Generate(MacroAssembler* masm); 826 void Generate(MacroAssembler* masm);
794 827
795 virtual void FinishCode(Handle<Code> code) { 828 virtual void FinishCode(Handle<Code> code) {
796 code->set_has_function_cache(RecordCallTarget()); 829 code->set_has_function_cache(RecordCallTarget());
797 } 830 }
798 831
(...skipping 20 matching lines...) Expand all
819 bool ReceiverMightBeImplicit() { 852 bool ReceiverMightBeImplicit() {
820 return (flags_ & RECEIVER_MIGHT_BE_IMPLICIT) != 0; 853 return (flags_ & RECEIVER_MIGHT_BE_IMPLICIT) != 0;
821 } 854 }
822 855
823 bool RecordCallTarget() { 856 bool RecordCallTarget() {
824 return (flags_ & RECORD_CALL_TARGET) != 0; 857 return (flags_ & RECORD_CALL_TARGET) != 0;
825 } 858 }
826 }; 859 };
827 860
828 861
829 class CallConstructStub: public CodeStub { 862 class CallConstructStub: public PlatformCodeStub {
830 public: 863 public:
831 explicit CallConstructStub(CallFunctionFlags flags) : flags_(flags) {} 864 explicit CallConstructStub(CallFunctionFlags flags) : flags_(flags) {}
832 865
833 void Generate(MacroAssembler* masm); 866 void Generate(MacroAssembler* masm);
834 867
835 virtual void FinishCode(Handle<Code> code) { 868 virtual void FinishCode(Handle<Code> code) {
836 code->set_has_function_cache(RecordCallTarget()); 869 code->set_has_function_cache(RecordCallTarget());
837 } 870 }
838 871
839 private: 872 private:
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
1010 } 1043 }
1011 1044
1012 private: 1045 private:
1013 MacroAssembler* masm_; 1046 MacroAssembler* masm_;
1014 bool previous_allow_; 1047 bool previous_allow_;
1015 1048
1016 DISALLOW_COPY_AND_ASSIGN(AllowStubCallsScope); 1049 DISALLOW_COPY_AND_ASSIGN(AllowStubCallsScope);
1017 }; 1050 };
1018 1051
1019 1052
1020 class KeyedLoadElementStub : public CodeStub { 1053 class KeyedLoadDictionaryElementStub : public PlatformCodeStub {
1021 public: 1054 public:
1022 explicit KeyedLoadElementStub(ElementsKind elements_kind) 1055 KeyedLoadDictionaryElementStub() {}
1023 : elements_kind_(elements_kind)
1024 { }
1025 1056
1026 Major MajorKey() { return KeyedLoadElement; } 1057 Major MajorKey() { return KeyedLoadElement; }
1027 int MinorKey() { return elements_kind_; } 1058 int MinorKey() { return DICTIONARY_ELEMENTS; }
1028 1059
1029 void Generate(MacroAssembler* masm); 1060 void Generate(MacroAssembler* masm);
1030 1061
1031 private: 1062 private:
1032 ElementsKind elements_kind_; 1063 DISALLOW_COPY_AND_ASSIGN(KeyedLoadDictionaryElementStub);
1033
1034 DISALLOW_COPY_AND_ASSIGN(KeyedLoadElementStub);
1035 }; 1064 };
1036 1065
1037 1066
1038 class KeyedStoreElementStub : public CodeStub { 1067 class KeyedLoadFastElementStub : public HydrogenCodeStub {
1068 public:
1069 KeyedLoadFastElementStub(bool is_js_array, ElementsKind elements_kind) {
1070 bit_field_ = ElementsKindBits::encode(elements_kind) |
1071 IsJSArrayBits::encode(is_js_array);
1072 }
1073
1074 Major MajorKey() { return KeyedLoadElement; }
1075 int MinorKey() { return bit_field_; }
1076
1077 bool is_js_array() const {
1078 return IsJSArrayBits::decode(bit_field_);
1079 }
1080
1081 ElementsKind elements_kind() const {
1082 return ElementsKindBits::decode(bit_field_);
1083 }
1084
1085 virtual Handle<Code> GenerateCode();
1086
1087 virtual CodeStubInterfaceDescriptor* GetInterfaceDescriptor(
1088 Isolate* isolate);
1089
1090 private:
1091 class IsJSArrayBits: public BitField<bool, 8, 1> {};
1092 class ElementsKindBits: public BitField<ElementsKind, 0, 8> {};
1093 uint32_t bit_field_;
1094
1095 DISALLOW_COPY_AND_ASSIGN(KeyedLoadFastElementStub);
1096 };
1097
1098
1099 class KeyedStoreElementStub : public PlatformCodeStub {
1039 public: 1100 public:
1040 KeyedStoreElementStub(bool is_js_array, 1101 KeyedStoreElementStub(bool is_js_array,
1041 ElementsKind elements_kind, 1102 ElementsKind elements_kind,
1042 KeyedAccessGrowMode grow_mode) 1103 KeyedAccessGrowMode grow_mode)
1043 : is_js_array_(is_js_array), 1104 : is_js_array_(is_js_array),
1044 elements_kind_(elements_kind), 1105 elements_kind_(elements_kind),
1045 grow_mode_(grow_mode), 1106 grow_mode_(grow_mode),
1046 fp_registers_(CanUseFPRegisters()) { } 1107 fp_registers_(CanUseFPRegisters()) { }
1047 1108
1048 Major MajorKey() { return KeyedStoreElement; } 1109 Major MajorKey() { return KeyedStoreElement; }
(...skipping 14 matching lines...) Expand all
1063 1124
1064 bool is_js_array_; 1125 bool is_js_array_;
1065 ElementsKind elements_kind_; 1126 ElementsKind elements_kind_;
1066 KeyedAccessGrowMode grow_mode_; 1127 KeyedAccessGrowMode grow_mode_;
1067 bool fp_registers_; 1128 bool fp_registers_;
1068 1129
1069 DISALLOW_COPY_AND_ASSIGN(KeyedStoreElementStub); 1130 DISALLOW_COPY_AND_ASSIGN(KeyedStoreElementStub);
1070 }; 1131 };
1071 1132
1072 1133
1073 class ToBooleanStub: public CodeStub { 1134 class ToBooleanStub: public PlatformCodeStub {
1074 public: 1135 public:
1075 enum Type { 1136 enum Type {
1076 UNDEFINED, 1137 UNDEFINED,
1077 BOOLEAN, 1138 BOOLEAN,
1078 NULL_TYPE, 1139 NULL_TYPE,
1079 SMI, 1140 SMI,
1080 SPEC_OBJECT, 1141 SPEC_OBJECT,
1081 STRING, 1142 STRING,
1082 HEAP_NUMBER, 1143 HEAP_NUMBER,
1083 NUMBER_OF_TYPES 1144 NUMBER_OF_TYPES
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
1133 Type type, 1194 Type type,
1134 Heap::RootListIndex value, 1195 Heap::RootListIndex value,
1135 bool result); 1196 bool result);
1136 void GenerateTypeTransition(MacroAssembler* masm); 1197 void GenerateTypeTransition(MacroAssembler* masm);
1137 1198
1138 Register tos_; 1199 Register tos_;
1139 Types types_; 1200 Types types_;
1140 }; 1201 };
1141 1202
1142 1203
1143 class ElementsTransitionAndStoreStub : public CodeStub { 1204 class ElementsTransitionAndStoreStub : public PlatformCodeStub {
1144 public: 1205 public:
1145 ElementsTransitionAndStoreStub(ElementsKind from, 1206 ElementsTransitionAndStoreStub(ElementsKind from,
1146 ElementsKind to, 1207 ElementsKind to,
1147 bool is_jsarray, 1208 bool is_jsarray,
1148 StrictModeFlag strict_mode, 1209 StrictModeFlag strict_mode,
1149 KeyedAccessGrowMode grow_mode) 1210 KeyedAccessGrowMode grow_mode)
1150 : from_(from), 1211 : from_(from),
1151 to_(to), 1212 to_(to),
1152 is_jsarray_(is_jsarray), 1213 is_jsarray_(is_jsarray),
1153 strict_mode_(strict_mode), 1214 strict_mode_(strict_mode),
(...skipping 20 matching lines...) Expand all
1174 ElementsKind from_; 1235 ElementsKind from_;
1175 ElementsKind to_; 1236 ElementsKind to_;
1176 bool is_jsarray_; 1237 bool is_jsarray_;
1177 StrictModeFlag strict_mode_; 1238 StrictModeFlag strict_mode_;
1178 KeyedAccessGrowMode grow_mode_; 1239 KeyedAccessGrowMode grow_mode_;
1179 1240
1180 DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub); 1241 DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub);
1181 }; 1242 };
1182 1243
1183 1244
1184 class StoreArrayLiteralElementStub : public CodeStub { 1245 class StoreArrayLiteralElementStub : public PlatformCodeStub {
1185 public: 1246 public:
1186 StoreArrayLiteralElementStub() 1247 StoreArrayLiteralElementStub()
1187 : fp_registers_(CanUseFPRegisters()) { } 1248 : fp_registers_(CanUseFPRegisters()) { }
1188 1249
1189 private: 1250 private:
1190 class FPRegisters: public BitField<bool, 0, 1> {}; 1251 class FPRegisters: public BitField<bool, 0, 1> {};
1191 1252
1192 Major MajorKey() { return StoreArrayLiteralElement; } 1253 Major MajorKey() { return StoreArrayLiteralElement; }
1193 int MinorKey() { return FPRegisters::encode(fp_registers_); } 1254 int MinorKey() { return FPRegisters::encode(fp_registers_); }
1194 1255
1195 void Generate(MacroAssembler* masm); 1256 void Generate(MacroAssembler* masm);
1196 1257
1197 bool fp_registers_; 1258 bool fp_registers_;
1198 1259
1199 DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub); 1260 DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub);
1200 }; 1261 };
1201 1262
1202 1263
1203 class ProfileEntryHookStub : public CodeStub { 1264 class ProfileEntryHookStub : public PlatformCodeStub {
1204 public: 1265 public:
1205 explicit ProfileEntryHookStub() {} 1266 explicit ProfileEntryHookStub() {}
1206 1267
1207 // The profile entry hook function is not allowed to cause a GC. 1268 // The profile entry hook function is not allowed to cause a GC.
1208 virtual bool SometimesSetsUpAFrame() { return false; } 1269 virtual bool SometimesSetsUpAFrame() { return false; }
1209 1270
1210 // Generates a call to the entry hook if it's enabled. 1271 // Generates a call to the entry hook if it's enabled.
1211 static void MaybeCallEntryHook(MacroAssembler* masm); 1272 static void MaybeCallEntryHook(MacroAssembler* masm);
1212 1273
1213 // Sets or unsets the entry hook function. Returns true on success, 1274 // Sets or unsets the entry hook function. Returns true on success,
(...skipping 14 matching lines...) Expand all
1228 1289
1229 // The current function entry hook. 1290 // The current function entry hook.
1230 static FunctionEntryHook entry_hook_; 1291 static FunctionEntryHook entry_hook_;
1231 1292
1232 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub); 1293 DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub);
1233 }; 1294 };
1234 1295
1235 } } // namespace v8::internal 1296 } } // namespace v8::internal
1236 1297
1237 #endif // V8_CODE_STUBS_H_ 1298 #endif // V8_CODE_STUBS_H_
OLDNEW
« no previous file with comments | « src/builtins.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698