diff options
Diffstat (limited to 'llvm/lib/Target/PIC16/PIC16ISelLowering.h')
-rw-r--r-- | llvm/lib/Target/PIC16/PIC16ISelLowering.h | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/llvm/lib/Target/PIC16/PIC16ISelLowering.h b/llvm/lib/Target/PIC16/PIC16ISelLowering.h index 498610a9753..74e4507741f 100644 --- a/llvm/lib/Target/PIC16/PIC16ISelLowering.h +++ b/llvm/lib/Target/PIC16/PIC16ISelLowering.h @@ -38,14 +38,17 @@ namespace llvm { PIC16Store, PIC16StWF, Banksel, - MTLO, - MTHI, + MTLO, // Move to low part of FSR + MTHI, // Move to high part of FSR + MTPCLATH, // Move to PCLATCH + PIC16Connect, // General connector for PIC16 nodes BCF, LSLF, // PIC16 Logical shift left LRLF, // PIC16 Logical shift right RLF, // Rotate left through carry RRF, // Rotate right through carry CALL, // PIC16 Call instruction + CALLW, // PIC16 CALLW instruction SUBCC, // Compare for equality or inequality. SELECT_ICC, // Psuedo to be caught in schedular and expanded to brcond. BRCOND, // Conditional branch. @@ -87,10 +90,25 @@ namespace llvm { SDValue LowerBinOp(SDValue Op, SelectionDAG &DAG); SDValue LowerCALL(SDValue Op, SelectionDAG &DAG); SDValue LowerRET(SDValue Op, SelectionDAG &DAG); - SDValue LowerCallReturn(SDValue Op, SDValue Chain, SDValue FrameAddress, - SDValue InFlag, SelectionDAG &DAG); - SDValue LowerCallArguments(SDValue Op, SDValue Chain, SDValue FrameAddress, - SDValue InFlag, SelectionDAG &DAG); + // Call returns + SDValue + LowerDirectCallReturn(SDValue Op, SDValue Chain, SDValue FrameAddress, + SDValue InFlag, SelectionDAG &DAG); + SDValue + LowerIndirectCallReturn(SDValue Op, SDValue Chain, SDValue InFlag, + SDValue DataAddr_Lo, SDValue DataAddr_Hi, + SelectionDAG &DAG); + + // Call arguments + SDValue + LowerDirectCallArguments(SDValue Op, SDValue Chain, SDValue FrameAddress, + SDValue InFlag, SelectionDAG &DAG); + + SDValue + LowerIndirectCallArguments(SDValue Op, SDValue Chain, SDValue InFlag, + SDValue DataAddr_Lo, SDValue DataAddr_Hi, + SelectionDAG &DAG); + SDValue LowerBR_CC(SDValue Op, SelectionDAG &DAG); SDValue LowerSELECT_CC(SDValue Op, SelectionDAG &DAG); SDValue LowerStopPoint(SDValue Op, SelectionDAG &DAG); @@ -152,6 +170,18 @@ namespace llvm { void LegalizeFrameIndex(SDValue Op, SelectionDAG &DAG, SDValue &ES, int &Offset); + // CALL node should have all legal operands only. Legalize all non-legal + // operands of CALL node and then return the new call will all operands + // legal. + SDValue LegalizeCALL(SDValue Op, SelectionDAG &DAG); + + // For indirect calls data address of the callee frame need to be + // extracted. This function fills the arguments DataAddr_Lo and + // DataAddr_Hi with the address of the callee frame. + void GetDataAddress(DebugLoc dl, SDValue Callee, SDValue &Chain, + SDValue &DataAddr_Lo, SDValue &DataAddr_Hi, + SelectionDAG &DAG); + // We can not have both operands of a binary operation in W. // This function is used to put one operand on stack and generate a load. SDValue ConvertToMemOperand(SDValue Op, SelectionDAG &DAG, DebugLoc dl); |