emitcode("mov","b,%s", x);
}
-/*-----------------------------------------------------------------*/
-/* movc - moves specified value into the carry */
-/*-----------------------------------------------------------------*/
-static void
-movc (const char *s)
-{
- if (!strcmp (s, zero))
- CLRC;
- else if (!strcmp (s, one))
- SETC;
- else if (strcmp (s, "c"))
- {/* it's not in carry already */
- MOVA (s);
- /* set C, if a >= 1 */
- emitcode ("add", "a,#0xff");
- }
-}
-
/*-----------------------------------------------------------------*/
/* pushB - saves register B if necessary */
/*-----------------------------------------------------------------*/
return aop->aopu.aop_reg[offset]->name;
case AOP_CRY:
- emitcode ("clr", "a");
emitcode ("mov", "c,%s", aop->aopu.aop_dir);
+ emitcode ("clr", "a");
emitcode ("rlc", "a");
return (dname ? "acc" : "a");
break;
case AOP_CRY:
- /* if not bit variable */
+ /* if result no bit variable */
if (!aop->aopu.aop_dir)
{
+ assert (!strcmp (s, "c"));
/* inefficient: move carry into A and use jz/jnz */
emitcode ("clr", "a");
emitcode ("rlc", "a");
accuse = TRUE;
}
- else
+ else if (s == zero)
+ emitcode ("clr", "%s", aop->aopu.aop_dir);
+ else if (s == one)
+ emitcode ("setb", "%s", aop->aopu.aop_dir);
+ else if (!strcmp (s, "c"))
+ emitcode ("mov", "%s,c", aop->aopu.aop_dir);
+ else if (strcmp (s, aop->aopu.aop_dir))
{
- if (s == zero)
- emitcode ("clr", "%s", aop->aopu.aop_dir);
- else if (s == one)
- emitcode ("setb", "%s", aop->aopu.aop_dir);
- else if (!strcmp (s, "c"))
- emitcode ("mov", "%s,c", aop->aopu.aop_dir);
- else if (strcmp (s, aop->aopu.aop_dir))
- {
- MOVA (s);
- /* set C, if a >= 1 */
- emitcode ("add", "a,#0xff");
- emitcode ("mov", "%s,c", aop->aopu.aop_dir);
- }
+ MOVA (s);
+ /* set C, if a >= 1 */
+ emitcode ("add", "a,#0xff");
+ emitcode ("mov", "%s,c", aop->aopu.aop_dir);
}
break;
}
}
+/*-----------------------------------------------------------------*/
+/* toCarry - make boolean and move into carry */
+/*-----------------------------------------------------------------*/
+static void
+toCarry (operand * oper)
+{
+ /* if the operand is a literal then
+ we know what the value is */
+ if (AOP_TYPE (oper) == AOP_LIT)
+ {
+ if ((int) operandLitValue (oper))
+ SETC;
+ else
+ CLRC;
+ }
+ else if (AOP_TYPE (oper) == AOP_CRY)
+ {
+ emitcode ("mov", "c,%s", oper->aop->aopu.aop_dir);
+ }
+ else
+ {
+ /* or the operand into a */
+ toBoolean (oper);
+ /* set C, if a >= 1 */
+ emitcode ("add", "a,#0xff");
+ }
+}
+
+/*-----------------------------------------------------------------*/
+/* assignBit - assign operand to bit operand */
+/*-----------------------------------------------------------------*/
+static void
+assignBit (operand * result, operand * right)
+{
+ /* if the right side is a literal then
+ we know what the value is */
+ if (AOP_TYPE (right) == AOP_LIT)
+ {
+ if ((int) operandLitValue (right))
+ aopPut (result, one, 0);
+ else
+ aopPut (result, zero, 0);
+ }
+ else
+ {
+ toCarry (right);
+ aopPut (result, "c", 0);
+ }
+}
+
/*-------------------------------------------------------------------*/
/* xch_a_aopGet - for exchanging acc with value of the aop */
else
emitcode ("clr", "b[%d]", bit);
}
- else if (AOP_TYPE (IC_LEFT (sic)) == AOP_CRY)
- {
- char *l = AOP (IC_LEFT (sic))->aopu.aop_dir;
- if (strcmp (l, "c"))
- emitcode ("mov", "c,%s", l);
- emitcode ("mov", "b[%d],c", bit);
- }
else
{
/* we need to or */
- toBoolean (IC_LEFT (sic));
- /* set C, if a >= 1 */
- emitcode ("add", "a,#0xff");
+ toCarry (IC_LEFT (sic));
emitcode ("mov", "b[%d],c", bit);
}
bit_count++;
// need caution message to user here
}
- if (IS_LITERAL(etype))
+ if (IS_LITERAL (etype))
{
/* if send set is not empty then assign */
if (_G.sendSet)
if (!swapBanks)
{
+ /* what if aopGet needs r0 or r1 ??? */
emitcode ("mov", "ar0,%s", aopGet(IC_LEFT (ic), 0, FALSE, FALSE));
emitcode ("mov", "ar1,%s", aopGet(IC_LEFT (ic), 1, FALSE, FALSE));
emitcode ("mov", "ar2,%s", aopGet(IC_LEFT (ic), 2, FALSE, FALSE));
emitcode ("lcall", "__sdcc_banked_call");
}
}
- else
+ else if (_G.sendSet)
{
/* push the return address on to the stack */
emitcode ("mov", "a,#%05d$", (rlbl->key + 100));
emitcode ("ret", "");
emitLabel (rlbl);
}
+ else /* the send set is empty */
+ {
+ char *l;
+ /* now get the calling address into dptr */
+ aopOp (IC_LEFT (ic), ic, FALSE);
+
+ l = aopGet (IC_LEFT (ic), 0, FALSE, FALSE);
+ if (AOP_TYPE (IC_LEFT (ic)) == AOP_DPTR)
+ {
+ emitcode ("mov", "r0,%s", l);
+ l = aopGet (IC_LEFT (ic), 1, FALSE, FALSE);
+ emitcode ("mov", "dph,%s", l);
+ emitcode ("mov", "dpl,r0");
+ }
+ else
+ {
+ emitcode ("mov", "dpl,%s", l);
+ l = aopGet (IC_LEFT (ic), 1, FALSE, FALSE);
+ emitcode ("mov", "dph,%s", l);
+ }
+
+ freeAsmop (IC_LEFT (ic), NULL, ic, TRUE);
+
+ if (swapBanks)
+ {
+ emitcode ("mov", "psw,#0x%02x",
+ ((FUNC_REGBANK(dtype)) << 3) & 0xff);
+ }
+
+ /* make the call */
+ emitcode ("lcall", "__sdcc_call_dptr");
+ }
}
if (swapBanks)
{
if (IS_BIT(_G.currentFunc->etype))
{
- if (AOP_TYPE (IC_LEFT (ic)) == AOP_CRY)
- emitcode ("mov", "c,%s", AOP (IC_LEFT (ic))->aopu.aop_dir);
- else
- movc (aopGet (IC_LEFT (ic), 0, FALSE, FALSE));
+ toCarry (IC_LEFT (ic));
}
else
{
if (AOP_TYPE (IC_LEFT (ic)) == AOP_DPTR)
{
/* #NOCHANGE */
- l = aopGet (IC_LEFT (ic), offset++,
- FALSE, TRUE);
+ l = aopGet (IC_LEFT (ic), offset++, FALSE, TRUE);
emitcode ("push", "%s", l);
pushed++;
}
else
{
- l = aopGet (IC_LEFT (ic), offset,
- FALSE, FALSE);
+ l = aopGet (IC_LEFT (ic), offset, FALSE, FALSE);
if (strcmp (fReturn[offset], l))
emitcode ("mov", "%s,%s", fReturn[offset++], l);
}
{
D (emitcode (";", "genPlusBits"));
+ emitcode ("mov", "c,%s", AOP (IC_LEFT (ic))->aopu.aop_dir);
if (AOP_TYPE (IC_RESULT (ic)) == AOP_CRY)
{
symbol *lbl = newiTempLabel (NULL);
- emitcode ("mov", "c,%s", AOP (IC_LEFT (ic))->aopu.aop_dir);
emitcode ("jnb", "%s,%05d$", AOP (IC_RIGHT (ic))->aopu.aop_dir, (lbl->key + 100));
emitcode ("cpl", "c");
emitLabel (lbl);
else
{
emitcode ("clr", "a");
- emitcode ("mov", "c,%s", AOP (IC_LEFT (ic))->aopu.aop_dir);
emitcode ("rlc", "a");
emitcode ("mov", "c,%s", AOP (IC_RIGHT (ic))->aopu.aop_dir);
emitcode ("addc", "a,%s", zero);
/* if the result is a bit */
if (AOP_TYPE (result) == AOP_CRY)
{
- /* if the right size is a literal then
- we know what the value is */
- if (AOP_TYPE (right) == AOP_LIT)
- {
- if (((int) operandLitValue (right)))
- aopPut (result, one, 0);
- else
- aopPut (result, zero, 0);
- goto release;
- }
-
- /* the right is also a bit variable */
- if (AOP_TYPE (right) == AOP_CRY)
- {
- emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir);
- aopPut (result, "c", 0);
- goto release;
- }
-
- /* we need to or */
- toBoolean (right);
- aopPut (result, "a", 0);
+ assignBit (result, right);
goto release;
}
/* if the result is a bit (and not a bitfield) */
if (IS_BIT (OP_SYMBOL (result)->type))
{
- /* if the right size is a literal then
- we know what the value is */
- if (AOP_TYPE (right) == AOP_LIT)
- {
- if (((int) operandLitValue (right)))
- aopPut (result, one, 0);
- else
- aopPut (result, zero, 0);
-
- goto release;
- }
-
- /* the right is also a bit variable */
- if (AOP_TYPE (right) == AOP_CRY)
- {
- emitcode ("mov", "c,%s", AOP (right)->aopu.aop_dir);
- aopPut (result, "c", 0);
- goto release;
- }
-
- /* we need to or */
- toBoolean (right);
- aopPut (result, "a", 0);
+ assignBit (result, right);
goto release;
}