| Index: src/ia32/lithium-codegen-ia32.h
|
| ===================================================================
|
| --- src/ia32/lithium-codegen-ia32.h (revision 6800)
|
| +++ src/ia32/lithium-codegen-ia32.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:
|
| @@ -34,15 +34,16 @@
|
| #include "deoptimizer.h"
|
| #include "safepoint-table.h"
|
| #include "scopes.h"
|
| +#include "ia32/lithium-gap-resolver-ia32.h"
|
|
|
| namespace v8 {
|
| namespace internal {
|
|
|
| // Forward declarations.
|
| class LDeferredCode;
|
| +class LGapNode;
|
| class SafepointGenerator;
|
|
|
| -
|
| class LCodeGen BASE_EMBEDDED {
|
| public:
|
| LCodeGen(LChunk* chunk, MacroAssembler* assembler, CompilationInfo* info)
|
| @@ -58,10 +59,24 @@
|
| scope_(chunk->graph()->info()->scope()),
|
| status_(UNUSED),
|
| deferred_(8),
|
| - osr_pc_offset_(-1) {
|
| + osr_pc_offset_(-1),
|
| + resolver_(this) {
|
| PopulateDeoptimizationLiteralsWithInlinedFunctions();
|
| }
|
|
|
| + // Simple accessors.
|
| + MacroAssembler* masm() const { return masm_; }
|
| +
|
| + // Support for converting LOperands to assembler types.
|
| + Operand ToOperand(LOperand* op) const;
|
| + Register ToRegister(LOperand* op) const;
|
| + XMMRegister ToDoubleRegister(LOperand* op) const;
|
| + Immediate ToImmediate(LOperand* op);
|
| +
|
| + // The operand denoting the second word (the one with a higher address) of
|
| + // a double stack slot.
|
| + Operand HighOperand(LOperand* op);
|
| +
|
| // Try to generate code for the entire chunk, but it may fail if the
|
| // chunk contains constructs we cannot handle. Returns true if the
|
| // code generation attempt succeeded.
|
| @@ -77,10 +92,16 @@
|
| void DoDeferredTaggedToI(LTaggedToI* instr);
|
| void DoDeferredMathAbsTaggedHeapNumber(LUnaryMathOperation* instr);
|
| void DoDeferredStackCheck(LGoto* instr);
|
| + void DoDeferredStringCharCodeAt(LStringCharCodeAt* instr);
|
| + void DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
| + Label* map_check);
|
|
|
| // Parallel move support.
|
| void DoParallelMove(LParallelMove* move);
|
|
|
| + // Emit frame translation commands for an environment.
|
| + void WriteTranslation(LEnvironment* environment, Translation* translation);
|
| +
|
| // 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)
|
| @@ -99,10 +120,13 @@
|
| bool is_done() const { return status_ == DONE; }
|
| bool is_aborted() const { return status_ == ABORTED; }
|
|
|
| + int strict_mode_flag() const {
|
| + return info_->is_strict() ? kStrictMode : kNonStrictMode;
|
| + }
|
| +
|
| 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);
|
| LInstruction* GetNextInstruction();
|
| @@ -129,17 +153,14 @@
|
| bool GenerateDeferredCode();
|
| bool GenerateSafepointTable();
|
|
|
| - void CallCode(Handle<Code> code,
|
| - RelocInfo::Mode mode,
|
| - LInstruction* instr);
|
| - void CallRuntime(Runtime::Function* function,
|
| - int num_arguments,
|
| - LInstruction* instr);
|
| - void CallRuntime(Runtime::FunctionId id,
|
| - int num_arguments,
|
| - LInstruction* instr) {
|
| + void CallCode(Handle<Code> code, RelocInfo::Mode mode, LInstruction* instr,
|
| + bool adjusted = true);
|
| + void CallRuntime(Runtime::Function* fun, int argc, LInstruction* instr,
|
| + bool adjusted = true);
|
| + void CallRuntime(Runtime::FunctionId id, int argc, LInstruction* instr,
|
| + bool adjusted = true) {
|
| Runtime::Function* function = Runtime::FunctionForId(id);
|
| - CallRuntime(function, num_arguments, instr);
|
| + CallRuntime(function, argc, instr, adjusted);
|
| }
|
|
|
| // Generate a direct call to a known function. Expects the function
|
| @@ -148,7 +169,7 @@
|
| int arity,
|
| LInstruction* instr);
|
|
|
| - void LoadPrototype(Register result, Handle<JSObject> prototype);
|
| + void LoadHeapObject(Register result, Handle<HeapObject> object);
|
|
|
| void RegisterLazyDeoptimization(LInstruction* instr);
|
| void RegisterEnvironmentForDeoptimization(LEnvironment* environment);
|
| @@ -164,13 +185,10 @@
|
|
|
| Register ToRegister(int index) const;
|
| XMMRegister ToDoubleRegister(int index) const;
|
| - Register ToRegister(LOperand* op) const;
|
| - XMMRegister ToDoubleRegister(LOperand* op) const;
|
| int ToInteger32(LConstantOperand* op) const;
|
| - Operand ToOperand(LOperand* op) const;
|
| - Immediate ToImmediate(LOperand* op);
|
|
|
| // Specific math operations - used from DoUnaryMathOperation.
|
| + void EmitIntegerMathAbs(LUnaryMathOperation* instr);
|
| void DoMathAbs(LUnaryMathOperation* instr);
|
| void DoMathFloor(LUnaryMathOperation* instr);
|
| void DoMathRound(LUnaryMathOperation* instr);
|
| @@ -181,6 +199,10 @@
|
| void DoMathSin(LUnaryMathOperation* instr);
|
|
|
| // Support for recording safepoint and position information.
|
| + void RecordSafepoint(LPointerMap* pointers,
|
| + Safepoint::Kind kind,
|
| + int arguments,
|
| + int deoptimization_index);
|
| void RecordSafepoint(LPointerMap* pointers, int deoptimization_index);
|
| void RecordSafepointWithRegisters(LPointerMap* pointers,
|
| int arguments,
|
| @@ -208,6 +230,11 @@
|
| Label* is_not_object,
|
| Label* is_object);
|
|
|
| + // Emits optimized code for %_IsConstructCall().
|
| + // Caller should branch on equal condition.
|
| + void EmitIsConstructCall(Register temp);
|
| +
|
| +
|
| LChunk* const chunk_;
|
| MacroAssembler* const masm_;
|
| CompilationInfo* const info_;
|
| @@ -228,6 +255,9 @@
|
| // itself is emitted at the end of the generated code.
|
| SafepointTableBuilder safepoints_;
|
|
|
| + // Compiler from a set of parallel moves to a sequential list of moves.
|
| + LGapResolver resolver_;
|
| +
|
| friend class LDeferredCode;
|
| friend class LEnvironment;
|
| friend class SafepointGenerator;
|
|
|