From 7520fc6559f7047fbcb0ca2443614b72438b3a9e Mon Sep 17 00:00:00 2001 From: sandeep Date: Mon, 24 Dec 2001 03:50:01 +0000 Subject: [PATCH] ALPHA version for -mTININative git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@1733 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- src/ds390/gen.c | 525 ++++++++++++++++++++++++++++++++++++++------ src/ds390/main.c | 95 ++++++-- src/ds390/peeph.def | 8 +- src/ds390/ralloc.c | 18 +- 4 files changed, 550 insertions(+), 96 deletions(-) diff --git a/src/ds390/gen.c b/src/ds390/gen.c index 18166661..e27f8293 100644 --- a/src/ds390/gen.c +++ b/src/ds390/gen.c @@ -79,7 +79,7 @@ static char *fReturn16[] = static char **fReturn = fReturn24; static char *accUse[] = {"a", "b"}; - +static char *javaRet[] = { "r0","r1","r2","r3"}; static short rbank = -1; static struct @@ -114,7 +114,7 @@ static void saveRBank (int, iCode *, bool); // A scratch register which will be used to hold // result bytes from operands in far space via DPTR2. -#define DP2_RESULT_REG "ap" +#define DP2_RESULT_REG "_ap" static lineNode *lineHead = NULL; static lineNode *lineCurr = NULL; @@ -607,6 +607,23 @@ aopForRemat (symbol * sym) return aop; } +/*-----------------------------------------------------------------*/ +/* aopHasRegs - returns true if aop has regs between from-to */ +/*-----------------------------------------------------------------*/ +static int aopHasRegs(asmop *aop, int from, int to) +{ + int size =0; + + if (aop->type != AOP_REG) return 0; /* if not assigned to regs */ + + for (; size < aop->size ; size++) { + int reg; + for (reg = from ; reg <= to ; reg++) + if (aop->aopu.aop_reg[size] == ds390_regWithIdx(reg)) return 1; + } + return 0; +} + /*-----------------------------------------------------------------*/ /* regsInCommon - two operands have some registers in common */ /*-----------------------------------------------------------------*/ @@ -1806,16 +1823,45 @@ release: freeAsmop (IC_RESULT (ic), NULL, ic, TRUE); } +/*-----------------------------------------------------------------*/ +/* savermask - saves registers in the mask */ +/*-----------------------------------------------------------------*/ +static void savermask(bitVect *rs_mask) +{ + int i; + if (options.useXstack) { + if (bitVectBitValue (rs_mask, R0_IDX)) + emitcode ("mov", "b,r0"); + emitcode ("mov", "r0,%s", spname); + for (i = 0; i < ds390_nRegs; i++) { + if (bitVectBitValue (rs_mask, i)) { + if (i == R0_IDX) + emitcode ("mov", "a,b"); + else + emitcode ("mov", "a,%s", ds390_regWithIdx (i)->name); + emitcode ("movx", "@r0,a"); + emitcode ("inc", "r0"); + } + } + emitcode ("mov", "%s,r0", spname); + if (bitVectBitValue (rs_mask, R0_IDX)) + emitcode ("mov", "r0,b"); + } else { + for (i = 0; i < ds390_nRegs; i++) { + if (bitVectBitValue (rs_mask, i)) + emitcode ("push", "%s", ds390_regWithIdx (i)->dname); + } + } +} + /*-----------------------------------------------------------------*/ /* saveRegisters - will look for a call and save the registers */ /*-----------------------------------------------------------------*/ static void saveRegisters (iCode * lic) { - int i; iCode *ic; bitVect *rsave; - sym_link *detype; /* look for call */ for (ic = lic; ic; ic = ic->next) @@ -1848,35 +1894,36 @@ saveRegisters (iCode * lic) ds390_rUmaskForOp (IC_RESULT(ic))); } ic->regsSaved = 1; - if (options.useXstack) - { - if (bitVectBitValue (rsave, R0_IDX)) - emitcode ("mov", "b,r0"); - emitcode ("mov", "r0,%s", spname); - for (i = 0; i < ds390_nRegs; i++) - { - if (bitVectBitValue (rsave, i)) - { - if (i == R0_IDX) - emitcode ("mov", "a,b"); - else - emitcode ("mov", "a,%s", ds390_regWithIdx (i)->name); - emitcode ("movx", "@r0,a"); - emitcode ("inc", "r0"); - } + savermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* usavermask - restore registers with mask */ +/*-----------------------------------------------------------------*/ +static void unsavermask(bitVect *rs_mask) +{ + int i; + if (options.useXstack) { + emitcode ("mov", "r0,%s", spname); + for (i = ds390_nRegs; i >= 0; i--) { + if (bitVectBitValue (rs_mask, i)) { + emitcode ("dec", "r0"); + emitcode ("movx", "a,@r0"); + if (i == R0_IDX) + emitcode ("mov", "b,a"); + else + emitcode ("mov", "%s,a", ds390_regWithIdx (i)->name); + } + } + emitcode ("mov", "%s,r0", spname); + if (bitVectBitValue (rs_mask, R0_IDX)) + emitcode ("mov", "r0,b"); + } else { + for (i = ds390_nRegs; i >= 0; i--) { + if (bitVectBitValue (rs_mask, i)) + emitcode ("pop", "%s", ds390_regWithIdx (i)->dname); } - emitcode ("mov", "%s,r0", spname); - if (bitVectBitValue (rsave, R0_IDX)) - emitcode ("mov", "r0,b"); } - else - for (i = 0; i < ds390_nRegs; i++) - { - if (bitVectBitValue (rsave, i)) - emitcode ("push", "%s", ds390_regWithIdx (i)->dname); - } - - detype = getSpec (operandType (IC_LEFT (ic))); } /*-----------------------------------------------------------------*/ @@ -1885,7 +1932,6 @@ saveRegisters (iCode * lic) static void unsaveRegisters (iCode * ic) { - int i; bitVect *rsave; if (IFFUNC_CALLEESAVES(OP_SYMBOL (IC_LEFT (ic))->type)) { @@ -1901,33 +1947,7 @@ unsaveRegisters (iCode * ic) rsave = bitVectCplAnd (bitVectCopy (ic->rMask), ds390_rUmaskForOp (IC_RESULT(ic))); } - if (options.useXstack) - { - emitcode ("mov", "r0,%s", spname); - for (i = ds390_nRegs; i >= 0; i--) - { - if (bitVectBitValue (rsave, i)) - { - emitcode ("dec", "r0"); - emitcode ("movx", "a,@r0"); - if (i == R0_IDX) - emitcode ("mov", "b,a"); - else - emitcode ("mov", "%s,a", ds390_regWithIdx (i)->name); - } - - } - emitcode ("mov", "%s,r0", spname); - if (bitVectBitValue (rsave, R0_IDX)) - emitcode ("mov", "r0,b"); - } - else - for (i = ds390_nRegs; i >= 0; i--) - { - if (bitVectBitValue (rsave, i)) - emitcode ("pop", "%s", ds390_regWithIdx (i)->dname); - } - + unsavermask(rsave); } @@ -3146,6 +3166,37 @@ genEndFunction (iCode * ic) } +/*-----------------------------------------------------------------*/ +/* genJavaNativeRet - generate code for return JavaNative */ +/*-----------------------------------------------------------------*/ +static void genJavaNativeRet(iCode *ic) +{ + int i, size; + + aopOp (IC_LEFT (ic), ic, FALSE, + (IS_SYMOP(IC_LEFT(ic)) && OP_SYMBOL(IC_LEFT(ic))->ruonly ? FALSE :TRUE)); + size = AOP_SIZE (IC_LEFT (ic)); + + assert (size <= 4); + + /* it is assigned to GPR0-R3 then push them */ + if (aopHasRegs(AOP(IC_LEFT(ic)),R0_IDX,R1_IDX) || + aopHasRegs(AOP(IC_LEFT(ic)),R2_IDX,R3_IDX)) { + for (i = 0 ; i < size ; i++ ) { + emitcode ("push","%s",aopGet(AOP(IC_LEFT(ic)),i,FALSE,TRUE,FALSE)); + } + for (i = (size-1) ; i >= 0 ; i--) { + emitcode ("pop","a%s",javaRet[i]); + } + } else { + for (i = 0 ; i < size ; i++) + emitcode ("mov","%s,%s",javaRet[i],aopGet(AOP(IC_LEFT(ic)),i,FALSE,TRUE,FALSE)); + } + for (i = size ; i < 4 ; i++ ) + emitcode ("mov","%s,#0",javaRet[i]); + return; +} + /*-----------------------------------------------------------------*/ /* genRet - generate code for return statement */ /*-----------------------------------------------------------------*/ @@ -3162,6 +3213,12 @@ genRet (iCode * ic) if (!IC_LEFT (ic)) goto jumpret; + /* if this is a JavaNative function then return + value in different register */ + if (IFFUNC_ISJAVANATIVE(currFunc->type)) { + genJavaNativeRet(ic); + goto jumpret; + } /* we have something to return then move the return value into place */ aopOp (IC_LEFT (ic), ic, FALSE, @@ -10782,10 +10839,21 @@ static void genMemcpyX2X( iCode *ic, int nparms, operand **parms, int fromc) { operand *from , *to , *count; symbol *lbl; + bitVect *rsave = NULL; + int i; /* we know it has to be 3 parameters */ assert (nparms == 3); + /* save DPTR if it needs to be saved */ + for (i = DPL_IDX ; i <= B_IDX ; i++ ) { + if (bitVectBitValue(ic->rMask,i)) + rsave = bitVectSetBit(rsave,i); + } + rsave = bitVectIntersect(rsave,bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + savermask(rsave); + to = parms[0]; from = parms[1]; count = parms[2]; @@ -10853,7 +10921,7 @@ static void genMemcpyX2X( iCode *ic, int nparms, operand **parms, int fromc) symbol *lbl1 = newiTempLabel(NULL); emitcode (";"," Auto increment but no djnz"); - emitcode ("mov","ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); + emitcode ("mov","_ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); emitcode ("mov","b,%s",aopGet (AOP (count), 1, FALSE, TRUE, TRUE)); emitcode ("mov", "dps,#!constbyte",0x21); /* Select DPTR2 & auto-toggle. */ emitcode ("","!tlabeldef",lbl->key+100); @@ -10866,11 +10934,11 @@ static void genMemcpyX2X( iCode *ic, int nparms, operand **parms, int fromc) emitcode ("inc", "dptr"); emitcode ("inc", "dptr"); emitcode ("mov","a,b"); - emitcode ("orl","a,ap"); + emitcode ("orl","a,_ap"); emitcode ("jz","!tlabel",lbl1->key+100); - emitcode ("mov","a,ap"); + emitcode ("mov","a,_ap"); emitcode ("add","a,#!constbyte",0xFF); - emitcode ("mov","ap,a"); + emitcode ("mov","_ap,a"); emitcode ("mov","a,b"); emitcode ("addc","a,#!constbyte",0xFF); emitcode ("mov","b,a"); @@ -10879,6 +10947,7 @@ static void genMemcpyX2X( iCode *ic, int nparms, operand **parms, int fromc) } emitcode ("mov", "dps,#0"); freeAsmop (count, NULL, ic, FALSE); + unsavermask(rsave); } @@ -10890,6 +10959,9 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) operand *to , *val , *count; symbol *lbl; char *l; + int i; + bitVect *rsave; + /* we know it has to be 3 parameters */ assert (nparms == 3); @@ -10897,6 +10969,15 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) val = parms[1]; count = parms[2]; + /* save DPTR if it needs to be saved */ + for (i = DPL_IDX ; i <= B_IDX ; i++ ) { + if (bitVectBitValue(ic->rMask,i)) + rsave = bitVectSetBit(rsave,i); + } + rsave = bitVectIntersect(rsave,bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + savermask(rsave); + aopOp (to, ic, FALSE, FALSE); /* get "to" into DPTR */ /* if the operand is already in dptr @@ -10943,7 +11024,7 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) } else { symbol *lbl1 = newiTempLabel(NULL); - emitcode ("mov","ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); + emitcode ("mov","_ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); emitcode ("mov","b,%s",aopGet (AOP (count), 1, FALSE, TRUE, TRUE)); emitcode ("","!tlabeldef",lbl->key+100); l = aopGet(AOP (val), 0, FALSE, FALSE, TRUE); @@ -10951,11 +11032,11 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) emitcode ("movx", "a,@dptr"); emitcode ("inc", "dptr"); emitcode ("mov","a,b"); - emitcode ("orl","a,ap"); + emitcode ("orl","a,_ap"); emitcode ("jz","!tlabel",lbl1->key+100); - emitcode ("mov","a,ap"); + emitcode ("mov","a,_ap"); emitcode ("add","a,#!constbyte",0xFF); - emitcode ("mov","ap,a"); + emitcode ("mov","_ap,a"); emitcode ("mov","a,b"); emitcode ("addc","a,#!constbyte",0xFF); emitcode ("mov","b,a"); @@ -10963,6 +11044,284 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) emitcode ("","!tlabeldef",lbl1->key+100); } freeAsmop (count, NULL, ic, FALSE); + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genNatLibLoadPrimitive - calls TINI api function to load primitive */ +/*-----------------------------------------------------------------*/ +static void genNatLibLoadPrimitive(iCode *ic, int nparms, operand **parms,int size) +{ + bitVect *rsave ; + operand *pnum, *result; + int i; + + assert (nparms==1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + pnum = parms[0]; + aopOp (pnum, ic, FALSE, FALSE); + emitcode ("mov","a,%s",aopGet(AOP(pnum),0,FALSE,FALSE,FALSE)); + freeAsmop (pnum, NULL, ic, FALSE); + emitcode ("lcall","NatLib_LoadPrimitive"); + aopOp (result=IC_RESULT(ic), ic, FALSE, FALSE); + if (aopHasRegs(AOP(result),R0_IDX,R1_IDX) || + aopHasRegs(AOP(result),R2_IDX,R3_IDX) ) { + for (i = (size-1) ; i >= 0 ; i-- ) { + emitcode ("push","a%s",javaRet[i]); + } + for (i=0; i < size ; i++ ) { + emitcode ("pop","a%s",aopGet(AOP(result),i,FALSE,FALSE,FALSE)); + } + } else { + for (i = 0 ; i < size ; i++ ) { + aopPut(AOP(result),javaRet[i],i); + } + } + freeAsmop (result, NULL, ic, FALSE); + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genNatLibLoadPointer - calls TINI api function to load pointer */ +/*-----------------------------------------------------------------*/ +static void genNatLibLoadPointer(iCode *ic, int nparms, operand **parms) +{ + bitVect *rsave ; + operand *pnum, *result; + int size = 3; + int i; + + assert (nparms==1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + pnum = parms[0]; + aopOp (pnum, ic, FALSE, FALSE); + emitcode ("mov","a,%s",aopGet(AOP(pnum),0,FALSE,FALSE,FALSE)); + freeAsmop (pnum, NULL, ic, FALSE); + emitcode ("lcall","NatLib_LoadPointer"); + aopOp (result=IC_RESULT(ic), ic, FALSE, FALSE); + if (AOP_TYPE(result)!=AOP_STR) { + for (i = 0 ; i < size ; i++ ) { + aopPut(AOP(result),fReturn[i],i); + } + } + freeAsmop (result, NULL, ic, FALSE); + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genNatLibInstallStateBlock - */ +/*-----------------------------------------------------------------*/ +static void genNatLibInstallStateBlock(iCode *ic, int nparms, + operand **parms, const char *name) +{ + bitVect *rsave ; + operand *psb, *handle; + assert (nparms==2); + + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + psb = parms[0]; + handle = parms[1]; + + /* put pointer to state block into DPTR1 */ + aopOp (psb, ic, FALSE, FALSE); + emitcode ("mov","dpl1,%s",aopGet(AOP(psb),0,FALSE,FALSE,FALSE)); + emitcode ("mov","dph1,%s",aopGet(AOP(psb),1,FALSE,FALSE,FALSE)); + emitcode ("mov","dpx1,%s",aopGet(AOP(psb),2,FALSE,FALSE,FALSE)); + freeAsmop (psb, NULL, ic, FALSE); + + /* put libraryID into DPTR */ + emitcode ("mov","dptr,#LibraryID"); + + /* put handle into r3:r2 */ + aopOp (handle, ic, FALSE, FALSE); + if (aopHasRegs(AOP(handle),R2_IDX,R3_IDX)) { + emitcode ("push","%s",aopGet(AOP(handle),0,FALSE,TRUE,FALSE)); + emitcode ("push","%s",aopGet(AOP(handle),1,FALSE,TRUE,FALSE)); + emitcode ("pop","ar3"); + emitcode ("pop","ar2"); + } else { + emitcode ("mov","r2,%s",aopGet(AOP(handle),0,FALSE,TRUE,FALSE)); + emitcode ("mov","r3,%s",aopGet(AOP(handle),1,FALSE,TRUE,FALSE)); + } + freeAsmop (psb, NULL, ic, FALSE); + + /* make the call */ + emitcode ("lcall","NatLib_Install%sStateBlock",name); + + /* put return value into place*/ + _G.accInUse++; + aopOp (IC_RESULT(ic), ic, FALSE, FALSE); + _G.accInUse--; + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genNatLibRemoveStateBlock - */ +/*-----------------------------------------------------------------*/ +static void genNatLibRemoveStateBlock(iCode *ic,int nparms,const char *name) +{ + bitVect *rsave ; + + assert(nparms==0); + + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + /* put libraryID into DPTR */ + emitcode ("mov","dptr,#LibraryID"); + /* make the call */ + emitcode ("lcall","NatLib_Remove%sStateBlock",name); + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genNatLibGetStateBlock - */ +/*-----------------------------------------------------------------*/ +static void genNatLibGetStateBlock(iCode *ic,int nparms, + operand **parms,const char *name) +{ + bitVect *rsave ; + symbol *lbl = newiTempLabel(NULL); + + assert(nparms==0); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + /* put libraryID into DPTR */ + emitcode ("mov","dptr,#LibraryID"); + /* make the call */ + emitcode ("lcall","NatLib_Remove%sStateBlock",name); + emitcode ("jnz","!tlabel",lbl->key+100); + + /* put return value into place */ + aopOp(IC_RESULT(ic),ic,FALSE,FALSE); + if (aopHasRegs(AOP(IC_RESULT(ic)),R2_IDX,R3_IDX)) { + emitcode ("push","ar3"); + emitcode ("push","ar2"); + emitcode ("pop","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,TRUE,FALSE)); + emitcode ("pop","%s",aopGet(AOP(IC_RESULT(ic)),1,FALSE,TRUE,FALSE)); + } else { + aopPut(AOP(IC_RESULT(ic)),"r2",0); + aopPut(AOP(IC_RESULT(ic)),"r3",1); + } + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + emitcode ("","!tlabeldef",lbl->key+100); + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genMMMalloc - */ +/*-----------------------------------------------------------------*/ +static void genMMMalloc (iCode *ic,int nparms, operand **parms, + int size, const char *name) +{ + bitVect *rsave ; + operand *bsize; + symbol *rsym; + symbol *lbl = newiTempLabel(NULL); + + assert (nparms == 1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + bsize=parms[0]; + aopOp (bsize,ic,FALSE,FALSE); + + /* put the size in R4-R2 */ + if (aopHasRegs(AOP(bsize),R2_IDX, (size==3 ? R4_IDX: R3_IDX))) { + emitcode("push","%s",aopGet(AOP(bsize),0,FALSE,TRUE,FALSE)); + emitcode("push","%s",aopGet(AOP(bsize),1,FALSE,TRUE,FALSE)); + if (size==3) { + emitcode("push","%s",aopGet(AOP(bsize),2,FALSE,TRUE,FALSE)); + emitcode("pop","ar4"); + } + emitcode("pop","ar3"); + emitcode("pop","ar2"); + } else { + emitcode ("mov","r2,%s",aopGet(AOP(bsize),0,FALSE,TRUE,FALSE)); + emitcode ("mov","r3,%s",aopGet(AOP(bsize),1,FALSE,TRUE,FALSE)); + if (size==3) { + emitcode("mov","r4,%s",aopGet(AOP(bsize),2,FALSE,TRUE,FALSE)); + } + } + freeAsmop (bsize, NULL, ic, FALSE); + + /* make the call */ + emitcode ("lcall","MM_%s",name); + emitcode ("jz","!tlabel",lbl->key+100); + emitcode ("mov","r2,#!constbyte",0xff); + emitcode ("mov","r3,#!constbyte",0xff); + emitcode ("","!tlabeldef",lbl->key+100); + /* we don't care about the pointer : we just save the handle */ + rsym = OP_SYMBOL(IC_RESULT(ic)); + if (rsym->liveFrom != rsym->liveTo) { + aopOp(IC_RESULT(ic),ic,FALSE,FALSE); + if (aopHasRegs(AOP(IC_RESULT(ic)),R2_IDX,R3_IDX)) { + emitcode ("push","ar3"); + emitcode ("push","ar2"); + emitcode ("pop","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,TRUE,FALSE)); + emitcode ("pop","%s",aopGet(AOP(IC_RESULT(ic)),1,FALSE,TRUE,FALSE)); + } else { + aopPut(AOP(IC_RESULT(ic)),"r2",0); + aopPut(AOP(IC_RESULT(ic)),"r3",1); + } + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + } + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genMMDeref - */ +/*-----------------------------------------------------------------*/ +static void genMMDeref (iCode *ic,int nparms, operand **parms) +{ + bitVect *rsave ; + operand *handle; + + assert (nparms == 1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + handle=parms[0]; + aopOp (handle,ic,FALSE,FALSE); + + /* put the size in R4-R2 */ + if (aopHasRegs(AOP(handle),R2_IDX,R3_IDX)) { + emitcode("push","%s",aopGet(AOP(handle),0,FALSE,TRUE,FALSE)); + emitcode("push","%s",aopGet(AOP(handle),1,FALSE,TRUE,FALSE)); + emitcode("pop","ar3"); + emitcode("pop","ar2"); + } else { + emitcode ("mov","r2,%s",aopGet(AOP(handle),0,FALSE,TRUE,FALSE)); + emitcode ("mov","r3,%s",aopGet(AOP(handle),1,FALSE,TRUE,FALSE)); + } + freeAsmop (handle, NULL, ic, FALSE); + + /* make the call */ + emitcode ("lcall","MM_Deref"); + + aopOp (IC_RESULT(ic),ic,FALSE,FALSE); + if (AOP_TYPE(IC_RESULT(ic)) != AOP_STR) { + aopPut(AOP(IC_RESULT(ic)),"dpl",0); + aopPut(AOP(IC_RESULT(ic)),"dph",1); + aopPut(AOP(IC_RESULT(ic)),"dpx",2); + } + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + unsavermask(rsave); } /*-----------------------------------------------------------------*/ @@ -10987,8 +11346,38 @@ static void genBuiltIn (iCode *ic) genMemcpyX2X(bi_iCode,nbi_parms,bi_parms,1); } else if (strcmp(bif->name,"__builtin_memset_x")==0) { genMemsetX(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"NatLib_LoadByte")==0) { + genNatLibLoadPrimitive(bi_iCode,nbi_parms,bi_parms,1); + } else if (strcmp(bif->name,"NatLib_LoadShort")==0) { + genNatLibLoadPrimitive(bi_iCode,nbi_parms,bi_parms,2); + } else if (strcmp(bif->name,"NatLib_LoadInt")==0) { + genNatLibLoadPrimitive(bi_iCode,nbi_parms,bi_parms,4); + } else if (strcmp(bif->name,"NatLib_LoadPointer")==0) { + genNatLibLoadPointer(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"NatLib_InstallImmutableStateBlock")==0) { + genNatLibInstallStateBlock(bi_iCode,nbi_parms,bi_parms,"Immutable"); + } else if (strcmp(bif->name,"NatLib_InstallEphemeralStateBlock")==0) { + genNatLibInstallStateBlock(bi_iCode,nbi_parms,bi_parms,"Ephemeral"); + } else if (strcmp(bif->name,"NatLib_RemoveImmutableStateBlock")==0) { + genNatLibRemoveStateBlock(bi_iCode,nbi_parms,"Immutable"); + } else if (strcmp(bif->name,"NatLib_RemoveEphemeralStateBlock")==0) { + genNatLibRemoveStateBlock(bi_iCode,nbi_parms,"Ephemeral"); + } else if (strcmp(bif->name,"NatLib_GetImmutableStateBlock")==0) { + genNatLibGetStateBlock(bi_iCode,nbi_parms,bi_parms,"Immutable"); + } else if (strcmp(bif->name,"NatLib_GetEphemeralStateBlock")==0) { + genNatLibGetStateBlock(bi_iCode,nbi_parms,bi_parms,"Ephemeral"); + } else if (strcmp(bif->name,"MM_XMalloc")==0) { + genMMMalloc(bi_iCode,nbi_parms,bi_parms,3,"XMalloc"); + } else if (strcmp(bif->name,"MM_Malloc")==0) { + genMMMalloc(bi_iCode,nbi_parms,bi_parms,2,"Malloc"); + } else if (strcmp(bif->name,"MM_ApplicationMalloc")==0) { + genMMMalloc(bi_iCode,nbi_parms,bi_parms,2,"ApplicationMalloc"); + } else if (strcmp(bif->name,"MM_Free")==0) { + genMMMalloc(bi_iCode,nbi_parms,bi_parms,2,"Free"); + } else if (strcmp(bif->name,"MM_Deref")==0) { + genMMDeref(bi_iCode,nbi_parms,bi_parms); } else { - werror(E_INTERNAL_ERROR,"unknown builtin function encountered\n"); + werror(E_INTERNAL_ERROR,__FILE__,__LINE__,"unknown builtin function encountered\n"); return ; } return ; diff --git a/src/ds390/main.c b/src/ds390/main.c index e2e21a08..660a21b4 100644 --- a/src/ds390/main.c +++ b/src/ds390/main.c @@ -8,6 +8,8 @@ #include "main.h" #include "ralloc.h" #include "gen.h" +#include "BuildCmd.h" +#include "MySystem.h" static char _defaultRules[] = { @@ -170,6 +172,7 @@ _ds390_genAssemblerPreamble (FILE * of) fputs ("dph1 = 0x85\t\t; dph1 register unknown to assembler\n", of); fputs ("dpx1 = 0x95\t\t; dpx1 register unknown to assembler\n", of); fputs ("ap = 0x9C\t\t; ap register unknown to assembler\n", of); + fputs ("_ap = 0x9C\t\t; _ap register unknown to assembler\n", of); fputs ("mcnt0 = 0xD1\t\t; mcnt0 register unknown to assembler\n", of); fputs ("mcnt1 = 0xD2\t\t; mcnt1 register unknown to assembler\n", of); fputs ("ma = 0xD3\t\t; ma register unknown to assembler\n", of); @@ -296,7 +299,8 @@ PORT ds390_port = "-plosgffc", /* Options with debug */ "-plosgff", /* Options without debug */ 0, - ".asm" + ".asm", + NULL /* no do_assemble function */ }, { _linkCmd, @@ -346,6 +350,7 @@ PORT ds390_port = _ds390_getRegName, _ds390_keywords, _ds390_genAssemblerPreamble, + NULL, /* no genAssemblerEnd */ _ds390_genIVT, _ds390_genXINIT, _ds390_reset_regparm, @@ -427,7 +432,7 @@ static void _tininative_finaliseOptions (void) istack->fmap = 1; istack->ptrType = FPOINTER; options.cc_only =1; -} /* MODEL_FLAT24 */ +} static int _tininative_genIVT (FILE * of, symbol ** interrupts, int maxInterrupts) { @@ -435,20 +440,52 @@ static int _tininative_genIVT (FILE * of, symbol ** interrupts, int maxInterrupt } static void _tininative_genAssemblerPreamble (FILE * of) { - fputs ("_bpx EQU 080h \t\t; _bpx register unknown to assembler\n", of); - fputs ("dpx EQU 093h\t\t; dpx register unknown to assembler\n", of); - fputs ("dps EQU 086h\t\t; dps register unknown to assembler\n", of); - fputs ("dpl1 EQU 084h\t\t; dpl1 register unknown to assembler\n", of); - fputs ("dph1 EQU 085h\t\t; dph1 register unknown to assembler\n", of); - fputs ("dpx1 EQU 095h\t\t; dpx1 register unknown to assembler\n", of); - fputs ("ap EQU 09Ch\t\t; ap register unknown to assembler\n", of); - fputs ("mcnt0 EQU 0D1h\t\t; mcnt0 register unknown to assembler\n", of); - fputs ("mcnt1 EQU 0D2h\t\t; mcnt1 register unknown to assembler\n", of); - fputs ("ma EQU 0D3h\t\t; ma register unknown to assembler\n", of); - fputs ("mb EQU 0D4h\t\t; mb register unknown to assembler\n", of); - fputs ("mc EQU 0D5h\t\t; mc register unknown to assembler\n", of); - fputs ("F1 EQU 0D1h\t\t; F1 user flag unknown to assembler\n", of); - fputs ("esp EQU 09Bh\t\t; ESP user flag unknown to assembler\n", of); + fputs("$include(tini.inc)\n", of); + fputs("$include(ds80c390.inc)\n", of); + fputs("$include(tinimacro.inc)\n", of); + fputs("$include(apiequ.inc)\n", of); + fputs("_bpx EQU 01Eh \t\t; _bpx (frame pointer) mapped to R8_B3:R7_B3\n", of); + fputs("_ap EQU 01Dh \t\t; _ap mapped to R6_B3\n", of); + /* Must be first and return 0 */ + fputs("Lib_Native_Init:\n",of); + fputs("\tclr\ta\n",of); + fputs("\tret\n",of); + fputs("LibraryID:\n",of); + fputs("\tdb \"DS\"\n",of); + if (options.tini_libid) { + fprintf(of,"\tdb 0,0,0%02xh,0%02xh,0%02xh,0%02xh\n", + (options.tini_libid>>24 & 0xff), + (options.tini_libid>>16 & 0xff), + (options.tini_libid>>8 & 0xff), + (options.tini_libid & 0xff)); + } else { + fprintf(of,"\tdb 0,0,0,0,0,1\n"); + } + +} +static void _tininative_genAssemblerEnd (FILE * of) +{ + fputs("\tend\n",of); +} +/* tininative assembler , calls "macro", if it succeeds calls "a390" */ +static void _tininative_do_assemble (const char * const *asmOptions) +{ + static const char *macroCmd[] = { + "macro","$1.a51",NULL + }; + static const char *a390Cmd[] = { + "a390","$1.mpp",NULL + }; + char buffer[100]; + + buildCmdLine(buffer,macroCmd,srcFileName,NULL,NULL,NULL); + if (my_system(buffer)) { + exit(1); + } + buildCmdLine(buffer,a390Cmd,srcFileName,NULL,NULL,asmOptions); + if (my_system(buffer)) { + exit(1); + } } /* list of key words used by TININative */ @@ -485,12 +522,32 @@ static builtins __tininative_builtins[] = { { "__builtin_memcpy_x2x","v",3,{"cx*","cx*","i"}}, /* void __builtin_memcpy_x2x (xdata char *,xdata char *,int) */ { "__builtin_memcpy_c2x","v",3,{"cx*","cp*","i"}}, /* void __builtin_memcpy_c2x (xdata char *,code char *,int) */ { "__builtin_memset_x","v",3,{"cx*","c","i"}}, /* void __builtin_memset (xdata char *,char,int) */ + /* TINI NatLib */ + { "NatLib_LoadByte","c",1,{"c"}}, /* char Natlib_LoadByte (0 based parameter number) */ + { "NatLib_LoadShort","s",1,{"c"}}, /* short Natlib_LoadShort (0 based parameter number) */ + { "NatLib_LoadInt","l",1,{"c"}}, /* long Natlib_LoadLong (0 based parameter number) */ + { "NatLib_LoadPointer","cx*",1,{"c"}}, /* long Natlib_LoadPointer (0 based parameter number) */ + /* TINI StateBlock related */ + { "NatLib_InstallImmutableStateBlock","c",2,{"vx*","us"}},/* char NatLib_InstallImmutableStateBlock(state block *,int handle) */ + { "NatLib_InstallEphemeralStateBlock","c",2,{"vx*","us"}},/* char NatLib_InstallEphemeralStateBlock(state block *,int handle) */ + { "NatLib_RemoveImmutableStateBlock","v",0,{NULL}},/* void NatLib_RemoveImmutableStateBlock() */ + { "NatLib_RemoveEphemeralStateBlock","v",0,{NULL}},/* void NatLib_RemoveEphemeralStateBlock() */ + { "NatLib_GetImmutableStateBlock","i",0,{NULL}}, /* int NatLib_GetImmutableStateBlock () */ + { "NatLib_GetEphemeralStateBlock","i",0,{NULL}}, /* int NatLib_GetEphemeralStateBlock () */ + /* Memory manager */ + { "MM_XMalloc","i",1,{"l"}}, /* int MM_XMalloc (long) */ + { "MM_Malloc","i",1,{"i"}}, /* int MM_Malloc (int) */ + { "MM_ApplicationMalloc","i",1,{"i"}}, /* int MM_ApplicationMalloc (int) */ + { "MM_Free","i",1,{"i"}}, /* int MM_Free (int) */ + { "MM_Deref","cx*",1,{"i"}}, /* char *MM_Free (int) */ + { "MM_UnrestrictedPersist","c",1,{"i"}}, /* char MM_UnrestrictedPersist (int) */ + { "MM_AppTag","c",2,{"i","c"}}, /* char *MM_AppTag (int,char) */ { NULL , NULL,0, {NULL}} /* mark end of table */ }; static const char *_a390Cmd[] = { - "a390", "$l", "$3", "$1.a51", NULL + "macro", "$l", "$3", "$1.a51", NULL }; PORT tininative_port = { @@ -508,7 +565,8 @@ PORT tininative_port = "-l", /* Options with debug */ "-l", /* Options without debug */ 0, - ".a51" + ".a51", + _tininative_do_assemble }, { NULL, @@ -558,6 +616,7 @@ PORT tininative_port = _ds390_getRegName, _tininative_keywords, _tininative_genAssemblerPreamble, + _tininative_genAssemblerEnd, _tininative_genIVT, NULL, _ds390_reset_regparm, diff --git a/src/ds390/peeph.def b/src/ds390/peeph.def index ecea4564..baf0ada1 100644 --- a/src/ds390/peeph.def +++ b/src/ds390/peeph.def @@ -1632,11 +1632,11 @@ replace { mov dptr,#%1 } -replace { - push %1 - pop %1 +replace restart { + push ar%1 + pop ar%1 } by { - ; Peephole 211 removed redundant push %1 pop %1 + ; Peephole 211 removed redundant push r%1 pop r%1 } replace { diff --git a/src/ds390/ralloc.c b/src/ds390/ralloc.c index 14b254db..638aa656 100644 --- a/src/ds390/ralloc.c +++ b/src/ds390/ralloc.c @@ -2022,8 +2022,9 @@ findAssignToSym (operand * op, iCode * ic) /*-----------------------------------------------------------------*/ static int packRegsForSupport (iCode * ic, eBBlock * ebp) -{ +{ int change = 0; + /* for the left & right operand :- look to see if the left was assigned a true symbol in far space in that case replace them */ @@ -2136,9 +2137,8 @@ packRegsDPTRuse (operand * op) if (OP_SYMBOL(IC_RESULT(ic))->liveTo == OP_SYMBOL(IC_RESULT(ic))->liveFrom) continue ; etype = getSpec(type = operandType(IC_RESULT(ic))); - //if (getSize(type) == 0 || isOperandEqual(op,IC_RESULT(ic))) - if (getSize(type) == 0) - continue ; + if (getSize(type) == 0 || isOperandEqual(op,IC_RESULT(ic))) + continue ; return NULL ; } @@ -2587,9 +2587,11 @@ packRegisters (eBBlock * ebp) } #endif +#if 0 /* unsafe */ /* reduce for support function calls */ if (ic->supportRtn || ic->op == '+' || ic->op == '-') packRegsForSupport (ic, ebp); +#endif /* some cases the redundant moves can can be eliminated for return statements */ @@ -2600,8 +2602,12 @@ packRegisters (eBBlock * ebp) packRegsDPTRuse (IC_LEFT (ic)); } - if ((ic->op == CALL && getSize(operandType(IC_RESULT(ic))) <= 4)) { - packRegsDPTRuse (IC_RESULT (ic)); + if (ic->op == CALL) { + sym_link *ftype = operandType(IC_LEFT(ic)); + if (getSize(operandType(IC_RESULT(ic))) <= 4 && + !IFFUNC_ISBUILTIN(ftype)) { + packRegsDPTRuse (IC_RESULT (ic)); + } } /* if pointer set & left has a size more than -- 2.30.2