| 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 56         deoptimizations_(4, info->zone()), | 56         deoptimizations_(4, info->zone()), | 
| 57         jump_table_(4, info->zone()), | 57         jump_table_(4, info->zone()), | 
| 58         deoptimization_literals_(8, info->zone()), | 58         deoptimization_literals_(8, info->zone()), | 
| 59         inlined_function_count_(0), | 59         inlined_function_count_(0), | 
| 60         scope_(info->scope()), | 60         scope_(info->scope()), | 
| 61         status_(UNUSED), | 61         status_(UNUSED), | 
| 62         translations_(info->zone()), | 62         translations_(info->zone()), | 
| 63         deferred_(8, info->zone()), | 63         deferred_(8, info->zone()), | 
| 64         osr_pc_offset_(-1), | 64         osr_pc_offset_(-1), | 
| 65         last_lazy_deopt_pc_(0), | 65         last_lazy_deopt_pc_(0), | 
|  | 66         frame_is_built_(false), | 
| 66         safepoints_(info->zone()), | 67         safepoints_(info->zone()), | 
| 67         resolver_(this), | 68         resolver_(this), | 
| 68         expected_safepoint_kind_(Safepoint::kSimple) { | 69         expected_safepoint_kind_(Safepoint::kSimple) { | 
| 69     PopulateDeoptimizationLiteralsWithInlinedFunctions(); | 70     PopulateDeoptimizationLiteralsWithInlinedFunctions(); | 
| 70   } | 71   } | 
| 71 | 72 | 
| 72   // Simple accessors. | 73   // Simple accessors. | 
| 73   MacroAssembler* masm() const { return masm_; } | 74   MacroAssembler* masm() const { return masm_; } | 
| 74   CompilationInfo* info() const { return info_; } | 75   CompilationInfo* info() const { return info_; } | 
| 75   Isolate* isolate() const { return info_->isolate(); } | 76   Isolate* isolate() const { return info_->isolate(); } | 
| 76   Factory* factory() const { return isolate()->factory(); } | 77   Factory* factory() const { return isolate()->factory(); } | 
| 77   Heap* heap() const { return isolate()->heap(); } | 78   Heap* heap() const { return isolate()->heap(); } | 
| 78   Zone* zone() const { return zone_; } | 79   Zone* zone() const { return zone_; } | 
| 79 | 80 | 
|  | 81   bool NeedsEagerFrame() const { | 
|  | 82     return GetStackSlotCount() > 0 || | 
|  | 83         info()->is_non_deferred_calling() || | 
|  | 84         !info()->IsStub(); | 
|  | 85   } | 
|  | 86   bool NeedsDeferredFrame() const { | 
|  | 87     return !NeedsEagerFrame() && info()->is_deferred_calling(); | 
|  | 88   } | 
|  | 89 | 
| 80   // Support for converting LOperands to assembler types. | 90   // Support for converting LOperands to assembler types. | 
| 81   Register ToRegister(LOperand* op) const; | 91   Register ToRegister(LOperand* op) const; | 
| 82   XMMRegister ToDoubleRegister(LOperand* op) const; | 92   XMMRegister ToDoubleRegister(LOperand* op) const; | 
| 83   bool IsInteger32Constant(LConstantOperand* op) const; | 93   bool IsInteger32Constant(LConstantOperand* op) const; | 
| 84   int ToInteger32(LConstantOperand* op) const; | 94   int ToInteger32(LConstantOperand* op) const; | 
| 85   double ToDouble(LConstantOperand* op) const; | 95   double ToDouble(LConstantOperand* op) const; | 
| 86   bool IsTaggedConstant(LConstantOperand* op) const; | 96   bool IsTaggedConstant(LConstantOperand* op) const; | 
| 87   Handle<Object> ToHandle(LConstantOperand* op) const; | 97   Handle<Object> ToHandle(LConstantOperand* op) const; | 
| 88   Operand ToOperand(LOperand* op) const; | 98   Operand ToOperand(LOperand* op) const; | 
| 89 | 99 | 
| (...skipping 13 matching lines...) Expand all  Loading... | 
| 103   void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr); | 113   void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr); | 
| 104   void DoDeferredStackCheck(LStackCheck* instr); | 114   void DoDeferredStackCheck(LStackCheck* instr); | 
| 105   void DoDeferredRandom(LRandom* instr); | 115   void DoDeferredRandom(LRandom* instr); | 
| 106   void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr); | 116   void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr); | 
| 107   void DoDeferredStringCharFromCode(LStringCharFromCode* instr); | 117   void DoDeferredStringCharFromCode(LStringCharFromCode* instr); | 
| 108   void DoDeferredAllocateObject(LAllocateObject* instr); | 118   void DoDeferredAllocateObject(LAllocateObject* instr); | 
| 109   void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, | 119   void DoDeferredInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr, | 
| 110                                        Label* map_check); | 120                                        Label* map_check); | 
| 111 | 121 | 
| 112   void DoCheckMapCommon(Register reg, Handle<Map> map, | 122   void DoCheckMapCommon(Register reg, Handle<Map> map, | 
| 113                         CompareMapMode mode, LEnvironment* env); | 123                         CompareMapMode mode, LInstruction* instr); | 
| 114 | 124 | 
| 115 // Parallel move support. | 125 // Parallel move support. | 
| 116   void DoParallelMove(LParallelMove* move); | 126   void DoParallelMove(LParallelMove* move); | 
| 117   void DoGap(LGap* instr); | 127   void DoGap(LGap* instr); | 
| 118 | 128 | 
| 119   // Emit frame translation commands for an environment. | 129   // Emit frame translation commands for an environment. | 
| 120   void WriteTranslation(LEnvironment* environment, | 130   void WriteTranslation(LEnvironment* environment, | 
| 121                         Translation* translation, | 131                         Translation* translation, | 
| 122                         int* arguments_index, | 132                         int* arguments_index, | 
| 123                         int* arguments_count); | 133                         int* arguments_count); | 
| (...skipping 27 matching lines...) Expand all  Loading... | 
| 151   int GetNextEmittedBlock(int block); | 161   int GetNextEmittedBlock(int block); | 
| 152 | 162 | 
| 153   void EmitClassOfTest(Label* if_true, | 163   void EmitClassOfTest(Label* if_true, | 
| 154                        Label* if_false, | 164                        Label* if_false, | 
| 155                        Handle<String> class_name, | 165                        Handle<String> class_name, | 
| 156                        Register input, | 166                        Register input, | 
| 157                        Register temporary, | 167                        Register temporary, | 
| 158                        Register scratch); | 168                        Register scratch); | 
| 159 | 169 | 
| 160   int GetStackSlotCount() const { return chunk()->spill_slot_count(); } | 170   int GetStackSlotCount() const { return chunk()->spill_slot_count(); } | 
| 161   int GetParameterCount() const { return scope()->num_parameters(); } | 171   int GetParameterCount() const { return info()->num_parameters(); } | 
| 162 | 172 | 
| 163   void Abort(const char* reason); | 173   void Abort(const char* reason); | 
| 164   void Comment(const char* format, ...); | 174   void Comment(const char* format, ...); | 
| 165 | 175 | 
| 166   void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); } | 176   void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code, zone()); } | 
| 167 | 177 | 
| 168   // Code generation passes.  Returns true if code generation should | 178   // Code generation passes.  Returns true if code generation should | 
| 169   // continue. | 179   // continue. | 
| 170   bool GeneratePrologue(); | 180   bool GeneratePrologue(); | 
| 171   bool GenerateBody(); | 181   bool GenerateBody(); | 
| (...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 320   void EmitPushTaggedOperand(LOperand* operand); | 330   void EmitPushTaggedOperand(LOperand* operand); | 
| 321 | 331 | 
| 322   // Emits optimized code to deep-copy the contents of statically known | 332   // Emits optimized code to deep-copy the contents of statically known | 
| 323   // object graphs (e.g. object literal boilerplate). | 333   // object graphs (e.g. object literal boilerplate). | 
| 324   void EmitDeepCopy(Handle<JSObject> object, | 334   void EmitDeepCopy(Handle<JSObject> object, | 
| 325                     Register result, | 335                     Register result, | 
| 326                     Register source, | 336                     Register source, | 
| 327                     int* offset); | 337                     int* offset); | 
| 328 | 338 | 
| 329   struct JumpTableEntry { | 339   struct JumpTableEntry { | 
| 330     explicit inline JumpTableEntry(Address entry) | 340     inline JumpTableEntry(Address entry, bool frame, bool is_lazy) | 
| 331         : label(), | 341         : label(), | 
| 332           address(entry) { } | 342           address(entry), | 
|  | 343           needs_frame(frame), | 
|  | 344           is_lazy_deopt(is_lazy) { } | 
| 333     Label label; | 345     Label label; | 
| 334     Address address; | 346     Address address; | 
|  | 347     bool needs_frame; | 
|  | 348     bool is_lazy_deopt; | 
| 335   }; | 349   }; | 
| 336 | 350 | 
| 337   void EnsureSpaceForLazyDeopt(int space_needed); | 351   void EnsureSpaceForLazyDeopt(int space_needed); | 
| 338   void DoLoadKeyedExternalArray(LLoadKeyed* instr); | 352   void DoLoadKeyedExternalArray(LLoadKeyed* instr); | 
| 339   void DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr); | 353   void DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr); | 
| 340   void DoLoadKeyedFixedArray(LLoadKeyed* instr); | 354   void DoLoadKeyedFixedArray(LLoadKeyed* instr); | 
| 341   void DoStoreKeyedExternalArray(LStoreKeyed* instr); | 355   void DoStoreKeyedExternalArray(LStoreKeyed* instr); | 
| 342   void DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr); | 356   void DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr); | 
| 343   void DoStoreKeyedFixedArray(LStoreKeyed* instr); | 357   void DoStoreKeyedFixedArray(LStoreKeyed* instr); | 
| 344 | 358 | 
| 345   Zone* zone_; | 359   Zone* zone_; | 
| 346   LPlatformChunk* const chunk_; | 360   LPlatformChunk* const chunk_; | 
| 347   MacroAssembler* const masm_; | 361   MacroAssembler* const masm_; | 
| 348   CompilationInfo* const info_; | 362   CompilationInfo* const info_; | 
| 349 | 363 | 
| 350   int current_block_; | 364   int current_block_; | 
| 351   int current_instruction_; | 365   int current_instruction_; | 
| 352   const ZoneList<LInstruction*>* instructions_; | 366   const ZoneList<LInstruction*>* instructions_; | 
| 353   ZoneList<LEnvironment*> deoptimizations_; | 367   ZoneList<LEnvironment*> deoptimizations_; | 
| 354   ZoneList<JumpTableEntry> jump_table_; | 368   ZoneList<JumpTableEntry> jump_table_; | 
| 355   ZoneList<Handle<Object> > deoptimization_literals_; | 369   ZoneList<Handle<Object> > deoptimization_literals_; | 
| 356   int inlined_function_count_; | 370   int inlined_function_count_; | 
| 357   Scope* const scope_; | 371   Scope* const scope_; | 
| 358   Status status_; | 372   Status status_; | 
| 359   TranslationBuffer translations_; | 373   TranslationBuffer translations_; | 
| 360   ZoneList<LDeferredCode*> deferred_; | 374   ZoneList<LDeferredCode*> deferred_; | 
| 361   int osr_pc_offset_; | 375   int osr_pc_offset_; | 
| 362   int last_lazy_deopt_pc_; | 376   int last_lazy_deopt_pc_; | 
|  | 377   bool frame_is_built_; | 
| 363 | 378 | 
| 364   // Builder that keeps track of safepoints in the code. The table | 379   // Builder that keeps track of safepoints in the code. The table | 
| 365   // itself is emitted at the end of the generated code. | 380   // itself is emitted at the end of the generated code. | 
| 366   SafepointTableBuilder safepoints_; | 381   SafepointTableBuilder safepoints_; | 
| 367 | 382 | 
| 368   // Compiler from a set of parallel moves to a sequential list of moves. | 383   // Compiler from a set of parallel moves to a sequential list of moves. | 
| 369   LGapResolver resolver_; | 384   LGapResolver resolver_; | 
| 370 | 385 | 
| 371   Safepoint::Kind expected_safepoint_kind_; | 386   Safepoint::Kind expected_safepoint_kind_; | 
| 372 | 387 | 
| 373   class PushSafepointRegistersScope BASE_EMBEDDED { | 388   class PushSafepointRegistersScope BASE_EMBEDDED { | 
| 374    public: | 389    public: | 
| 375     explicit PushSafepointRegistersScope(LCodeGen* codegen) | 390     explicit PushSafepointRegistersScope(LCodeGen* codegen) | 
| 376         : codegen_(codegen) { | 391         : codegen_(codegen) { | 
|  | 392       ASSERT(codegen_->info()->is_calling()); | 
| 377       ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple); | 393       ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kSimple); | 
| 378       codegen_->masm_->PushSafepointRegisters(); | 394       codegen_->masm_->PushSafepointRegisters(); | 
| 379       codegen_->expected_safepoint_kind_ = Safepoint::kWithRegisters; | 395       codegen_->expected_safepoint_kind_ = Safepoint::kWithRegisters; | 
| 380     } | 396     } | 
| 381 | 397 | 
| 382     ~PushSafepointRegistersScope() { | 398     ~PushSafepointRegistersScope() { | 
| 383       ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kWithRegisters); | 399       ASSERT(codegen_->expected_safepoint_kind_ == Safepoint::kWithRegisters); | 
| 384       codegen_->masm_->PopSafepointRegisters(); | 400       codegen_->masm_->PopSafepointRegisters(); | 
| 385       codegen_->expected_safepoint_kind_ = Safepoint::kSimple; | 401       codegen_->expected_safepoint_kind_ = Safepoint::kSimple; | 
| 386     } | 402     } | 
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 422   LCodeGen* codegen_; | 438   LCodeGen* codegen_; | 
| 423   Label entry_; | 439   Label entry_; | 
| 424   Label exit_; | 440   Label exit_; | 
| 425   Label* external_exit_; | 441   Label* external_exit_; | 
| 426   int instruction_index_; | 442   int instruction_index_; | 
| 427 }; | 443 }; | 
| 428 | 444 | 
| 429 } }  // namespace v8::internal | 445 } }  // namespace v8::internal | 
| 430 | 446 | 
| 431 #endif  // V8_X64_LITHIUM_CODEGEN_X64_H_ | 447 #endif  // V8_X64_LITHIUM_CODEGEN_X64_H_ | 
| OLD | NEW | 
|---|