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); |
} |