X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fds390%2Fgen.c;h=77bae8aaf24e441ecfdb34b5652603453148d53a;hb=5041ceef1317fba40db00ddc5f57b74f7484220d;hp=e27f8293ad3b02fc4f4ad6a8778471b60906430f;hpb=7520fc6559f7047fbcb0ca2443614b72438b3a9e;p=fw%2Fsdcc diff --git a/src/ds390/gen.c b/src/ds390/gen.c index e27f8293..77bae8aa 100644 --- a/src/ds390/gen.c +++ b/src/ds390/gen.c @@ -56,14 +56,15 @@ #define BETTER_LITERAL_SHIFT char *aopLiteral (value * val, int offset); +extern int allocInfo; /* this is the down and dirty file with all kinds of kludgy & hacky stuff. This is what it is all about CODE GENERATION for a specific MCU . some of the routines may be reusable, will have to see */ -static char *zero = "#0x00"; -static char *one = "#0x01"; +static char *zero = "#0"; +static char *one = "#1"; static char *spname; #define D(x) x @@ -79,6 +80,7 @@ static char *fReturn16[] = static char **fReturn = fReturn24; static char *accUse[] = {"a", "b"}; +static char *dptrn[2][3]; static char *javaRet[] = { "r0","r1","r2","r3"}; static short rbank = -1; @@ -91,10 +93,16 @@ static struct short inLine; short debugLine; short nRegsSaved; + short dptrInUse; + short dptr1InUse; set *sendSet; } _G; +static char *rb1regs[] = { + "b1_0","b1_1","b1_2","b1_3","b1_4","b1_5","b1_6","b1_7" +}; + static void saveRBank (int, iCode *, bool); #define RESULTONSTACK(x) \ @@ -130,6 +138,20 @@ static unsigned char SRMask[] = #define MSB16 1 #define MSB24 2 #define MSB32 3 +#define PROTECT_SP {if (options.protect_sp_update) { \ + symbol *lbl = newiTempLabel(NULL); \ + emitcode ("setb","F1"); \ + emitcode ("jbc","EA,!tlabel",lbl->key+100); \ + emitcode ("clr","F1"); \ + emitcode ("","!tlabeldef",lbl->key+100); \ + }} +#define UNPROTECT_SP { if (options.protect_sp_update) { \ + symbol *lbl = newiTempLabel(NULL); \ + emitcode ("jnb","F1,!tlabel",lbl->key+100); \ + emitcode ("setb","EA"); \ + emitcode ("","!tlabeldef",lbl->key+100); \ + }} + /*-----------------------------------------------------------------*/ /* emitcode - writes the code into a file : for now it is simple */ @@ -460,49 +482,77 @@ aopForSym (iCode * ic, symbol * sym, bool result, bool useDP2) if (sym->onStack && options.stack10bit) { + short stack_val = -((sym->stack < 0) ? + ((short) (sym->stack - _G.nRegsSaved)) : + ((short) sym->stack)) ; + if (useDP2 && _G.dptr1InUse) { + emitcode ("push","dpl1"); + emitcode ("push","dph1"); + emitcode ("push","dpx1"); + } else if (_G.dptrInUse ) { + emitcode ("push","dpl"); + emitcode ("push","dph"); + emitcode ("push","dpx"); + } /* It's on the 10 bit stack, which is located in * far data space. - */ - - if (_G.accInUse) - emitcode ("push", "acc"); - - if (_G.bInUse) - emitcode ("push", "b"); - - emitcode ("mov", "a,_bpx"); - emitcode ("clr","c"); - emitcode ("subb", "a,#!constbyte", - -((sym->stack < 0) ? - ((short) (sym->stack - _G.nRegsSaved)) : - ((short) sym->stack)) & 0xff); - emitcode ("mov","b,a"); - emitcode ("mov","a,_bpx+1"); - emitcode ("subb","a,#!constbyte",(-((sym->stack < 0) ? - ((short) (sym->stack - _G.nRegsSaved)) : - ((short) sym->stack)) >> 8) & 0xff); - if (useDP2) { - if (options.model == MODEL_FLAT24) - emitcode ("mov", "dpx1,#!constbyte", (options.stack_loc >> 16) & 0xff); - TR_DPTR("#2"); - emitcode ("mov", "dph1,a"); - emitcode ("mov", "dpl1,b"); - } else { - if (options.model == MODEL_FLAT24) - emitcode ("mov", "dpx,#!constbyte", (options.stack_loc >> 16) & 0xff); - emitcode ("mov", "dph,a"); - emitcode ("mov", "dpl,b"); - } - - if (_G.bInUse) - emitcode ("pop", "b"); - - if (_G.accInUse) - emitcode ("pop", "acc"); - - sym->aop = aop = newAsmop ((short) (useDP2 ? AOP_DPTR2 : AOP_DPTR)); - aop->size = getSize (sym->type); - return aop; + */ + if (stack_val < 0 && stack_val > -5) { /* between -5 & -1 */ + if (useDP2) { + if (options.model == MODEL_FLAT24) + emitcode ("mov", "dpx1,#!constbyte", (options.stack_loc >> 16) & 0xff); + TR_DPTR("#2"); + emitcode ("mov", "dph1,_bpx+1"); + emitcode ("mov", "dpl1,_bpx"); + emitcode ("mov","dps,#1"); + } else { + if (options.model == MODEL_FLAT24) + emitcode ("mov", "dpx,#!constbyte", (options.stack_loc >> 16) & 0xff); + emitcode ("mov", "dph,_bpx+1"); + emitcode ("mov", "dpl,_bpx"); + } + stack_val = -stack_val; + while (stack_val--) { + emitcode ("inc","dptr"); + } + if (useDP2) { + emitcode("mov","dps,#0"); + } + } else { + if (_G.accInUse) + emitcode ("push", "acc"); + + if (_G.bInUse) + emitcode ("push", "b"); + + emitcode ("mov", "a,_bpx"); + emitcode ("clr","c"); + emitcode ("subb", "a,#!constbyte", stack_val & 0xff); + emitcode ("mov","b,a"); + emitcode ("mov","a,_bpx+1"); + emitcode ("subb","a,#!constbyte",(stack_val >> 8) & 0xff); + if (useDP2) { + if (options.model == MODEL_FLAT24) + emitcode ("mov", "dpx1,#!constbyte", (options.stack_loc >> 16) & 0xff); + TR_DPTR("#2"); + emitcode ("mov", "dph1,a"); + emitcode ("mov", "dpl1,b"); + } else { + if (options.model == MODEL_FLAT24) + emitcode ("mov", "dpx,#!constbyte", (options.stack_loc >> 16) & 0xff); + emitcode ("mov", "dph,a"); + emitcode ("mov", "dpl,b"); + } + + if (_G.bInUse) + emitcode ("pop", "b"); + + if (_G.accInUse) + emitcode ("pop", "acc"); + } + sym->aop = aop = newAsmop ((short) (useDP2 ? AOP_DPTR2 : AOP_DPTR)); + aop->size = getSize (sym->type); + return aop; } /* if in bit space */ @@ -531,7 +581,7 @@ aopForSym (iCode * ic, symbol * sym, bool result, bool useDP2) aop->size = FPTRSIZE; return aop; } - + /* only remaining is far space */ /* in which case DPTR gets the address */ sym->aop = aop = newAsmop ((short) (useDP2 ? AOP_DPTR2 : AOP_DPTR)); @@ -592,8 +642,12 @@ aopForRemat (symbol * sym) OP_SYMBOL (IC_LEFT (ic))->rname, val >= 0 ? '+' : '-', abs (val) & 0xffff); - else - strcpy (buffer, OP_SYMBOL (IC_LEFT (ic))->rname); + else { + if (IS_ASSIGN_ICODE(ic) && isOperandLiteral(IC_RIGHT(ic))) + sprintf(buffer,"0x%x",(int) operandLitValue (IC_RIGHT (ic))); + else + strcpy (buffer, OP_SYMBOL (IC_LEFT (ic))->rname); + } aop->aopu.aop_immd.aop_immd1 = Safe_calloc (1, strlen (buffer) + 1); strcpy (aop->aopu.aop_immd.aop_immd1, buffer); @@ -833,7 +887,7 @@ aopOp (operand * op, iCode * ic, bool result, bool useDP2) /* a AOP_STR uses DPTR, but DPTR is already in use; * we're just hosed. */ - fprintf (stderr, "*** Internal error: AOP_STR with DPTR in use! for operand %s\n",sym->name); + werror(E_INTERNAL_ERROR,__FILE__,__LINE__,"AOP_STR with DPTR in use!"); } aop = op->aop = sym->aop = newAsmop (AOP_STR); @@ -842,7 +896,13 @@ aopOp (operand * op, iCode * ic, bool result, bool useDP2) aop->aopu.aop_str[i] = fReturn[i]; return; } - + + if (sym->dptr) { /* has been allocated to a DPTRn */ + aop = op->aop = sym->aop = newAsmop (AOP_DPTRn); + aop->size = getSize (sym->type); + aop->aopu.dptr = sym->dptr; + return ; + } /* else spill location */ if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) { /* force a new aop if sizes differ */ @@ -961,8 +1021,21 @@ freeAsmop (operand * op, asmop * aaop, iCode * ic, bool pop) _G.r1Pushed--; } } + case AOP_DPTR2: + if (_G.dptr1InUse) { + emitcode ("pop","dpx1"); + emitcode ("pop","dph1"); + emitcode ("pop","dpl1"); + } + break; + case AOP_DPTR: + if (_G.dptrInUse) { + emitcode ("pop","dpx"); + emitcode ("pop","dph"); + emitcode ("pop","dpl"); + } + break; } - dealloc: /* all other cases just dealloc */ if (op) @@ -1032,6 +1105,10 @@ aopGet (asmop * aop, strcpy (rs, s); return rs; + case AOP_DPTRn: + assert(offset <= 3); + return dptrn[aop->aopu.dptr][offset]; + case AOP_DPTR: case AOP_DPTR2: @@ -1208,6 +1285,10 @@ aopPut (asmop * aop, char *s, int offset) } break; + case AOP_DPTRn: + emitcode ("mov","%s,%s",dptrn[aop->aopu.dptr][offset],s); + break; + case AOP_DPTR: case AOP_DPTR2: @@ -1328,11 +1409,8 @@ aopPut (asmop * aop, char *s, int offset) MOVA (s); } { - symbol *lbl = newiTempLabel (NULL); - emitcode ("clr", "c"); - emitcode ("jz", "!tlabel", lbl->key + 100); - emitcode ("cpl", "c"); - emitcode ("", "!tlabeldef", lbl->key + 100); + /* set C, if a >= 1 */ + emitcode ("add", "a,#!constbyte",0xff); emitcode ("mov", "%s,c", aop->aopu.aop_dir); } } @@ -1415,6 +1493,8 @@ reAdjustPreg (asmop * aop) #define AOP_INPREG(x) (x && (x->type == AOP_REG && \ (x->aopu.aop_reg[0] == ds390_regWithIdx(R0_IDX) || \ x->aopu.aop_reg[0] == ds390_regWithIdx(R1_IDX) ))) +#define AOP_INDPTRn(x) (AOP_TYPE(x) == AOP_DPTRn) +#define AOP_USESDPTR(x) (AOP_TYPE(x) == AOP_DPTR || AOP_TYPE(x) == AOP_STR) /* Workaround for DS80C390 bug: div ab may return bogus results * if A is accessed in instruction immediately before the div. @@ -1673,6 +1753,7 @@ genCpl (iCode * ic) { int offset = 0; int size; + symbol *tlbl; D (emitcode (";", "genCpl "); ); @@ -1682,17 +1763,21 @@ genCpl (iCode * ic) aopOp (IC_LEFT (ic), ic, FALSE, FALSE); aopOp (IC_RESULT (ic), ic, TRUE, AOP_TYPE (IC_LEFT (ic)) == AOP_DPTR); - /* if both are in bit space then - a special case */ - if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY && - AOP_TYPE (IC_LEFT (ic)) == AOP_CRY) - { - + /* special case if in bit space */ + if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY) { + if (AOP_TYPE (IC_LEFT (ic)) == AOP_CRY) { emitcode ("mov", "c,%s", IC_LEFT (ic)->aop->aopu.aop_dir); emitcode ("cpl", "c"); emitcode ("mov", "%s,c", IC_RESULT (ic)->aop->aopu.aop_dir); goto release; } + tlbl=newiTempLabel(NULL); + emitcode ("cjne", "%s,#0x01,%05d$", + aopGet(AOP(IC_LEFT(ic)), 0, FALSE,FALSE,TRUE), tlbl->key+100); + emitcode ("", "%05d$:", tlbl->key+100); + outBitC (IC_RESULT(ic)); + goto release; + } size = AOP_SIZE (IC_RESULT (ic)); _startLazyDPSEvaluation (); @@ -1887,6 +1972,7 @@ saveRegisters (iCode * lic) if (bitVectBitValue(ic->rMask,i)) rsave = bitVectSetBit(rsave,i); } + rsave = bitVectCplAnd(rsave,ds390_rUmaskForOp (IC_RESULT(ic))); } else { /* safe the registers in use at this time but skip the ones for the result */ @@ -1941,6 +2027,7 @@ unsaveRegisters (iCode * ic) if (bitVectBitValue(ic->rMask,i)) rsave = bitVectSetBit(rsave,i); } + rsave = bitVectCplAnd(rsave,ds390_rUmaskForOp (IC_RESULT(ic))); } else { /* restore the registers in use at this time but skip the ones for the result */ @@ -2052,7 +2139,7 @@ genIpush (iCode * ic) { /* and the item is spilt then do nothing */ - if (OP_SYMBOL (IC_LEFT (ic))->isspilt) + if (OP_SYMBOL (IC_LEFT (ic))->isspilt || OP_SYMBOL(IC_LEFT(ic))->dptr) return; aopOp (IC_LEFT (ic), ic, FALSE, FALSE); @@ -2124,7 +2211,7 @@ genIpop (iCode * ic) /* if the temp was not pushed then */ - if (OP_SYMBOL (IC_LEFT (ic))->isspilt) + if (OP_SYMBOL (IC_LEFT (ic))->isspilt || OP_SYMBOL (IC_LEFT (ic))->dptr) return; aopOp (IC_LEFT (ic), ic, FALSE, FALSE); @@ -2273,6 +2360,56 @@ saveRBank (int bank, iCode * ic, bool pushPsw) } } +/*-----------------------------------------------------------------*/ +/* genSend - gen code for SEND */ +/*-----------------------------------------------------------------*/ +static void genSend(set *sendSet) +{ + iCode *sic; + int sendCount = 0 ; + static int rb1_count = 0; + + for (sic = setFirstItem (sendSet); sic; + sic = setNextItem (sendSet)) { + int size, offset = 0; + + size=getSize(operandType(IC_LEFT(sic))); + D (emitcode (";", "genSend argreg = %d, size = %d ",sic->argreg,size)); + if (sendCount == 0) { /* first parameter */ + // we know that dpl(hxb) is the result, so + rb1_count = 0 ; + _startLazyDPSEvaluation (); + if (size>1) { + aopOp (IC_LEFT (sic), sic, FALSE, + (IS_SYMOP(IC_LEFT(sic)) && OP_SYMBOL(IC_LEFT(sic))->ruonly ? FALSE : TRUE)); + } else { + aopOp (IC_LEFT (sic), sic, FALSE, FALSE); + } + while (size--) { + char *l = aopGet (AOP (IC_LEFT (sic)), offset, + FALSE, FALSE, TRUE); + if (strcmp (l, fReturn[offset])) { + emitcode ("mov", "%s,%s", + fReturn[offset], + l); + } + offset++; + } + _endLazyDPSEvaluation (); + freeAsmop (IC_LEFT (sic), NULL, sic, TRUE); + rb1_count =0; + } else { /* if more parameter in registers */ + aopOp (IC_LEFT (sic), sic, FALSE, TRUE); + while (size--) { + emitcode ("mov","b1_%d,%s",rb1_count++,aopGet (AOP (IC_LEFT (sic)), offset++, + FALSE, FALSE, TRUE)); + } + freeAsmop (IC_LEFT (sic), NULL, sic, TRUE); + } + sendCount++; + } +} + /*-----------------------------------------------------------------*/ /* genCall - generates a call statement */ /*-----------------------------------------------------------------*/ @@ -2316,74 +2453,10 @@ genCall (iCode * ic) */ if (_G.sendSet) { - iCode *sic; - - for (sic = setFirstItem (_G.sendSet); sic; - sic = setNextItem (_G.sendSet)) - { - int size, offset = 0; - -#if 0 - aopOp (IC_LEFT (sic), sic, FALSE, FALSE); - size = AOP_SIZE (IC_LEFT (sic)); - - _startLazyDPSEvaluation (); - while (size--) - { - char *l = aopGet (AOP(IC_LEFT(sic)), offset, - FALSE, FALSE, TRUE); - if ((AOP_TYPE(IC_LEFT(sic)) == AOP_DPTR) && size) - { - emitcode("mov", "%s,%s", regs390[offset].name, l); - } - else if (strcmp (l, fReturn[offset])) - { - emitcode ("mov", "%s,%s", - fReturn[offset], - l); - } - offset++; - } - _endLazyDPSEvaluation (); - if (AOP_TYPE(IC_LEFT(sic)) == AOP_DPTR) - { - size = AOP_SIZE (IC_LEFT (sic)); - if (size) - { - size--; - } - while (size) - { - size--; - emitcode("mov", "%s,%s", - fReturn[size], regs390[size].name); - } - } -#else - // we know that dpl(hxb) is the result, so - _startLazyDPSEvaluation (); - size=getSize(operandType(IC_LEFT(sic))); - if (size>1) { - aopOp (IC_LEFT (sic), sic, FALSE, - (IS_SYMOP(IC_LEFT(sic)) && OP_SYMBOL(IC_LEFT(sic))->ruonly ? FALSE : TRUE)); - } else { - aopOp (IC_LEFT (sic), sic, FALSE, FALSE); - } - while (size--) - { - char *l = aopGet (AOP (IC_LEFT (sic)), offset, - FALSE, FALSE, TRUE); - if (strcmp (l, fReturn[offset])) - { - emitcode ("mov", "%s,%s", - fReturn[offset], - l); - } - offset++; - } - _endLazyDPSEvaluation (); -#endif - freeAsmop (IC_LEFT (sic), NULL, sic, TRUE); + if (IFFUNC_ISREENT(dtype)) { /* need to reverse the send set */ + genSend(reverseSet(_G.sendSet)); + } else { + genSend(_G.sendSet); } _G.sendSet = NULL; } @@ -2448,16 +2521,26 @@ genCall (iCode * ic) /* adjust the stack for parameters if required */ if (ic->parmBytes) { + int i; if (options.stack10bit) { - emitcode ("clr","c"); - emitcode ("mov","a,sp"); - emitcode ("subb","a,#!constbyte",ic->parmBytes & 0xff); - emitcode ("mov","sp,a"); - emitcode ("mov","a,esp"); - emitcode ("subb","a,#!constbyte",(ic->parmBytes >> 8) & 0xff); - emitcode ("mov","esp,a"); + if (ic->parmBytes <= 10) { + emitcode(";","stack adjustment for parms"); + for (i=0; i < ic->parmBytes ; i++) { + emitcode("pop","acc"); + } + } else { + PROTECT_SP; + emitcode ("clr","c"); + emitcode ("mov","a,sp"); + emitcode ("subb","a,#!constbyte",ic->parmBytes & 0xff); + emitcode ("mov","sp,a"); + emitcode ("mov","a,esp"); + emitcode ("anl","a,#3"); + emitcode ("subb","a,#!constbyte",(ic->parmBytes >> 8) & 0xff); + emitcode ("mov","esp,a"); + UNPROTECT_SP; + } } else { - int i; if (ic->parmBytes > 3) { emitcode ("mov", "a,%s", spname); emitcode ("add", "a,#!constbyte", (-ic->parmBytes) & 0xff); @@ -2528,37 +2611,8 @@ genPcall (iCode * ic) /* if send set is not empty the assign */ if (_G.sendSet) { - iCode *sic; - - for (sic = setFirstItem (_G.sendSet); sic; - sic = setNextItem (_G.sendSet)) - { - int size, offset = 0; - - // we know that dpl(hxb) is the result, so - _startLazyDPSEvaluation (); - size=getSize(operandType(IC_LEFT(sic))); - if (size>1) { - aopOp (IC_LEFT (sic), sic, FALSE, TRUE); - } else { - aopOp (IC_LEFT (sic), sic, FALSE, FALSE); - } - while (size--) - { - char *l = aopGet (AOP (IC_LEFT (sic)), offset, - FALSE, FALSE, TRUE); - if (strcmp (l, fReturn[offset])) - { - emitcode ("mov", "%s,%s", - fReturn[offset], - l); - } - offset++; - } - _endLazyDPSEvaluation (); - freeAsmop (IC_LEFT (sic), NULL, sic, TRUE); - } - _G.sendSet = NULL; + genSend(reverseSet(_G.sendSet)); + _G.sendSet = NULL; } emitcode ("ret", ""); @@ -2586,18 +2640,36 @@ genPcall (iCode * ic) if (ic->parmBytes) { int i; - if (ic->parmBytes > 3) - { - emitcode ("mov", "a,%s", spname); - emitcode ("add", "a,#!constbyte", (-ic->parmBytes) & 0xff); - emitcode ("mov", "%s,a", spname); - } - else - for (i = 0; i < ic->parmBytes; i++) - emitcode ("dec", "%s", spname); - + if (options.stack10bit) { + if (ic->parmBytes <= 10) { + emitcode(";","stack adjustment for parms"); + for (i=0; i < ic->parmBytes ; i++) { + emitcode("pop","acc"); + } + } else { + PROTECT_SP; + emitcode ("clr","c"); + emitcode ("mov","a,sp"); + emitcode ("subb","a,#!constbyte",ic->parmBytes & 0xff); + emitcode ("mov","sp,a"); + emitcode ("mov","a,esp"); + emitcode ("anl","a,#3"); + emitcode ("subb","a,#!constbyte",(ic->parmBytes >> 8) & 0xff); + emitcode ("mov","esp,a"); + UNPROTECT_SP; + } + } else { + if (ic->parmBytes > 3) { + emitcode ("mov", "a,%s", spname); + emitcode ("add", "a,#!constbyte", (-ic->parmBytes) & 0xff); + emitcode ("mov", "%s,a", spname); + } + else + for (i = 0; i < ic->parmBytes; i++) + emitcode ("dec", "%s", spname); + + } } - /* if register bank was saved then unsave them */ if (restoreBank) unsaveRBank (FUNC_REGBANK (dtype), ic, TRUE); @@ -2714,8 +2786,7 @@ genFunction (iCode * ic) /* if this is an interrupt service routine then save acc, b, dpl, dph */ if (IFFUNC_ISISR (sym->type)) - { - + { /* is ISR */ if (!inExcludeList ("acc")) emitcode ("push", "acc"); if (!inExcludeList ("b")) @@ -2744,13 +2815,13 @@ genFunction (iCode * ic) registers :-) */ if (!FUNC_REGBANK (sym->type)) { + int i; /* if this function does not call any other function then we can be economical and save only those registers that are used */ if (!IFFUNC_HASFCALL(sym->type)) { - int i; /* if any registers used */ if (sym->regsUsed) @@ -2771,6 +2842,11 @@ genFunction (iCode * ic) determines register usage so we will have to push the entire bank */ saveRBank (0, ic, FALSE); + if (options.parms_in_bank1) { + for (i=0; i < 8 ; i++ ) { + emitcode ("push","%s",rb1regs[i]); + } + } } } else @@ -2897,7 +2973,8 @@ genFunction (iCode * ic) emitcode ("mov", "psw,#!constbyte", (FUNC_REGBANK (sym->type) << 3) & 0x00ff); } - if (IFFUNC_ISREENT (sym->type) || options.stackAuto) { + if ( (IFFUNC_ISREENT (sym->type) || options.stackAuto) && + (sym->stack || FUNC_HASSTACKPARM(sym->type))) { if (options.stack10bit) { emitcode ("push","_bpx"); emitcode ("push","_bpx+1"); @@ -2922,14 +2999,21 @@ genFunction (iCode * ic) if (sym->stack) { int i = sym->stack; if (options.stack10bit) { - if ( i > 1024) werror (W_STACK_OVERFLOW, sym->name); + if ( i > 1024) werror (W_STACK_OVERFLOW, sym->name); assert (sym->recvSize <= 4); - emitcode ("mov","a,sp"); - emitcode ("add","a,#!constbyte", ((short) sym->stack & 0xff)); - emitcode ("mov","sp,a"); - emitcode ("mov","a,esp"); - emitcode ("addc","a,#!constbyte", (((short) sym->stack) >> 8) & 0xff); - emitcode ("mov","esp,a"); + if (sym->stack <= 8) { + while (i--) emitcode ("push","acc"); + } else { + PROTECT_SP; + emitcode ("mov","a,sp"); + emitcode ("add","a,#!constbyte", ((short) sym->stack & 0xff)); + emitcode ("mov","sp,a"); + emitcode ("mov","a,esp"); + emitcode ("anl","a,#3"); + emitcode ("addc","a,#!constbyte", (((short) sym->stack) >> 8) & 0xff); + emitcode ("mov","esp,a"); + UNPROTECT_SP; + } } else { if (i > 256) werror (W_STACK_OVERFLOW, sym->name); @@ -2972,10 +3056,14 @@ genEndFunction (iCode * ic) return; } - if (IFFUNC_ISREENT (sym->type) || options.stackAuto) { + if ((IFFUNC_ISREENT (sym->type) || options.stackAuto) && + (sym->stack || FUNC_HASSTACKPARM(sym->type))) { + if (options.stack10bit) { + PROTECT_SP; emitcode ("mov", "sp,_bpx", spname); emitcode ("mov", "esp,_bpx+1", spname); + UNPROTECT_SP; } else { emitcode ("mov", "%s,_bp", spname); } @@ -2991,7 +3079,9 @@ genEndFunction (iCode * ic) } - if ((IFFUNC_ISREENT (sym->type) || options.stackAuto)) { + if ((IFFUNC_ISREENT (sym->type) || options.stackAuto) && + (sym->stack || FUNC_HASSTACKPARM(sym->type))) { + if (options.useXstack) { emitcode ("mov", "r0,%s", spname); emitcode ("movx", "a,@r0"); @@ -3018,10 +3108,10 @@ genEndFunction (iCode * ic) */ emitcode ("pop", "psw"); } - } + } if (IFFUNC_ISISR (sym->type)) - { + { /* is ISR */ /* now we need to restore the registers */ /* if this isr has no bank i.e. is going to @@ -3029,12 +3119,12 @@ genEndFunction (iCode * ic) registers :-) */ if (!FUNC_REGBANK (sym->type)) { + int i; /* if this function does not call any other function then we can be economical and save only those registers that are used */ if (!IFFUNC_HASFCALL(sym->type)) { - int i; /* if any registers used */ if (sym->regsUsed) @@ -3054,6 +3144,11 @@ genEndFunction (iCode * ic) /* this function has a function call cannot determines register usage so we will have to pop the entire bank */ + if (options.parms_in_bank1) { + for (i = 7 ; i >= 0 ; i-- ) { + emitcode ("pop","%s",rb1regs[i]); + } + } unsaveRBank (0, ic, FALSE); } } @@ -3315,6 +3410,13 @@ findLabelBackwards (iCode * ic, int key) ic = ic->prev; count++; + /* If we have any pushes or pops, we cannot predict the distance. + I don't like this at all, this should be dealt with in the + back-end */ + if (ic->op == IPUSH || ic->op == IPOP) { + return 0; + } + if (ic->op == LABEL && IC_LABEL (ic)->key == key) { /* printf("findLabelBackwards = %d\n", count); */ @@ -3345,6 +3447,13 @@ genPlusIncr (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; + if (size == 1 && AOP(IC_LEFT(ic)) == AOP(IC_RESULT(ic)) && + AOP_TYPE(IC_LEFT(ic)) == AOP_DIR ) { + while (icount--) { + emitcode("inc","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE,FALSE)); + } + return TRUE; + } /* if increment 16 bits in register */ if ( AOP_TYPE (IC_LEFT (ic)) == AOP_REG && @@ -3426,6 +3535,32 @@ genPlusIncr (iCode * ic) return TRUE; } + if (AOP_TYPE(IC_RESULT(ic))==AOP_STR && IS_ITEMP(IC_RESULT(ic)) && + !AOP_USESDPTR(IC_LEFT(ic)) && icount <= 5 && size <= 3 && + options.model == MODEL_FLAT24 ) { + + switch (size) { + case 3: + emitcode ("mov","dpx,%s",aopGet(AOP (IC_LEFT (ic)), 2, FALSE, FALSE, FALSE)); + case 2: + emitcode ("mov","dph,%s",aopGet(AOP (IC_LEFT (ic)), 1, FALSE, FALSE, FALSE)); + case 1: + emitcode ("mov","dpl,%s",aopGet(AOP (IC_LEFT (ic)), 0, FALSE, FALSE, FALSE)); + break; + } + while (icount--) emitcode ("inc","dptr"); + return TRUE; + } + + if (AOP_INDPTRn(IC_LEFT(ic)) && AOP_INDPTRn(IC_RESULT(ic)) && + AOP(IC_LEFT(ic))->aopu.dptr == AOP(IC_RESULT(ic))->aopu.dptr && + icount <= 5 ) { + emitcode ("mov","dps,#!constbyte",AOP(IC_LEFT(ic))->aopu.dptr); + while (icount--) emitcode ("inc","dptr"); + emitcode ("mov","dps,#0"); + return TRUE; + } + /* if the sizes are greater than 1 then we cannot */ if (AOP_SIZE (IC_RESULT (ic)) > 1 || AOP_SIZE (IC_LEFT (ic)) > 1) @@ -3545,24 +3680,6 @@ adjustArithmeticResult (iCode * ic) } } -#if 0 // AOP_OP_3 is deprecated; nobody likes Ack errors. - // Please don't bring it back without a really good reason. -// Macro to aopOp all three operands of an ic. Will fatal if this cannot be done -// (because all three operands are in far space). -#define AOP_OP_3(ic) \ - aopOp (IC_RIGHT(ic),ic,FALSE, FALSE); \ - aopOp (IC_LEFT(ic),ic,FALSE, (AOP_TYPE(IC_RIGHT(ic)) == AOP_DPTR)); \ - aopOp (IC_RESULT(ic),ic,TRUE, (AOP_TYPE(IC_LEFT(ic)) == AOP_DPTR) || \ - (AOP_TYPE(IC_RIGHT(ic)) == AOP_DPTR)); \ - if (AOP_TYPE(IC_LEFT(ic)) == AOP_DPTR2 && \ - AOP_TYPE(IC_RESULT(ic)) == AOP_DPTR2) \ - { \ - /* werror(E_INTERNAL_ERROR,__FILE__,__LINE__, */ \ - fprintf(stderr, \ - "Ack: three operands in far space! (%s:%d %s:%d)\n", __FILE__, __LINE__, ic->filename, ic->lineno); \ - } -#endif - // Macro to aopOp all three operands of an ic. If this cannot be done, // the IC_LEFT and IC_RIGHT operands will be aopOp'd, and the rc parameter // will be set TRUE. The caller must then handle the case specially, noting @@ -3570,9 +3687,9 @@ adjustArithmeticResult (iCode * ic) #define AOP_OP_3_NOFATAL(ic, rc) \ aopOp (IC_RIGHT(ic),ic,FALSE, FALSE); \ aopOp (IC_LEFT(ic),ic,FALSE, (AOP_TYPE(IC_RIGHT(ic)) == AOP_DPTR) || \ - (OP_SYMBOL(IC_RESULT(ic))->ruonly)); \ + ((OP_SYMBOL(IC_RESULT(ic))->ruonly) && !isOperandEqual(IC_LEFT(ic),IC_RESULT(ic)))); \ if (AOP_TYPE(IC_LEFT(ic)) == AOP_DPTR2 && \ - (isOperandInFarSpace(IC_RESULT(ic)) || OP_SYMBOL(IC_RESULT(ic))->ruonly )) \ + (isOperandInFarSpace(IC_RESULT(ic)) || (OP_SYMBOL(IC_RESULT(ic))->ruonly && !isOperandEqual(IC_LEFT(ic),IC_RESULT(ic))))) \ { \ /* No can do; DPTR & DPTR2 in use, and we need another. */ \ rc = TRUE; \ @@ -3845,6 +3962,13 @@ genMinusDec (iCode * ic) if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4) return FALSE; + if (size == 1 && AOP(IC_LEFT(ic)) == AOP(IC_RESULT(ic)) && + AOP_TYPE(IC_LEFT(ic)) == AOP_DIR ) { + while (icount--) { + emitcode("dec","%s",aopGet(AOP(IC_RESULT(ic)),0,FALSE,FALSE,FALSE)); + } + return TRUE; + } /* if decrement 16 bits in register */ if (AOP_TYPE (IC_LEFT (ic)) == AOP_REG && AOP_TYPE (IC_RESULT (ic)) == AOP_REG && @@ -4029,9 +4153,11 @@ genMinus (iCode * ic) D (emitcode (";", "genMinus ");); aopOp (IC_LEFT (ic), ic, FALSE, FALSE); - aopOp (IC_RIGHT (ic), ic, FALSE, TRUE); + aopOp (IC_RIGHT (ic), ic, FALSE, + (AOP_INDPTRn(IC_LEFT(ic)) ? FALSE : (AOP_USESDPTR(IC_LEFT(ic)) ? TRUE : FALSE))); if ((AOP_TYPE (IC_LEFT (ic)) == AOP_DPTR) && - (AOP_TYPE (IC_RIGHT (ic)) == AOP_DPTR2)) + ((AOP_TYPE (IC_RIGHT (ic)) == AOP_DPTR2) + || OP_SYMBOL(IC_RESULT(ic))->ruonly)) { pushResult = TRUE; } @@ -4070,40 +4196,42 @@ genMinus (iCode * ic) /* if literal, add a,#-lit, else normal subb */ _startLazyDPSEvaluation (); - while (size--) - { + while (size--) { MOVA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE, FALSE, TRUE)); - if (AOP_TYPE (IC_RIGHT (ic)) != AOP_LIT) - emitcode ("subb", "a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE, FALSE)); - else - { + if (AOP_TYPE (IC_RIGHT (ic)) != AOP_LIT) { + if (AOP_USESDPTR(IC_RIGHT(ic))) { + emitcode ("mov","b,a"); + MOVA(aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE, FALSE)); + emitcode ("xch","a,b"); + emitcode ("subb","a,b"); + } else { + emitcode ("subb", "a,%s", + aopGet (AOP (IC_RIGHT (ic)), offset, FALSE, FALSE, FALSE)); + } + } else { /* first add without previous c */ if (!offset) { - if (!size && lit==-1) { - emitcode ("dec", "a"); - } else { - emitcode ("add", "a,#!constbyte", - (unsigned int) (lit & 0x0FFL)); - } + if (!size && lit==-1) { + emitcode ("dec", "a"); + } else { + emitcode ("add", "a,#!constbyte", + (unsigned int) (lit & 0x0FFL)); + } } else { - emitcode ("addc", "a,#!constbyte", - (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); + emitcode ("addc", "a,#!constbyte", + (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); } - } - - if (pushResult) - { + } + + if (pushResult) { emitcode ("push", "acc"); - } - else - { + } else { aopPut (AOP (IC_RESULT (ic)), "a", offset); - } + } offset++; - } + } _endLazyDPSEvaluation (); - + if (pushResult) { aopOp (IC_RESULT (ic), ic, TRUE, FALSE); @@ -5071,7 +5199,7 @@ genCmp (operand * left, operand * right, /* if unsigned char cmp with lit, do cjne left,#right,zz */ if ((size == 1) && !sign && - (AOP_TYPE (right) == AOP_LIT && AOP_TYPE (left) != AOP_DIR)) + (AOP_TYPE (right) == AOP_LIT && AOP_TYPE (left) != AOP_DIR && AOP_TYPE (left) != AOP_STR)) { symbol *lbl = newiTempLabel (NULL); emitcode ("cjne", "%s,%s,!tlabel", @@ -5574,7 +5702,7 @@ ifxForOp (operand * op, iCode * ic) /* hasInc - operand is incremented before any other use */ /*-----------------------------------------------------------------*/ static iCode * -hasInc (operand *op, iCode *ic) +hasInc (operand *op, iCode *ic, int osize) { sym_link *type = operandType(op); sym_link *retype = getSpec (type); @@ -5585,7 +5713,9 @@ hasInc (operand *op, iCode *ic) if (!IS_SYMOP(op)) return NULL; if (IS_BITVAR(retype)||!IS_PTR(type)) return NULL; - isize = getSize(type->next); + if (IS_AGGREGATE(type->next)) return NULL; + if (osize != (isize = getSize(type->next))) return NULL; + while (lic) { /* if operand of the form op = op + */ if (lic->op == '+' && isOperandEqual(IC_LEFT(lic),op) && @@ -5959,6 +6089,10 @@ genAnd (iCode * ic, iCode * ifx) sprintf (buffer, "acc.%d", posbit & 0x07); genIfxJump (ifx, buffer); } + else + { + emitcode ("anl","a,#!constbyte",1 << (posbit & 0x07)); + } goto release; } } @@ -8993,7 +9127,7 @@ genFarPointerGet (operand * left, /* if the operand is already in dptr then we do nothing else we move the value to dptr */ - if (AOP_TYPE (left) != AOP_STR) + if (AOP_TYPE (left) != AOP_STR && !AOP_INDPTRn(left) ) { /* if this is remateriazable */ if (AOP_TYPE (left) == AOP_IMMD) @@ -9028,53 +9162,81 @@ genFarPointerGet (operand * left, } } /* so dptr know contains the address */ - aopOp (result, ic, FALSE, TRUE); + aopOp (result, ic, FALSE, (AOP_INDPTRn(left) ? FALSE : TRUE)); /* if bit then unpack */ - if (IS_BITVAR (retype) || IS_BITVAR (letype)) - genUnpackBits (result, "dptr", FPOINTER); - else + if (IS_BITVAR (retype) || IS_BITVAR (letype)) { + if (AOP_INDPTRn(left)) { + genSetDPTR(AOP(left)->aopu.dptr); + } + genUnpackBits (result, "dptr", FPOINTER); + if (AOP_INDPTRn(left)) { + genSetDPTR(0); + } + } else { size = AOP_SIZE (result); offset = 0; - _startLazyDPSEvaluation (); - while (size--) - { - - genSetDPTR (0); - _flushLazyDPS (); - - emitcode ("movx", "a,@dptr"); - if (size || (dopi && pi && AOP_TYPE (left) != AOP_IMMD)) - emitcode ("inc", "dptr"); - - aopPut (AOP (result), "a", offset++); - } - _endLazyDPSEvaluation (); - } - if (dopi && pi && AOP_TYPE (left) != AOP_IMMD) { - aopPut ( AOP (left), "dpl", 0); - aopPut ( AOP (left), "dph", 1); - if (options.model == MODEL_FLAT24) - aopPut ( AOP (left), "dpx", 2); - pi->generated = 1; - } else if (OP_SYMBOL(left)->ruonly && AOP_SIZE(result) > 1 && - (OP_SYMBOL (left)->liveTo > ic->seq || ic->depth)) { - - size = AOP_SIZE (result) - 1; - while (size--) emitcode ("lcall","__decdptr"); - } - + if (AOP_INDPTRn(left) && AOP_USESDPTR(result)) { + while (size--) { + genSetDPTR(AOP(left)->aopu.dptr); + emitcode ("movx", "a,@dptr"); + if (size || (dopi && pi && AOP_TYPE (left) != AOP_IMMD)) + emitcode ("inc", "dptr"); + genSetDPTR (0); + aopPut (AOP (result), "a", offset++); + } + } else { + _startLazyDPSEvaluation (); + while (size--) { + if (AOP_INDPTRn(left)) { + genSetDPTR(AOP(left)->aopu.dptr); + } else { + genSetDPTR (0); + } + _flushLazyDPS (); + + emitcode ("movx", "a,@dptr"); + if (size || (dopi && pi && AOP_TYPE (left) != AOP_IMMD)) + emitcode ("inc", "dptr"); + + aopPut (AOP (result), "a", offset++); + } + _endLazyDPSEvaluation (); + } + } + if (dopi && pi && AOP_TYPE (left) != AOP_IMMD) { + if (!AOP_INDPTRn(left)) { + aopPut ( AOP (left), "dpl", 0); + aopPut ( AOP (left), "dph", 1); + if (options.model == MODEL_FLAT24) + aopPut ( AOP (left), "dpx", 2); + } + pi->generated = 1; + } else if ((OP_SYMBOL(left)->ruonly || AOP_INDPTRn(left)) && + AOP_SIZE(result) > 1 && + (OP_SYMBOL (left)->liveTo > ic->seq || ic->depth)) { + + size = AOP_SIZE (result) - 1; + if (AOP_INDPTRn(left)) { + genSetDPTR(AOP(left)->aopu.dptr); + } + while (size--) emitcode ("lcall","__decdptr"); + if (AOP_INDPTRn(left)) { + genSetDPTR(0); + } + } + freeAsmop (left, NULL, ic, TRUE); freeAsmop (result, NULL, ic, TRUE); } /*-----------------------------------------------------------------*/ -/* emitcodePointerGet - gget value from code space */ +/* genCodePointerGet - get value from code space */ /*-----------------------------------------------------------------*/ static void -emitcodePointerGet (operand * left, +genCodePointerGet (operand * left, operand * result, iCode * ic, iCode *pi) { int size, offset, dopi=1; @@ -9084,7 +9246,7 @@ emitcodePointerGet (operand * left, /* if the operand is already in dptr then we do nothing else we move the value to dptr */ - if (AOP_TYPE (left) != AOP_STR) + if (AOP_TYPE (left) != AOP_STR && !AOP_INDPTRn(left)) { /* if this is remateriazable */ if (AOP_TYPE (left) == AOP_IMMD) @@ -9118,41 +9280,71 @@ emitcodePointerGet (operand * left, } } /* so dptr know contains the address */ - aopOp (result, ic, FALSE, TRUE); + aopOp (result, ic, FALSE, (AOP_INDPTRn(left) ? FALSE : TRUE)); /* if bit then unpack */ - if (IS_BITVAR (retype)) - genUnpackBits (result, "dptr", CPOINTER); - else + if (IS_BITVAR (retype)) { + if (AOP_INDPTRn(left)) { + genSetDPTR(AOP(left)->aopu.dptr); + } + genUnpackBits (result, "dptr", CPOINTER); + if (AOP_INDPTRn(left)) { + genSetDPTR(0); + } + } else { size = AOP_SIZE (result); offset = 0; - - _startLazyDPSEvaluation (); - while (size--) - { - genSetDPTR (0); - _flushLazyDPS (); - - emitcode ("clr", "a"); - emitcode ("movc", "a,@a+dptr"); - if (size || (dopi && pi && AOP_TYPE (left) != AOP_IMMD)) - emitcode ("inc", "dptr"); - aopPut (AOP (result), "a", offset++); - } - _endLazyDPSEvaluation (); + if (AOP_INDPTRn(left) && AOP_USESDPTR(result)) { + while (size--) { + genSetDPTR(AOP(left)->aopu.dptr); + emitcode ("clr", "a"); + emitcode ("movc", "a,@a+dptr"); + if (size || (dopi && pi && AOP_TYPE (left) != AOP_IMMD)) + emitcode ("inc", "dptr"); + genSetDPTR (0); + aopPut (AOP (result), "a", offset++); + } + } else { + _startLazyDPSEvaluation (); + while (size--) + { + if (AOP_INDPTRn(left)) { + genSetDPTR(AOP(left)->aopu.dptr); + } else { + genSetDPTR (0); + } + _flushLazyDPS (); + + emitcode ("clr", "a"); + emitcode ("movc", "a,@a+dptr"); + if (size || (dopi && pi && AOP_TYPE (left) != AOP_IMMD)) + emitcode ("inc", "dptr"); + aopPut (AOP (result), "a", offset++); + } + _endLazyDPSEvaluation (); + } } if (dopi && pi && AOP_TYPE (left) != AOP_IMMD) { - aopPut ( AOP (left), "dpl", 0); - aopPut ( AOP (left), "dph", 1); - if (options.model == MODEL_FLAT24) - aopPut ( AOP (left), "dpx", 2); + if (!AOP_INDPTRn(left)) { + aopPut ( AOP (left), "dpl", 0); + aopPut ( AOP (left), "dph", 1); + if (options.model == MODEL_FLAT24) + aopPut ( AOP (left), "dpx", 2); + } pi->generated = 1; - } else if (OP_SYMBOL(left)->ruonly && AOP_SIZE(result) > 1 && + } else if ((OP_SYMBOL(left)->ruonly || AOP_INDPTRn(left)) && + AOP_SIZE(result) > 1 && (OP_SYMBOL (left)->liveTo > ic->seq || ic->depth)) { size = AOP_SIZE (result) - 1; + if (AOP_INDPTRn(left)) { + genSetDPTR(AOP(left)->aopu.dptr); + } while (size--) emitcode ("lcall","__decdptr"); + if (AOP_INDPTRn(left)) { + genSetDPTR(0); + } } freeAsmop (left, NULL, ic, TRUE); @@ -9190,6 +9382,7 @@ genGenPointerGet (operand * left, else { /* we need to get it byte by byte */ _startLazyDPSEvaluation (); +#if 1 // I see no point at all to this code and will likely yank it soon. if (AOP(left)->type==AOP_DPTR2) { char *l; l=aopGet(AOP(left),0,FALSE,FALSE,TRUE); @@ -9209,7 +9402,10 @@ genGenPointerGet (operand * left, } else { emitcode ("mov", "b,%s", aopGet (AOP(left),2,FALSE,FALSE,TRUE)); } - } else { + } + else +#endif + { emitcode ("mov", "dpl,%s", aopGet (AOP(left),0,FALSE,FALSE,TRUE)); emitcode ("mov", "dph,%s", aopGet (AOP(left),1,FALSE,FALSE,TRUE)); if (options.model == MODEL_FLAT24) { @@ -9293,7 +9489,7 @@ genPointerGet (iCode * ic, iCode *pi) if (p_type == GPOINTER && OP_SYMBOL(left)->remat && IS_CAST_ICODE(OP_SYMBOL(left)->rematiCode)) { left = IC_RIGHT(OP_SYMBOL(left)->rematiCode); - type = type = operandType (left); + type = operandType (left); p_type = DCL_TYPE (type); } /* now that we have the pointer type we assign @@ -9315,7 +9511,7 @@ genPointerGet (iCode * ic, iCode *pi) break; case CPOINTER: - emitcodePointerGet (left, result, ic, pi); + genCodePointerGet (left, result, ic, pi); break; case GPOINTER: @@ -9737,7 +9933,7 @@ genFarPointerSet (operand * right, /* if the operand is already in dptr then we do nothing else we move the value to dptr */ - if (AOP_TYPE (result) != AOP_STR) + if (AOP_TYPE (result) != AOP_STR && !AOP_INDPTRn(result)) { /* if this is remateriazable */ if (AOP_TYPE (result) == AOP_IMMD) @@ -9770,43 +9966,72 @@ genFarPointerSet (operand * right, } } /* so dptr know contains the address */ - aopOp (right, ic, FALSE, TRUE); + aopOp (right, ic, FALSE, (AOP_INDPTRn(result) ? FALSE : TRUE)); /* if bit then unpack */ - if (IS_BITVAR (retype) || IS_BITVAR (letype)) - genPackBits ((IS_BITVAR (retype) ? retype : letype), right, "dptr", FPOINTER); - else - { + if (IS_BITVAR (retype) || IS_BITVAR (letype)) { + if (AOP_INDPTRn(result)) { + genSetDPTR(AOP(result)->aopu.dptr); + } + genPackBits ((IS_BITVAR (retype) ? retype : letype), right, "dptr", FPOINTER); + if (AOP_INDPTRn(result)) { + genSetDPTR(0); + } + } else { size = AOP_SIZE (right); offset = 0; - - _startLazyDPSEvaluation (); - while (size--) - { - char *l = aopGet (AOP (right), offset++, FALSE, FALSE, TRUE); - MOVA (l); - - genSetDPTR (0); - _flushLazyDPS (); - - emitcode ("movx", "@dptr,a"); - if (size || (dopi && pi && AOP_TYPE (result) != AOP_IMMD)) - emitcode ("inc", "dptr"); - } - _endLazyDPSEvaluation (); - } - + if (AOP_INDPTRn(result) && AOP_USESDPTR(right)) { + while (size--) { + char *l = aopGet (AOP (right), offset++, FALSE, FALSE, TRUE); + MOVA (l); + + genSetDPTR(AOP(result)->aopu.dptr); + emitcode ("movx", "@dptr,a"); + if (size || (dopi && pi && AOP_TYPE (result) != AOP_IMMD)) + emitcode ("inc", "dptr"); + genSetDPTR (0); + } + } else { + _startLazyDPSEvaluation (); + while (size--) { + char *l = aopGet (AOP (right), offset++, FALSE, FALSE, TRUE); + MOVA (l); + + if (AOP_INDPTRn(result)) { + genSetDPTR(AOP(result)->aopu.dptr); + } else { + genSetDPTR (0); + } + _flushLazyDPS (); + + emitcode ("movx", "@dptr,a"); + if (size || (dopi && pi && AOP_TYPE (result) != AOP_IMMD)) + emitcode ("inc", "dptr"); + } + _endLazyDPSEvaluation (); + } + } + if (dopi && pi && AOP_TYPE (result) != AOP_IMMD) { - aopPut (AOP(result),"dpl",0); - aopPut (AOP(result),"dph",1); - if (options.model == MODEL_FLAT24) - aopPut (AOP(result),"dpx",2); + if (!AOP_INDPTRn(result)) { + aopPut (AOP(result),"dpl",0); + aopPut (AOP(result),"dph",1); + if (options.model == MODEL_FLAT24) + aopPut (AOP(result),"dpx",2); + } pi->generated=1; - } else if (OP_SYMBOL(result)->ruonly && AOP_SIZE(right) > 1 && + } else if ((OP_SYMBOL(result)->ruonly || AOP_INDPTRn(result)) && + AOP_SIZE(right) > 1 && (OP_SYMBOL (result)->liveTo > ic->seq || ic->depth)) { size = AOP_SIZE (right) - 1; + if (AOP_INDPTRn(result)) { + genSetDPTR(AOP(result)->aopu.dptr); + } while (size--) emitcode ("lcall","__decdptr"); + if (AOP_INDPTRn(result)) { + genSetDPTR(0); + } } freeAsmop (result, NULL, ic, TRUE); freeAsmop (right, NULL, ic, TRUE); @@ -9933,7 +10158,7 @@ genPointerSet (iCode * ic, iCode *pi) if (p_type == GPOINTER && OP_SYMBOL(result)->remat && IS_CAST_ICODE(OP_SYMBOL(result)->rematiCode)) { result = IC_RIGHT(OP_SYMBOL(result)->rematiCode); - type = type = operandType (result); + type = operandType (result); p_type = DCL_TYPE (type); } @@ -9958,6 +10183,10 @@ genPointerSet (iCode * ic, iCode *pi) case GPOINTER: genGenPointerSet (right, result, ic, pi); break; + + default: + werror (E_INTERNAL_ERROR, __FILE__, __LINE__, + "genPointerSet: illegal pointer type"); } } @@ -10023,14 +10252,14 @@ genAddrOf (iCode * ic) char buff[10]; tsprintf(buff,"#!constbyte",(options.stack_loc >> 16) & 0xff); /* if it has an offset then we need to compute it */ - emitcode ("subb", "a,#!constbyte", - -((sym->stack < 0) ? - ((short) (sym->stack - _G.nRegsSaved)) : - ((short) sym->stack)) & 0xff); - emitcode ("mov","b,a"); - emitcode ("mov","a,#!constbyte",(-((sym->stack < 0) ? - ((short) (sym->stack - _G.nRegsSaved)) : - ((short) sym->stack)) >> 8) & 0xff); +/* emitcode ("subb", "a,#!constbyte", */ +/* -((sym->stack < 0) ? */ +/* ((short) (sym->stack - _G.nRegsSaved)) : */ +/* ((short) sym->stack)) & 0xff); */ +/* emitcode ("mov","b,a"); */ +/* emitcode ("mov","a,#!constbyte",(-((sym->stack < 0) ? */ +/* ((short) (sym->stack - _G.nRegsSaved)) : */ +/* ((short) sym->stack)) >> 8) & 0xff); */ if (sym->stack) { emitcode ("mov", "a,_bpx"); emitcode ("add", "a,#!constbyte", ((sym->stack < 0) ? @@ -10557,8 +10786,6 @@ genCast (iCode * ic) /* pointer to generic pointer */ if (IS_GENPTR (ctype)) { - char *l = zero; - if (IS_PTR (type)) { p_type = DCL_TYPE (type); @@ -10618,29 +10845,19 @@ genCast (iCode * ic) _endLazyDPSEvaluation (); /* the last byte depending on type */ - switch (p_type) { - case IPOINTER: - case POINTER: - l = zero; - break; - case FPOINTER: - l = one; - break; - case CPOINTER: - l = "#0x02"; - break; - case PPOINTER: - l = "#0x03"; - break; - - default: - /* this should never happen */ - werror (E_INTERNAL_ERROR, __FILE__, __LINE__, - "got unknown pointer type"); - exit (1); + int gpVal = pointerTypeToGPByte(p_type, NULL, NULL); + char gpValStr[10]; + + if (gpVal == -1) + { + // pointerTypeToGPByte will have bitched. + exit(1); + } + + sprintf(gpValStr, "#0x%d", gpVal); + aopPut (AOP (result), gpValStr, GPTRSIZE - 1); } - aopPut (AOP (result), l, GPTRSIZE - 1); goto release; } @@ -10796,39 +11013,51 @@ static void genReceive (iCode * ic) { - D (emitcode (";", "genReceive "); - ); - - if (isOperandInFarSpace (IC_RESULT (ic)) && - (OP_SYMBOL (IC_RESULT (ic))->isspilt || - IS_TRUE_SYMOP (IC_RESULT (ic)))) - { - int size = getSize (operandType (IC_RESULT (ic))); - int offset = fReturnSizeDS390 - size; - while (size--) - { - emitcode ("push", "%s", (strcmp (fReturn[fReturnSizeDS390 - offset - 1], "a") ? - fReturn[fReturnSizeDS390 - offset - 1] : "acc")); - offset++; - } - aopOp (IC_RESULT (ic), ic, FALSE, FALSE); - size = AOP_SIZE (IC_RESULT (ic)); - offset = 0; - while (size--) - { - emitcode ("pop", "acc"); - aopPut (AOP (IC_RESULT (ic)), "a", offset++); - } + int size = getSize (operandType (IC_RESULT (ic))); + int offset = 0; + int rb1off ; + + D (emitcode (";", "genReceive "); + ); - } - else - { - _G.accInUse++; + if (ic->argreg == 1) { /* first parameter */ + if (isOperandInFarSpace (IC_RESULT (ic)) && + (OP_SYMBOL (IC_RESULT (ic))->isspilt || + IS_TRUE_SYMOP (IC_RESULT (ic)))) + { + offset = fReturnSizeDS390 - size; + while (size--) + { + emitcode ("push", "%s", (strcmp (fReturn[fReturnSizeDS390 - offset - 1], "a") ? + fReturn[fReturnSizeDS390 - offset - 1] : "acc")); + offset++; + } + aopOp (IC_RESULT (ic), ic, FALSE, FALSE); + size = AOP_SIZE (IC_RESULT (ic)); + offset = 0; + while (size--) + { + emitcode ("pop", "acc"); + aopPut (AOP (IC_RESULT (ic)), "a", offset++); + } + + } else { + _G.accInUse++; + aopOp (IC_RESULT (ic), ic, FALSE, FALSE); + _G.accInUse--; + assignResultValue (IC_RESULT (ic)); + } + } else { /* second receive onwards */ + /* this gets a little tricky since unused recevies will be + eliminated, we have saved the reg in the type field . and + we use that to figure out which register to use */ aopOp (IC_RESULT (ic), ic, FALSE, FALSE); - _G.accInUse--; - assignResultValue (IC_RESULT (ic)); - } - + rb1off = ic->argreg; + while (size--) { + aopPut (AOP (IC_RESULT (ic)), rb1regs[rb1off++ -5], offset++); + } + + } freeAsmop (IC_RESULT (ic), NULL, ic, TRUE); } @@ -10839,12 +11068,13 @@ static void genMemcpyX2X( iCode *ic, int nparms, operand **parms, int fromc) { operand *from , *to , *count; symbol *lbl; - bitVect *rsave = NULL; + bitVect *rsave; int i; /* we know it has to be 3 parameters */ assert (nparms == 3); + rsave = newBitVect(16); /* save DPTR if it needs to be saved */ for (i = DPL_IDX ; i <= B_IDX ; i++ ) { if (bitVectBitValue(ic->rMask,i)) @@ -10897,32 +11127,27 @@ static void genMemcpyX2X( iCode *ic, int nparms, operand **parms, int fromc) } } freeAsmop (to, NULL, ic, FALSE); - + _G.dptrInUse = _G.dptr1InUse = 1; aopOp (count, ic->next->next, FALSE,FALSE); lbl =newiTempLabel(NULL); /* now for the actual copy */ if (AOP_TYPE(count) == AOP_LIT && (int)floatFromVal (AOP(count)->aopu.aop_lit) <= 256) { - emitcode (";","OH JOY auto increment with djnz (very fast)"); - emitcode ("mov", "dps,#!constbyte",0x21); /* Select DPTR2 & auto-toggle. */ emitcode ("mov", "b,%s",aopGet(AOP(count),0,FALSE,FALSE,FALSE)); - emitcode ("","!tlabeldef",lbl->key+100); if (fromc) { - emitcode ("clr","a"); - emitcode ("movc", "a,@a+dptr"); - } else - emitcode ("movx", "a,@dptr"); - emitcode ("movx", "@dptr,a"); - emitcode ("inc", "dptr"); - emitcode ("inc", "dptr"); - emitcode ("djnz","b,!tlabel",lbl->key+100); + emitcode ("lcall","__bi_memcpyc2x_s"); + } else { + emitcode ("lcall","__bi_memcpyx2x_s"); + } + freeAsmop (count, NULL, ic, FALSE); } else { symbol *lbl1 = newiTempLabel(NULL); emitcode (";"," Auto increment but no djnz"); emitcode ("mov","_ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); emitcode ("mov","b,%s",aopGet (AOP (count), 1, FALSE, TRUE, TRUE)); + freeAsmop (count, NULL, ic, FALSE); emitcode ("mov", "dps,#!constbyte",0x21); /* Select DPTR2 & auto-toggle. */ emitcode ("","!tlabeldef",lbl->key+100); if (fromc) { @@ -10946,29 +11171,25 @@ static void genMemcpyX2X( iCode *ic, int nparms, operand **parms, int fromc) emitcode ("","!tlabeldef",lbl1->key+100); } emitcode ("mov", "dps,#0"); - freeAsmop (count, NULL, ic, FALSE); + _G.dptrInUse = _G.dptr1InUse = 0; unsavermask(rsave); } /*-----------------------------------------------------------------*/ -/* genMemsetX - gencode for memSetX data */ +/* genMemcmpX2X - gen code for memcmp xdata to xdata */ /*-----------------------------------------------------------------*/ -static void genMemsetX(iCode *ic, int nparms, operand **parms) +static void genMemcmpX2X( iCode *ic, int nparms, operand **parms, int fromc) { - operand *to , *val , *count; - symbol *lbl; - char *l; - int i; + operand *from , *to , *count; + symbol *lbl,*lbl2; bitVect *rsave; + int i; /* we know it has to be 3 parameters */ assert (nparms == 3); - to = parms[0]; - val = parms[1]; - count = parms[2]; - + rsave = newBitVect(16); /* save DPTR if it needs to be saved */ for (i = DPL_IDX ; i <= B_IDX ; i++ ) { if (bitVectBitValue(ic->rMask,i)) @@ -10977,7 +11198,21 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) rsave = bitVectIntersect(rsave,bitVectCplAnd (bitVectCopy (ic->rMask), ds390_rUmaskForOp (IC_RESULT(ic)))); savermask(rsave); + + to = parms[0]; + from = parms[1]; + count = parms[2]; + + aopOp (from, ic->next, FALSE, FALSE); + + /* get from into DPTR1 */ + emitcode ("mov", "dpl1,%s", aopGet (AOP (from), 0, FALSE, FALSE, TRUE)); + emitcode ("mov", "dph1,%s", aopGet (AOP (from), 1, FALSE, FALSE, TRUE)); + if (options.model == MODEL_FLAT24) { + emitcode ("mov", "dpx1,%s", aopGet (AOP (from), 2, FALSE, FALSE, TRUE)); + } + freeAsmop (from, NULL, ic, FALSE); aopOp (to, ic, FALSE, FALSE); /* get "to" into DPTR */ /* if the operand is already in dptr @@ -11007,29 +11242,44 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) } } freeAsmop (to, NULL, ic, FALSE); - - aopOp (val, ic->next->next, FALSE,FALSE); - aopOp (count, ic->next->next, FALSE,FALSE); + _G.dptrInUse = _G.dptr1InUse = 1; + aopOp (count, ic->next->next, FALSE,FALSE); lbl =newiTempLabel(NULL); - /* now for the actual copy */ + lbl2 =newiTempLabel(NULL); + + /* now for the actual compare */ if (AOP_TYPE(count) == AOP_LIT && (int)floatFromVal (AOP(count)->aopu.aop_lit) <= 256) { - l = aopGet(AOP (val), 0, FALSE, FALSE, TRUE); emitcode ("mov", "b,%s",aopGet(AOP(count),0,FALSE,FALSE,FALSE)); - MOVA(l); - emitcode ("","!tlabeldef",lbl->key+100); - emitcode ("movx", "@dptr,a"); - emitcode ("inc", "dptr"); - emitcode ("djnz","b,!tlabel",lbl->key+100); + if (fromc) + emitcode("lcall","__bi_memcmpc2x_s"); + else + emitcode("lcall","__bi_memcmpx2x_s"); + freeAsmop (count, NULL, ic, FALSE); + aopOp (IC_RESULT(ic), ic, FALSE,FALSE); + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); } else { symbol *lbl1 = newiTempLabel(NULL); - + + emitcode("push","ar0"); + emitcode (";"," Auto increment but no djnz"); emitcode ("mov","_ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); emitcode ("mov","b,%s",aopGet (AOP (count), 1, FALSE, TRUE, TRUE)); + freeAsmop (count, NULL, ic, FALSE); + emitcode ("mov", "dps,#!constbyte",0x21); /* Select DPTR2 & auto-toggle. */ emitcode ("","!tlabeldef",lbl->key+100); - l = aopGet(AOP (val), 0, FALSE, FALSE, TRUE); - MOVA(l); + if (fromc) { + emitcode ("clr","a"); + emitcode ("movc", "a,@a+dptr"); + } else + emitcode ("movx", "a,@dptr"); + emitcode ("mov","r0,a"); emitcode ("movx", "a,@dptr"); + emitcode ("clr","c"); + emitcode ("subb","a,r0"); + emitcode ("jnz","!tlabel",lbl2->key+100); + emitcode ("inc", "dptr"); emitcode ("inc", "dptr"); emitcode ("mov","a,b"); emitcode ("orl","a,_ap"); @@ -11042,27 +11292,399 @@ static void genMemsetX(iCode *ic, int nparms, operand **parms) emitcode ("mov","b,a"); emitcode ("sjmp","!tlabel",lbl->key+100); emitcode ("","!tlabeldef",lbl1->key+100); + emitcode ("clr","a"); + emitcode ("","!tlabeldef",lbl2->key+100); + aopOp (IC_RESULT(ic), ic, FALSE,FALSE); + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + emitcode("pop","ar0"); + emitcode ("mov", "dps,#0"); } - freeAsmop (count, NULL, ic, FALSE); + _G.dptrInUse = _G.dptr1InUse = 0; unsavermask(rsave); + } /*-----------------------------------------------------------------*/ -/* genNatLibLoadPrimitive - calls TINI api function to load primitive */ +/* genInp - gen code for __builtin_inp read data from a mem mapped */ +/* port, first parameter output area second parameter pointer to */ +/* port third parameter count */ /*-----------------------------------------------------------------*/ -static void genNatLibLoadPrimitive(iCode *ic, int nparms, operand **parms,int size) +static void genInp( iCode *ic, int nparms, operand **parms) { - 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)))); + operand *from , *to , *count; + symbol *lbl; + bitVect *rsave; + int i; + + /* we know it has to be 3 parameters */ + assert (nparms == 3); - pnum = parms[0]; - aopOp (pnum, ic, FALSE, FALSE); + rsave = newBitVect(16); + /* 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]; + + aopOp (from, ic->next, FALSE, FALSE); + + /* get from into DPTR1 */ + emitcode ("mov", "dpl1,%s", aopGet (AOP (from), 0, FALSE, FALSE, TRUE)); + emitcode ("mov", "dph1,%s", aopGet (AOP (from), 1, FALSE, FALSE, TRUE)); + if (options.model == MODEL_FLAT24) { + emitcode ("mov", "dpx1,%s", aopGet (AOP (from), 2, FALSE, FALSE, TRUE)); + } + + freeAsmop (from, NULL, ic, FALSE); + aopOp (to, ic, FALSE, FALSE); + /* get "to" into DPTR */ + /* if the operand is already in dptr + then we do nothing else we move the value to dptr */ + if (AOP_TYPE (to) != AOP_STR) { + /* if already in DPTR then we need to push */ + if (AOP_TYPE(to) == AOP_DPTR) { + emitcode ("push", "%s", aopGet (AOP (to), 0, FALSE, TRUE, TRUE)); + emitcode ("push", "%s", aopGet (AOP (to), 1, FALSE, TRUE, TRUE)); + if (options.model == MODEL_FLAT24) + emitcode ("mov", "dpx,%s", aopGet (AOP (to), 2, FALSE, FALSE, TRUE)); + emitcode ("pop", "dph"); + emitcode ("pop", "dpl"); + } else { + _startLazyDPSEvaluation (); + /* if this is remateriazable */ + if (AOP_TYPE (to) == AOP_IMMD) { + emitcode ("mov", "dptr,%s", aopGet (AOP (to), 0, TRUE, FALSE, FALSE)); + } else { /* we need to get it byte by byte */ + emitcode ("mov", "dpl,%s", aopGet (AOP (to), 0, FALSE, FALSE, TRUE)); + emitcode ("mov", "dph,%s", aopGet (AOP (to), 1, FALSE, FALSE, TRUE)); + if (options.model == MODEL_FLAT24) { + emitcode ("mov", "dpx,%s", aopGet (AOP (to), 2, FALSE, FALSE, TRUE)); + } + } + _endLazyDPSEvaluation (); + } + } + freeAsmop (to, NULL, ic, FALSE); + + _G.dptrInUse = _G.dptr1InUse = 1; + aopOp (count, ic->next->next, FALSE,FALSE); + lbl =newiTempLabel(NULL); + + /* now for the actual copy */ + if (AOP_TYPE(count) == AOP_LIT && + (int)floatFromVal (AOP(count)->aopu.aop_lit) <= 256) { + emitcode (";","OH JOY auto increment with djnz (very fast)"); + emitcode ("mov", "dps,#!constbyte",0x1); /* Select DPTR2 */ + emitcode ("mov", "b,%s",aopGet(AOP(count),0,FALSE,FALSE,FALSE)); + freeAsmop (count, NULL, ic, FALSE); + emitcode ("","!tlabeldef",lbl->key+100); + emitcode ("movx", "a,@dptr"); /* read data from port */ + emitcode ("dec","dps"); /* switch to DPTR */ + emitcode ("movx", "@dptr,a"); /* save into location */ + emitcode ("inc", "dptr"); /* point to next area */ + emitcode ("inc","dps"); /* switch to DPTR2 */ + emitcode ("djnz","b,!tlabel",lbl->key+100); + } else { + symbol *lbl1 = newiTempLabel(NULL); + + emitcode (";"," Auto increment but no djnz"); + emitcode ("mov","_ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); + emitcode ("mov","b,%s",aopGet (AOP (count), 1, FALSE, TRUE, TRUE)); + freeAsmop (count, NULL, ic, FALSE); + emitcode ("mov", "dps,#!constbyte",0x1); /* Select DPTR2 */ + emitcode ("","!tlabeldef",lbl->key+100); + emitcode ("movx", "a,@dptr"); + emitcode ("dec","dps"); /* switch to DPTR */ + emitcode ("movx", "@dptr,a"); + emitcode ("inc", "dptr"); + emitcode ("inc","dps"); /* switch to DPTR2 */ +/* emitcode ("djnz","b,!tlabel",lbl->key+100); */ +/* emitcode ("djnz","_ap,!tlabel",lbl->key+100); */ + emitcode ("mov","a,b"); + emitcode ("orl","a,_ap"); + emitcode ("jz","!tlabel",lbl1->key+100); + emitcode ("mov","a,_ap"); + emitcode ("add","a,#!constbyte",0xFF); + emitcode ("mov","_ap,a"); + emitcode ("mov","a,b"); + emitcode ("addc","a,#!constbyte",0xFF); + emitcode ("mov","b,a"); + emitcode ("sjmp","!tlabel",lbl->key+100); + emitcode ("","!tlabeldef",lbl1->key+100); + } + emitcode ("mov", "dps,#0"); + _G.dptrInUse = _G.dptr1InUse = 0; + unsavermask(rsave); + +} + +/*-----------------------------------------------------------------*/ +/* genOutp - gen code for __builtin_inp write data to a mem mapped */ +/* port, first parameter output area second parameter pointer to */ +/* port third parameter count */ +/*-----------------------------------------------------------------*/ +static void genOutp( iCode *ic, int nparms, operand **parms) +{ + operand *from , *to , *count; + symbol *lbl; + bitVect *rsave; + int i; + + /* we know it has to be 3 parameters */ + assert (nparms == 3); + + rsave = newBitVect(16); + /* 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]; + + aopOp (from, ic->next, FALSE, FALSE); + + /* get from into DPTR1 */ + emitcode ("mov", "dpl1,%s", aopGet (AOP (from), 0, FALSE, FALSE, TRUE)); + emitcode ("mov", "dph1,%s", aopGet (AOP (from), 1, FALSE, FALSE, TRUE)); + if (options.model == MODEL_FLAT24) { + emitcode ("mov", "dpx1,%s", aopGet (AOP (from), 2, FALSE, FALSE, TRUE)); + } + + freeAsmop (from, NULL, ic, FALSE); + aopOp (to, ic, FALSE, FALSE); + /* get "to" into DPTR */ + /* if the operand is already in dptr + then we do nothing else we move the value to dptr */ + if (AOP_TYPE (to) != AOP_STR) { + /* if already in DPTR then we need to push */ + if (AOP_TYPE(to) == AOP_DPTR) { + emitcode ("push", "%s", aopGet (AOP (to), 0, FALSE, TRUE, TRUE)); + emitcode ("push", "%s", aopGet (AOP (to), 1, FALSE, TRUE, TRUE)); + if (options.model == MODEL_FLAT24) + emitcode ("mov", "dpx,%s", aopGet (AOP (to), 2, FALSE, FALSE, TRUE)); + emitcode ("pop", "dph"); + emitcode ("pop", "dpl"); + } else { + _startLazyDPSEvaluation (); + /* if this is remateriazable */ + if (AOP_TYPE (to) == AOP_IMMD) { + emitcode ("mov", "dptr,%s", aopGet (AOP (to), 0, TRUE, FALSE, FALSE)); + } else { /* we need to get it byte by byte */ + emitcode ("mov", "dpl,%s", aopGet (AOP (to), 0, FALSE, FALSE, TRUE)); + emitcode ("mov", "dph,%s", aopGet (AOP (to), 1, FALSE, FALSE, TRUE)); + if (options.model == MODEL_FLAT24) { + emitcode ("mov", "dpx,%s", aopGet (AOP (to), 2, FALSE, FALSE, TRUE)); + } + } + _endLazyDPSEvaluation (); + } + } + freeAsmop (to, NULL, ic, FALSE); + + _G.dptrInUse = _G.dptr1InUse = 1; + aopOp (count, ic->next->next, FALSE,FALSE); + lbl =newiTempLabel(NULL); + + /* now for the actual copy */ + if (AOP_TYPE(count) == AOP_LIT && + (int)floatFromVal (AOP(count)->aopu.aop_lit) <= 256) { + emitcode (";","OH JOY auto increment with djnz (very fast)"); + emitcode ("mov", "dps,#!constbyte",0x0); /* Select DPTR */ + emitcode ("mov", "b,%s",aopGet(AOP(count),0,FALSE,FALSE,FALSE)); + emitcode ("","!tlabeldef",lbl->key+100); + emitcode ("movx", "a,@dptr"); /* read data from port */ + emitcode ("inc","dps"); /* switch to DPTR2 */ + emitcode ("movx", "@dptr,a"); /* save into location */ + emitcode ("inc", "dptr"); /* point to next area */ + emitcode ("dec","dps"); /* switch to DPTR */ + emitcode ("djnz","b,!tlabel",lbl->key+100); + freeAsmop (count, NULL, ic, FALSE); + } else { + symbol *lbl1 = newiTempLabel(NULL); + + emitcode (";"," Auto increment but no djnz"); + emitcode ("mov","_ap,%s",aopGet (AOP (count), 0, FALSE, TRUE, TRUE)); + emitcode ("mov","b,%s",aopGet (AOP (count), 1, FALSE, TRUE, TRUE)); + freeAsmop (count, NULL, ic, FALSE); + emitcode ("mov", "dps,#!constbyte",0x0); /* Select DPTR */ + emitcode ("","!tlabeldef",lbl->key+100); + emitcode ("movx", "a,@dptr"); + emitcode ("inc", "dptr"); + emitcode ("inc","dps"); /* switch to DPTR2 */ + emitcode ("movx", "@dptr,a"); + emitcode ("dec","dps"); /* switch to DPTR */ + emitcode ("mov","a,b"); + emitcode ("orl","a,_ap"); + emitcode ("jz","!tlabel",lbl1->key+100); + emitcode ("mov","a,_ap"); + emitcode ("add","a,#!constbyte",0xFF); + emitcode ("mov","_ap,a"); + emitcode ("mov","a,b"); + emitcode ("addc","a,#!constbyte",0xFF); + emitcode ("mov","b,a"); + emitcode ("sjmp","!tlabel",lbl->key+100); + emitcode ("","!tlabeldef",lbl1->key+100); + } + emitcode ("mov", "dps,#0"); + _G.dptrInUse = _G.dptr1InUse = 0; + unsavermask(rsave); + +} + +/*-----------------------------------------------------------------*/ +/* genSwapW - swap lower & high order bytes */ +/*-----------------------------------------------------------------*/ +static void genSwapW(iCode *ic, int nparms, operand **parms) +{ + operand *dest; + operand *src; + assert (nparms==1); + + src = parms[0]; + dest=IC_RESULT(ic); + + assert(getSize(operandType(src))==2); + + aopOp (src, ic, FALSE, FALSE); + emitcode ("mov","a,%s",aopGet(AOP(src),0,FALSE,FALSE,TRUE)); + _G.accInUse++; + emitcode ("mov","b,%s",aopGet(AOP(src),1,FALSE,FALSE,FALSE)); + _G.accInUse--; + freeAsmop (src, NULL, ic, FALSE); + + aopOp (dest,ic, FALSE, FALSE); + aopPut(AOP(dest),"b",0); + aopPut(AOP(dest),"a",1); + freeAsmop (dest, NULL, ic, FALSE); +} + +/*-----------------------------------------------------------------*/ +/* genMemsetX - gencode for memSetX data */ +/*-----------------------------------------------------------------*/ +static void genMemsetX(iCode *ic, int nparms, operand **parms) +{ + operand *to , *val , *count; + symbol *lbl; + char *l; + int i; + bitVect *rsave = NULL; + + /* we know it has to be 3 parameters */ + assert (nparms == 3); + + to = parms[0]; + val = parms[1]; + count = parms[2]; + + /* save DPTR if it needs to be saved */ + rsave = newBitVect(16); + 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 + then we do nothing else we move the value to dptr */ + if (AOP_TYPE (to) != AOP_STR) { + /* if already in DPTR then we need to push */ + if (AOP_TYPE(to) == AOP_DPTR) { + emitcode ("push", "%s", aopGet (AOP (to), 0, FALSE, TRUE, TRUE)); + emitcode ("push", "%s", aopGet (AOP (to), 1, FALSE, TRUE, TRUE)); + if (options.model == MODEL_FLAT24) + emitcode ("mov", "dpx,%s", aopGet (AOP (to), 2, FALSE, FALSE, TRUE)); + emitcode ("pop", "dph"); + emitcode ("pop", "dpl"); + } else { + _startLazyDPSEvaluation (); + /* if this is remateriazable */ + if (AOP_TYPE (to) == AOP_IMMD) { + emitcode ("mov", "dptr,%s", aopGet (AOP (to), 0, TRUE, FALSE, FALSE)); + } else { /* we need to get it byte by byte */ + emitcode ("mov", "dpl,%s", aopGet (AOP (to), 0, FALSE, FALSE, TRUE)); + emitcode ("mov", "dph,%s", aopGet (AOP (to), 1, FALSE, FALSE, TRUE)); + if (options.model == MODEL_FLAT24) { + emitcode ("mov", "dpx,%s", aopGet (AOP (to), 2, FALSE, FALSE, TRUE)); + } + } + _endLazyDPSEvaluation (); + } + } + freeAsmop (to, NULL, ic, FALSE); + + aopOp (val, ic->next->next, FALSE,FALSE); + aopOp (count, ic->next->next, FALSE,FALSE); + lbl =newiTempLabel(NULL); + /* now for the actual copy */ + if (AOP_TYPE(count) == AOP_LIT && + (int)floatFromVal (AOP(count)->aopu.aop_lit) <= 256) { + l = aopGet(AOP (val), 0, FALSE, FALSE, TRUE); + emitcode ("mov", "b,%s",aopGet(AOP(count),0,FALSE,FALSE,FALSE)); + MOVA(l); + emitcode ("","!tlabeldef",lbl->key+100); + emitcode ("movx", "@dptr,a"); + emitcode ("inc", "dptr"); + emitcode ("djnz","b,!tlabel",lbl->key+100); + } else { + symbol *lbl1 = newiTempLabel(NULL); + + 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); + MOVA(l); + emitcode ("movx", "@dptr,a"); + emitcode ("inc", "dptr"); + emitcode ("mov","a,b"); + emitcode ("orl","a,_ap"); + emitcode ("jz","!tlabel",lbl1->key+100); + emitcode ("mov","a,_ap"); + emitcode ("add","a,#!constbyte",0xFF); + emitcode ("mov","_ap,a"); + emitcode ("mov","a,b"); + emitcode ("addc","a,#!constbyte",0xFF); + emitcode ("mov","b,a"); + emitcode ("sjmp","!tlabel",lbl->key+100); + 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"); @@ -11132,9 +11754,15 @@ static void genNatLibInstallStateBlock(iCode *ic, int nparms, /* 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)); + if (AOP_TYPE (psb) == AOP_IMMD) { + emitcode ("mov","dps,#1"); + emitcode ("mov", "dptr,%s", aopGet (AOP (psb), 0, TRUE, FALSE, FALSE)); + emitcode ("mov","dps,#0"); + } else { + 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 */ @@ -11313,74 +11941,439 @@ static void genMMDeref (iCode *ic,int nparms, operand **parms) /* 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); + + { + symbol *rsym = OP_SYMBOL(IC_RESULT(ic)); + if (rsym->liveFrom != rsym->liveTo) { + 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); } +/*-----------------------------------------------------------------*/ +/* genMMUnrestrictedPersist - */ +/*-----------------------------------------------------------------*/ +static void genMMUnrestrictedPersist(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 R3-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_UnrestrictedPersist"); + + { + symbol *rsym = OP_SYMBOL(IC_RESULT(ic)); + if (rsym->liveFrom != rsym->liveTo) { + aopOp (IC_RESULT(ic),ic,FALSE,FALSE); + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + } + } + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genSystemExecJavaProcess - */ +/*-----------------------------------------------------------------*/ +static void genSystemExecJavaProcess(iCode *ic,int nparms, operand **parms) +{ + bitVect *rsave ; + operand *handle, *pp; + + assert (nparms==2); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + pp = parms[0]; + handle = parms[1]; + + /* put the handle in 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 (handle, NULL, ic, FALSE); + + /* put pointer in DPTR */ + aopOp (pp,ic,FALSE,FALSE); + if (AOP_TYPE(pp) == AOP_IMMD) { + emitcode ("mov", "dptr,%s", aopGet (AOP (pp), 0, TRUE, FALSE, FALSE)); + } else if (AOP_TYPE(pp) != AOP_STR) { /* not already in dptr */ + emitcode ("mov","dpl,%s",aopGet(AOP(pp),0,FALSE,FALSE,FALSE)); + emitcode ("mov","dph,%s",aopGet(AOP(pp),1,FALSE,FALSE,FALSE)); + emitcode ("mov","dpx,%s",aopGet(AOP(pp),2,FALSE,FALSE,FALSE)); + } + freeAsmop (handle, NULL, ic, FALSE); + + /* make the call */ + emitcode ("lcall","System_ExecJavaProcess"); + + /* put result in place */ + { + symbol *rsym = OP_SYMBOL(IC_RESULT(ic)); + if (rsym->liveFrom != rsym->liveTo) { + aopOp (IC_RESULT(ic),ic,FALSE,FALSE); + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + } + } + + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genSystemRTCRegisters - */ +/*-----------------------------------------------------------------*/ +static void genSystemRTCRegisters(iCode *ic,int nparms, operand **parms, + char *name) +{ + bitVect *rsave ; + operand *pp; + + assert (nparms==1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + pp=parms[0]; + /* put pointer in DPTR */ + aopOp (pp,ic,FALSE,FALSE); + if (AOP_TYPE (pp) == AOP_IMMD) { + emitcode ("mov","dps,#1"); + emitcode ("mov", "dptr,%s", aopGet (AOP (pp), 0, TRUE, FALSE, FALSE)); + emitcode ("mov","dps,#0"); + } else { + emitcode ("mov","dpl1,%s",aopGet(AOP(pp),0,FALSE,FALSE,FALSE)); + emitcode ("mov","dph1,%s",aopGet(AOP(pp),1,FALSE,FALSE,FALSE)); + emitcode ("mov","dpx1,%s",aopGet(AOP(pp),2,FALSE,FALSE,FALSE)); + } + freeAsmop (pp, NULL, ic, FALSE); + + /* make the call */ + emitcode ("lcall","System_%sRTCRegisters",name); + + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genSystemThreadSleep - */ +/*-----------------------------------------------------------------*/ +static void genSystemThreadSleep(iCode *ic,int nparms, operand **parms, char *name) +{ + bitVect *rsave ; + operand *to, *s; + + assert (nparms==1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + to = parms[0]; + aopOp(to,ic,FALSE,FALSE); + if (aopHasRegs(AOP(to),R2_IDX,R3_IDX) || + aopHasRegs(AOP(to),R0_IDX,R1_IDX) ) { + emitcode ("push","%s",aopGet(AOP(to),0,FALSE,TRUE,FALSE)); + emitcode ("push","%s",aopGet(AOP(to),1,FALSE,TRUE,FALSE)); + emitcode ("push","%s",aopGet(AOP(to),2,FALSE,TRUE,FALSE)); + emitcode ("push","%s",aopGet(AOP(to),3,FALSE,TRUE,FALSE)); + emitcode ("pop","ar3"); + emitcode ("pop","ar2"); + emitcode ("pop","ar1"); + emitcode ("pop","ar0"); + } else { + emitcode ("mov","r0,%s",aopGet(AOP(to),0,FALSE,TRUE,FALSE)); + emitcode ("mov","r1,%s",aopGet(AOP(to),1,FALSE,TRUE,FALSE)); + emitcode ("mov","r2,%s",aopGet(AOP(to),2,FALSE,TRUE,FALSE)); + emitcode ("mov","r3,%s",aopGet(AOP(to),3,FALSE,TRUE,FALSE)); + } + freeAsmop (to, NULL, ic, FALSE); + + /* suspend in acc */ + s = parms[1]; + aopOp(s,ic,FALSE,FALSE); + emitcode ("mov","a,%s",aopGet(AOP(s),0,FALSE,TRUE,FALSE)); + freeAsmop (s, NULL, ic, FALSE); + + /* make the call */ + emitcode ("lcall","System_%s",name); + + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genSystemThreadResume - */ +/*-----------------------------------------------------------------*/ +static void genSystemThreadResume(iCode *ic,int nparms, operand **parms) +{ + bitVect *rsave ; + operand *tid,*pid; + + assert (nparms==2); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + tid = parms[0]; + pid = parms[1]; + + /* PID in R0 */ + aopOp(pid,ic,FALSE,FALSE); + emitcode ("mov","r0,%s",aopGet(AOP(pid),0,FALSE,TRUE,FALSE)); + freeAsmop (pid, NULL, ic, FALSE); + + /* tid into ACC */ + aopOp(tid,ic,FALSE,FALSE); + emitcode ("mov","a,%s",aopGet(AOP(tid),0,FALSE,TRUE,FALSE)); + freeAsmop (tid, NULL, ic, FALSE); + + emitcode ("lcall","System_ThreadResume"); + + /* put result into place */ + { + symbol *rsym = OP_SYMBOL(IC_RESULT(ic)); + if (rsym->liveFrom != rsym->liveTo) { + aopOp (IC_RESULT(ic),ic,FALSE,FALSE); + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + } + } + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genSystemProcessResume - */ +/*-----------------------------------------------------------------*/ +static void genSystemProcessResume(iCode *ic,int nparms, operand **parms) +{ + bitVect *rsave ; + operand *pid; + + assert (nparms==1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + pid = parms[0]; + + /* pid into ACC */ + aopOp(pid,ic,FALSE,FALSE); + emitcode ("mov","a,%s",aopGet(AOP(pid),0,FALSE,TRUE,FALSE)); + freeAsmop (pid, NULL, ic, FALSE); + + emitcode ("lcall","System_ProcessResume"); + + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genSystem - */ +/*-----------------------------------------------------------------*/ +static void genSystem (iCode *ic,int nparms,char *name) +{ + assert(nparms == 0); + + emitcode ("lcall","System_%s",name); +} + +/*-----------------------------------------------------------------*/ +/* genSystemPoll - */ +/*-----------------------------------------------------------------*/ +static void genSystemPoll(iCode *ic,int nparms, operand **parms,char *name) +{ + bitVect *rsave ; + operand *fp; + + assert (nparms==1); + /* save registers that need to be saved */ + savermask(rsave = bitVectCplAnd (bitVectCopy (ic->rMask), + ds390_rUmaskForOp (IC_RESULT(ic)))); + + fp = parms[0]; + aopOp (fp,ic,FALSE,FALSE); + if (AOP_TYPE (fp) == AOP_IMMD) { + emitcode ("mov", "dptr,%s", aopGet (AOP (fp), 0, TRUE, FALSE, FALSE)); + } else if (AOP_TYPE(fp) != AOP_STR) { /* not already in dptr */ + emitcode ("mov","dpl,%s",aopGet(AOP(fp),0,FALSE,FALSE,FALSE)); + emitcode ("mov","dph,%s",aopGet(AOP(fp),1,FALSE,FALSE,FALSE)); + emitcode ("mov","dpx,%s",aopGet(AOP(fp),2,FALSE,FALSE,FALSE)); + } + freeAsmop (fp, NULL, ic, FALSE); + + emitcode ("lcall","System_%sPoll",name); + + /* put result into place */ + { + symbol *rsym = OP_SYMBOL(IC_RESULT(ic)); + if (rsym->liveFrom != rsym->liveTo) { + aopOp (IC_RESULT(ic),ic,FALSE,FALSE); + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + } + } + unsavermask(rsave); +} + +/*-----------------------------------------------------------------*/ +/* genSystemGetCurrentID - */ +/*-----------------------------------------------------------------*/ +static void genSystemGetCurrentID(iCode *ic,int nparms, operand **parms,char *name) +{ + assert (nparms==0); + + emitcode ("lcall","System_GetCurrent%sId",name); + /* put result into place */ + { + symbol *rsym = OP_SYMBOL(IC_RESULT(ic)); + if (rsym->liveFrom != rsym->liveTo) { + aopOp (IC_RESULT(ic),ic,FALSE,FALSE); + aopPut(AOP(IC_RESULT(ic)),"a",0); + freeAsmop (IC_RESULT(ic), NULL, ic, FALSE); + } + } +} + /*-----------------------------------------------------------------*/ /* genBuiltIn - calls the appropriate function to generating code */ /* for a built in function */ /*-----------------------------------------------------------------*/ static void genBuiltIn (iCode *ic) { - operand *bi_parms[MAX_BUILTIN_ARGS]; - int nbi_parms; - iCode *bi_iCode; - symbol *bif; - - /* get all the arguments for a built in function */ - bi_iCode = getBuiltinParms(ic,&nbi_parms,bi_parms); - - /* which function is it */ - bif = OP_SYMBOL(IC_LEFT(bi_iCode)); - if (strcmp(bif->name,"__builtin_memcpy_x2x")==0) { - genMemcpyX2X(bi_iCode,nbi_parms,bi_parms,0); - } else if (strcmp(bif->name,"__builtin_memcpy_c2x")==0) { - 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,__FILE__,__LINE__,"unknown builtin function encountered\n"); - return ; - } - return ; + operand *bi_parms[MAX_BUILTIN_ARGS]; + int nbi_parms; + iCode *bi_iCode; + symbol *bif; + + /* get all the arguments for a built in function */ + bi_iCode = getBuiltinParms(ic,&nbi_parms,bi_parms); + + /* which function is it */ + bif = OP_SYMBOL(IC_LEFT(bi_iCode)); + if (strcmp(bif->name,"__builtin_memcpy_x2x")==0) { + genMemcpyX2X(bi_iCode,nbi_parms,bi_parms,0); + } else if (strcmp(bif->name,"__builtin_memcpy_c2x")==0) { + genMemcpyX2X(bi_iCode,nbi_parms,bi_parms,1); + } else if (strcmp(bif->name,"__builtin_memcmp_x2x")==0) { + genMemcmpX2X(bi_iCode,nbi_parms,bi_parms,0); + } else if (strcmp(bif->name,"__builtin_memcmp_c2x")==0) { + genMemcmpX2X(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,"__builtin_inp")==0) { + genInp(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"__builtin_outp")==0) { + genOutp(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"__builtin_swapw")==0) { + genSwapW(bi_iCode,nbi_parms,bi_parms); + /* JavaNative builtIns */ + } 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 if (strcmp(bif->name,"MM_UnrestrictedPersist")==0) { + genMMUnrestrictedPersist(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"System_ExecJavaProcess")==0) { + genSystemExecJavaProcess(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"System_GetRTCRegisters")==0) { + genSystemRTCRegisters(bi_iCode,nbi_parms,bi_parms,"Get"); + } else if (strcmp(bif->name,"System_SetRTCRegisters")==0) { + genSystemRTCRegisters(bi_iCode,nbi_parms,bi_parms,"Set"); + } else if (strcmp(bif->name,"System_ThreadSleep")==0) { + genSystemThreadSleep(bi_iCode,nbi_parms,bi_parms,"ThreadSleep"); + } else if (strcmp(bif->name,"System_ThreadSleep_ExitCriticalSection")==0) { + genSystemThreadSleep(bi_iCode,nbi_parms,bi_parms,"ThreadSleep_ExitCriticalSection"); + } else if (strcmp(bif->name,"System_ProcessSleep")==0) { + genSystemThreadSleep(bi_iCode,nbi_parms,bi_parms,"ProcessSleep"); + } else if (strcmp(bif->name,"System_ProcessSleep_ExitCriticalSection")==0) { + genSystemThreadSleep(bi_iCode,nbi_parms,bi_parms,"ProcessSleep_ExitCriticalSection"); + } else if (strcmp(bif->name,"System_ThreadResume")==0) { + genSystemThreadResume(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"System_SaveThread")==0) { + genSystemThreadResume(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"System_ThreadResume")==0) { + genSystemThreadResume(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"System_ProcessResume")==0) { + genSystemProcessResume(bi_iCode,nbi_parms,bi_parms); + } else if (strcmp(bif->name,"System_SaveJavaThreadState")==0) { + genSystem(bi_iCode,nbi_parms,"SaveJavaThreadState"); + } else if (strcmp(bif->name,"System_RestoreJavaThreadState")==0) { + genSystem(bi_iCode,nbi_parms,"RestoreJavaThreadState"); + } else if (strcmp(bif->name,"System_ProcessYield")==0) { + genSystem(bi_iCode,nbi_parms,"ProcessYield"); + } else if (strcmp(bif->name,"System_ProcessSuspend")==0) { + genSystem(bi_iCode,nbi_parms,"ProcessSuspend"); + } else if (strcmp(bif->name,"System_RegisterPoll")==0) { + genSystemPoll(bi_iCode,nbi_parms,bi_parms,"Register"); + } else if (strcmp(bif->name,"System_RemovePoll")==0) { + genSystemPoll(bi_iCode,nbi_parms,bi_parms,"Remove"); + } else if (strcmp(bif->name,"System_GetCurrentThreadId")==0) { + genSystemGetCurrentID(bi_iCode,nbi_parms,bi_parms,"Thread"); + } else if (strcmp(bif->name,"System_GetCurrentProcessId")==0) { + genSystemGetCurrentID(bi_iCode,nbi_parms,bi_parms,"Process"); + } else { + werror(E_INTERNAL_ERROR,__FILE__,__LINE__,"unknown builtin function encountered\n"); + return ; + } + return ; } /*-----------------------------------------------------------------*/ @@ -11393,7 +12386,10 @@ gen390Code (iCode * lic) int cln = 0; lineHead = lineCurr = NULL; - + dptrn[1][0] = "dpl1"; + dptrn[1][1] = "dph1"; + dptrn[1][2] = "dpx1"; + if (options.model == MODEL_FLAT24) { fReturnSizeDS390 = 5; fReturn = fReturn24; @@ -11402,8 +12398,7 @@ gen390Code (iCode * lic) fReturn = fReturn16; options.stack10bit=0; } -#if 0 - //REMOVE ME!!! +#if 1 /* print the allocation information */ if (allocInfo) printAllocInfo (currFunc, codeOutFile); @@ -11429,7 +12424,7 @@ gen390Code (iCode * lic) for (ic = lic; ic; ic = ic->next) { - if (cln != ic->lineno) + if (ic->lineno && cln != ic->lineno) { if (options.debug) { @@ -11439,7 +12434,8 @@ gen390Code (iCode * lic) ic->level, ic->block); _G.debugLine = 0; } - emitcode (";", "%s %d", ic->filename, ic->lineno); + emitcode ("", ";\t%s:%d: %s", ic->filename, ic->lineno, + printCLine(ic->filename, ic->lineno)); cln = ic->lineno; } /* if the result is marked as @@ -11599,12 +12595,12 @@ gen390Code (iCode * lic) break; case GET_VALUE_AT_ADDRESS: - genPointerGet (ic,hasInc(IC_LEFT(ic),ic)); + genPointerGet (ic,hasInc(IC_LEFT(ic),ic, getSize(operandType(IC_RESULT(ic))))); break; case '=': if (POINTER_SET (ic)) - genPointerSet (ic,hasInc(IC_RESULT(ic),ic)); + genPointerSet (ic,hasInc(IC_RESULT(ic),ic,getSize(operandType(IC_RIGHT(ic))))); else genAssign (ic); break;