[llvm-commits] CVS: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp PPCISelLowering.cpp PPCISelLowering.h PPCInstrFormats.td PPCInstrInfo.td PPCRegisterInfo.td
Nate Begeman
natebegeman at mac.com
Mon Dec 19 16:26:12 PST 2005
Changes in directory llvm/lib/Target/PowerPC:
PPCISelDAGToDAG.cpp updated: 1.145 -> 1.146
PPCISelLowering.cpp updated: 1.51 -> 1.52
PPCISelLowering.h updated: 1.12 -> 1.13
PPCInstrFormats.td updated: 1.62 -> 1.63
PPCInstrInfo.td updated: 1.162 -> 1.163
PPCRegisterInfo.td updated: 1.27 -> 1.28
---
Log message:
Pattern-match return. Includes gross hack!
---
Diffs of the changes: (+45 -39)
PPCISelDAGToDAG.cpp | 23 -----------------------
PPCISelLowering.cpp | 27 +++++++++++++++++++--------
PPCISelLowering.h | 6 ++++--
PPCInstrFormats.td | 8 +++++---
PPCInstrInfo.td | 12 +++++++++---
PPCRegisterInfo.td | 8 ++++++++
6 files changed, 45 insertions(+), 39 deletions(-)
Index: llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
diff -u llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.145 llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.146
--- llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp:1.145 Mon Dec 19 17:40:42 2005
+++ llvm/lib/Target/PowerPC/PPCISelDAGToDAG.cpp Mon Dec 19 18:26:01 2005
@@ -1043,29 +1043,6 @@
Select(N->getOperand(3)),
getI32Imm(BROpc));
}
-
- case ISD::RET: {
- SDOperand Chain = Select(N->getOperand(0)); // Token chain.
-
- if (N->getNumOperands() == 2) {
- SDOperand Val = Select(N->getOperand(1));
- if (N->getOperand(1).getValueType() == MVT::i32) {
- Chain = CurDAG->getCopyToReg(Chain, PPC::R3, Val);
- } else {
- assert(MVT::isFloatingPoint(N->getOperand(1).getValueType()));
- Chain = CurDAG->getCopyToReg(Chain, PPC::F1, Val);
- }
- } else if (N->getNumOperands() > 1) {
- assert(N->getOperand(1).getValueType() == MVT::i32 &&
- N->getOperand(2).getValueType() == MVT::i32 &&
- N->getNumOperands() == 3 && "Unknown two-register ret value!");
- Chain = CurDAG->getCopyToReg(Chain, PPC::R4, Select(N->getOperand(1)));
- Chain = CurDAG->getCopyToReg(Chain, PPC::R3, Select(N->getOperand(2)));
- }
-
- // Finally, select this to a blr (return) instruction.
- return CurDAG->SelectNodeTo(N, PPC::BLR, MVT::Other, Chain);
- }
case ISD::BR_CC:
case ISD::BRTWOWAY_CC: {
SDOperand Chain = Select(N->getOperand(0));
Index: llvm/lib/Target/PowerPC/PPCISelLowering.cpp
diff -u llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.51 llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.52
--- llvm/lib/Target/PowerPC/PPCISelLowering.cpp:1.51 Mon Dec 19 17:25:09 2005
+++ llvm/lib/Target/PowerPC/PPCISelLowering.cpp Mon Dec 19 18:26:01 2005
@@ -793,15 +793,26 @@
SDOperand PPCTargetLowering::LowerReturnTo(SDOperand Chain, SDOperand Op,
SelectionDAG &DAG) {
- if (Op.getValueType() == MVT::i64) {
- SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op,
- DAG.getConstant(1, MVT::i32));
- SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op,
- DAG.getConstant(0, MVT::i32));
- return DAG.getNode(ISD::RET, MVT::Other, Chain, Lo, Hi);
- } else {
- return DAG.getNode(ISD::RET, MVT::Other, Chain, Op);
+ SDOperand Copy;
+ switch (Op.getValueType()) {
+ default: assert(0 && "Unknown type to return!");
+ case MVT::i32:
+ Copy = DAG.getCopyToReg(Chain, PPC::R3, Op, SDOperand());
+ break;
+ case MVT::f32:
+ case MVT::f64:
+ Copy = DAG.getCopyToReg(Chain, PPC::F1, Op, SDOperand());
+ break;
+ case MVT::i64:
+ SDOperand Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op,
+ DAG.getConstant(1, MVT::i32));
+ SDOperand Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, MVT::i32, Op,
+ DAG.getConstant(0, MVT::i32));
+ Copy = DAG.getCopyToReg(Chain, PPC::R3, Hi, SDOperand());
+ Copy = DAG.getCopyToReg(Copy, PPC::R4, Lo, Copy.getValue(1));
+ break;
}
+ return DAG.getNode(PPCISD::RET_FLAG, MVT::Other, Copy, Copy.getValue(1));
}
SDOperand PPCTargetLowering::LowerVAStart(SDOperand Chain, SDOperand VAListP,
Index: llvm/lib/Target/PowerPC/PPCISelLowering.h
diff -u llvm/lib/Target/PowerPC/PPCISelLowering.h:1.12 llvm/lib/Target/PowerPC/PPCISelLowering.h:1.13
--- llvm/lib/Target/PowerPC/PPCISelLowering.h:1.12 Tue Dec 13 16:55:21 2005
+++ llvm/lib/Target/PowerPC/PPCISelLowering.h Mon Dec 19 18:26:01 2005
@@ -54,12 +54,14 @@
/// at function entry, used for PIC code.
GlobalBaseReg,
-
/// These nodes represent the 32-bit PPC shifts that operate on 6-bit
/// shift amounts. These nodes are generated by the multi-precision shift
/// code.
SRL, SRA, SHL,
- };
+
+ /// Return with a flag operand, matched by 'blr'
+ RET_FLAG,
+};
}
class PPCTargetLowering : public TargetLowering {
Index: llvm/lib/Target/PowerPC/PPCInstrFormats.td
diff -u llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.62 llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.63
--- llvm/lib/Target/PowerPC/PPCInstrFormats.td:1.62 Tue Dec 13 18:34:09 2005
+++ llvm/lib/Target/PowerPC/PPCInstrFormats.td Mon Dec 19 18:26:01 2005
@@ -328,12 +328,14 @@
}
class XLForm_2<bits<6> opcode, bits<10> xo, bit lk, dag OL, string asmstr,
- InstrItinClass itin>
+ InstrItinClass itin, list<dag> pattern>
: I<opcode, OL, asmstr, itin> {
bits<5> BO;
bits<5> BI;
bits<2> BH;
+ let Pattern = pattern;
+
let Inst{6-10} = BO;
let Inst{11-15} = BI;
let Inst{16-18} = 0;
@@ -343,8 +345,8 @@
}
class XLForm_2_ext<bits<6> opcode, bits<10> xo, bits<5> bo, bits<5> bi, bit lk,
- dag OL, string asmstr, InstrItinClass itin>
- : XLForm_2<opcode, xo, lk, OL, asmstr, itin> {
+ dag OL, string asmstr, InstrItinClass itin, list<dag> pattern>
+ : XLForm_2<opcode, xo, lk, OL, asmstr, itin, pattern> {
let BO = bo;
let BI = bi;
let BH = 0;
Index: llvm/lib/Target/PowerPC/PPCInstrInfo.td
diff -u llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.162 llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.163
--- llvm/lib/Target/PowerPC/PPCInstrInfo.td:1.162 Mon Dec 19 17:25:09 2005
+++ llvm/lib/Target/PowerPC/PPCInstrInfo.td Mon Dec 19 18:26:01 2005
@@ -46,6 +46,9 @@
def callseq_start : SDNode<"ISD::CALLSEQ_START", SDT_PPCCallSeq,[SDNPHasChain]>;
def callseq_end : SDNode<"ISD::CALLSEQ_END", SDT_PPCCallSeq,[SDNPHasChain]>;
+def SDT_PPCRetFlag : SDTypeProfile<0, 1, [ SDTCisVT<0, FlagVT>]>;
+def retflag : SDNode<"PPCISD::RET_FLAG", SDT_PPCRetFlag, [SDNPHasChain]>;
+
//===----------------------------------------------------------------------===//
// PowerPC specific transformation functions and pattern fragments.
//
@@ -221,8 +224,8 @@
let isTerminator = 1 in {
let isReturn = 1 in
- def BLR : XLForm_2_ext<19, 16, 20, 0, 0, (ops), "blr", BrB>;
- def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, (ops), "bctr", BrB>;
+ def BLR : XLForm_2_ext<19, 16, 20, 0, 0, (ops), "blr", BrB, [(ret)]>;
+ def BCTR : XLForm_2_ext<19, 528, 20, 0, 0, (ops), "bctr", BrB, []>;
}
let Defs = [LR] in
@@ -267,7 +270,8 @@
"bl $func", BrB, []>;
def BLA : IForm<18, 1, 1, (ops aaddr:$func, variable_ops),
"bla $func", BrB, []>;
- def BCTRL : XLForm_2_ext<19, 528, 20, 0, 1, (ops variable_ops), "bctrl", BrB>;
+ def BCTRL : XLForm_2_ext<19, 528, 20, 0, 1, (ops variable_ops), "bctrl", BrB,
+ []>;
}
// D-Form instructions. Most instructions that perform an operation on a
@@ -1052,6 +1056,8 @@
def : Pat<(f64 (extload xaddr:$src, f32)),
(FMRSD (LFSX xaddr:$src))>;
+def : Pat<(retflag FLAG), (BLR)>;
+
// Same as above, but using a temporary. FIXME: implement temporaries :)
/*
def : Pattern<(xor GPRC:$in, imm:$imm),
Index: llvm/lib/Target/PowerPC/PPCRegisterInfo.td
diff -u llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.27 llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.28
--- llvm/lib/Target/PowerPC/PPCRegisterInfo.td:1.27 Fri Dec 16 03:19:13 2005
+++ llvm/lib/Target/PowerPC/PPCRegisterInfo.td Mon Dec 19 18:26:01 2005
@@ -132,6 +132,14 @@
// VRsave register
def VRSAVE: SPR<256, "VRsave">;
+// FIXME:
+// HACKTROCITY: define a flags reg class for things that need to take a flag.
+// this should really be handled by tablgen.
+def FLAG: SPR<1023, "Flag">;
+def FLAGRC : RegisterClass<"PPC", [FlagVT], 32, [FLAG]> {
+ let Size = 32;
+}
+
/// Register classes
// Allocate volatiles first
// then nonvolatiles in reverse order since stmw/lmw save from rN to r31
More information about the llvm-commits
mailing list