[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