diff options
author | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2009-05-09 05:11:19 +0000 |
---|---|---|
committer | Sanjiv Gupta <sanjiv.gupta@microchip.com> | 2009-05-09 05:11:19 +0000 |
commit | 09560f805ef53e5876d025dbbf63a3244e15f8a6 (patch) | |
tree | 171d88e2f1ac21cb3b09b3e8a1a8744b3c199343 /lib/Target | |
parent | 2d85052f2bae5a5a31c03017c48ca8a9eba1453c (diff) | |
download | llvm-09560f805ef53e5876d025dbbf63a3244e15f8a6.tar.gz llvm-09560f805ef53e5876d025dbbf63a3244e15f8a6.tar.bz2 llvm-09560f805ef53e5876d025dbbf63a3244e15f8a6.tar.xz |
Use 16 bit arithmetic while retrieving the address of callee's frame during indirect function calls, and set pclath before every call to retrieve the frame address.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@71323 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target')
-rw-r--r-- | lib/Target/PIC16/PIC16ISelLowering.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/Target/PIC16/PIC16ISelLowering.cpp b/lib/Target/PIC16/PIC16ISelLowering.cpp index 2e5730af6c..3e3d3b8fd1 100644 --- a/lib/Target/PIC16/PIC16ISelLowering.cpp +++ b/lib/Target/PIC16/PIC16ISelLowering.cpp @@ -1151,10 +1151,14 @@ GetDataAddress(DebugLoc dl, SDValue Callee, SDValue &Chain, SDValue Data_Lo, Data_Hi; SDVTList Tys = DAG.getVTList(MVT::i8, MVT::Other, MVT::Flag); - Hi = DAG.getNode(PIC16ISD::MTPCLATH, dl, MVT::i8, 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); + // Subtract 2 from Address to get the Lower part of DataAddress. + SDVTList VTList = DAG.getVTList(MVT::i8, MVT::Flag); + Data_Lo = DAG.getNode(ISD::SUBC, dl, VTList, Lo, + DAG.getConstant(2, MVT::i8)); + SDValue Ops[3] = { Hi, DAG.getConstant(0, MVT::i8), Data_Lo.getValue(1)}; + Data_Hi = DAG.getNode(ISD::SUBE, dl, VTList, Ops, 3); + SDValue PCLATH = DAG.getNode(PIC16ISD::MTPCLATH, dl, MVT::i8, Data_Hi); + Callee = DAG.getNode(PIC16ISD::PIC16Connect, dl, MVT::i8, Data_Lo, PCLATH); SDValue Call = DAG.getNode(PIC16ISD::CALLW, dl, Tys, Chain, Callee, OperFlag); Chain = getChain(Call); @@ -1172,10 +1176,15 @@ GetDataAddress(DebugLoc dl, SDValue Callee, SDValue &Chain, Chain = getChain(SeqStart); OperFlag = getOutFlag(SeqStart); // To manage the data dependency - // 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)); + // Subtract 1 from Address to get high part of data address. + Data_Lo = DAG.getNode(ISD::SUBC, dl, VTList, Lo, + DAG.getConstant(1, MVT::i8)); + SDValue HiOps[3] = { Hi, DAG.getConstant(0, MVT::i8), Data_Lo.getValue(1)}; + Data_Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps, 3); + PCLATH = DAG.getNode(PIC16ISD::MTPCLATH, dl, MVT::i8, Data_Hi); + // Use new Lo to make another CALLW - Callee = DAG.getNode(PIC16ISD::PIC16Connect, dl, MVT::i8, Data_Lo, Hi); + Callee = DAG.getNode(PIC16ISD::PIC16Connect, dl, MVT::i8, Data_Lo, PCLATH); Call = DAG.getNode(PIC16ISD::CALLW, dl, Tys, Chain, Callee, OperFlag); Chain = getChain(Call); OperFlag = getOutFlag(Call); |