Index: src/x64/lithium-codegen-x64.h |
=================================================================== |
--- src/x64/lithium-codegen-x64.h (revision 6260) |
+++ src/x64/lithium-codegen-x64.h (working copy) |
@@ -1,4 +1,4 @@ |
-// Copyright 2010 the V8 project authors. All rights reserved. |
+// Copyright 2011 the V8 project authors. All rights reserved. |
// Redistribution and use in source and binary forms, with or without |
// modification, are permitted provided that the following conditions are |
// met: |
@@ -39,10 +39,26 @@ |
// Forward declarations. |
class LDeferredCode; |
+class SafepointGenerator; |
class LCodeGen BASE_EMBEDDED { |
public: |
- LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info) { } |
+ LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info) |
+ : chunk_(chunk), |
+ masm_(assembler), |
+ info_(info), |
+ current_block_(-1), |
+ current_instruction_(-1), |
+ instructions_(chunk->instructions()), |
+ deoptimizations_(4), |
+ deoptimization_literals_(8), |
+ inlined_function_count_(0), |
+ scope_(chunk->graph()->info()->scope()), |
+ status_(UNUSED), |
+ deferred_(8), |
+ osr_pc_offset_(-1) { |
+ PopulateDeoptimizationLiteralsWithInlinedFunctions(); |
+ } |
// Try to generate code for the entire chunk, but it may fail if the |
// chunk contains constructs we cannot handle. Returns true if the |
@@ -52,11 +68,150 @@ |
return false; |
} |
+ |
// Finish the code by setting stack height, safepoint, and bailout |
// information on it. |
void FinishCode(Handle<Code> code) { UNIMPLEMENTED(); } |
+ |
+ // Parallel move support. |
+ void DoParallelMove(LParallelMove* move); |
+ |
+ // Declare methods that deal with the individual node types. |
+#define DECLARE_DO(type) void Do##type(L##type* node); |
+ LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) |
+#undef DECLARE_DO |
+ |
+ private: |
+ enum Status { |
+ UNUSED, |
+ GENERATING, |
+ DONE, |
+ ABORTED |
+ }; |
+ |
+ bool is_unused() const { return status_ == UNUSED; } |
+ bool is_generating() const { return status_ == GENERATING; } |
+ bool is_done() const { return status_ == DONE; } |
+ bool is_aborted() const { return status_ == ABORTED; } |
+ |
+ LChunk* chunk() const { return chunk_; } |
+ Scope* scope() const { return scope_; } |
+ HGraph* graph() const { return chunk_->graph(); } |
+ MacroAssembler* masm() const { return masm_; } |
+ |
+ int GetNextEmittedBlock(int block) { |
+ UNIMPLEMENTED(); |
+ return 0; |
+ } |
+ LInstruction* GetNextInstruction() { |
+ UNIMPLEMENTED(); |
+ return NULL; |
+ } |
+ |
+ void EmitClassOfTest(Label* if_true, |
+ Label* if_false, |
+ Handle<String> class_name, |
+ Register input, |
+ Register temporary, |
+ Register temporary2) { UNIMPLEMENTED(); } |
+ |
+ int StackSlotCount() const { return chunk()->spill_slot_count(); } |
+ int ParameterCount() const { return scope()->num_parameters(); } |
+ |
+ void Abort(const char* format, ...) { UNIMPLEMENTED(); } |
+ void Comment(const char* format, ...) { UNIMPLEMENTED(); } |
+ |
+ void AddDeferredCode(LDeferredCode* code) { deferred_.Add(code); } |
+ |
+ // Code generation passes. Returns true if code generation should |
+ // continue. |
+ bool GeneratePrologue() { |
+ UNIMPLEMENTED(); |
+ return true; |
+ } |
+ bool GenerateBody() { |
+ UNIMPLEMENTED(); |
+ return true; |
+ } |
+ bool GenerateDeferredCode() { |
+ UNIMPLEMENTED(); |
+ return true; |
+ } |
+ bool GenerateSafepointTable() { |
+ UNIMPLEMENTED(); |
+ return true; |
+ } |
+ |
+ void CallCode(Handle<Code> code, |
+ RelocInfo::Mode mode, |
+ LInstruction* instr) { UNIMPLEMENTED(); } |
+ void CallRuntime(Runtime::Function* function, |
+ int num_arguments, |
+ LInstruction* instr) { UNIMPLEMENTED(); } |
+ void CallRuntime(Runtime::FunctionId id, |
+ int num_arguments, |
+ LInstruction* instr) { |
+ Runtime::Function* function = Runtime::FunctionForId(id); |
+ CallRuntime(function, num_arguments, instr); |
+ } |
+ |
+ void DeoptimizeIf(Condition cc, LEnvironment* environment) { |
+ UNIMPLEMENTED(); |
+ } |
+ void PopulateDeoptimizationLiteralsWithInlinedFunctions() { UNIMPLEMENTED(); } |
+ |
+ LChunk* const chunk_; |
+ MacroAssembler* const masm_; |
+ CompilationInfo* const info_; |
+ |
+ int current_block_; |
+ int current_instruction_; |
+ const ZoneList<LInstruction*>* instructions_; |
+ ZoneList<LEnvironment*> deoptimizations_; |
+ ZoneList<Handle<Object> > deoptimization_literals_; |
+ int inlined_function_count_; |
+ Scope* const scope_; |
+ Status status_; |
+ TranslationBuffer translations_; |
+ ZoneList<LDeferredCode*> deferred_; |
+ int osr_pc_offset_; |
+ |
+ // Builder that keeps track of safepoints in the code. The table |
+ // itself is emitted at the end of the generated code. |
+ SafepointTableBuilder safepoints_; |
+ |
+ friend class LDeferredCode; |
+ friend class LEnvironment; |
+ friend class SafepointGenerator; |
+ DISALLOW_COPY_AND_ASSIGN(LCodeGen); |
}; |
+ |
+class LDeferredCode: public ZoneObject { |
+ public: |
+ explicit LDeferredCode(LCodeGen* codegen) |
+ : codegen_(codegen), external_exit_(NULL) { |
+ codegen->AddDeferredCode(this); |
+ } |
+ |
+ virtual ~LDeferredCode() { } |
+ virtual void Generate() = 0; |
+ |
+ void SetExit(Label *exit) { external_exit_ = exit; } |
+ Label* entry() { return &entry_; } |
+ Label* exit() { return external_exit_ != NULL ? external_exit_ : &exit_; } |
+ |
+ protected: |
+ LCodeGen* codegen() const { return codegen_; } |
+ MacroAssembler* masm() const { return codegen_->masm(); } |
+ |
+ private: |
+ LCodeGen* codegen_; |
+ Label entry_; |
+ Label exit_; |
+ Label* external_exit_; |
+}; |
+ |
} } // namespace v8::internal |
#endif // V8_X64_LITHIUM_CODEGEN_X64_H_ |