Make the function begin label start after ther data pointer.
authorSanjiv Gupta <sanjiv.gupta@microchip.com>
Wed, 22 Apr 2009 12:02:36 +0000 (12:02 +0000)
committerSanjiv Gupta <sanjiv.gupta@microchip.com>
Wed, 22 Apr 2009 12:02:36 +0000 (12:02 +0000)
The address of data frame for function can be obtained by subtracting 2 from the function begin label.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@69801 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PIC16/PIC16AsmPrinter.cpp
lib/Target/PIC16/PIC16ISelLowering.cpp
lib/Target/PIC16/PIC16InstrInfo.td

index a1268166488fb239c8579acaa7b59db23382e059..e16e9ad46d03a8f0b07b44de77a37fe620735094 100644 (file)
@@ -116,9 +116,9 @@ bool PIC16AsmPrinter::runOnMachineFunction(MachineFunction &MF) {
   SwitchToSection (fCodeSection);
 
   // Emit the frame address of the function at the beginning of code.
-  O << CurrentFnName << ":\n";
   O << "    retlw  low(" << FunctionLabelBegin<< CurrentFnName << ".frame)\n";
   O << "    retlw  high(" << FunctionLabelBegin<< CurrentFnName << ".frame)\n"; 
+  O << CurrentFnName << ":\n";
 
 
   // Print out code for the function.
index dec92ad84df270c7b6f06d408529ecc75bbce823..605fbe9415568e7effde43e3fa90bd25c4a65d4e 100644 (file)
@@ -1155,10 +1155,12 @@ GetDataAddress(DebugLoc dl, SDValue Callee, SDValue &Chain,
    SDValue Lo = Callee.getOperand(0);
    SDValue Hi = Callee.getOperand(1);
 
+   SDValue Data_Lo, Data_Hi;
    SDVTList Tys = DAG.getVTList(MVT::i8, MVT::Other, MVT::Flag);
    Hi = DAG.getNode(PIC16ISD::MTPCLATH, dl, MVT::i8, Hi);
-   // Use the Lo part as is and make CALLW
-   Callee = DAG.getNode(PIC16ISD::PIC16Connect, dl, MVT::i8, Lo, Hi);
+   // Subtract 2 from Lo to get the Lower part of DataAddress. 
+   Data_Lo = DAG.getNode(ISD::SUB, dl, MVT::i8, Lo, DAG.getConstant(2, MVT::i8));
+   Callee = DAG.getNode(PIC16ISD::PIC16Connect, dl, MVT::i8, Data_Lo, Hi);
    SDValue Call = DAG.getNode(PIC16ISD::CALLW, dl, Tys, Chain, Callee,
                               OperFlag);
    Chain = getChain(Call);
@@ -1176,10 +1178,10 @@ GetDataAddress(DebugLoc dl, SDValue Callee, SDValue &Chain,
    Chain = getChain(SeqStart);
    OperFlag = getOutFlag(SeqStart); // To manage the data dependency
 
-   // Add 1 to Lo part for the second code word.
-   Lo = DAG.getNode(ISD::ADD, dl, MVT::i8, Lo, DAG.getConstant(1, MVT::i8));
+   // Subtract 1 to Lo part for the second code word.
+   Data_Lo = DAG.getNode(ISD::SUB, dl, MVT::i8, Lo, DAG.getConstant(1, MVT::i8));
    // Use new Lo to make another CALLW
-   Callee = DAG.getNode(PIC16ISD::PIC16Connect, dl, MVT::i8, Lo, Hi);
+   Callee = DAG.getNode(PIC16ISD::PIC16Connect, dl, MVT::i8, Data_Lo, Hi);
    Call = DAG.getNode(PIC16ISD::CALLW, dl, Tys, Chain, Callee, OperFlag);
    Chain = getChain(Call);
    OperFlag = getOutFlag(Call);
@@ -1266,8 +1268,8 @@ SDValue PIC16TargetLowering::LowerCALL(SDValue Op, SelectionDAG &DAG) {
        SDValue CodeAddr_Lo = Callee.getOperand(0);
        SDValue CodeAddr_Hi = Callee.getOperand(1);
 
-       CodeAddr_Lo = DAG.getNode(ISD::ADD, dl, MVT::i8, CodeAddr_Lo,
-                                 DAG.getConstant(2, MVT::i8));
+       /*CodeAddr_Lo = DAG.getNode(ISD::ADD, dl, MVT::i8, CodeAddr_Lo,
+                                 DAG.getConstant(2, MVT::i8));*/
 
        // move Hi part in PCLATH
        CodeAddr_Hi = DAG.getNode(PIC16ISD::MTPCLATH, dl, MVT::i8, CodeAddr_Hi);
index 8f902594da15c3962db0f0819c46e5c947cdc7a9..09872b3c41b0034a4cfc2fce8619d18054e6af04 100644 (file)
@@ -428,7 +428,8 @@ def sublw_cc : SUBLW<0, PIC16Subcc>;
 let isCall = 1,
     Defs = [W, FSR0, FSR1] in {
     def CALL: LiteralFormat<0x1, (outs), (ins i8imm:$func),
-            "call ${func} + 2",
+            //"call ${func} + 2",
+            "call ${func}",
             [(PIC16call diraddr:$func)]>;
 }