case AOP_CRY:
// destination is carry for return-use-only
d = (IS_OP_RUONLY (result)) ? "c" : aop->aopu.aop_dir;
+
// source is no literal and not in carry
if ((s != zero) && (s != one) && strcmp (s, "c"))
{
freeAsmop (IC_LEFT (ic), NULL, ic, TRUE);
}
+/*-----------------------------------------------------------------*/
+/* popForBranch - recover the spilt registers for a branch */
+/*-----------------------------------------------------------------*/
+static void
+popForBranch (iCode * ic, bool markGenerated)
+{
+ while (ic && ic->op == IPOP)
+ {
+ genIpop (ic);
+ if (markGenerated)
+ ic->generated = 1; /* mark the icode as generated */
+ ic = ic->next;
+ }
+}
+
/*-----------------------------------------------------------------*/
/* saveRBank - saves an entire register bank on the stack */
/*-----------------------------------------------------------------*/
if (swapBanks)
{
- emitcode ("mov", "psw,#0x%02x",
- ((FUNC_REGBANK(dtype)) << 3) & 0xff);
+ emitcode ("mov", "psw,#0x%02x", ((FUNC_REGBANK(dtype)) << 3) & 0xff);
}
/* make the call */
/* this function has a function call. We cannot
determine 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]);
+ saveRBank (0, ic, FALSE);
+ if (options.parms_in_bank1)
+ {
+ for (i=0; i < 8 ; i++ )
+ {
+ emitcode ("push","%s",rb1regs[i]);
}
}
}
}
else
{
- if (options.parms_in_bank1) {
- for (i = 7 ; i >= 0 ; i-- ) {
+ if (options.parms_in_bank1)
+ {
+ for (i = 7 ; i >= 0 ; i-- )
+ {
emitcode ("pop","%s",rb1regs[i]);
- }
- }
+ }
+ }
/* this function has a function call. We cannot
determine register usage so we will have to pop the
entire bank */
unsaveRBank (0, ic, FALSE);
}
}
- else
+ else
{
/* This ISR uses a non-zero bank.
*
symbol *tlbl;
int emitTlbl;
int labelRange;
+ char *l;
/* If the next instruction is a goto and the goto target
* is < 10 instructions previous to this, we can generate
tlbl = newiTempLabel (NULL);
emitTlbl = 1;
}
- emitcode ("inc", "%s", aopGet (IC_RESULT (ic), LSB, FALSE, FALSE));
+ l = aopGet (IC_RESULT (ic), LSB, FALSE, FALSE);
+ emitcode ("inc", "%s", l);
if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0x00,%05d$",
- aopGet (IC_RESULT (ic), LSB, FALSE, FALSE),
- tlbl->key + 100);
+ {
+ emitcode ("cjne", "%s,#0x00,%05d$", l, tlbl->key + 100);
+ }
else
{
emitcode ("clr", "a");
- emitcode ("cjne", "a,%s,%05d$",
- aopGet (IC_RESULT (ic), LSB, FALSE, FALSE),
- tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$", l, tlbl->key + 100);
}
- emitcode ("inc", "%s", aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE));
+ l = aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE);
+ emitcode ("inc", "%s", l);
if (size > 2)
{
- if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
- IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0x00,%05d$",
- aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE),
- tlbl->key + 100);
+ if (!strcmp(l, "acc"))
+ {
+ emitcode("jnz", "!tlabel", tlbl->key + 100);
+ }
+ else if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
+ IS_AOP_PREG (IC_RESULT (ic)))
+ {
+ emitcode ("cjne", "%s,#0x00,%05d$", l, tlbl->key + 100);
+ }
else
- emitcode ("cjne", "a,%s,%05d$",
- aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE),
- tlbl->key + 100);
+ {
+ emitcode ("cjne", "a,%s,%05d$", l, tlbl->key + 100);
+ }
- emitcode ("inc", "%s", aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE));
+ l = aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE);
+ emitcode ("inc", "%s", l);
}
if (size > 3)
{
- if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
- IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0x00,%05d$",
- aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE),
- tlbl->key + 100);
+ if (!strcmp(l, "acc"))
+ {
+ emitcode("jnz", "!tlabel", tlbl->key + 100);
+ }
+ else if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
+ IS_AOP_PREG (IC_RESULT (ic)))
+ {
+ emitcode ("cjne", "%s,#0x00,%05d$", l, tlbl->key + 100);
+ }
else
{
- emitcode ("cjne", "a,%s,%05d$",
- aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE),
- tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$", l, tlbl->key + 100);
}
- emitcode ("inc", "%s", aopGet (IC_RESULT (ic), MSB32, FALSE, FALSE));
+
+ l = aopGet (IC_RESULT (ic), MSB32, FALSE, FALSE);
+ emitcode ("inc", "%s", l);
}
if (emitTlbl)
(icount == 1))
{
symbol *tlbl;
- int emitTlbl;
- int labelRange;
+ int emitTlbl;
+ int labelRange;
+ char *l;
/* If the next instruction is a goto and the goto target
* is <= 10 instructions previous to this, we can generate
emitTlbl = 1;
}
- emitcode ("dec", "%s", aopGet (IC_RESULT (ic), LSB, FALSE, FALSE));
+ l = aopGet (IC_RESULT (ic), LSB, FALSE, FALSE);
+ emitcode ("dec", "%s", l);
+
if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0xff,%05d$"
- ,aopGet (IC_RESULT (ic), LSB, FALSE, FALSE)
- ,tlbl->key + 100);
+ {
+ emitcode ("cjne", "%s,#0xff,%05d$", l, tlbl->key + 100);
+ }
else
{
emitcode ("mov", "a,#0xff");
- emitcode ("cjne", "a,%s,%05d$"
- ,aopGet (IC_RESULT (ic), LSB, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$", l, tlbl->key + 100);
}
- emitcode ("dec", "%s", aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE));
+ l = aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE);
+ emitcode ("dec", "%s", l);
if (size > 2)
{
- if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
- IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0xff,%05d$"
- ,aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE)
- ,tlbl->key + 100);
+ if (!strcmp(l, "acc"))
+ {
+ emitcode("jnz", "!tlabel", tlbl->key + 100);
+ }
+ else if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
+ IS_AOP_PREG (IC_RESULT (ic)))
+ {
+ emitcode ("cjne", "%s,#0xff,%05d$", l, tlbl->key + 100);
+ }
else
{
- emitcode ("cjne", "a,%s,%05d$"
- ,aopGet (IC_RESULT (ic), MSB16, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$", l, tlbl->key + 100);
}
- emitcode ("dec", "%s", aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE));
+ l = aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE);
+ emitcode ("dec", "%s", l);
}
if (size > 3)
{
- if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
- IS_AOP_PREG (IC_RESULT (ic)))
- emitcode ("cjne", "%s,#0xff,%05d$"
- ,aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE)
- ,tlbl->key + 100);
+ if (!strcmp(l, "acc"))
+ {
+ emitcode("jnz", "!tlabel", tlbl->key + 100);
+ }
+ else if (AOP_TYPE (IC_RESULT (ic)) == AOP_REG ||
+ IS_AOP_PREG (IC_RESULT (ic)))
+ {
+ emitcode ("cjne", "%s,#0xff,%05d$", l, tlbl->key + 100);
+ }
else
{
- emitcode ("cjne", "a,%s,%05d$"
- ,aopGet (IC_RESULT (ic), MSB24, FALSE, FALSE)
- ,tlbl->key + 100);
+ emitcode ("cjne", "a,%s,%05d$", l, tlbl->key + 100);
}
- emitcode ("dec", "%s", aopGet (IC_RESULT (ic), MSB32, FALSE, FALSE));
+ l = aopGet (IC_RESULT (ic), MSB32, FALSE, FALSE);
+ emitcode ("dec", "%s", l);
}
if (emitTlbl)
{
lbl = newiTempLabel (NULL);
emitcode ("jnb", "acc.7,%05d$", (lbl->key + 100));
emitcode ("cpl", "F0"); /* complement sign flag */
- emitcode ("cpl", "a"); /* 2's complement */
+ emitcode ("cpl", "a"); /* 2's complement */
emitcode ("inc", "a");
emitLabel (lbl);
}
/* msb is 0x00 or 0xff depending on the sign */
if (runtimeSign)
{
- emitcode ("mov", "c,F0");
+ emitcode ("mov", "c,F0");
emitcode ("subb", "a,acc");
while (size--)
aopPut (result, "a", offset++);
/* genIfxJump :- will create a jump depending on the ifx */
/*-----------------------------------------------------------------*/
static void
-genIfxJump (iCode * ic, char *jval, operand *left, operand *right, operand *result)
+genIfxJump (iCode * ic, char *jval, operand *left, operand *right, operand *result, iCode *popIc)
{
symbol *jlbl;
symbol *tlbl = newiTempLabel (NULL);
char *inst;
+ /* if there is something to be popped then do it first */
+ popForBranch (popIc, TRUE);
+
D (emitcode (";", "genIfxJump"));
/* if true label then we jump if condition
MOVA (aopGet (left, AOP_SIZE (left) - 1, FALSE, FALSE));
if (!(AOP_TYPE (result) == AOP_CRY && AOP_SIZE (result)) && ifx)
{
- genIfxJump (ifx, "acc.7", left, right, result);
+ genIfxJump (ifx, "acc.7", left, right, result, ic->next);
freeAsmop (right, NULL, ic, TRUE);
freeAsmop (left, NULL, ic, TRUE);
code a little differently */
if (ifx)
{
- genIfxJump (ifx, "c", NULL, NULL, result);
+ genIfxJump (ifx, "c", NULL, NULL, result, ic->next);
}
else
{
{
bool swappedLR = FALSE;
operand *left, *right, *result;
+ iCode * popIc = ic->next;
D (emitcode (";", "genCmpEq"));
freeForBranchAsmop (result);
freeForBranchAsmop (right);
freeForBranchAsmop (left);
+ popForBranch (popIc, FALSE);
emitcode ("ljmp", "%05d$", IC_TRUE (ifx)->key + 100);
}
else
freeForBranchAsmop (result);
freeForBranchAsmop (right);
freeForBranchAsmop (left);
+ popForBranch (popIc, FALSE);
emitcode ("ljmp", "%05d$", IC_FALSE (ifx)->key + 100);
}
emitLabel (tlbl);
freeForBranchAsmop (result);
freeForBranchAsmop (right);
freeForBranchAsmop (left);
+ popForBranch (popIc, FALSE);
emitcode ("ljmp", "%05d$", IC_TRUE (ifx)->key + 100);
emitLabel (tlbl);
}
freeForBranchAsmop (result);
freeForBranchAsmop (right);
freeForBranchAsmop (left);
+ popForBranch (popIc, FALSE);
emitcode ("ljmp", "%05d$", IC_FALSE (ifx)->key + 100);
emitLabel (lbl);
}
}
if (ifx)
{
- genIfxJump (ifx, "c", left, right, result);
+ genIfxJump (ifx, "c", left, right, result, popIc);
goto release;
}
/* if the result is used in an arithmetic operation
gencjne (left, right, newiTempLabel (NULL), FALSE);
if (ifx)
{
- genIfxJump (ifx, "a", left, right, result);
+ genIfxJump (ifx, "a", left, right, result, popIc);
goto release;
}
/* if the result is used in an arithmetic operation
static iCode *
ifxForOp (operand * op, iCode * ic)
{
+ iCode *ifxIc;
+
/* if true symbol then needs to be assigned */
if (IS_TRUE_SYMOP (op))
return NULL;
/* if this has register type condition and
+ while skipping ipop's (see bug 1509084),
the next instruction is ifx with the same operand
and live to of the operand is upto the ifx only then */
- if (ic->next &&
- ic->next->op == IFX &&
- IC_COND (ic->next)->key == op->key &&
- OP_SYMBOL (op)->liveTo <= ic->next->seq)
- return ic->next;
+ for (ifxIc = ic->next; ifxIc && ifxIc->op == IPOP; ifxIc = ifxIc->next);
+ if (ifxIc && ifxIc->op == IFX &&
+ IC_COND (ifxIc)->key == op->key &&
+ OP_SYMBOL (op)->liveTo <= ifxIc->seq)
+ return ifxIc;
return NULL;
}
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) &&
- isOperandEqual(IC_RESULT(lic),op) &&
- isOperandLiteral(IC_RIGHT(lic)) &&
- operandLitValue(IC_RIGHT(lic)) == isize) {
- return lic;
- }
- /* if the operand used or deffed */
- if (bitVectBitValue(OP_USES(op),lic->key) || lic->defKey == op->key) {
- return NULL;
+ while (lic)
+ {
+ /* if operand of the form op = op + <sizeof *op> */
+ if (lic->op == '+' && isOperandEqual(IC_LEFT(lic),op) &&
+ isOperandEqual(IC_RESULT(lic),op) &&
+ isOperandLiteral(IC_RIGHT(lic)) &&
+ operandLitValue(IC_RIGHT(lic)) == isize)
+ {
+ return lic;
+ }
+ /* if the operand used or deffed */
+ if (bitVectBitValue(OP_USES(op),lic->key) || lic->defKey == op->key)
+ {
+ return NULL;
+ }
+ /* if GOTO or IFX */
+ if (lic->op == IFX || lic->op == GOTO || lic->op == LABEL) break;
+ lic = lic->next;
}
- /* if GOTO or IFX */
- if (lic->op == IFX || lic->op == GOTO || lic->op == LABEL) break;
- lic = lic->next;
- }
return NULL;
}
outBitC (result);
// if(bit & ...)
else if ((AOP_TYPE (result) == AOP_CRY) && ifx)
- genIfxJump (ifx, "c", left, right, result);
+ genIfxJump (ifx, "c", left, right, result, ic->next);
goto release;
}
{
SNPRINTF (buffer, sizeof(buffer),
"acc.%d", posbit & 0x07);
- genIfxJump (ifx, buffer, left, right, result);
+ genIfxJump (ifx, buffer, left, right, result, ic->next);
}
else
{// what is this case? just found it in ds390/gen.c
{
MOVA (aopGet (left, offset, FALSE, FALSE));
emitcode ("anl", "a,%s", aopGet (right, offset, FALSE, FALSE));
- }
+ }
else
{
MOVA (aopGet (right, offset, FALSE, FALSE));
outBitC (result);
// if(bit | ...)
else if ((AOP_TYPE (result) == AOP_CRY) && ifx)
- genIfxJump (ifx, "c", left, right, result);
+ genIfxJump (ifx, "c", left, right, result, ic->next);
goto release;
}
}
else
{
- genIfxJump (ifx, "a", left, right, result);
+ genIfxJump (ifx, "a", left, right, result, ic->next);
goto release;
}
}
outBitC (result);
// if(bit ^ ...)
else if ((AOP_TYPE (result) == AOP_CRY) && ifx)
- genIfxJump (ifx, "c", left, right, result);
+ genIfxJump (ifx, "c", left, right, result, ic->next);
goto release;
}
genRRC (iCode * ic)
{
operand *left, *result;
- int size, offset;
- char *l;
+ int size, offset;
+ char *l;
D (emitcode (";", "genRRC"));
break;
case 3:
case 4:
- case 5: // AAAAABBB:CCCCCDDD
+ case 5: // AAAAABBB:CCCCCDDD
- AccRol (shCount); // BBBAAAAA:CCCCCDDD
+ AccRol (shCount); // BBBAAAAA:CCCCCDDD
emitcode ("anl", "a,#0x%02x",
SLMask[shCount]); // BBB00000:CCCCCDDD
emitcode ("xch", "a,%s", x); // CCCCCDDD:BBB00000
- AccRol (shCount); // DDDCCCCC:BBB00000
+ AccRol (shCount); // DDDCCCCC:BBB00000
emitcode ("xch", "a,%s", x); // BBB00000:DDDCCCCC
emitcode ("xrl", "a,%s", x); // BBBCCCCC:DDD00000
break;
- case 6: // AAAAAABB:CCCCCCDD
+ case 6: // AAAAAABB:CCCCCCDD
emitcode ("anl", "a,#0x%02x",
SRMask[shCount]); // 000000BB:CCCCCCDD
emitcode ("mov", "c,acc.0"); // c = B
emitcode ("xch", "a,%s", x); // CCCCCCDD:000000BB
#if 0 // REMOVE ME
- AccAXRrl1 (x); // BCCCCCCD:D000000B
- AccAXRrl1 (x); // BBCCCCCC:DD000000
+ AccAXRrl1 (x); // BCCCCCCD:D000000B
+ AccAXRrl1 (x); // BBCCCCCC:DD000000
#else
emitcode("rrc","a");
emitcode("xch","a,%s", x);
emitcode("xch","a,%s", x);
#endif
break;
- case 7: // a:x <<= 7
+ case 7: // a:x <<= 7
emitcode ("anl", "a,#0x%02x",
SRMask[shCount]); // 0000000B:CCCCCCCD
emitcode ("xch", "a,%s", x); // CCCCCCCD:0000000B
- AccAXRrl1 (x); // BCCCCCCC:D0000000
+ AccAXRrl1 (x); // BCCCCCCC:D0000000
break;
default:
break;
case 1:
CLRC;
- AccAXRrl1 (x); // 0->a:x
+ AccAXRrl1 (x); // 0->a:x
break;
case 2:
CLRC;
- AccAXRrl1 (x); // 0->a:x
+ AccAXRrl1 (x); // 0->a:x
CLRC;
- AccAXRrl1 (x); // 0->a:x
+ AccAXRrl1 (x); // 0->a:x
break;
case 3:
case 4:
- case 5: // AAAAABBB:CCCCCDDD = a:x
+ case 5: // AAAAABBB:CCCCCDDD = a:x
- AccRol (8 - shCount); // BBBAAAAA:DDDCCCCC
+ AccRol (8 - shCount); // BBBAAAAA:DDDCCCCC
emitcode ("xch", "a,%s", x); // CCCCCDDD:BBBAAAAA
- AccRol (8 - shCount); // DDDCCCCC:BBBAAAAA
+ AccRol (8 - shCount); // DDDCCCCC:BBBAAAAA
emitcode ("anl", "a,#0x%02x",
SRMask[shCount]); // 000CCCCC:BBBAAAAA
emitcode ("xch", "a,%s", x); // 000AAAAA:BBBCCCCC
break;
- case 6: // AABBBBBB:CCDDDDDD
+ case 6: // AABBBBBB:CCDDDDDD
emitcode ("mov", "c,acc.7");
- AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA
+ AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA
emitcode ("mov", "c,acc.7");
- AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA
+ AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA
emitcode ("xch", "a,%s", x); // DDDDDDAA:BBBBBBCC
SRMask[shCount]); // 000000AA:BBBBBBCC
break;
- case 7: // ABBBBBBB:CDDDDDDD
+ case 7: // ABBBBBBB:CDDDDDDD
emitcode ("mov", "c,acc.7"); // c = A
- AccAXLrl1 (x); // BBBBBBBC:DDDDDDDA
+ AccAXLrl1 (x); // BBBBBBBC:DDDDDDDA
emitcode ("xch", "a,%s", x); // DDDDDDDA:BBBBBBCC
break;
case 1:
emitcode ("mov", "c,acc.7");
- AccAXRrl1 (x); // s->a:x
+ AccAXRrl1 (x); // s->a:x
break;
case 2:
emitcode ("mov", "c,acc.7");
- AccAXRrl1 (x); // s->a:x
+ AccAXRrl1 (x); // s->a:x
emitcode ("mov", "c,acc.7");
- AccAXRrl1 (x); // s->a:x
+ AccAXRrl1 (x); // s->a:x
break;
case 3:
case 4:
- case 5: // AAAAABBB:CCCCCDDD = a:x
+ case 5: // AAAAABBB:CCCCCDDD = a:x
tlbl = newiTempLabel (NULL);
- AccRol (8 - shCount); // BBBAAAAA:CCCCCDDD
+ AccRol (8 - shCount); // BBBAAAAA:CCCCCDDD
emitcode ("xch", "a,%s", x); // CCCCCDDD:BBBAAAAA
- AccRol (8 - shCount); // DDDCCCCC:BBBAAAAA
+ AccRol (8 - shCount); // DDDCCCCC:BBBAAAAA
emitcode ("anl", "a,#0x%02x",
SRMask[shCount]); // 000CCCCC:BBBAAAAA
(unsigned char) ~SRMask[shCount]); // 111AAAAA:BBBCCCCC
emitLabel (tlbl);
- break; // SSSSAAAA:BBBCCCCC
+ break; // SSSSAAAA:BBBCCCCC
- case 6: // AABBBBBB:CCDDDDDD
+ case 6: // AABBBBBB:CCDDDDDD
tlbl = newiTempLabel (NULL);
emitcode ("mov", "c,acc.7");
- AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA
+ AccAXLrl1 (x); // ABBBBBBC:CDDDDDDA
emitcode ("mov", "c,acc.7");
- AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA
+ AccAXLrl1 (x); // BBBBBBCC:DDDDDDAA
emitcode ("xch", "a,%s", x); // DDDDDDAA:BBBBBBCC
emitLabel (tlbl);
break;
- case 7: // ABBBBBBB:CDDDDDDD
+ case 7: // ABBBBBBB:CDDDDDDD
tlbl = newiTempLabel (NULL);
emitcode ("mov", "c,acc.7"); // c = A
- AccAXLrl1 (x); // BBBBBBBC:DDDDDDDA
+ AccAXLrl1 (x); // BBBBBBBC:DDDDDDDA
emitcode ("xch", "a,%s", x); // DDDDDDDA:BBBBBBCC
if (size > 1)
{
if (shCount)
- shiftL1Left2Result (left, LSB, result, MSB16, shCount);
+ {
+ shiftL1Left2Result (left, LSB, result, MSB16, shCount);
+ }
else
- movLeft2Result (left, LSB, result, MSB16, 0);
+ {
+ movLeft2Result (left, LSB, result, MSB16, 0);
+ }
}
aopPut (result, zero, LSB);
}
while (size--)
movLeft2Result (left, size, result, size, 0);
}
-
else if (shCount >= (size * 8))
{
if (sign)
rname = aopGet (left, 0, FALSE, FALSE);
if (*rname != '@')
{
- fprintf(stderr, "probable internal error: unexpected rname @ %s:%d\n",
- __FILE__, __LINE__);
+ fprintf(stderr, "probable internal error: unexpected rname '%s' @ %s:%d\n",
+ rname, __FILE__, __LINE__);
}
else
{
}
/* now some housekeeping stuff */
- if (aop) /* we had to allocate for this iCode */
+ if (aop) /* we had to allocate for this iCode */
{
if (pi) { /* post increment present */
aopPut (left, rname, 0);
if (ifx && !ifx->generated)
{
- genIfxJump (ifx, ifxCond, left, NULL, result);
+ genIfxJump (ifx, ifxCond, left, NULL, result, ic->next);
}
/* done */
}
/* now some housekeeping stuff */
- if (aop) /* we had to allocate for this iCode */
+ if (aop) /* we had to allocate for this iCode */
{
if (pi)
aopPut (left, rname, 0);
if (ifx && !ifx->generated)
{
- genIfxJump (ifx, ifxCond, left, NULL, result);
+ genIfxJump (ifx, ifxCond, left, NULL, result, ic->next);
}
/* done */
if (ifx && !ifx->generated)
{
- genIfxJump (ifx, ifxCond, left, NULL, result);
+ genIfxJump (ifx, ifxCond, left, NULL, result, ic->next);
}
freeAsmop (result, NULL, ic, TRUE);
if (ifx && !ifx->generated)
{
- genIfxJump (ifx, ifxCond, left, NULL, result);
+ genIfxJump (ifx, ifxCond, left, NULL, result, ic->next);
}
freeAsmop (result, NULL, ic, TRUE);
if (ifx && !ifx->generated)
{
- genIfxJump (ifx, ifxCond, left, NULL, result);
+ genIfxJump (ifx, ifxCond, left, NULL, result, ic->next);
}
freeAsmop (result, NULL, ic, TRUE);
}
/* now some housekeeping stuff */
- if (aop) /* we had to allocate for this iCode */
+ if (aop) /* we had to allocate for this iCode */
{
if (pi)
aopPut (result, rname, 0);
/* the result is now in the accumulator or a directly addressable bit */
freeAsmop (cond, NULL, ic, TRUE);
- /* if there was something to be popped then do it */
- if (popIc)
- genIpop (popIc);
-
/* if the condition is a bit variable */
if (isbit && dup)
- genIfxJump(ic, dup, NULL, NULL, NULL);
+ genIfxJump(ic, dup, NULL, NULL, NULL, popIc);
else if (isbit && IS_ITEMP (cond) && SPIL_LOC (cond))
- genIfxJump (ic, SPIL_LOC (cond)->rname, NULL, NULL, NULL);
+ genIfxJump (ic, SPIL_LOC (cond)->rname, NULL, NULL, NULL, popIc);
else if (isbit && !IS_ITEMP (cond))
- genIfxJump (ic, OP_SYMBOL (cond)->rname, NULL, NULL, NULL);
+ genIfxJump (ic, OP_SYMBOL (cond)->rname, NULL, NULL, NULL, popIc);
else
- genIfxJump (ic, "a", NULL, NULL, NULL);
+ genIfxJump (ic, "a", NULL, NULL, NULL, popIc);
ic->generated = 1;
}
{
char s[SDCC_NAME_MAX];
if (offset)
- sprintf (s, "#(%s >> %d)",
- sym->rname,
- offset * 8);
+ {
+ sprintf (s, "#(%s >> %d)",
+ sym->rname,
+ offset * 8);
+ }
else
- SNPRINTF (s, sizeof(s), "#%s", sym->rname);
+ {
+ SNPRINTF (s, sizeof(s), "#%s", sym->rname);
+ }
aopPut (IC_RESULT (ic), s, offset++);
}
if (opIsGptr (IC_RESULT (ic)))
break;
case IPOP:
+ {
+ iCode *ifxIc, *popIc;
+ bool CommonRegs = FALSE;
+
/* IPOP happens only when trying to restore a
spilt live range, if there is an ifx statement
- following this pop then the if statement might
+ following this pop (or several) then the if statement might
be using some of the registers being popped which
would destory the contents of the register so
we need to check for this condition and handle it */
- if (ic->next &&
- ic->next->op == IFX &&
- regsInCommon (IC_LEFT (ic), IC_COND (ic->next)))
- genIfx (ic->next, ic);
+ for (ifxIc = ic->next; ifxIc && ifxIc->op == IPOP; ifxIc = ifxIc->next);
+ for (popIc = ic; popIc && popIc->op == IPOP; popIc = popIc->next)
+ CommonRegs |= (ifxIc && ifxIc->op == IFX && !ifxIc->generated &&
+ regsInCommon (IC_LEFT (popIc), IC_COND (ifxIc)));
+ if (CommonRegs)
+ genIfx (ifxIc, ic);
else
genIpop (ic);
+ }
break;
case CALL: