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