| OLD | NEW | 
|---|
| 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 148 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 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); | 163   bool FindCodeInCache(Code** code_out); | 
| 164 | 164 | 
| 165  protected: | 165  protected: | 
| 166   static bool CanUseFPRegisters(); | 166   static bool CanUseFPRegisters(); | 
| 167 | 167 | 
| 168  private: | 168  private: | 
| 169   // Nonvirtual wrapper around the stub-specific Generate function.  Call | 169   friend class PlatformCodeStub; | 
| 170   // this function to set up the macro assembler and generate the code. |  | 
| 171   void GenerateCode(MacroAssembler* masm); |  | 
| 172 | 170 | 
| 173   // Generates the assembler code for the stub. | 171   // Generates the assembler code for the stub. | 
| 174   virtual void Generate(MacroAssembler* masm) = 0; | 172   virtual Handle<Code> GenerateCode() = 0; | 
| 175 | 173 | 
| 176   // Perform bookkeeping required after code generation when stub code is | 174   // Perform bookkeeping required after code generation when stub code is | 
| 177   // initially generated. | 175   // initially generated. | 
| 178   void RecordCodeGeneration(Code* code, MacroAssembler* masm); | 176   void RecordCodeGeneration(Code* code, Isolate* isolate); | 
| 179 | 177 | 
| 180   // Finish the code object after it has been generated. | 178   // Finish the code object after it has been generated. | 
| 181   virtual void FinishCode(Handle<Code> code) { } | 179   virtual void FinishCode(Handle<Code> code) { } | 
| 182 | 180 | 
| 183   // Activate newly generated stub. Is called after | 181   // Activate newly generated stub. Is called after | 
| 184   // registering stub in the stub cache. | 182   // registering stub in the stub cache. | 
| 185   virtual void Activate(Code* code) { } | 183   virtual void Activate(Code* code) { } | 
| 186 | 184 | 
| 187   // Returns information for computing the number key. | 185   // Returns information for computing the number key. | 
| 188   virtual Major MajorKey() = 0; | 186   virtual Major MajorKey() = 0; | 
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 223   } | 221   } | 
| 224 | 222 | 
| 225   class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {}; | 223   class MajorKeyBits: public BitField<uint32_t, 0, kStubMajorKeyBits> {}; | 
| 226   class MinorKeyBits: public BitField<uint32_t, | 224   class MinorKeyBits: public BitField<uint32_t, | 
| 227       kStubMajorKeyBits, kStubMinorKeyBits> {};  // NOLINT | 225       kStubMajorKeyBits, kStubMinorKeyBits> {};  // NOLINT | 
| 228 | 226 | 
| 229   friend class BreakPointIterator; | 227   friend class BreakPointIterator; | 
| 230 }; | 228 }; | 
| 231 | 229 | 
| 232 | 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 class HGraph; | 
|  | 245 class HydrogenCodeStub : public CodeStub { | 
|  | 246  public: | 
|  | 247   // Retrieve the code for the stub. Generate the code if needed. | 
|  | 248   virtual Handle<Code> GenerateCode(); | 
|  | 249 | 
|  | 250   virtual int GetCodeKind() { return Code::COMPILED_STUB; } | 
|  | 251 | 
|  | 252  protected: | 
|  | 253   virtual void Generate(HGraph* graph) = 0; | 
|  | 254 }; | 
|  | 255 | 
|  | 256 | 
| 233 // Helper interface to prepare to/restore after making runtime calls. | 257 // Helper interface to prepare to/restore after making runtime calls. | 
| 234 class RuntimeCallHelper { | 258 class RuntimeCallHelper { | 
| 235  public: | 259  public: | 
| 236   virtual ~RuntimeCallHelper() {} | 260   virtual ~RuntimeCallHelper() {} | 
| 237 | 261 | 
| 238   virtual void BeforeCall(MacroAssembler* masm) const = 0; | 262   virtual void BeforeCall(MacroAssembler* masm) const = 0; | 
| 239 | 263 | 
| 240   virtual void AfterCall(MacroAssembler* masm) const = 0; | 264   virtual void AfterCall(MacroAssembler* masm) const = 0; | 
| 241 | 265 | 
| 242  protected: | 266  protected: | 
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 280 class NopRuntimeCallHelper : public RuntimeCallHelper { | 304 class NopRuntimeCallHelper : public RuntimeCallHelper { | 
| 281  public: | 305  public: | 
| 282   NopRuntimeCallHelper() {} | 306   NopRuntimeCallHelper() {} | 
| 283 | 307 | 
| 284   virtual void BeforeCall(MacroAssembler* masm) const {} | 308   virtual void BeforeCall(MacroAssembler* masm) const {} | 
| 285 | 309 | 
| 286   virtual void AfterCall(MacroAssembler* masm) const {} | 310   virtual void AfterCall(MacroAssembler* masm) const {} | 
| 287 }; | 311 }; | 
| 288 | 312 | 
| 289 | 313 | 
| 290 class StackCheckStub : public CodeStub { | 314 class StackCheckStub : public PlatformCodeStub { | 
| 291  public: | 315  public: | 
| 292   StackCheckStub() { } | 316   StackCheckStub() { } | 
| 293 | 317 | 
| 294   void Generate(MacroAssembler* masm); | 318   void Generate(MacroAssembler* masm); | 
| 295 | 319 | 
| 296  private: | 320  private: | 
| 297   Major MajorKey() { return StackCheck; } | 321   Major MajorKey() { return StackCheck; } | 
| 298   int MinorKey() { return 0; } | 322   int MinorKey() { return 0; } | 
| 299 }; | 323 }; | 
| 300 | 324 | 
| 301 | 325 | 
| 302 class InterruptStub : public CodeStub { | 326 class InterruptStub : public PlatformCodeStub { | 
| 303  public: | 327  public: | 
| 304   InterruptStub() { } | 328   InterruptStub() { } | 
| 305 | 329 | 
| 306   void Generate(MacroAssembler* masm); | 330   void Generate(MacroAssembler* masm); | 
| 307 | 331 | 
| 308  private: | 332  private: | 
| 309   Major MajorKey() { return Interrupt; } | 333   Major MajorKey() { return Interrupt; } | 
| 310   int MinorKey() { return 0; } | 334   int MinorKey() { return 0; } | 
| 311 }; | 335 }; | 
| 312 | 336 | 
| 313 | 337 | 
| 314 class ToNumberStub: public CodeStub { | 338 class ToNumberStub: public PlatformCodeStub { | 
| 315  public: | 339  public: | 
| 316   ToNumberStub() { } | 340   ToNumberStub() { } | 
| 317 | 341 | 
| 318   void Generate(MacroAssembler* masm); | 342   void Generate(MacroAssembler* masm); | 
| 319 | 343 | 
| 320  private: | 344  private: | 
| 321   Major MajorKey() { return ToNumber; } | 345   Major MajorKey() { return ToNumber; } | 
| 322   int MinorKey() { return 0; } | 346   int MinorKey() { return 0; } | 
| 323 }; | 347 }; | 
| 324 | 348 | 
| 325 | 349 | 
| 326 class FastNewClosureStub : public CodeStub { | 350 class FastNewClosureStub : public PlatformCodeStub { | 
| 327  public: | 351  public: | 
| 328   explicit FastNewClosureStub(LanguageMode language_mode) | 352   explicit FastNewClosureStub(LanguageMode language_mode) | 
| 329     : language_mode_(language_mode) { } | 353     : language_mode_(language_mode) { } | 
| 330 | 354 | 
| 331   void Generate(MacroAssembler* masm); | 355   void Generate(MacroAssembler* masm); | 
| 332 | 356 | 
| 333  private: | 357  private: | 
| 334   Major MajorKey() { return FastNewClosure; } | 358   Major MajorKey() { return FastNewClosure; } | 
| 335   int MinorKey() { return language_mode_ == CLASSIC_MODE | 359   int MinorKey() { return language_mode_ == CLASSIC_MODE | 
| 336         ? kNonStrictMode : kStrictMode; } | 360         ? kNonStrictMode : kStrictMode; } | 
| 337 | 361 | 
| 338   LanguageMode language_mode_; | 362   LanguageMode language_mode_; | 
| 339 }; | 363 }; | 
| 340 | 364 | 
| 341 | 365 | 
| 342 class FastNewContextStub : public CodeStub { | 366 class FastNewContextStub : public PlatformCodeStub { | 
| 343  public: | 367  public: | 
| 344   static const int kMaximumSlots = 64; | 368   static const int kMaximumSlots = 64; | 
| 345 | 369 | 
| 346   explicit FastNewContextStub(int slots) : slots_(slots) { | 370   explicit FastNewContextStub(int slots) : slots_(slots) { | 
| 347     ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); | 371     ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); | 
| 348   } | 372   } | 
| 349 | 373 | 
| 350   void Generate(MacroAssembler* masm); | 374   void Generate(MacroAssembler* masm); | 
| 351 | 375 | 
| 352  private: | 376  private: | 
| 353   int slots_; | 377   int slots_; | 
| 354 | 378 | 
| 355   Major MajorKey() { return FastNewContext; } | 379   Major MajorKey() { return FastNewContext; } | 
| 356   int MinorKey() { return slots_; } | 380   int MinorKey() { return slots_; } | 
| 357 }; | 381 }; | 
| 358 | 382 | 
| 359 | 383 | 
| 360 class FastNewBlockContextStub : public CodeStub { | 384 class FastNewBlockContextStub : public PlatformCodeStub { | 
| 361  public: | 385  public: | 
| 362   static const int kMaximumSlots = 64; | 386   static const int kMaximumSlots = 64; | 
| 363 | 387 | 
| 364   explicit FastNewBlockContextStub(int slots) : slots_(slots) { | 388   explicit FastNewBlockContextStub(int slots) : slots_(slots) { | 
| 365     ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); | 389     ASSERT(slots_ > 0 && slots_ <= kMaximumSlots); | 
| 366   } | 390   } | 
| 367 | 391 | 
| 368   void Generate(MacroAssembler* masm); | 392   void Generate(MacroAssembler* masm); | 
| 369 | 393 | 
| 370  private: | 394  private: | 
| 371   int slots_; | 395   int slots_; | 
| 372 | 396 | 
| 373   Major MajorKey() { return FastNewBlockContext; } | 397   Major MajorKey() { return FastNewBlockContext; } | 
| 374   int MinorKey() { return slots_; } | 398   int MinorKey() { return slots_; } | 
| 375 }; | 399 }; | 
| 376 | 400 | 
| 377 | 401 | 
| 378 class FastCloneShallowArrayStub : public CodeStub { | 402 class FastCloneShallowArrayStub : public PlatformCodeStub { | 
| 379  public: | 403  public: | 
| 380   // Maximum length of copied elements array. | 404   // Maximum length of copied elements array. | 
| 381   static const int kMaximumClonedLength = 8; | 405   static const int kMaximumClonedLength = 8; | 
| 382 | 406 | 
| 383   enum Mode { | 407   enum Mode { | 
| 384     CLONE_ELEMENTS, | 408     CLONE_ELEMENTS, | 
| 385     CLONE_DOUBLE_ELEMENTS, | 409     CLONE_DOUBLE_ELEMENTS, | 
| 386     COPY_ON_WRITE_ELEMENTS, | 410     COPY_ON_WRITE_ELEMENTS, | 
| 387     CLONE_ANY_ELEMENTS | 411     CLONE_ANY_ELEMENTS | 
| 388   }; | 412   }; | 
| (...skipping 12 matching lines...) Expand all  Loading... | 
| 401   int length_; | 425   int length_; | 
| 402 | 426 | 
| 403   Major MajorKey() { return FastCloneShallowArray; } | 427   Major MajorKey() { return FastCloneShallowArray; } | 
| 404   int MinorKey() { | 428   int MinorKey() { | 
| 405     ASSERT(mode_ == 0 || mode_ == 1 || mode_ == 2 || mode_ == 3); | 429     ASSERT(mode_ == 0 || mode_ == 1 || mode_ == 2 || mode_ == 3); | 
| 406     return length_ * 4 +  mode_; | 430     return length_ * 4 +  mode_; | 
| 407   } | 431   } | 
| 408 }; | 432 }; | 
| 409 | 433 | 
| 410 | 434 | 
| 411 class FastCloneShallowObjectStub : public CodeStub { | 435 class FastCloneShallowObjectStub : public PlatformCodeStub { | 
| 412  public: | 436  public: | 
| 413   // Maximum number of properties in copied object. | 437   // Maximum number of properties in copied object. | 
| 414   static const int kMaximumClonedProperties = 6; | 438   static const int kMaximumClonedProperties = 6; | 
| 415 | 439 | 
| 416   explicit FastCloneShallowObjectStub(int length) : length_(length) { | 440   explicit FastCloneShallowObjectStub(int length) : length_(length) { | 
| 417     ASSERT_GE(length_, 0); | 441     ASSERT_GE(length_, 0); | 
| 418     ASSERT_LE(length_, kMaximumClonedProperties); | 442     ASSERT_LE(length_, kMaximumClonedProperties); | 
| 419   } | 443   } | 
| 420 | 444 | 
| 421   void Generate(MacroAssembler* masm); | 445   void Generate(MacroAssembler* masm); | 
| 422 | 446 | 
| 423  private: | 447  private: | 
| 424   int length_; | 448   int length_; | 
| 425 | 449 | 
| 426   Major MajorKey() { return FastCloneShallowObject; } | 450   Major MajorKey() { return FastCloneShallowObject; } | 
| 427   int MinorKey() { return length_; } | 451   int MinorKey() { return length_; } | 
| 428 }; | 452 }; | 
| 429 | 453 | 
| 430 | 454 | 
| 431 class InstanceofStub: public CodeStub { | 455 class InstanceofStub: public PlatformCodeStub { | 
| 432  public: | 456  public: | 
| 433   enum Flags { | 457   enum Flags { | 
| 434     kNoFlags = 0, | 458     kNoFlags = 0, | 
| 435     kArgsInRegisters = 1 << 0, | 459     kArgsInRegisters = 1 << 0, | 
| 436     kCallSiteInlineCheck = 1 << 1, | 460     kCallSiteInlineCheck = 1 << 1, | 
| 437     kReturnTrueFalseObject = 1 << 2 | 461     kReturnTrueFalseObject = 1 << 2 | 
| 438   }; | 462   }; | 
| 439 | 463 | 
| 440   explicit InstanceofStub(Flags flags) : flags_(flags) { } | 464   explicit InstanceofStub(Flags flags) : flags_(flags) { } | 
| 441 | 465 | 
| (...skipping 17 matching lines...) Expand all  Loading... | 
| 459   bool ReturnTrueFalseObject() const { | 483   bool ReturnTrueFalseObject() const { | 
| 460     return (flags_ & kReturnTrueFalseObject) != 0; | 484     return (flags_ & kReturnTrueFalseObject) != 0; | 
| 461   } | 485   } | 
| 462 | 486 | 
| 463   virtual void PrintName(StringStream* stream); | 487   virtual void PrintName(StringStream* stream); | 
| 464 | 488 | 
| 465   Flags flags_; | 489   Flags flags_; | 
| 466 }; | 490 }; | 
| 467 | 491 | 
| 468 | 492 | 
| 469 class MathPowStub: public CodeStub { | 493 class MathPowStub: public PlatformCodeStub { | 
| 470  public: | 494  public: | 
| 471   enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK}; | 495   enum ExponentType { INTEGER, DOUBLE, TAGGED, ON_STACK}; | 
| 472 | 496 | 
| 473   explicit MathPowStub(ExponentType exponent_type) | 497   explicit MathPowStub(ExponentType exponent_type) | 
| 474       : exponent_type_(exponent_type) { } | 498       : exponent_type_(exponent_type) { } | 
| 475   virtual void Generate(MacroAssembler* masm); | 499   virtual void Generate(MacroAssembler* masm); | 
| 476 | 500 | 
| 477  private: | 501  private: | 
| 478   virtual CodeStub::Major MajorKey() { return MathPow; } | 502   virtual CodeStub::Major MajorKey() { return MathPow; } | 
| 479   virtual int MinorKey() { return exponent_type_; } | 503   virtual int MinorKey() { return exponent_type_; } | 
| 480 | 504 | 
| 481   ExponentType exponent_type_; | 505   ExponentType exponent_type_; | 
| 482 }; | 506 }; | 
| 483 | 507 | 
| 484 | 508 | 
| 485 class ICCompareStub: public CodeStub { | 509 class ICCompareStub: public PlatformCodeStub { | 
| 486  public: | 510  public: | 
| 487   ICCompareStub(Token::Value op, CompareIC::State state) | 511   ICCompareStub(Token::Value op, CompareIC::State state) | 
| 488       : op_(op), state_(state) { | 512       : op_(op), state_(state) { | 
| 489     ASSERT(Token::IsCompareOp(op)); | 513     ASSERT(Token::IsCompareOp(op)); | 
| 490   } | 514   } | 
| 491 | 515 | 
| 492   virtual void Generate(MacroAssembler* masm); | 516   virtual void Generate(MacroAssembler* masm); | 
| 493 | 517 | 
| 494   void set_known_map(Handle<Map> map) { known_map_ = map; } | 518   void set_known_map(Handle<Map> map) { known_map_ = map; } | 
| 495 | 519 | 
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 536   CANT_BOTH_BE_NAN = 1 << 2 | 560   CANT_BOTH_BE_NAN = 1 << 2 | 
| 537 }; | 561 }; | 
| 538 | 562 | 
| 539 | 563 | 
| 540 enum NaNInformation { | 564 enum NaNInformation { | 
| 541   kBothCouldBeNaN, | 565   kBothCouldBeNaN, | 
| 542   kCantBothBeNaN | 566   kCantBothBeNaN | 
| 543 }; | 567 }; | 
| 544 | 568 | 
| 545 | 569 | 
| 546 class CompareStub: public CodeStub { | 570 class CompareStub: public PlatformCodeStub { | 
| 547  public: | 571  public: | 
| 548   CompareStub(Condition cc, | 572   CompareStub(Condition cc, | 
| 549               bool strict, | 573               bool strict, | 
| 550               CompareFlags flags, | 574               CompareFlags flags, | 
| 551               Register lhs, | 575               Register lhs, | 
| 552               Register rhs) : | 576               Register rhs) : | 
| 553      cc_(cc), | 577      cc_(cc), | 
| 554       strict_(strict), | 578       strict_(strict), | 
| 555       never_nan_nan_((flags & CANT_BOTH_BE_NAN) != 0), | 579       never_nan_nan_((flags & CANT_BOTH_BE_NAN) != 0), | 
| 556       include_number_compare_((flags & NO_NUMBER_COMPARE_IN_STUB) == 0), | 580       include_number_compare_((flags & NO_NUMBER_COMPARE_IN_STUB) == 0), | 
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 618                          Label* label, | 642                          Label* label, | 
| 619                          Register object, | 643                          Register object, | 
| 620                          Register scratch); | 644                          Register scratch); | 
| 621 | 645 | 
| 622   // Unfortunately you have to run without snapshots to see most of these | 646   // Unfortunately you have to run without snapshots to see most of these | 
| 623   // names in the profile since most compare stubs end up in the snapshot. | 647   // names in the profile since most compare stubs end up in the snapshot. | 
| 624   virtual void PrintName(StringStream* stream); | 648   virtual void PrintName(StringStream* stream); | 
| 625 }; | 649 }; | 
| 626 | 650 | 
| 627 | 651 | 
| 628 class CEntryStub : public CodeStub { | 652 class CEntryStub : public PlatformCodeStub { | 
| 629  public: | 653  public: | 
| 630   explicit CEntryStub(int result_size, | 654   explicit CEntryStub(int result_size, | 
| 631                       SaveFPRegsMode save_doubles = kDontSaveFPRegs) | 655                       SaveFPRegsMode save_doubles = kDontSaveFPRegs) | 
| 632       : result_size_(result_size), save_doubles_(save_doubles) { } | 656       : result_size_(result_size), save_doubles_(save_doubles) { } | 
| 633 | 657 | 
| 634   void Generate(MacroAssembler* masm); | 658   void Generate(MacroAssembler* masm); | 
| 635 | 659 | 
| 636   // The version of this stub that doesn't save doubles is generated ahead of | 660   // The version of this stub that doesn't save doubles is generated ahead of | 
| 637   // time, so it's OK to call it from other stubs that can't cope with GC during | 661   // time, so it's OK to call it from other stubs that can't cope with GC during | 
| 638   // their code generation.  On machines that always have gp registers (x64) we | 662   // their code generation.  On machines that always have gp registers (x64) we | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 652   const int result_size_; | 676   const int result_size_; | 
| 653   SaveFPRegsMode save_doubles_; | 677   SaveFPRegsMode save_doubles_; | 
| 654 | 678 | 
| 655   Major MajorKey() { return CEntry; } | 679   Major MajorKey() { return CEntry; } | 
| 656   int MinorKey(); | 680   int MinorKey(); | 
| 657 | 681 | 
| 658   bool NeedsImmovableCode(); | 682   bool NeedsImmovableCode(); | 
| 659 }; | 683 }; | 
| 660 | 684 | 
| 661 | 685 | 
| 662 class JSEntryStub : public CodeStub { | 686 class JSEntryStub : public PlatformCodeStub { | 
| 663  public: | 687  public: | 
| 664   JSEntryStub() { } | 688   JSEntryStub() { } | 
| 665 | 689 | 
| 666   void Generate(MacroAssembler* masm) { GenerateBody(masm, false); } | 690   void Generate(MacroAssembler* masm) { GenerateBody(masm, false); } | 
| 667 | 691 | 
| 668  protected: | 692  protected: | 
| 669   void GenerateBody(MacroAssembler* masm, bool is_construct); | 693   void GenerateBody(MacroAssembler* masm, bool is_construct); | 
| 670 | 694 | 
| 671  private: | 695  private: | 
| 672   Major MajorKey() { return JSEntry; } | 696   Major MajorKey() { return JSEntry; } | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 686 | 710 | 
| 687  private: | 711  private: | 
| 688   int MinorKey() { return 1; } | 712   int MinorKey() { return 1; } | 
| 689 | 713 | 
| 690   virtual void PrintName(StringStream* stream) { | 714   virtual void PrintName(StringStream* stream) { | 
| 691     stream->Add("JSConstructEntryStub"); | 715     stream->Add("JSConstructEntryStub"); | 
| 692   } | 716   } | 
| 693 }; | 717 }; | 
| 694 | 718 | 
| 695 | 719 | 
| 696 class ArgumentsAccessStub: public CodeStub { | 720 class ArgumentsAccessStub: public PlatformCodeStub { | 
| 697  public: | 721  public: | 
| 698   enum Type { | 722   enum Type { | 
| 699     READ_ELEMENT, | 723     READ_ELEMENT, | 
| 700     NEW_NON_STRICT_FAST, | 724     NEW_NON_STRICT_FAST, | 
| 701     NEW_NON_STRICT_SLOW, | 725     NEW_NON_STRICT_SLOW, | 
| 702     NEW_STRICT | 726     NEW_STRICT | 
| 703   }; | 727   }; | 
| 704 | 728 | 
| 705   explicit ArgumentsAccessStub(Type type) : type_(type) { } | 729   explicit ArgumentsAccessStub(Type type) : type_(type) { } | 
| 706 | 730 | 
| 707  private: | 731  private: | 
| 708   Type type_; | 732   Type type_; | 
| 709 | 733 | 
| 710   Major MajorKey() { return ArgumentsAccess; } | 734   Major MajorKey() { return ArgumentsAccess; } | 
| 711   int MinorKey() { return type_; } | 735   int MinorKey() { return type_; } | 
| 712 | 736 | 
| 713   void Generate(MacroAssembler* masm); | 737   void Generate(MacroAssembler* masm); | 
| 714   void GenerateReadElement(MacroAssembler* masm); | 738   void GenerateReadElement(MacroAssembler* masm); | 
| 715   void GenerateNewStrict(MacroAssembler* masm); | 739   void GenerateNewStrict(MacroAssembler* masm); | 
| 716   void GenerateNewNonStrictFast(MacroAssembler* masm); | 740   void GenerateNewNonStrictFast(MacroAssembler* masm); | 
| 717   void GenerateNewNonStrictSlow(MacroAssembler* masm); | 741   void GenerateNewNonStrictSlow(MacroAssembler* masm); | 
| 718 | 742 | 
| 719   virtual void PrintName(StringStream* stream); | 743   virtual void PrintName(StringStream* stream); | 
| 720 }; | 744 }; | 
| 721 | 745 | 
| 722 | 746 | 
| 723 class RegExpExecStub: public CodeStub { | 747 class RegExpExecStub: public PlatformCodeStub { | 
| 724  public: | 748  public: | 
| 725   RegExpExecStub() { } | 749   RegExpExecStub() { } | 
| 726 | 750 | 
| 727  private: | 751  private: | 
| 728   Major MajorKey() { return RegExpExec; } | 752   Major MajorKey() { return RegExpExec; } | 
| 729   int MinorKey() { return 0; } | 753   int MinorKey() { return 0; } | 
| 730 | 754 | 
| 731   void Generate(MacroAssembler* masm); | 755   void Generate(MacroAssembler* masm); | 
| 732 }; | 756 }; | 
| 733 | 757 | 
| 734 | 758 | 
| 735 class RegExpConstructResultStub: public CodeStub { | 759 class RegExpConstructResultStub: public PlatformCodeStub { | 
| 736  public: | 760  public: | 
| 737   RegExpConstructResultStub() { } | 761   RegExpConstructResultStub() { } | 
| 738 | 762 | 
| 739  private: | 763  private: | 
| 740   Major MajorKey() { return RegExpConstructResult; } | 764   Major MajorKey() { return RegExpConstructResult; } | 
| 741   int MinorKey() { return 0; } | 765   int MinorKey() { return 0; } | 
| 742 | 766 | 
| 743   void Generate(MacroAssembler* masm); | 767   void Generate(MacroAssembler* masm); | 
| 744 }; | 768 }; | 
| 745 | 769 | 
| 746 | 770 | 
| 747 class CallFunctionStub: public CodeStub { | 771 class CallFunctionStub: public PlatformCodeStub { | 
| 748  public: | 772  public: | 
| 749   CallFunctionStub(int argc, CallFunctionFlags flags) | 773   CallFunctionStub(int argc, CallFunctionFlags flags) | 
| 750       : argc_(argc), flags_(flags) { } | 774       : argc_(argc), flags_(flags) { } | 
| 751 | 775 | 
| 752   void Generate(MacroAssembler* masm); | 776   void Generate(MacroAssembler* masm); | 
| 753 | 777 | 
| 754   virtual void FinishCode(Handle<Code> code) { | 778   virtual void FinishCode(Handle<Code> code) { | 
| 755     code->set_has_function_cache(RecordCallTarget()); | 779     code->set_has_function_cache(RecordCallTarget()); | 
| 756   } | 780   } | 
| 757 | 781 | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 778   bool ReceiverMightBeImplicit() { | 802   bool ReceiverMightBeImplicit() { | 
| 779     return (flags_ & RECEIVER_MIGHT_BE_IMPLICIT) != 0; | 803     return (flags_ & RECEIVER_MIGHT_BE_IMPLICIT) != 0; | 
| 780   } | 804   } | 
| 781 | 805 | 
| 782   bool RecordCallTarget() { | 806   bool RecordCallTarget() { | 
| 783     return (flags_ & RECORD_CALL_TARGET) != 0; | 807     return (flags_ & RECORD_CALL_TARGET) != 0; | 
| 784   } | 808   } | 
| 785 }; | 809 }; | 
| 786 | 810 | 
| 787 | 811 | 
| 788 class CallConstructStub: public CodeStub { | 812 class CallConstructStub: public PlatformCodeStub { | 
| 789  public: | 813  public: | 
| 790   explicit CallConstructStub(CallFunctionFlags flags) : flags_(flags) {} | 814   explicit CallConstructStub(CallFunctionFlags flags) : flags_(flags) {} | 
| 791 | 815 | 
| 792   void Generate(MacroAssembler* masm); | 816   void Generate(MacroAssembler* masm); | 
| 793 | 817 | 
| 794   virtual void FinishCode(Handle<Code> code) { | 818   virtual void FinishCode(Handle<Code> code) { | 
| 795     code->set_has_function_cache(RecordCallTarget()); | 819     code->set_has_function_cache(RecordCallTarget()); | 
| 796   } | 820   } | 
| 797 | 821 | 
| 798  private: | 822  private: | 
| (...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 969   } | 993   } | 
| 970 | 994 | 
| 971  private: | 995  private: | 
| 972   MacroAssembler* masm_; | 996   MacroAssembler* masm_; | 
| 973   bool previous_allow_; | 997   bool previous_allow_; | 
| 974 | 998 | 
| 975   DISALLOW_COPY_AND_ASSIGN(AllowStubCallsScope); | 999   DISALLOW_COPY_AND_ASSIGN(AllowStubCallsScope); | 
| 976 }; | 1000 }; | 
| 977 | 1001 | 
| 978 | 1002 | 
| 979 class KeyedLoadElementStub : public CodeStub { | 1003 class KeyedLoadDictionaryElementStub : public PlatformCodeStub { | 
| 980  public: | 1004  public: | 
| 981   explicit KeyedLoadElementStub(ElementsKind elements_kind) | 1005   explicit KeyedLoadDictionaryElementStub() {} | 
| 982       : elements_kind_(elements_kind) |  | 
| 983   { } |  | 
| 984 | 1006 | 
| 985   Major MajorKey() { return KeyedLoadElement; } | 1007   Major MajorKey() { return KeyedLoadElement; } | 
| 986   int MinorKey() { return elements_kind_; } | 1008   int MinorKey() { return DICTIONARY_ELEMENTS; } | 
| 987 | 1009 | 
| 988   void Generate(MacroAssembler* masm); | 1010   void Generate(MacroAssembler* masm); | 
| 989 | 1011 | 
| 990  private: | 1012  private: | 
| 991   ElementsKind elements_kind_; | 1013   DISALLOW_COPY_AND_ASSIGN(KeyedLoadDictionaryElementStub); | 
| 992 |  | 
| 993   DISALLOW_COPY_AND_ASSIGN(KeyedLoadElementStub); |  | 
| 994 }; | 1014 }; | 
| 995 | 1015 | 
| 996 | 1016 | 
| 997 class KeyedStoreElementStub : public CodeStub { | 1017 class KeyedLoadFastElementStub : public HydrogenCodeStub { | 
|  | 1018  public: | 
|  | 1019   explicit KeyedLoadFastElementStub(bool is_js_array, | 
|  | 1020                                     ElementsKind elements_kind) { | 
|  | 1021     bit_field_ = ElementsKindBits::encode(elements_kind); | 
|  | 1022     bit_field_ = IsJSArrayBits::update(bit_field_, is_js_array); | 
|  | 1023   } | 
|  | 1024 | 
|  | 1025   virtual void Generate(HGraph* graph); | 
|  | 1026 | 
|  | 1027   Major MajorKey() { return KeyedLoadElement; } | 
|  | 1028   int MinorKey() { return bit_field_; } | 
|  | 1029 | 
|  | 1030   bool is_js_array() const { | 
|  | 1031     return IsJSArrayBits::decode(bit_field_); | 
|  | 1032   } | 
|  | 1033 | 
|  | 1034   ElementsKind elements_kind() const { | 
|  | 1035     return ElementsKindBits::decode(bit_field_); | 
|  | 1036   } | 
|  | 1037 | 
|  | 1038  private: | 
|  | 1039   class IsJSArrayBits: public BitField<bool, 8, 1> {}; | 
|  | 1040   class ElementsKindBits: public BitField<ElementsKind, 0, 8> {}; | 
|  | 1041   uint32_t bit_field_; | 
|  | 1042 | 
|  | 1043   DISALLOW_COPY_AND_ASSIGN(KeyedLoadFastElementStub); | 
|  | 1044 }; | 
|  | 1045 | 
|  | 1046 | 
|  | 1047 class KeyedStoreElementStub : public PlatformCodeStub { | 
| 998  public: | 1048  public: | 
| 999   KeyedStoreElementStub(bool is_js_array, | 1049   KeyedStoreElementStub(bool is_js_array, | 
| 1000                         ElementsKind elements_kind, | 1050                         ElementsKind elements_kind, | 
| 1001                         KeyedAccessGrowMode grow_mode) | 1051                         KeyedAccessGrowMode grow_mode) | 
| 1002       : is_js_array_(is_js_array), | 1052       : is_js_array_(is_js_array), | 
| 1003         elements_kind_(elements_kind), | 1053         elements_kind_(elements_kind), | 
| 1004         grow_mode_(grow_mode), | 1054         grow_mode_(grow_mode), | 
| 1005         fp_registers_(CanUseFPRegisters()) { } | 1055         fp_registers_(CanUseFPRegisters()) { } | 
| 1006 | 1056 | 
| 1007   Major MajorKey() { return KeyedStoreElement; } | 1057   Major MajorKey() { return KeyedStoreElement; } | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 1022 | 1072 | 
| 1023   bool is_js_array_; | 1073   bool is_js_array_; | 
| 1024   ElementsKind elements_kind_; | 1074   ElementsKind elements_kind_; | 
| 1025   KeyedAccessGrowMode grow_mode_; | 1075   KeyedAccessGrowMode grow_mode_; | 
| 1026   bool fp_registers_; | 1076   bool fp_registers_; | 
| 1027 | 1077 | 
| 1028   DISALLOW_COPY_AND_ASSIGN(KeyedStoreElementStub); | 1078   DISALLOW_COPY_AND_ASSIGN(KeyedStoreElementStub); | 
| 1029 }; | 1079 }; | 
| 1030 | 1080 | 
| 1031 | 1081 | 
| 1032 class ToBooleanStub: public CodeStub { | 1082 class ToBooleanStub: public PlatformCodeStub { | 
| 1033  public: | 1083  public: | 
| 1034   enum Type { | 1084   enum Type { | 
| 1035     UNDEFINED, | 1085     UNDEFINED, | 
| 1036     BOOLEAN, | 1086     BOOLEAN, | 
| 1037     NULL_TYPE, | 1087     NULL_TYPE, | 
| 1038     SMI, | 1088     SMI, | 
| 1039     SPEC_OBJECT, | 1089     SPEC_OBJECT, | 
| 1040     STRING, | 1090     STRING, | 
| 1041     HEAP_NUMBER, | 1091     HEAP_NUMBER, | 
| 1042     NUMBER_OF_TYPES | 1092     NUMBER_OF_TYPES | 
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1089                     Type type, | 1139                     Type type, | 
| 1090                     Heap::RootListIndex value, | 1140                     Heap::RootListIndex value, | 
| 1091                     bool result); | 1141                     bool result); | 
| 1092   void GenerateTypeTransition(MacroAssembler* masm); | 1142   void GenerateTypeTransition(MacroAssembler* masm); | 
| 1093 | 1143 | 
| 1094   Register tos_; | 1144   Register tos_; | 
| 1095   Types types_; | 1145   Types types_; | 
| 1096 }; | 1146 }; | 
| 1097 | 1147 | 
| 1098 | 1148 | 
| 1099 class ElementsTransitionAndStoreStub : public CodeStub { | 1149 class ElementsTransitionAndStoreStub : public PlatformCodeStub { | 
| 1100  public: | 1150  public: | 
| 1101   ElementsTransitionAndStoreStub(ElementsKind from, | 1151   ElementsTransitionAndStoreStub(ElementsKind from, | 
| 1102                                  ElementsKind to, | 1152                                  ElementsKind to, | 
| 1103                                  bool is_jsarray, | 1153                                  bool is_jsarray, | 
| 1104                                  StrictModeFlag strict_mode, | 1154                                  StrictModeFlag strict_mode, | 
| 1105                                  KeyedAccessGrowMode grow_mode) | 1155                                  KeyedAccessGrowMode grow_mode) | 
| 1106       : from_(from), | 1156       : from_(from), | 
| 1107         to_(to), | 1157         to_(to), | 
| 1108         is_jsarray_(is_jsarray), | 1158         is_jsarray_(is_jsarray), | 
| 1109         strict_mode_(strict_mode), | 1159         strict_mode_(strict_mode), | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 1130   ElementsKind from_; | 1180   ElementsKind from_; | 
| 1131   ElementsKind to_; | 1181   ElementsKind to_; | 
| 1132   bool is_jsarray_; | 1182   bool is_jsarray_; | 
| 1133   StrictModeFlag strict_mode_; | 1183   StrictModeFlag strict_mode_; | 
| 1134   KeyedAccessGrowMode grow_mode_; | 1184   KeyedAccessGrowMode grow_mode_; | 
| 1135 | 1185 | 
| 1136   DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub); | 1186   DISALLOW_COPY_AND_ASSIGN(ElementsTransitionAndStoreStub); | 
| 1137 }; | 1187 }; | 
| 1138 | 1188 | 
| 1139 | 1189 | 
| 1140 class StoreArrayLiteralElementStub : public CodeStub { | 1190 class StoreArrayLiteralElementStub : public PlatformCodeStub { | 
| 1141  public: | 1191  public: | 
| 1142   StoreArrayLiteralElementStub() | 1192   StoreArrayLiteralElementStub() | 
| 1143         : fp_registers_(CanUseFPRegisters()) { } | 1193         : fp_registers_(CanUseFPRegisters()) { } | 
| 1144 | 1194 | 
| 1145  private: | 1195  private: | 
| 1146   class FPRegisters: public BitField<bool,                0, 1> {}; | 1196   class FPRegisters: public BitField<bool,                0, 1> {}; | 
| 1147 | 1197 | 
| 1148   Major MajorKey() { return StoreArrayLiteralElement; } | 1198   Major MajorKey() { return StoreArrayLiteralElement; } | 
| 1149   int MinorKey() { return FPRegisters::encode(fp_registers_); } | 1199   int MinorKey() { return FPRegisters::encode(fp_registers_); } | 
| 1150 | 1200 | 
| 1151   void Generate(MacroAssembler* masm); | 1201   void Generate(MacroAssembler* masm); | 
| 1152 | 1202 | 
| 1153   bool fp_registers_; | 1203   bool fp_registers_; | 
| 1154 | 1204 | 
| 1155   DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub); | 1205   DISALLOW_COPY_AND_ASSIGN(StoreArrayLiteralElementStub); | 
| 1156 }; | 1206 }; | 
| 1157 | 1207 | 
| 1158 | 1208 | 
| 1159 class ProfileEntryHookStub : public CodeStub { | 1209 class ProfileEntryHookStub : public PlatformCodeStub { | 
| 1160  public: | 1210  public: | 
| 1161   explicit ProfileEntryHookStub() {} | 1211   explicit ProfileEntryHookStub() {} | 
| 1162 | 1212 | 
| 1163   // The profile entry hook function is not allowed to cause a GC. | 1213   // The profile entry hook function is not allowed to cause a GC. | 
| 1164   virtual bool SometimesSetsUpAFrame() { return false; } | 1214   virtual bool SometimesSetsUpAFrame() { return false; } | 
| 1165 | 1215 | 
| 1166   // Generates a call to the entry hook if it's enabled. | 1216   // Generates a call to the entry hook if it's enabled. | 
| 1167   static void MaybeCallEntryHook(MacroAssembler* masm); | 1217   static void MaybeCallEntryHook(MacroAssembler* masm); | 
| 1168 | 1218 | 
| 1169   // Sets or unsets the entry hook function. Returns true on success, | 1219   // Sets or unsets the entry hook function. Returns true on success, | 
| (...skipping 14 matching lines...) Expand all  Loading... | 
| 1184 | 1234 | 
| 1185   // The current function entry hook. | 1235   // The current function entry hook. | 
| 1186   static FunctionEntryHook entry_hook_; | 1236   static FunctionEntryHook entry_hook_; | 
| 1187 | 1237 | 
| 1188   DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub); | 1238   DISALLOW_COPY_AND_ASSIGN(ProfileEntryHookStub); | 
| 1189 }; | 1239 }; | 
| 1190 | 1240 | 
| 1191 } }  // namespace v8::internal | 1241 } }  // namespace v8::internal | 
| 1192 | 1242 | 
| 1193 #endif  // V8_CODE_STUBS_H_ | 1243 #endif  // V8_CODE_STUBS_H_ | 
| OLD | NEW | 
|---|