{
iCode *ic = sym->rematiCode;
asmop *aop = newAsmop (AOP_IMMD);
- int ptr_type ;
+ int ptr_type=0;
int val = 0;
for (;;)
aop->aopu.aop_immd.from_cast_remat = 1;
ic = OP_SYMBOL (IC_RIGHT (ic))->rematiCode;
ptr_type = DCL_TYPE(from_type);
+ if (ptr_type == IPOINTER) {
+ // bug #481053
+ ptr_type = POINTER;
+ }
continue ;
} else break;
}
/* if already has a asmop then continue */
- if (op->aop)
+ if (op->aop )
return;
/* if the underlying symbol has a aop */
}
/* else spill location */
+ if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
+ /* force a new aop if sizes differ */
+ sym->usl.spillLoc->aop = NULL;
+ }
sym->aop = op->aop = aop =
aopForSym (ic, sym->usl.spillLoc, result);
aop->size = getSize (sym->type);
{
int offset = 0;
int size;
-
+ symbol *tlbl;
D(emitcode (";", "genCpl"));
aopOp (IC_LEFT (ic), ic, FALSE);
aopOp (IC_RESULT (ic), ic, TRUE);
- /* 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), tlbl->key+100);
+ emitcode ("", "%05d$:", tlbl->key+100);
+ outBitC (IC_RESULT(ic));
+ goto release;
+ }
size = AOP_SIZE (IC_RESULT (ic));
while (size--)
genCall (iCode * ic)
{
sym_link *dtype;
- bool restoreBank = FALSE;
+// bool restoreBank = FALSE;
bool swapBanks = FALSE;
D(emitcode(";", "genCall"));
the same register bank then we need to save the
destination registers on the stack */
dtype = operandType (IC_LEFT (ic));
- if (dtype && !IFFUNC_ISNAKED(dtype) &&
+ if (currFunc && dtype && !IFFUNC_ISNAKED(dtype) &&
(FUNC_REGBANK (currFunc->type) != FUNC_REGBANK (dtype)) &&
- IFFUNC_ISISR (currFunc->type))
+ !IFFUNC_ISISR (dtype))
{
- if (!ic->bankSaved)
- {
- /* This is unexpected; the bank should have been saved in
- * genFunction.
- */
- saveRBank (FUNC_REGBANK (dtype), ic, FALSE);
- restoreBank = TRUE;
- }
+// if (!ic->bankSaved)
+// {
+// /* This is unexpected; the bank should have been saved in
+// * genFunction.
+// */
+// saveRBank (FUNC_REGBANK (dtype), ic, FALSE);
+// restoreBank = TRUE;
+// }
+ // need caution message to user here
swapBanks = TRUE;
}
/* if we need assign a result value */
if ((IS_ITEMP (IC_RESULT (ic)) &&
(OP_SYMBOL (IC_RESULT (ic))->nRegs ||
+ OP_SYMBOL (IC_RESULT (ic))->accuse ||
OP_SYMBOL (IC_RESULT (ic))->spildir)) ||
IS_TRUE_SYMOP (IC_RESULT (ic)))
{
if (ic->regsSaved && !IFFUNC_CALLEESAVES(dtype))
unsaveRegisters (ic);
- /* if register bank was saved then pop them */
- if (restoreBank)
- unsaveRBank (FUNC_REGBANK (dtype), ic, FALSE);
+// /* if register bank was saved then pop them */
+// if (restoreBank)
+// unsaveRBank (FUNC_REGBANK (dtype), ic, FALSE);
}
/*-----------------------------------------------------------------*/
-/* genPcall - generates a call by pointer statement */
+/* -10l - generates a call by pointer statement */
/*-----------------------------------------------------------------*/
static void
genPcall (iCode * ic)
{
sym_link *dtype;
symbol *rlbl = newiTempLabel (NULL);
- bool restoreBank=FALSE;
+// bool restoreBank=FALSE;
+ bool swapBanks = FALSE;
D(emitcode(";", "genPCall"));
if (!ic->regsSaved)
saveRegisters (ic);
- /* if we are calling a function that is not using
+ /* if we are calling a not _naked function that is not using
the same register bank then we need to save the
destination registers on the stack */
- dtype = operandType (IC_LEFT (ic));
- if (dtype && !FUNC_ISNAKED(dtype) &&
- IFFUNC_ISISR (currFunc->type) &&
- (FUNC_REGBANK (currFunc->type) != FUNC_REGBANK (dtype))) {
- saveRBank (FUNC_REGBANK (dtype), ic, TRUE);
- restoreBank=TRUE;
+ dtype = operandType (IC_LEFT (ic))->next;
+ if (currFunc && dtype && !IFFUNC_ISNAKED(dtype) &&
+ (FUNC_REGBANK (currFunc->type) != FUNC_REGBANK (dtype)) &&
+ !IFFUNC_ISISR (dtype))
+ {
+// saveRBank (FUNC_REGBANK (dtype), ic, TRUE);
+// restoreBank=TRUE;
+ swapBanks = TRUE;
+ // need caution message to user here
}
/* push the return address on to the stack */
_G.sendSet = NULL;
}
+ if (swapBanks)
+ {
+ emitcode ("mov", "psw,#0x%02x",
+ ((FUNC_REGBANK(dtype)) << 3) & 0xff);
+ }
+
+ /* make the call */
emitcode ("ret", "");
emitcode ("", "%05d$:", (rlbl->key + 100));
+ if (swapBanks)
+ {
+ emitcode ("mov", "psw,#0x%02x",
+ ((FUNC_REGBANK(currFunc->type)) << 3) & 0xff);
+ }
+
/* if we need assign a result value */
if ((IS_ITEMP (IC_RESULT (ic)) &&
(OP_SYMBOL (IC_RESULT (ic))->nRegs ||
}
- /* if register bank was saved then unsave them */
- if (restoreBank)
- unsaveRBank (FUNC_REGBANK (dtype), ic, TRUE);
+// /* if register bank was saved then unsave them */
+// if (restoreBank)
+// unsaveRBank (FUNC_REGBANK (dtype), ic, TRUE);
/* if we hade saved some registers then
unsave them */
symbol *sym;
sym_link *ftype;
bool switchedPSW = FALSE;
+ int calleesaves_saved_register = -1;
_G.nRegsSaved = 0;
/* create the function header */
if (bitVectBitValue (sym->regsUsed, i) ||
(mcs51_ptrRegReq && (i == R0_IDX || i == R1_IDX)))
{
+ /* remember one saved register for later usage */
+ if (calleesaves_saved_register < 0)
+ calleesaves_saved_register = i;
emitcode ("push", "%s", mcs51_regWithIdx (i)->dname);
_G.nRegsSaved++;
}
}
/* set the register bank to the desired value */
- if ((FUNC_REGBANK (sym->type) || IFFUNC_ISISR (sym->type))
+ if (( /* FUNC_REGBANK (sym->type) || */ IFFUNC_ISISR (sym->type))
&& !switchedPSW)
{
emitcode ("push", "psw");
emitcode ("mov", "sp,a");
}
+ else if (i > 5)
+ {
+ if (IFFUNC_CALLEESAVES(sym->type))
+ {
+ /* if it's a callee-saves function we need a saved register */
+ if (calleesaves_saved_register >= 0)
+ {
+ emitcode ("mov", "%s,a", mcs51_regWithIdx (calleesaves_saved_register)->dname);
+ emitcode ("mov", "a,sp");
+ emitcode ("add", "a,#0x%02x", ((char) sym->stack & 0xff));
+ emitcode ("mov", "sp,a");
+ emitcode ("mov", "a,%s", mcs51_regWithIdx (calleesaves_saved_register)->dname);
+ }
+ else
+ /* do it the hard way */
+ while (i--)
+ emitcode ("inc", "sp");
+ }
+ else
+ {
+ /* not callee-saves, we can clobber ar0 */
+ emitcode ("mov", "ar0,a");
+ emitcode ("mov", "a,sp");
+ emitcode ("add", "a,#0x%02x", ((char) sym->stack & 0xff));
+ emitcode ("mov", "sp,a");
+ emitcode ("mov", "a,ar0");
+ }
+ }
else
while (i--)
emitcode ("inc", "sp");
}
/* restore the register bank */
- if (FUNC_REGBANK (sym->type) || IFFUNC_ISISR (sym->type))
+ if ( /* FUNC_REGBANK (sym->type) || */ IFFUNC_ISISR (sym->type))
{
- if (!FUNC_REGBANK (sym->type) || !IFFUNC_ISISR (sym->type)
+ if (/* !FUNC_REGBANK (sym->type) || */ !IFFUNC_ISISR (sym->type)
|| !options.useXstack)
{
/* Special case of ISR using non-zero bank with useXstack
emitcode ("setb", "ea");
/* if debug then send end of function */
- /* if (options.debug && currFunc) */
if (options.debug && currFunc)
{
_G.debugLine = 1;
{
int size, offset = 0, pushed = 0;
+ D(emitcode (";", "genRet"));
+
/* if we have no return value then
just generate the "ret" */
if (!IC_LEFT (ic))
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); */
return count;
}
}
unsigned int icount;
unsigned int size = getDataSize (IC_RESULT (ic));
- D(emitcode (";", "genPlusIncr"));
-
/* will try to generate an increment */
/* if the right side is not a literal
we cannot */
if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4)
return FALSE;
+ D(emitcode (";", "genPlusIncr"));
+
/* if increment 16 bits in register */
if (sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) &&
(size > 1) &&
emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE));
if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0x00,%05d$"
- ,aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "%s,#0x00,%05d$",
+ aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE),
+ tlbl->key + 100);
else
{
emitcode ("clr", "a");
- emitcode ("cjne", "a,%s,%05d$"
- ,aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$",
+ aopGet (AOP (IC_RESULT (ic)), LSB, FALSE, FALSE),
+ tlbl->key + 100);
}
emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE));
{
if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0x00,%05d$"
- ,aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "%s,#0x00,%05d$",
+ aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE),
+ tlbl->key + 100);
else
- emitcode ("cjne", "a,%s,%05d$"
- ,aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$",
+ aopGet (AOP (IC_RESULT (ic)), MSB16, FALSE, FALSE),
+ tlbl->key + 100);
emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE));
}
{
if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0x00,%05d$"
- ,aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "%s,#0x00,%05d$",
+ aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE),
+ tlbl->key + 100);
else
{
- emitcode ("cjne", "a,%s,%05d$"
- ,aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$",
+ aopGet (AOP (IC_RESULT (ic)), MSB24, FALSE, FALSE),
+ tlbl->key + 100);
}
emitcode ("inc", "%s", aopGet (AOP (IC_RESULT (ic)), MSB32, FALSE, FALSE));
}
static void
genPlusBits (iCode * ic)
{
+ D(emitcode (";", "genPlusBits"));
+
if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
{
symbol *lbl = newiTempLabel (NULL);
unsigned int icount;
unsigned int size = getDataSize (IC_RESULT (ic));
- D(emitcode (";", "genMinusDec"));
-
/* will try to generate an increment */
/* if the right side is not a literal
we cannot */
if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 4)
return FALSE;
+ D(emitcode (";", "genMinusDec"));
+
/* if decrement 16 bits in register */
if (sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) &&
(size > 1) &&
genMinusBits (iCode * ic)
{
symbol *lbl = newiTempLabel (NULL);
+
+ D(emitcode (";", "genMinusBits"));
+
if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
{
emitcode ("mov", "c,%s", AOP (IC_LEFT (ic))->aopu.aop_dir);
int size, offset = 0;
unsigned long lit = 0L;
+ D(emitcode (";", "genMinus"));
+
aopOp (IC_LEFT (ic), ic, FALSE);
aopOp (IC_RIGHT (ic), ic, FALSE);
aopOp (IC_RESULT (ic), ic, TRUE);
operand * right,
operand * result)
{
+ D(emitcode (";", "genMultbits"));
+
emitcode ("mov", "c,%s", AOP (left)->aopu.aop_dir);
emitcode ("anl", "c,%s", AOP (right)->aopu.aop_dir);
outBitC (result);
symbol *lbl;
int size=AOP_SIZE(result);
+ D(emitcode (";", "genMultOneByte"));
+
if (size<1 || size>2) {
// this should never happen
fprintf (stderr, "size!=1||2 (%d) in %s at line:%d \n",
operand *right = IC_RIGHT (ic);
operand *result = IC_RESULT (ic);
+ D(emitcode (";", "genMult"));
+
/* assign the amsops */
aopOp (left, ic, FALSE);
aopOp (right, ic, FALSE);
char *l;
+ D(emitcode (";", "genDivbits"));
+
/* the result must be bit */
emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE));
l = aopGet (AOP (left), 0, FALSE, FALSE);
symbol *lbl;
int size, offset;
+ D(emitcode (";", "genDivOneByte"));
+
size = AOP_SIZE (result) - 1;
offset = 1;
/* signed or unsigned */
operand *right = IC_RIGHT (ic);
operand *result = IC_RESULT (ic);
+ D(emitcode (";", "genDiv"));
+
/* assign the amsops */
aopOp (left, ic, FALSE);
aopOp (right, ic, FALSE);
char *l;
+ D(emitcode (";", "genModbits"));
+
/* the result must be bit */
emitcode ("mov", "b,%s", aopGet (AOP (right), 0, FALSE, FALSE));
l = aopGet (AOP (left), 0, FALSE, FALSE);
char *l;
symbol *lbl;
+ D(emitcode (";", "genModOneByte"));
+
/* signed or unsigned */
if (SPEC_USIGN (opetype))
{
operand *right = IC_RIGHT (ic);
operand *result = IC_RESULT (ic);
+ D(emitcode (";", "genMod"));
+
/* assign the amsops */
aopOp (left, ic, FALSE);
aopOp (right, ic, FALSE);
symbol *tlbl = newiTempLabel (NULL);
char *inst;
+ D(emitcode (";", "genIfxJump"));
+
/* if true label then we jump if condition
supplied is true */
if (IC_TRUE (ic))
int size, offset = 0;
unsigned long lit = 0L;
+ D(emitcode (";", "genCmp"));
+
/* if left & right are bit variables */
if (AOP_TYPE (left) == AOP_CRY &&
AOP_TYPE (right) == AOP_CRY)
sym_link *letype, *retype;
int sign;
+ D(emitcode (";", "genCmpGt"));
+
left = IC_LEFT (ic);
right = IC_RIGHT (ic);
result = IC_RESULT (ic);
sym_link *letype, *retype;
int sign;
+ D(emitcode (";", "genCmpLt"));
+
left = IC_LEFT (ic);
right = IC_RIGHT (ic);
result = IC_RESULT (ic);
{
operand *left, *right, *result;
+ D(emitcode (";", "genCmpEq"));
+
aopOp ((left = IC_LEFT (ic)), ic, FALSE);
aopOp ((right = IC_RIGHT (ic)), ic, FALSE);
aopOp ((result = IC_RESULT (ic)), ic, TRUE);
/* 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);
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 + <sizeof *op> */
if (lic->op == '+' && isOperandEqual(IC_LEFT(lic),op) &&
if (bitVectBitValue(OP_USES(op),lic->key) || (unsigned) lic->defKey == op->key) {
return NULL;
}
+ /* if GOTO or IFX */
+ if (lic->op == IFX || lic->op == GOTO || lic->op == LABEL) break;
lic = lic->next;
}
return NULL;
operand *left, *right, *result;
symbol *tlbl;
+ D(emitcode (";", "genAndOp"));
+
/* note here that && operations that are in an
if statement are taken away by backPatchLabels
only those used in arthmetic operations remain */
operand *left, *right, *result;
symbol *tlbl;
+ D(emitcode (";", "genOrOp"));
+
/* note here that || operations that are in an
if statement are taken away by backPatchLabels
only those used in arthmetic operations remain */
int bytelit = 0;
char buffer[10];
+ D(emitcode (";", "genAnd"));
+
aopOp ((left = IC_LEFT (ic)), ic, FALSE);
aopOp ((right = IC_RIGHT (ic)), ic, FALSE);
aopOp ((result = IC_RESULT (ic)), ic, TRUE);
int size, offset = 0;
unsigned long lit = 0L;
+ D(emitcode (";", "genOr"));
+
aopOp ((left = IC_LEFT (ic)), ic, FALSE);
aopOp ((right = IC_RIGHT (ic)), ic, FALSE);
aopOp ((result = IC_RESULT (ic)), ic, TRUE);
{
if (AOP_TYPE (right) == AOP_LIT)
{
- // c = bit & literal;
+ // c = bit | literal;
if (lit)
{
// lit != 0 => result = 1
if (pi && AOP_TYPE (result) != AOP_STR && AOP_TYPE (result) != AOP_IMMD) {
aopPut (AOP(result),"dpl",0);
aopPut (AOP(result),"dph",1);
+ aopPut (AOP(result),"b",2);
pi->generated=1;
}
freeAsmop (result, NULL, ic, TRUE);
if (sym->stack)
{
emitcode ("mov", "a,_bp");
- emitcode ("add", "a,#0x%02x", ((char) sym->stack & 0xff));
+ emitcode ("add", "a,#0x%02x", ((sym->stack < 0) ?
+ ((char) (sym->stack - _G.nRegsSaved)) :
+ ((char) sym->stack)) & 0xff);
aopPut (AOP (IC_RESULT (ic)), "a", 0);
}
else
aopOp (result, ic, FALSE);
/* if the result is a bit */
- // if (AOP_TYPE (result) == AOP_CRY /* works only for true symbols */
if (IS_BITVAR(OP_SYMBOL(result)->type))
{
/* if the right size is a literal then
freeAsmop (IC_RESULT (ic), NULL, ic, TRUE);
}
-/*-----------------------------------------------------------------*/
-/* gen51AggregateAssign - copy complete array's or structures */
-/*-----------------------------------------------------------------*/
-void gen51AggregateAssign(iCode *ic) {
- operand *left=IC_LEFT(ic);
- operand *right=IC_RIGHT(ic);
- char *fromName=OP_SYMBOL(right)->rname;
- char *toName=OP_SYMBOL(left)->rname;
- int fromSize=getSize(OP_SYMBOL(right)->type);
- int toSize=getSize(OP_SYMBOL(left)->type);
- int count=toSize;
-
- D(emitcode (";", "gen51AggregateAssign"));
-
- if (SPEC_OCLS(OP_SYMBOL(left)->etype)!=xdata ||
- SPEC_OCLS(OP_SYMBOL(right)->etype)!=code) {
- // well, this code isn't used yet from anywhere else as for initialising
- fprintf (stderr, "*** error: %s:%d can only assign aggregates from cseg to xseg for now\n", ic->filename, ic->lineno);
- exit (457);
- }
-
- if (fromSize!=toSize) {
- fprintf (stderr, "*** error: %s:%d aggregates have different size\n",
- ic->filename, ic->lineno);
- exit (821);
- }
-
-#if 1
- // use the generic memcpy() for now
- emitcode (";", "initialize %s", OP_SYMBOL(IC_LEFT(ic))->name);
- emitcode ("mov", "dptr,#_memcpy_PARM_2");
- emitcode ("mov", "a,#%s", fromName);
- emitcode ("movx", "@dptr,a");
- emitcode ("inc", "dptr");
- emitcode ("mov", "a,#(%s>>8)", fromName);
- emitcode ("movx", "@dptr,a");
- emitcode ("inc", "dptr");
- emitcode ("mov", "a,#%02x; only from cseg for now", 2);
- emitcode ("movx", "@dptr,a");
- emitcode ("mov", "dptr,#_memcpy_PARM_3");
- emitcode ("mov", "a,#(%d>>0); number of bytes", count);
- emitcode ("movx", "@dptr,a");
- emitcode ("inc", "dptr");
- emitcode ("mov", "a,#(%d>>8)", count);
- emitcode ("movx", "@dptr,a");
- emitcode ("mov", "dptr,#%s", toName);
- emitcode ("mov", "b,#%02x; only to xseg for now", 1);
- emitcode ("lcall", "_memcpy");
-#else
- // more efficient, but will require the native_memcpy_cs2xs
- emitcode ("mov", "r0,#%s", fromName);
- emitcode ("mov", "r1,#(%s>>8)", fromName);
- emitcode ("mov", "r2,#%s", toName);
- emitcode ("mov", "r3,#(%s>>8)", toName);
- emitcode ("mov", "r4,#%d", count);
- emitcode ("mov", "r5,#(%d>>8)", count);
- emitcode ("lcall", "_native_memcpy_cs2xs");
-#endif
-}
-
/*-----------------------------------------------------------------*/
/* gen51Code - generate code for 8051 based controllers */
/*-----------------------------------------------------------------*/
if (allocInfo)
printAllocInfo (currFunc, codeOutFile);
/* if debug information required */
- /* if (options.debug && currFunc) { */
if (options.debug && currFunc)
{
cdbSymbol (currFunc, cdbFile, FALSE, TRUE);
for (ic = lic; ic; ic = ic->next)
{
- if (cln != ic->lineno)
+ if (ic->lineno && cln != ic->lineno)
{
if (options.debug)
{
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
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;
addSet (&_G.sendSet, ic);
break;
- case ARRAYINIT:
- gen51AggregateAssign(ic);
- break;
-
default:
ic = ic;
}