[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