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

Nate Begeman natebegeman at mac.com
Tue Mar 29 14:25:02 PST 2005



Changes in directory llvm/lib/Target/PowerPC:

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

Implement integer select and i1 sign extend


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

 PPC32ISelPattern.cpp |   51 +++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 49 insertions(+), 2 deletions(-)


Index: llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp
diff -u llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.15 llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.16
--- llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp:1.15	Tue Mar 29 15:54:38 2005
+++ llvm/lib/Target/PowerPC/PPC32ISelPattern.cpp	Tue Mar 29 16:24:51 2005
@@ -853,6 +853,9 @@
     case MVT::i8:   
       BuildMI(BB, PPC::EXTSB, 1, Result).addReg(Tmp1); 
       break;
+    case MVT::i1:
+      BuildMI(BB, PPC::SUBFIC, 2, Result).addReg(Tmp1).addSImm(0);
+      break;
     }
     return Result;
     
@@ -1097,8 +1100,52 @@
     assert(0 && "Is this legal?");
     return 0;
     
-  case ISD::SELECT:
-    abort();
+  case ISD::SELECT: {
+    Tmp1 = SelectExpr(N.getOperand(0)); //Cond
+
+    // 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);
+
+    // FIXME: Select i64?
+    return Result;
+  }
 
   case ISD::Constant:
     switch (N.getValueType()) {






More information about the llvm-commits mailing list