PPC: Fix "[turbofan] Support unboxed float and double stack parameters."
authormbrandy <mbrandy@us.ibm.com>
Wed, 26 Aug 2015 20:13:56 +0000 (13:13 -0700)
committerCommit bot <commit-bot@chromium.org>
Wed, 26 Aug 2015 20:14:12 +0000 (20:14 +0000)
R=titzer@chromium.org, jyan@ca.ibm.com, dstence@us.ibm.com, joransiu@ca.ibm.com
BUG=

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

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

src/compiler/ppc/code-generator-ppc.cc
src/compiler/ppc/instruction-selector-ppc.cc

index bf13c4b..3baf621 100644 (file)
@@ -981,7 +981,13 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
       break;
     case kPPC_PushFrame: {
       int num_slots = i.InputInt32(1);
-      __ StorePU(i.InputRegister(0), MemOperand(sp, -num_slots * kPointerSize));
+      if (instr->InputAt(0)->IsDoubleRegister()) {
+        __ stfdu(i.InputDoubleRegister(0),
+                 MemOperand(sp, -num_slots * kPointerSize));
+      } else {
+        __ StorePU(i.InputRegister(0),
+                   MemOperand(sp, -num_slots * kPointerSize));
+      }
       break;
     }
     case kPPC_StoreToStackSlot: {
@@ -1338,6 +1344,8 @@ void CodeGenerator::AssemblePrologue() {
     __ StubPrologue();
     frame()->SetRegisterSaveAreaSize(
         StandardFrameConstants::kFixedFrameSizeFromFp);
+  } else {
+    frame()->SetPCOnStack(false);
   }
 
   if (info()->is_osr()) {
@@ -1384,6 +1392,7 @@ void CodeGenerator::AssembleReturn() {
       const RegList saves = descriptor->CalleeSavedRegisters() & ~frame_saves;
       __ MultiPop(saves);
     }
+    __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
   } else if (descriptor->IsJSFunctionCall() || needs_frame_) {
     // Canonicalize JSFunction return sites for now.
     if (return_label_.is_bound()) {
@@ -1391,9 +1400,11 @@ void CodeGenerator::AssembleReturn() {
       return;
     } else {
       __ bind(&return_label_);
+      __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
     }
+  } else {
+    __ Drop(pop_count);
   }
-  __ LeaveFrame(StackFrame::MANUAL, pop_count * kPointerSize);
   __ Ret();
 }
 
index 194b95f..197dcc1 100644 (file)
@@ -1477,14 +1477,16 @@ void InstructionSelector::VisitCall(Node* node, BasicBlock* handler) {
     int num_slots = static_cast<int>(descriptor->StackParameterCount());
     int slot = 0;
     for (Node* input : buffer.pushed_nodes) {
-      // Skip any alignment holes in pushed nodes.
-      if (input == nullptr) continue;
       if (slot == 0) {
+        DCHECK(input);
         Emit(kPPC_PushFrame, g.NoOutput(), g.UseRegister(input),
              g.TempImmediate(num_slots));
       } else {
-        Emit(kPPC_StoreToStackSlot, g.NoOutput(), g.UseRegister(input),
-             g.TempImmediate(slot));
+        // Skip any alignment holes in pushed nodes.
+        if (input) {
+          Emit(kPPC_StoreToStackSlot, g.NoOutput(), g.UseRegister(input),
+               g.TempImmediate(slot));
+        }
       }
       ++slot;
     }
@@ -1580,9 +1582,17 @@ void InstructionSelector::VisitTailCall(Node* node) {
     InitializeCallBuffer(node, &buffer, true, false);
 
     // Push any stack arguments.
-    for (Node* input : base::Reversed(buffer.pushed_nodes)) {
-      if (input == nullptr) continue;
-      Emit(kPPC_Push, g.NoOutput(), g.UseRegister(input));
+    int num_slots = static_cast<int>(descriptor->StackParameterCount());
+    int slot = 0;
+    for (Node* input : buffer.pushed_nodes) {
+      if (slot == 0) {
+        Emit(kPPC_PushFrame, g.NoOutput(), g.UseRegister(input),
+             g.TempImmediate(num_slots));
+      } else {
+        Emit(kPPC_StoreToStackSlot, g.NoOutput(), g.UseRegister(input),
+             g.TempImmediate(slot));
+      }
+      ++slot;
     }
 
     // Select the appropriate opcode based on the call type.