From: sgjesse@chromium.org Date: Wed, 22 Jun 2011 06:24:34 +0000 (+0000) Subject: ARM: Fix context save/restore for VFP registers. X-Git-Tag: upstream/4.7.83~19105 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=42a87564c3836663eff13414ca45e9f3bc97d628;p=platform%2Fupstream%2Fv8.git ARM: Fix context save/restore for VFP registers. BUG=none TEST=none Review URL: http://codereview.chromium.org//7217011 Patch from Martyn Capewell . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8357 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/arm/assembler-arm.h b/src/arm/assembler-arm.h index 1989f10f4..51a114fa6 100644 --- a/src/arm/assembler-arm.h +++ b/src/arm/assembler-arm.h @@ -303,6 +303,10 @@ const DwVfpRegister d13 = { 13 }; const DwVfpRegister d14 = { 14 }; const DwVfpRegister d15 = { 15 }; +// Aliases for double registers. +const DwVfpRegister kFirstCalleeSavedDoubleReg = d8; +const DwVfpRegister kLastCalleeSavedDoubleReg = d15; + // Coprocessor register struct CRegister { diff --git a/src/arm/code-stubs-arm.cc b/src/arm/code-stubs-arm.cc index c99c5abcd..4bc33239b 100644 --- a/src/arm/code-stubs-arm.cc +++ b/src/arm/code-stubs-arm.cc @@ -3550,12 +3550,24 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { // Save callee-saved registers (incl. cp and fp), sp, and lr __ stm(db_w, sp, kCalleeSaved | lr.bit()); + if (CpuFeatures::IsSupported(VFP3)) { + CpuFeatures::Scope scope(VFP3); + // Save callee-saved vfp registers. + __ vstm(db_w, sp, kFirstCalleeSavedDoubleReg, kLastCalleeSavedDoubleReg); + } + // Get address of argv, see stm above. // r0: code entry // r1: function // r2: receiver // r3: argc - __ ldr(r4, MemOperand(sp, (kNumCalleeSaved + 1) * kPointerSize)); // argv + + // Setup argv in r4. + int offset_to_argv = (kNumCalleeSaved + 1) * kPointerSize; + if (CpuFeatures::IsSupported(VFP3)) { + offset_to_argv += kNumDoubleCalleeSaved * kDoubleSize; + } + __ ldr(r4, MemOperand(sp, offset_to_argv)); // Push a frame with special values setup to mark it as an entry frame. // r0: code entry @@ -3680,6 +3692,13 @@ void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { __ mov(lr, Operand(pc)); } #endif + + if (CpuFeatures::IsSupported(VFP3)) { + CpuFeatures::Scope scope(VFP3); + // Restore callee-saved vfp registers. + __ vldm(ia_w, sp, kFirstCalleeSavedDoubleReg, kLastCalleeSavedDoubleReg); + } + __ ldm(ia_w, sp, kCalleeSaved | pc.bit()); } diff --git a/src/arm/frames-arm.h b/src/arm/frames-arm.h index d6846c850..84e108b3d 100644 --- a/src/arm/frames-arm.h +++ b/src/arm/frames-arm.h @@ -72,6 +72,9 @@ static const RegList kCalleeSaved = static const int kNumCalleeSaved = 7 + kR9Available; +// Double registers d8 to d15 are callee-saved. +static const int kNumDoubleCalleeSaved = 8; + // Number of registers for which space is reserved in safepoints. Must be a // multiple of 8.