[llvm-commits] [llvm] r67371 - in /llvm/trunk/lib/Target/PIC16: PIC16ISelLowering.cpp PIC16ISelLowering.h
Sanjiv Gupta
sanjiv.gupta at microchip.com
Fri Mar 20 06:42:22 PDT 2009
Author: sgupta
Date: Fri Mar 20 08:42:20 2009
New Revision: 67371
URL: http://llvm.org/viewvc/llvm-project?rev=67371&view=rev
Log:
Reformatting. Inserted code comments. Cleaned interfaces.
Removed unncessary code. No functionality change.
Modified:
llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.cpp
llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.h
Modified: llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.cpp?rev=67371&r1=67370&r2=67371&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.cpp (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.cpp Fri Mar 20 08:42:20 2009
@@ -142,6 +142,41 @@
computeRegisterProperties();
}
+// getOutFlag - Extract the flag result if the Op has it.
+static SDValue getOutFlag(SDValue &Op) {
+ // Flag is the last value of the node.
+ SDValue Flag = Op.getValue(Op.getNode()->getNumValues() - 1);
+
+ assert (Flag.getValueType() == MVT::Flag
+ && "Node does not have an out Flag");
+
+ return Flag;
+}
+
+// To extract chain value from the SDValue Nodes
+// This function will help to maintain the chain extracting
+// code at one place. In case of any change in future it will
+// help maintain the code.
+static SDValue getChain(SDValue &Op) {
+ SDValue Chain = Op.getValue(Op.getNode()->getNumValues() - 1);
+
+ // If the last value returned in Flag then the chain is
+ // second last value returned.
+ if (Chain.getValueType() == MVT::Flag)
+ Chain = Op.getValue(Op.getNode()->getNumValues() - 2);
+
+ // All nodes may not produce a chain. Therefore following assert
+ // verifies that the node is returning a chain only.
+ assert (Chain.getValueType() == MVT::Other
+ && "Node does not have a chain");
+
+ return Chain;
+}
+
+/// PopulateResults - Helper function to LowerOperation.
+/// If a node wants to return multiple results after lowering,
+/// it stuffs them into an array of SDValue called Results.
+
static void PopulateResults(SDValue N, SmallVectorImpl<SDValue>&Results) {
if (N.getOpcode() == ISD::MERGE_VALUES) {
int NumResults = N.getNumOperands();
@@ -156,6 +191,8 @@
return MVT::i8;
}
+/// FIXME: These three functions below should not be here if we change
+/// the generic code to allow generting libcalls for I8 types as well.
void
PIC16TargetLowering::setPIC16LibcallName(PIC16ISD::PIC16Libcall Call,
@@ -195,47 +232,6 @@
return CallInfo.first;
}
-SDValue
-PIC16TargetLowering::getCurrentFrame(SelectionDAG &DAG) {
- MachineFunction &MF = DAG.getMachineFunction();
- const Function *Func = MF.getFunction();
- const std::string FuncName = Func->getName();
-
- // this is causing memory waste
- // because for every call new memory will be allocated
- char *tmpName = new char [strlen(FuncName.c_str()) + 6];
- sprintf(tmpName, "%s.tmp", FuncName.c_str());
-
- // if the external symbol of the same name already exists then
- // it will not create the new one.
- return DAG.getTargetExternalSymbol(tmpName, MVT::i8);
-}
-
-void
-PIC16TargetLowering::getCurrentFrameIndex(SelectionDAG &DAG, SDValue &ES,
- unsigned SlotSize, int &FromFI) {
- MachineFunction &MF = DAG.getMachineFunction();
- const Function *Func = MF.getFunction();
- const std::string FuncName = Func->getName();
-
- // this is causing memory waste
- // because for every call new memory will be allocated
- char *tmpName = new char [strlen(FuncName.c_str()) + 6];
- sprintf(tmpName, "%s.tmp", FuncName.c_str());
-
- // if the external symbol of the same name already exists then
- // it will not create the new one.
- ES = DAG.getTargetExternalSymbol(tmpName, MVT::i8);
-
- // Alignment is always 1
- //FromFI = MF.getFrameInfo()->CreateStackObject(SlotSize, 1);
- FromFI = MF.getFrameInfo()->CreateStackObject(1, 1);
- int FI;
- for(unsigned i=1;i<SlotSize; ++i) {
- FI = MF.getFrameInfo()->CreateStackObject(1, 1);
- }
-}
-
const char *PIC16TargetLowering::getTargetNodeName(unsigned Opcode) const {
switch (Opcode) {
default: return NULL;
@@ -477,51 +473,24 @@
return false;
}
-// Extract the out flag
-SDValue PIC16TargetLowering::getOutFlag(SDValue &Op) {
- SDValue Flag = Op.getValue(Op.getNode()->getNumValues() - 1);
-
- assert (Flag.getValueType() == MVT::Flag && "Node does not have an out Flag");
-
- return Flag;
-}
-
-// To extract chain value from the SDValue Nodes
-// This function will help to maintain the chain extracting
-// code at one place. In case of any change in future it will
-// help maintain the code.
-SDValue PIC16TargetLowering::getChain(SDValue &Op) {
- SDValue Chain = Op.getValue(Op.getNode()->getNumValues() - 1);
-
- // If the last value returned in Flag then the chain is
- // second last value returned.
- if (Chain.getValueType() == MVT::Flag)
- Chain = Op.getValue(Op.getNode()->getNumValues() - 2);
-
- // All nodes may not produce a chain. Therefore following assert
- // verifies that the node is returning a chain only.
- assert (Chain.getValueType() == MVT::Other && "Node does not have a chain");
- return Chain;
-}
+// GetExpandedParts - This function is on the similiar lines as
+// the GetExpandedInteger in type legalizer is. This returns expanded
+// parts of Op in Lo and Hi.
void PIC16TargetLowering::GetExpandedParts(SDValue Op, SelectionDAG &DAG,
SDValue &Lo, SDValue &Hi) {
SDNode *N = Op.getNode();
DebugLoc dl = N->getDebugLoc();
- MVT NewVT;
- std::vector<SDValue> Opers;
- NewVT = getTypeToTransformTo(N->getValueType(0));
-
- // extract the lo component
- Opers.push_back(Op);
- Opers.push_back(DAG.getConstant(0,MVT::i8));
- Lo = DAG.getNode(ISD::EXTRACT_ELEMENT,dl,NewVT,&Opers[0],Opers.size());
+ MVT NewVT = getTypeToTransformTo(N->getValueType(0));
+
+ // Extract the lo component.
+ Lo = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, NewVT, Op,
+ DAG.getConstant(0, MVT::i8));
+
// extract the hi component
- Opers.clear();
- Opers.push_back(Op);
- Opers.push_back(DAG.getConstant(1,MVT::i8));
- Hi = DAG.getNode(ISD::EXTRACT_ELEMENT,dl,NewVT,&Opers[0],Opers.size());
+ Hi = DAG.getNode(ISD::EXTRACT_ELEMENT, dl, NewVT, Op,
+ DAG.getConstant(1, MVT::i8));
}
// Legalize FrameIndex into ExternalSymbol and offset.
@@ -621,19 +590,6 @@
return;
}
-//SDValue PIC16TargetLowering::ExpandAdd(SDNode *N, SelectionDAG &DAG) {
- //SDValue OperLeft = N->getOperand(0);
- //SDValue OperRight = N->getOperand(1);
-
- //if((OperLeft.getOpcode() == ISD::Constant) ||
- //(OperRight.getOpcode() == ISD::Constant)) {
- //return SDValue();
- //}
-
- // These case are yet to be handled
- //return SDValue();
-//}
-
SDValue PIC16TargetLowering::ExpandLoad(SDNode *N, SelectionDAG &DAG) {
LoadSDNode *LD = dyn_cast<LoadSDNode>(SDValue(N, 0));
SDValue Chain = LD->getChain();
@@ -1099,12 +1055,19 @@
return false;
}
+// NeedToConvertToMemOp - Returns true if one of the operands of the
+// operation 'Op' needs to be put into memory. Also returns the
+// operand no. of the operand to be converted in 'MemOp'. Remember, PIC16 has
+// no instruction that can operation on two registers. Most insns take
+// one register and one memory operand (addwf) / Constant (addlw).
bool PIC16TargetLowering::NeedToConvertToMemOp(SDValue Op, unsigned &MemOp) {
- // Return false if one of the operands is already a direct
- // load and that operand has only one use.
+ // If one of the operand is a constant, return false.
if (Op.getOperand(0).getOpcode() == ISD::Constant ||
Op.getOperand(1).getOpcode() == ISD::Constant)
return false;
+
+ // Return false if one of the operands is already a direct
+ // load and that operand has only one use.
if (isDirectLoad(Op.getOperand(0))) {
if (Op.getOperand(0).hasOneUse())
return false;
@@ -1120,10 +1083,14 @@
return true;
}
-SDValue PIC16TargetLowering:: LowerBinOp(SDValue Op, SelectionDAG &DAG) {
+// LowerBinOp - Lower a commutative binary operation that does not
+// affect status flag carry.
+SDValue PIC16TargetLowering::LowerBinOp(SDValue Op, SelectionDAG &DAG) {
DebugLoc dl = Op.getDebugLoc();
+
// We should have handled larger operands in type legalizer itself.
assert (Op.getValueType() == MVT::i8 && "illegal Op to lower");
+
unsigned MemOp = 1;
if (NeedToConvertToMemOp(Op, MemOp)) {
// Put one value on stack.
@@ -1137,7 +1104,9 @@
}
}
-SDValue PIC16TargetLowering:: LowerADD(SDValue Op, SelectionDAG &DAG) {
+// LowerADD - Lower all types of ADD operations including the ones
+// that affects carry.
+SDValue PIC16TargetLowering::LowerADD(SDValue Op, SelectionDAG &DAG) {
// We should have handled larger operands in type legalizer itself.
assert (Op.getValueType() == MVT::i8 && "illegal add to lower");
DebugLoc dl = Op.getDebugLoc();
@@ -1189,7 +1158,7 @@
// equal. Therefore to construct MERGE_VALUE node, UNDEF nodes equal to the
// number of arguments of function have been created.
-SDValue PIC16TargetLowering:: LowerFORMAL_ARGUMENTS(SDValue Op,
+SDValue PIC16TargetLowering::LowerFORMAL_ARGUMENTS(SDValue Op,
SelectionDAG &DAG) {
SmallVector<SDValue, 8> ArgValues;
unsigned NumArgs = Op.getNumOperands() - 3;
@@ -1207,7 +1176,8 @@
ArgValues.size()).getValue(Op.getResNo());
}
-// Perform DAGCombine of PIC16Load
+// Perform DAGCombine of PIC16Load.
+// FIXME - Need a more elaborate comment here.
SDValue PIC16TargetLowering::
PerformPIC16LoadCombine(SDNode *N, DAGCombinerInfo &DCI) const {
SelectionDAG &DAG = DCI.DAG;
Modified: llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.h?rev=67371&r1=67370&r2=67371&view=diff
==============================================================================
--- llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.h (original)
+++ llvm/trunk/lib/Target/PIC16/PIC16ISelLowering.h Fri Mar 20 08:42:20 2009
@@ -120,15 +120,6 @@
// function will return true
bool isRomAddress(const SDValue &Op);
- // To extract chain value from the SDValue Nodes
- // This function will help to maintain the chain extracting
- // code at one place. In case of any change in future it will
- // help maintain the code
- SDValue getChain(SDValue &Op);
-
- SDValue getOutFlag(SDValue &Op);
-
-
// Extract the Lo and Hi component of Op.
void GetExpandedParts(SDValue Op, SelectionDAG &DAG, SDValue &Lo,
SDValue &Hi);
@@ -173,11 +164,6 @@
// Check if operation has a direct load operand.
inline bool isDirectLoad(const SDValue Op);
- // Create the symbol and index for function frame
- void getCurrentFrameIndex(SelectionDAG &DAG, SDValue &ES,
- unsigned SlotSize, int &FI);
-
- SDValue getCurrentFrame(SelectionDAG &DAG);
};
} // namespace llvm
More information about the llvm-commits
mailing list