| Index: src/cfg.h
|
| ===================================================================
|
| --- src/cfg.h (revision 2654)
|
| +++ src/cfg.h (working copy)
|
| @@ -307,7 +307,10 @@
|
|
|
| // Accessors.
|
| Where where() { return where_; }
|
| - void set_where(Where where) { where_ = where; }
|
| + void set_where(Where where) {
|
| + ASSERT(where_ == TempLocation::NOT_ALLOCATED);
|
| + where_ = where;
|
| + }
|
|
|
| // Predicates.
|
| bool is_on_stack() { return where_ == STACK; }
|
| @@ -343,14 +346,6 @@
|
| // be generated.
|
| class Instruction : public ZoneObject {
|
| public:
|
| - // Every instruction has a location where its result is stored (which may
|
| - // be Nowhere, the default).
|
| - Instruction() : location_(CfgGlobals::current()->nowhere()) {}
|
| -
|
| - explicit Instruction(Location* location) : location_(location) {}
|
| -
|
| - virtual ~Instruction() {}
|
| -
|
| // Accessors.
|
| Location* location() { return location_; }
|
| void set_location(Location* location) { location_ = location; }
|
| @@ -370,16 +365,84 @@
|
| #endif
|
|
|
| protected:
|
| + // Every instruction has a location where its result is stored (which may
|
| + // be Nowhere).
|
| + explicit Instruction(Location* location) : location_(location) {}
|
| +
|
| + virtual ~Instruction() {}
|
| +
|
| Location* location_;
|
| };
|
|
|
|
|
| +// Base class of instructions that have no input operands.
|
| +class ZeroOperandInstruction : public Instruction {
|
| + public:
|
| + // Support for fast-compilation mode:
|
| + virtual void Compile(MacroAssembler* masm) = 0;
|
| + void FastAllocate(TempLocation* temp);
|
| +
|
| +#ifdef DEBUG
|
| + // Printing support: print the operands (nothing).
|
| + virtual void Print() {}
|
| +#endif
|
| +
|
| + protected:
|
| + explicit ZeroOperandInstruction(Location* loc) : Instruction(loc) {}
|
| +};
|
| +
|
| +
|
| +// Base class of instructions that have a single input operand.
|
| +class OneOperandInstruction : public Instruction {
|
| + public:
|
| + // Support for fast-compilation mode:
|
| + virtual void Compile(MacroAssembler* masm) = 0;
|
| + void FastAllocate(TempLocation* temp);
|
| +
|
| +#ifdef DEBUG
|
| + // Printing support: print the operands.
|
| + virtual void Print();
|
| +#endif
|
| +
|
| + protected:
|
| + OneOperandInstruction(Location* loc, Value* value)
|
| + : Instruction(loc), value_(value) {
|
| + }
|
| +
|
| + Value* value_;
|
| +};
|
| +
|
| +
|
| +// Base class of instructions that have two input operands.
|
| +class TwoOperandInstruction : public Instruction {
|
| + protected:
|
| + // Support for fast-compilation mode:
|
| + virtual void Compile(MacroAssembler* masm) = 0;
|
| + void FastAllocate(TempLocation* temp);
|
| +
|
| +#ifdef DEBUG
|
| + // Printing support: print the operands.
|
| + virtual void Print();
|
| +#endif
|
| +
|
| + protected:
|
| + TwoOperandInstruction(Location* loc, Value* value0, Value* value1)
|
| + : Instruction(loc), value0_(value0), value1_(value1) {
|
| + }
|
| +
|
| + Value* value0_;
|
| + Value* value1_;
|
| +};
|
| +
|
| +
|
| // A phantom instruction that indicates the start of a statement. It
|
| // causes the statement position to be recorded in the relocation
|
| // information but generates no code.
|
| -class PositionInstr : public Instruction {
|
| +class PositionInstr : public ZeroOperandInstruction {
|
| public:
|
| - explicit PositionInstr(int pos) : pos_(pos) {}
|
| + explicit PositionInstr(int pos)
|
| + : ZeroOperandInstruction(CfgGlobals::current()->nowhere()), pos_(pos) {
|
| + }
|
|
|
| // Support for fast-compilation mode.
|
| void Compile(MacroAssembler* masm);
|
| @@ -399,67 +462,60 @@
|
|
|
|
|
| // Move a value to a location.
|
| -class MoveInstr : public Instruction {
|
| +class MoveInstr : public OneOperandInstruction {
|
| public:
|
| - MoveInstr(Location* loc, Value* value) : Instruction(loc), value_(value) {}
|
| + MoveInstr(Location* loc, Value* value)
|
| + : OneOperandInstruction(loc, value) {
|
| + }
|
|
|
| // Accessors.
|
| Value* value() { return value_; }
|
|
|
| // Support for fast-compilation mode.
|
| void Compile(MacroAssembler* masm);
|
| - void FastAllocate(TempLocation* temp);
|
|
|
| #ifdef DEBUG
|
| + // Printing support.
|
| void Print();
|
| #endif
|
| -
|
| - private:
|
| - Value* value_;
|
| };
|
|
|
|
|
| // Load a property from a receiver, leaving the result in a location.
|
| -class PropLoadInstr : public Instruction {
|
| +class PropLoadInstr : public TwoOperandInstruction {
|
| public:
|
| PropLoadInstr(Location* loc, Value* object, Value* key)
|
| - : Instruction(loc), object_(object), key_(key) {
|
| + : TwoOperandInstruction(loc, object, key) {
|
| }
|
|
|
| // Accessors.
|
| - Value* object() { return object_; }
|
| - Value* key() { return key_; }
|
| + Value* object() { return value0_; }
|
| + Value* key() { return value1_; }
|
|
|
| // Support for fast-compilation mode.
|
| void Compile(MacroAssembler* masm);
|
| - void FastAllocate(TempLocation* temp);
|
|
|
| #ifdef DEBUG
|
| void Print();
|
| #endif
|
| -
|
| - private:
|
| - Value* object_;
|
| - Value* key_;
|
| };
|
|
|
|
|
| // Perform a (non-short-circuited) binary operation on a pair of values,
|
| // leaving the result in a location.
|
| -class BinaryOpInstr : public Instruction {
|
| +class BinaryOpInstr : public TwoOperandInstruction {
|
| public:
|
| BinaryOpInstr(Location* loc, Token::Value op, Value* left, Value* right)
|
| - : Instruction(loc), op_(op), left_(left), right_(right) {
|
| + : TwoOperandInstruction(loc, left, right), op_(op) {
|
| }
|
|
|
| // Accessors.
|
| + Value* left() { return value0_; }
|
| + Value* right() { return value1_; }
|
| Token::Value op() { return op_; }
|
| - Value* left() { return left_; }
|
| - Value* right() { return right_; }
|
|
|
| // Support for fast-compilation mode.
|
| void Compile(MacroAssembler* masm);
|
| - void FastAllocate(TempLocation* temp);
|
|
|
| #ifdef DEBUG
|
| void Print();
|
| @@ -467,8 +523,6 @@
|
|
|
| private:
|
| Token::Value op_;
|
| - Value* left_;
|
| - Value* right_;
|
| };
|
|
|
|
|
| @@ -477,9 +531,11 @@
|
| // block, and implies that the block is closed (cannot have instructions
|
| // appended or graph fragments concatenated to the end) and that the block's
|
| // successor is the global exit node for the current function.
|
| -class ReturnInstr : public Instruction {
|
| +class ReturnInstr : public OneOperandInstruction {
|
| public:
|
| - explicit ReturnInstr(Value* value) : value_(value) {}
|
| + explicit ReturnInstr(Value* value)
|
| + : OneOperandInstruction(CfgGlobals::current()->nowhere(), value) {
|
| + }
|
|
|
| virtual ~ReturnInstr() {}
|
|
|
| @@ -488,14 +544,10 @@
|
|
|
| // Support for fast-compilation mode.
|
| void Compile(MacroAssembler* masm);
|
| - void FastAllocate(TempLocation* temp);
|
|
|
| #ifdef DEBUG
|
| void Print();
|
| #endif
|
| -
|
| - private:
|
| - Value* value_;
|
| };
|
|
|
|
|
|
|