| Index: src/arm/code-stubs-arm.cc | 
| diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc | 
| index 9484f85f97e38ff87de543ec4c25dee3b9d6984e..800c0f132dab246a27ca5541101c427d12eb1c10 100644 | 
| --- a/src/arm/code-stubs-arm.cc | 
| +++ b/src/arm/code-stubs-arm.cc | 
| @@ -37,6 +37,23 @@ namespace v8 { | 
| namespace internal { | 
|  | 
|  | 
| +CodeStubInterfaceDescriptor* | 
| +    KeyedLoadFastElementStub::GetInterfaceDescriptor(Isolate* isolate) { | 
| +  static CodeStubInterfaceDescriptor* result = NULL; | 
| +  if (result == NULL) { | 
| +    Handle<Code> miss = isolate->builtins()->KeyedLoadIC_Miss(); | 
| +    static Register registers[] = { r1, r0 }; | 
| +    static CodeStubInterfaceDescriptor info = { | 
| +      2, | 
| +      registers, | 
| +      miss | 
| +    }; | 
| +    result = &info; | 
| +  } | 
| +  return result; | 
| +} | 
| + | 
| + | 
| #define __ ACCESS_MASM(masm) | 
|  | 
| static void EmitIdenticalObjectComparison(MacroAssembler* masm, | 
| @@ -503,7 +520,7 @@ void FastCloneShallowObjectStub::Generate(MacroAssembler* masm) { | 
| // 52 fraction bits (20 in the first word, 32 in the second).  Zeros is a | 
| // scratch register.  Destroys the source register.  No GC occurs during this | 
| // stub so you don't have to set up the frame. | 
| -class ConvertToDoubleStub : public CodeStub { | 
| +class ConvertToDoubleStub : public PlatformCodeStub { | 
| public: | 
| ConvertToDoubleStub(Register result_reg_1, | 
| Register result_reg_2, | 
| @@ -3568,10 +3585,10 @@ void MathPowStub::Generate(MacroAssembler* masm) { | 
| const Register exponent = r2; | 
| const Register heapnumbermap = r5; | 
| const Register heapnumber = r0; | 
| -  const DoubleRegister double_base = d1; | 
| -  const DoubleRegister double_exponent = d2; | 
| -  const DoubleRegister double_result = d3; | 
| -  const DoubleRegister double_scratch = d0; | 
| +  const DwVfpRegister double_base = d1; | 
| +  const DwVfpRegister double_exponent = d2; | 
| +  const DwVfpRegister double_result = d3; | 
| +  const DwVfpRegister double_scratch = d0; | 
| const SwVfpRegister single_scratch = s0; | 
| const Register scratch = r9; | 
| const Register scratch2 = r7; | 
| @@ -3781,12 +3798,29 @@ void CodeStub::GenerateStubsAheadOfTime() { | 
|  | 
|  | 
| void CodeStub::GenerateFPStubs() { | 
| -  CEntryStub save_doubles(1, kSaveFPRegs); | 
| -  Handle<Code> code = save_doubles.GetCode(); | 
| -  code->set_is_pregenerated(true); | 
| -  StoreBufferOverflowStub stub(kSaveFPRegs); | 
| -  stub.GetCode()->set_is_pregenerated(true); | 
| -  code->GetIsolate()->set_fp_stubs_generated(true); | 
| +  SaveFPRegsMode mode = CpuFeatures::IsSupported(VFP2) | 
| +      ? kSaveFPRegs | 
| +      : kDontSaveFPRegs; | 
| +  CEntryStub save_doubles(1, mode); | 
| +  StoreBufferOverflowStub stub(mode); | 
| +  // These stubs might already be in the snapshot, detect that and don't | 
| +  // regenerate, which would lead to code stub initialization state being messed | 
| +  // up. | 
| +  Code* save_doubles_code = NULL; | 
| +  Code* store_buffer_overflow_code = NULL; | 
| +  if (!save_doubles.FindCodeInCache(&save_doubles_code, ISOLATE)) { | 
| +    if (CpuFeatures::IsSupported(VFP2)) { | 
| +      CpuFeatures::Scope scope2(VFP2); | 
| +      save_doubles_code = *save_doubles.GetCode(); | 
| +      store_buffer_overflow_code = *stub.GetCode(); | 
| +    } else { | 
| +      save_doubles_code = *save_doubles.GetCode(); | 
| +      store_buffer_overflow_code = *stub.GetCode(); | 
| +    } | 
| +    save_doubles_code->set_is_pregenerated(true); | 
| +    store_buffer_overflow_code->set_is_pregenerated(true); | 
| +  } | 
| +  ISOLATE->set_fp_stubs_generated(true); | 
| } | 
|  | 
|  | 
|  |