diff options
| author | Nate Begeman <natebegeman@mac.com> | 2005-12-19 23:40:42 +0000 |
|---|---|---|
| committer | Nate Begeman <natebegeman@mac.com> | 2005-12-19 23:40:42 +0000 |
| commit | c126397a69b88e765a63ef5e4266699421b77f89 (patch) | |
| tree | 9bc045af499bd07f15bed33fb4c8b5009289d215 /llvm/lib | |
| parent | 8e6a8af205c7be4d8003398e37096e8375ffea37 (diff) | |
| download | bcm5719-llvm-c126397a69b88e765a63ef5e4266699421b77f89.tar.gz bcm5719-llvm-c126397a69b88e765a63ef5e4266699421b77f89.zip | |
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
llvm-svn: 24872
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp | 9 | ||||
| -rw-r--r-- | llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 6 |
2 files changed, 10 insertions, 5 deletions
diff --git a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp index 9cf686353a6..717b831086d 100644 --- a/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp +++ b/llvm/lib/Target/PowerPC/PPCAsmPrinter.cpp @@ -189,7 +189,14 @@ namespace { 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); } diff --git a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index b9550f50fa4..338be660808 100644 --- a/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -454,8 +454,7 @@ bool PPCDAGToDAGISel::SelectAddrIdx(SDOperand N, SDOperand &Base, 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 @@ bool PPCDAGToDAGISel::SelectAddrIdxOnly(SDOperand N, SDOperand &Base, 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; } |

