Revision: 8407
Author:   [email protected]
Date:     Fri Jun 24 04:53:35 2011
Log:      Merge r8357 to 3.2 branch

r8357: ARM: Fix context save/restore for VFP registers.

[email protected]

BUG=none
TEST=none
Review URL: http://codereview.chromium.org/7241020
http://code.google.com/p/v8/source/detail?r=8407

Modified:
 /branches/3.2/src/arm/assembler-arm.h
 /branches/3.2/src/arm/code-stubs-arm.cc
 /branches/3.2/src/arm/frames-arm.h
 /branches/3.2/src/version.cc

=======================================
--- /branches/3.2/src/arm/assembler-arm.h       Mon Apr 11 05:33:05 2011
+++ /branches/3.2/src/arm/assembler-arm.h       Fri Jun 24 04:53:35 2011
@@ -302,6 +302,10 @@
 const DwVfpRegister d14 = { 14 };
 const DwVfpRegister d15 = { 15 };

+// Aliases for double registers.
+const DwVfpRegister kFirstCalleeSavedDoubleReg = d8;
+const DwVfpRegister kLastCalleeSavedDoubleReg = d15;
+

 // Coprocessor register
 struct CRegister {
=======================================
--- /branches/3.2/src/arm/code-stubs-arm.cc     Wed May 18 05:48:35 2011
+++ /branches/3.2/src/arm/code-stubs-arm.cc     Fri Jun 24 04:53:35 2011
@@ -3413,12 +3413,24 @@
   // 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
@@ -3543,6 +3555,13 @@
     __ 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());
 }

=======================================
--- /branches/3.2/src/arm/frames-arm.h  Mon Apr  4 01:25:31 2011
+++ /branches/3.2/src/arm/frames-arm.h  Fri Jun 24 04:53:35 2011
@@ -72,6 +72,9 @@

 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.
=======================================
--- /branches/3.2/src/version.cc        Fri Jun 24 01:20:24 2011
+++ /branches/3.2/src/version.cc        Fri Jun 24 04:53:35 2011
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     2
 #define BUILD_NUMBER      10
-#define PATCH_LEVEL       22
+#define PATCH_LEVEL       23
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
 #define IS_CANDIDATE_VERSION 0

--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev

Reply via email to