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