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

Side by Side Diff: src/x64/lithium-codegen-x64.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/x64/deoptimizer-x64.cc ('k') | src/x64/lithium-codegen-x64.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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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_
OLDNEW
« no previous file with comments | « src/x64/deoptimizer-x64.cc ('k') | src/x64/lithium-codegen-x64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698