Chromium Code Reviews| 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..0fedeb54f778b01ea16fe8a7d92c289a2deca993 100644 |
| --- a/src/arm/code-stubs-arm.cc |
| +++ b/src/arm/code-stubs-arm.cc |
| @@ -37,6 +37,24 @@ namespace v8 { |
| namespace internal { |
| +CodeStubInterfaceDescriptor* |
| +KeyedLoadFastElementStub::GetInterfaceDescriptor(Isolate* isolate) { |
|
Jakob Kummerow
2012/11/28 16:28:22
nit: indentation please
danno
2012/11/30 16:23:24
Done.
|
| + static bool initialized = false; |
| + static CodeStubInterfaceDescriptor* result; |
| + if (!initialized) { |
| + 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 +521,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 +3586,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 +3799,28 @@ 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 leads to code stub initialization state being messed up. |
|
Jakob Kummerow
2012/11/28 16:28:22
s/leads/would lead/?
danno
2012/11/30 16:23:24
Done.
|
| + 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); |
| } |