MIPS: Save and restore callee-saved FP registers in cctest/ConvertDToI.
authorakos.palfi <akos.palfi@imgtec.com>
Fri, 11 Sep 2015 15:31:08 +0000 (08:31 -0700)
committerCommit bot <commit-bot@chromium.org>
Fri, 11 Sep 2015 15:31:20 +0000 (15:31 +0000)
Correctly save and restore FP registers in cctest/ConvertDToI to
avoid accidental register overwriting by the generated code.

Note: This failure is manifested only in R6 mode.

TEST=test/cctest/interpreter/test-interpreter
BUG=

Review URL: https://codereview.chromium.org/1337023002

Cr-Commit-Position: refs/heads/master@{#30700}

test/cctest/test-code-stubs-mips.cc
test/cctest/test-code-stubs-mips64.cc

index 796aa1d..eb3ba02 100644 (file)
@@ -62,6 +62,11 @@ ConvertDToIFunc MakeConvertDToIFuncTrampoline(Isolate* isolate,
   // Save callee save registers.
   __ MultiPush(kCalleeSaved | ra.bit());
 
+  // Save callee-saved FPU registers.
+  __ MultiPushFPU(kCalleeSavedFPU);
+  // Set up the reserved register for 0.0.
+  __ Move(kDoubleRegZero, 0.0);
+
   // For softfp, move the input value into f12.
   if (IsMipsSoftFloatABI) {
     __ Move(f12, a0, a1);
@@ -117,6 +122,9 @@ ConvertDToIFunc MakeConvertDToIFuncTrampoline(Isolate* isolate,
   __ Branch(&ok, eq, v0, Operand(zero_reg));
   __ bind(&ok);
 
+  // Restore callee-saved FPU registers.
+  __ MultiPopFPU(kCalleeSavedFPU);
+
   // Restore callee save registers.
   __ MultiPop(kCalleeSaved | ra.bit());
 
index 9f146f6..1415cec 100644 (file)
@@ -62,6 +62,11 @@ ConvertDToIFunc MakeConvertDToIFuncTrampoline(Isolate* isolate,
   // Save callee save registers.
   __ MultiPush(kCalleeSaved | ra.bit());
 
+  // Save callee-saved FPU registers.
+  __ MultiPushFPU(kCalleeSavedFPU);
+  // Set up the reserved register for 0.0.
+  __ Move(kDoubleRegZero, 0.0);
+
   // For softfp, move the input value into f12.
   if (IsMipsSoftFloatABI) {
     __ Move(f12, a0, a1);
@@ -117,6 +122,9 @@ ConvertDToIFunc MakeConvertDToIFuncTrampoline(Isolate* isolate,
   __ Branch(&ok, eq, v0, Operand(zero_reg));
   __ bind(&ok);
 
+  // Restore callee-saved FPU registers.
+  __ MultiPopFPU(kCalleeSavedFPU);
+
   // Restore callee save registers.
   __ MultiPop(kCalleeSaved | ra.bit());