Changes in directory llvm/lib/Target/PowerPC:
PPCAsmPrinter.cpp updated: 1.130 -> 1.131 PPCISelDAGToDAG.cpp updated: 1.144 -> 1.145 --- Log message: Fix a couple of the FIXMEs, thanks to suggestion from Chris. This allows us to load and store vectors directly at a pointer (offset of zero) by using r0 as the base register. This also requires some asm printer work to satisfy the darwin assembler. For void %foo(<4 x float> * %a) { entry: %tmp1 = load <4 x float> * %a; %tmp2 = add <4 x float> %tmp1, %tmp1 store <4 x float> %tmp2, <4 x float> *%a ret void } We now produce: _foo: lvx v0, 0, r3 vaddfp v0, v0, v0 stvx v0, 0, r3 blr Instead of: _foo: li r2, 0 lvx v0, r2, r3 vaddfp v0, v0, v0 stvx v0, r2, r3 blr --- Diffs of the changes: (+10 -5) PPCAsmPrinter.cpp | 9 ++++++++- PPCISelDAGToDAG.cpp | 6 ++---- 2 files changed, 10 insertions(+), 5 deletions(-) Index: llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp diff -u llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.130 llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.131 --- llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp:1.130 Mon Dec 19 17:25:09 2005 +++ llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp Mon Dec 19 17:40:42 2005 @@ -189,7 +189,14 @@ O << ')'; } void printMemRegReg(const MachineInstr *MI, unsigned OpNo) { - printOperand(MI, OpNo); + // When used as the base register, r0 reads constant zero rather than + // the value contained in the register. For this reason, the darwin + // assembler requires that we print r0 as 0 (no r) when used as the base. + const MachineOperand &MO = MI->getOperand(OpNo); + if (MO.getReg() == PPC::R0) + O << '0'; + else + O << TM.getRegisterInfo()->get(MO.getReg()).Name; O << ", "; printOperand(MI, OpNo+1); } Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.144 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.145 --- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.144 Mon Dec 19 17:25:09 2005 +++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Mon Dec 19 17:40:42 2005 @@ -454,8 +454,7 @@ return true; } - // FIXME: This should be a CopyFromReg R0 rather than a load of 0. - Base = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); + Base = CurDAG->getRegister(PPC::R0, MVT::i32); Index = Select(N); return true; } @@ -470,8 +469,7 @@ return true; } - // FIXME: This should be a CopyFromReg R0 rather than a load of 0. - Base = CurDAG->getTargetNode(PPC::LI, MVT::i32, getI32Imm(0)); + Base = CurDAG->getRegister(PPC::R0, MVT::i32); Index = Select(N); return true; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits