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 | 3033816c80179135305f5b0bab724b1596c4015d (patch) | |
tree | eb6f3f0e75a4c6ffcc7a5407c512173e468ec403 /llvm/lib | |
parent | 91e2ab496fdab4512652041b9cd0818ca872e342 (diff) | |
download | bcm5719-llvm-3033816c80179135305f5b0bab724b1596c4015d.tar.gz bcm5719-llvm-3033816c80179135305f5b0bab724b1596c4015d.zip |
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.
llvm-svn: 71323
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Target/PIC16/PIC16ISelLowering.cpp | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/llvm/lib/Target/PIC16/PIC16ISelLowering.cpp b/llvm/lib/Target/PIC16/PIC16ISelLowering.cpp index 2e5730af6cd..3e3d3b8fd11 100644 --- a/llvm/lib/Target/PIC16/PIC16ISelLowering.cpp +++ b/llvm/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); |