| Index: src/x64/lithium-x64.h
 | 
| ===================================================================
 | 
| --- src/x64/lithium-x64.h	(revision 7679)
 | 
| +++ src/x64/lithium-x64.h	(working copy)
 | 
| @@ -93,7 +93,6 @@
 | 
|    V(ExternalArrayLength)                        \
 | 
|    V(FixedArrayLength)                           \
 | 
|    V(FunctionLiteral)                            \
 | 
| -  V(Gap)                                        \
 | 
|    V(GetCachedArrayIndex)                        \
 | 
|    V(GlobalObject)                               \
 | 
|    V(GlobalReceiver)                             \
 | 
| @@ -105,6 +104,7 @@
 | 
|    V(InstanceOf)                                 \
 | 
|    V(InstanceOfAndBranch)                        \
 | 
|    V(InstanceOfKnownGlobal)                      \
 | 
| +  V(InstructionGap)                             \
 | 
|    V(Integer32ToDouble)                          \
 | 
|    V(InvokeFunction)                             \
 | 
|    V(IsNull)                                     \
 | 
| @@ -171,20 +171,16 @@
 | 
|    V(ValueOf)
 | 
|  
 | 
|  
 | 
| -#define DECLARE_INSTRUCTION(type)                \
 | 
| -  virtual bool Is##type() const { return true; } \
 | 
| -  static L##type* cast(LInstruction* instr) {    \
 | 
| -    ASSERT(instr->Is##type());                   \
 | 
| -    return reinterpret_cast<L##type*>(instr);    \
 | 
| +#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)              \
 | 
| +  virtual Opcode opcode() const { return LInstruction::k##type; } \
 | 
| +  virtual void CompileToNative(LCodeGen* generator);              \
 | 
| +  virtual const char* Mnemonic() const { return mnemonic; }       \
 | 
| +  static L##type* cast(LInstruction* instr) {                     \
 | 
| +    ASSERT(instr->Is##type());                                    \
 | 
| +    return reinterpret_cast<L##type*>(instr);                     \
 | 
|    }
 | 
|  
 | 
|  
 | 
| -#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)        \
 | 
| -  virtual void CompileToNative(LCodeGen* generator);        \
 | 
| -  virtual const char* Mnemonic() const { return mnemonic; } \
 | 
| -  DECLARE_INSTRUCTION(type)
 | 
| -
 | 
| -
 | 
|  #define DECLARE_HYDROGEN_ACCESSOR(type)     \
 | 
|    H##type* hydrogen() const {               \
 | 
|      return H##type::cast(hydrogen_value()); \
 | 
| @@ -207,11 +203,26 @@
 | 
|    virtual void PrintDataTo(StringStream* stream) = 0;
 | 
|    virtual void PrintOutputOperandTo(StringStream* stream) = 0;
 | 
|  
 | 
| -  // Declare virtual type testers.
 | 
| -#define DECLARE_DO(type) virtual bool Is##type() const { return false; }
 | 
| -  LITHIUM_ALL_INSTRUCTION_LIST(DECLARE_DO)
 | 
| -#undef DECLARE_DO
 | 
| +  enum Opcode {
 | 
| +    // Declare a unique enum value for each instruction.
 | 
| +#define DECLARE_OPCODE(type) k##type,
 | 
| +    LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE)
 | 
| +    kNumberOfInstructions
 | 
| +#undef DECLARE_OPCODE
 | 
| +  };
 | 
|  
 | 
| +  virtual Opcode opcode() const = 0;
 | 
| +
 | 
| +  // Declare non-virtual type testers for all leaf IR classes.
 | 
| +#define DECLARE_PREDICATE(type) \
 | 
| +  bool Is##type() const { return opcode() == k##type; }
 | 
| +  LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE)
 | 
| +#undef DECLARE_PREDICATE
 | 
| +
 | 
| +  // Declare virtual predicates for instructions that don't have
 | 
| +  // an opcode.
 | 
| +  virtual bool IsGap() const { return false; }
 | 
| +
 | 
|    virtual bool IsControl() const { return false; }
 | 
|    virtual void SetBranchTargets(int true_block_id, int false_block_id) { }
 | 
|  
 | 
| @@ -337,8 +348,13 @@
 | 
|      parallel_moves_[AFTER] = NULL;
 | 
|    }
 | 
|  
 | 
| -  DECLARE_CONCRETE_INSTRUCTION(Gap, "gap")
 | 
| +  // Can't use the DECLARE-macro here because of sub-classes.
 | 
| +  virtual bool IsGap() const { return true; }
 | 
|    virtual void PrintDataTo(StringStream* stream);
 | 
| +  static LGap* cast(LInstruction* instr) {
 | 
| +    ASSERT(instr->IsGap());
 | 
| +    return reinterpret_cast<LGap*>(instr);
 | 
| +  }
 | 
|  
 | 
|    bool IsRedundant() const;
 | 
|  
 | 
| @@ -368,6 +384,14 @@
 | 
|  };
 | 
|  
 | 
|  
 | 
| +class LInstructionGap: public LGap {
 | 
| + public:
 | 
| +  explicit LInstructionGap(HBasicBlock* block) : LGap(block) { }
 | 
| +
 | 
| +  DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap")
 | 
| +};
 | 
| +
 | 
| +
 | 
|  class LGoto: public LTemplateInstruction<0, 0, 0> {
 | 
|   public:
 | 
|    LGoto(int block_id, bool include_stack_check = false)
 | 
| @@ -456,7 +480,6 @@
 | 
|  template<int I, int T>
 | 
|  class LControlInstruction: public LTemplateInstruction<0, I, T> {
 | 
|   public:
 | 
| -  DECLARE_INSTRUCTION(ControlInstruction)
 | 
|    virtual bool IsControl() const { return true; }
 | 
|  
 | 
|    int true_block_id() const { return true_block_id_; }
 | 
| @@ -1092,6 +1115,7 @@
 | 
|  
 | 
|    Token::Value op() const { return op_; }
 | 
|  
 | 
| +  virtual Opcode opcode() const { return LInstruction::kArithmeticD; }
 | 
|    virtual void CompileToNative(LCodeGen* generator);
 | 
|    virtual const char* Mnemonic() const;
 | 
|  
 | 
| @@ -1108,6 +1132,7 @@
 | 
|      inputs_[1] = right;
 | 
|    }
 | 
|  
 | 
| +  virtual Opcode opcode() const { return LInstruction::kArithmeticT; }
 | 
|    virtual void CompileToNative(LCodeGen* generator);
 | 
|    virtual const char* Mnemonic() const;
 | 
|  
 | 
| @@ -2191,7 +2216,6 @@
 | 
|  };
 | 
|  
 | 
|  #undef DECLARE_HYDROGEN_ACCESSOR
 | 
| -#undef DECLARE_INSTRUCTION
 | 
|  #undef DECLARE_CONCRETE_INSTRUCTION
 | 
|  
 | 
|  } }  // namespace v8::int
 | 
| 
 |