| Index: src/ia32/lithium-ia32.h
 | 
| diff --git a/src/ia32/lithium-ia32.h b/src/ia32/lithium-ia32.h
 | 
| index 1bf402b1fe8145ef3dc97ec4bb53b80200f8e3b3..dbe54bddaf7cbbe8e6ffb24c511b1dc9423031c7 100644
 | 
| --- a/src/ia32/lithium-ia32.h
 | 
| +++ b/src/ia32/lithium-ia32.h
 | 
| @@ -43,6 +43,7 @@ class LCodeGen;
 | 
|  #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)    \
 | 
|    V(AccessArgumentsAt)                          \
 | 
|    V(AddI)                                       \
 | 
| +  V(Allocate)                                   \
 | 
|    V(AllocateObject)                             \
 | 
|    V(ApplyArguments)                             \
 | 
|    V(ArgumentsElements)                          \
 | 
| @@ -168,6 +169,7 @@ class LCodeGen;
 | 
|    V(Throw)                                      \
 | 
|    V(ToFastProperties)                           \
 | 
|    V(TransitionElementsKind)                     \
 | 
| +  V(TrapAllocationMemento)                      \
 | 
|    V(Typeof)                                     \
 | 
|    V(TypeofIsAndBranch)                          \
 | 
|    V(UnaryMathOperation)                         \
 | 
| @@ -1466,7 +1468,8 @@ class LLoadKeyed: public LTemplateInstruction<1, 2, 0> {
 | 
|    }
 | 
|  
 | 
|    virtual bool ClobbersDoubleRegisters() const {
 | 
| -    return !IsDoubleOrFloatElementsKind(hydrogen()->elements_kind());
 | 
| +    return !CpuFeatures::IsSupported(SSE2) &&
 | 
| +        !IsDoubleOrFloatElementsKind(hydrogen()->elements_kind());
 | 
|    }
 | 
|  
 | 
|    DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed")
 | 
| @@ -1642,6 +1645,7 @@ class LThisFunction: public LTemplateInstruction<1, 0, 0> {
 | 
|  class LContext: public LTemplateInstruction<1, 0, 0> {
 | 
|   public:
 | 
|    DECLARE_CONCRETE_INSTRUCTION(Context, "context")
 | 
| +  DECLARE_HYDROGEN_ACCESSOR(Context)
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -1906,6 +1910,7 @@ class LNumberTagD: public LTemplateInstruction<1, 1, 1> {
 | 
|    LOperand* temp() { return temps_[0]; }
 | 
|  
 | 
|    DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d")
 | 
| +  DECLARE_HYDROGEN_ACCESSOR(Change)
 | 
|  };
 | 
|  
 | 
|  
 | 
| @@ -2091,16 +2096,19 @@ class LStoreKeyedGeneric: public LTemplateInstruction<0, 4, 0> {
 | 
|  };
 | 
|  
 | 
|  
 | 
| -class LTransitionElementsKind: public LTemplateInstruction<1, 1, 2> {
 | 
| +class LTransitionElementsKind: public LTemplateInstruction<0, 2, 2> {
 | 
|   public:
 | 
|    LTransitionElementsKind(LOperand* object,
 | 
| +                          LOperand* context,
 | 
|                            LOperand* new_map_temp,
 | 
|                            LOperand* temp) {
 | 
|      inputs_[0] = object;
 | 
| +    inputs_[1] = context;
 | 
|      temps_[0] = new_map_temp;
 | 
|      temps_[1] = temp;
 | 
|    }
 | 
|  
 | 
| +  LOperand* context() { return inputs_[1]; }
 | 
|    LOperand* object() { return inputs_[0]; }
 | 
|    LOperand* new_map_temp() { return temps_[0]; }
 | 
|    LOperand* temp() { return temps_[1]; }
 | 
| @@ -2118,6 +2126,22 @@ class LTransitionElementsKind: public LTemplateInstruction<1, 1, 2> {
 | 
|  };
 | 
|  
 | 
|  
 | 
| +class LTrapAllocationMemento : public LTemplateInstruction<0, 1, 1> {
 | 
| + public:
 | 
| +  LTrapAllocationMemento(LOperand* object,
 | 
| +                         LOperand* temp) {
 | 
| +    inputs_[0] = object;
 | 
| +    temps_[0] = temp;
 | 
| +  }
 | 
| +
 | 
| +  LOperand* object() { return inputs_[0]; }
 | 
| +  LOperand* temp() { return temps_[0]; }
 | 
| +
 | 
| +  DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento,
 | 
| +                               "trap-allocation-memento")
 | 
| +};
 | 
| +
 | 
| +
 | 
|  class LStringAdd: public LTemplateInstruction<1, 3, 0> {
 | 
|   public:
 | 
|    LStringAdd(LOperand* context, LOperand* left, LOperand* right) {
 | 
| @@ -2315,6 +2339,23 @@ class LAllocateObject: public LTemplateInstruction<1, 1, 1> {
 | 
|  };
 | 
|  
 | 
|  
 | 
| +class LAllocate: public LTemplateInstruction<1, 2, 1> {
 | 
| + public:
 | 
| +  LAllocate(LOperand* context, LOperand* size, LOperand* temp) {
 | 
| +    inputs_[0] = context;
 | 
| +    inputs_[1] = size;
 | 
| +    temps_[0] = temp;
 | 
| +  }
 | 
| +
 | 
| +  LOperand* context() { return inputs_[0]; }
 | 
| +  LOperand* size() { return inputs_[1]; }
 | 
| +  LOperand* temp() { return temps_[0]; }
 | 
| +
 | 
| +  DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate")
 | 
| +  DECLARE_HYDROGEN_ACCESSOR(Allocate)
 | 
| +};
 | 
| +
 | 
| +
 | 
|  class LFastLiteral: public LTemplateInstruction<1, 1, 0> {
 | 
|   public:
 | 
|    explicit LFastLiteral(LOperand* context) {
 | 
| 
 |