[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp

Nate Begeman natebegeman at mac.com
Tue Mar 29 14:49:06 PST 2005



Changes in directory llvm/lib/Target/PowerPC:

PPC32ISelPattern.cpp updated: 1.16 -> 1.17
---
Log message:

Fix BranchCC (it's still dumb), and implement FP select (also dumb)


---
Diffs of the changes:  (+49 -4)

 PPC32ISelPattern.cpp |   53 +++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 49 insertions(+), 4 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.16 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.17
--- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.16	Tue Mar 29 16:24:51 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp	Tue Mar 29 16:48:55 2005
@@ -495,9 +495,10 @@
   Select(N.getOperand(0));  //chain
   SDOperand CC = N.getOperand(1);
   
-  //Giveup and do the stupid thing
+  //Give up and do the stupid thing
   unsigned Tmp1 = SelectExpr(CC);
-  BuildMI(BB, PPC::BNE, 2).addReg(Tmp1).addMBB(Dest);
+  BuildMI(BB, PPC::CMPLWI, 2, PPC::CR0).addReg(Tmp1).addImm(0);
+  BuildMI(BB, PPC::BNE, 2).addReg(PPC::CR0).addMBB(Dest);
   return;
 }
 
@@ -514,8 +515,52 @@
     Node->dump();
     assert(0 && "Node not handled!\n");
 
-  case ISD::SELECT:
-    abort();
+  case ISD::SELECT: {
+    Tmp1 = SelectExpr(N.getOperand(0)); //Cond
+
+    // FIXME: generate FSEL here
+
+    // Create an iterator with which to insert the MBB for copying the false 
+    // value and the MBB to hold the PHI instruction for this SetCC.
+    MachineBasicBlock *thisMBB = BB;
+    const BasicBlock *LLVM_BB = BB->getBasicBlock();
+    ilist<MachineBasicBlock>::iterator It = BB;
+    ++It;
+
+    //  thisMBB:
+    //  ...
+    //   TrueVal = ...
+    //   cmpTY cr0, r1, r2
+    //   bCC copy1MBB
+    //   fallthrough --> copy0MBB
+    BuildMI(BB, PPC::CMPLWI, 2, PPC::CR0).addReg(Tmp1).addImm(0);
+    MachineBasicBlock *copy0MBB = new MachineBasicBlock(LLVM_BB);
+    MachineBasicBlock *sinkMBB = new MachineBasicBlock(LLVM_BB);
+    unsigned TrueValue = SelectExpr(N.getOperand(1)); //Use if TRUE
+    BuildMI(BB, PPC::BNE, 2).addReg(PPC::CR0).addMBB(sinkMBB);
+    MachineFunction *F = BB->getParent();
+    F->getBasicBlockList().insert(It, copy0MBB);
+    F->getBasicBlockList().insert(It, sinkMBB);
+    // Update machine-CFG edges
+    BB->addSuccessor(copy0MBB);
+    BB->addSuccessor(sinkMBB);
+
+    //  copy0MBB:
+    //   %FalseValue = ...
+    //   # fallthrough to sinkMBB
+    BB = copy0MBB;
+    unsigned FalseValue = SelectExpr(N.getOperand(2)); //Use if FALSE
+    // Update machine-CFG edges
+    BB->addSuccessor(sinkMBB);
+
+    //  sinkMBB:
+    //   %Result = phi [ %FalseValue, copy0MBB ], [ %TrueValue, thisMBB ]
+    //  ...
+    BB = sinkMBB;
+    BuildMI(BB, PPC::PHI, 4, Result).addReg(FalseValue)
+      .addMBB(copy0MBB).addReg(TrueValue).addMBB(thisMBB);
+    return Result;
+  }
     
   case ISD::FP_ROUND:
     assert (DestType == MVT::f32 && 






More information about the llvm-commits mailing list