ARM: Fix context save/restore for VFP registers.
BUG=none TEST=none Review URL: http://codereview.chromium.org//7217011 Patch from Martyn Capewell <m.m.capewell@googlemail.com>. git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@8357 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
31ce5cca07
commit
42a87564c3
@ -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 {
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user