{
if (pairId == PAIR_HL || pairId == PAIR_IY)
{
- if (_G.pairs[pairId].last_type == AOP_IMMD && left->type == AOP_IMMD)
+ if ((_G.pairs[pairId].last_type == AOP_IMMD && left->type == AOP_IMMD) ||
+ (_G.pairs[pairId].last_type == AOP_IY && left->type == AOP_IY))
{
if (_G.pairs[pairId].base && !strcmp (_G.pairs[pairId].base, base))
{
_G.pairs[pairId].last_type = aop->type;
}
+/* Can be used for local labels where Code generation takes care of spilling */
+static void
+emitLabelNoSpill (int key)
+{
+ emit2 ("!tlabeldef", key);
+ _G.lines.current->isLabel = 1;
+}
+
static void
emitLabel (int key)
{
emit2 ("!shortjp NZ,!tlabel", tlbl->key + 100);
}
}
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
return TRUE;
}
{
emit2 ("!shortjp Z,!tlabel", tlbl->key + 100);
emit2 ("ld a,!one");
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
outAcc (result);
}
}
emit2 ("ld l,#0x00");
emit2 ("ld d,l");
emit2 ("ld b,#0x08");
- emitLabel (tlbl1->key + 100);
+ emitLabelNoSpill (tlbl1->key + 100);
emit2 ("add hl,hl");
emit2 ("jp NC,!tlabel", tlbl2->key + 100);
emit2 ("add hl,de");
- emitLabel (tlbl2->key + 100);
+ emitLabelNoSpill (tlbl2->key + 100);
emit2 ("djnz !tlabel", tlbl1->key + 100);
spillPair(PAIR_HL);
emit2 ("!shortjp !tlabel", tlbl->key + 100);
emitLabel (lbl->key + 100);
emit2 ("xor a,a");
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
_pop (pop);
}
{
_pop (pop);
emit2 ("jp !tlabel", IC_TRUE (ifx)->key + 100);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
_pop (pop);
}
else
symbol *lbl = newiTempLabel (NULL);
_pop (pop);
emit2 ("!shortjp !tlabel", lbl->key + 100);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
_pop (pop);
emit2 ("jp !tlabel", IC_FALSE (ifx)->key + 100);
- emitLabel (lbl->key + 100);
+ emitLabelNoSpill (lbl->key + 100);
}
}
/* mark the icode as generated */
_toBoolean (left);
emit2 ("!shortjp Z,!tlabel", tlbl->key + 100);
_toBoolean (right);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
outBitAcc (result);
}
_toBoolean (left);
emit2 ("!shortjp NZ,!tlabel", tlbl->key + 100);
_toBoolean (right);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
outBitAcc (result);
}
{
symbol *nlbl = newiTempLabel (NULL);
emit2 ("jp !tlabel", nlbl->key + 100);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
emit2 ("jp !tlabel", IC_TRUE (ic)->key + 100);
- emitLabel (nlbl->key + 100);
+ emitLabelNoSpill (nlbl->key + 100);
}
else
{
emit2 ("jp !tlabel", IC_FALSE (ic)->key + 100);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
}
ic->generated = 1;
}
{
emit2 ("ld a,!immedbyte", shCount);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
emitRsh2 (AOP (result), size, is_signed);
{
emit2 ("ld a,!immedbyte+1", shCount);
emit2 ("!shortjp !tlabel", tlbl1->key + 100);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
}
while (size--)
}
if (shCount > 1)
{
- emitLabel (tlbl1->key + 100);
+ emitLabelNoSpill (tlbl1->key + 100);
emit2 ("dec a");
emit2 ("!shortjp NZ,!tlabel", tlbl->key + 100);
}
_pop (PAIR_AF);
emit2 ("!shortjp !tlabel", tlbl1->key + 100);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
l = aopGet (AOP (result), offset, FALSE);
while (size--)
}
offset++;
}
- emitLabel (tlbl1->key + 100);
+ emitLabelNoSpill (tlbl1->key + 100);
emit2 ("dec a");
emit2 ("!shortjp NZ,!tlabel", tlbl->key + 100);
_pop (PAIR_AF);
emit2 ("!shortjp !tlabel", tlbl1->key + 100);
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
while (size--)
{
l = aopGet (AOP (result), offset--, FALSE);
emit2 ("rr %s", l);
}
}
- emitLabel (tlbl1->key + 100);
+ emitLabelNoSpill (tlbl1->key + 100);
emit2 ("dec a");
emit2 ("!shortjp NZ,!tlabel", tlbl->key + 100);
emit2 ("bit %d,a", blen - 1);
emit2 ("jp Z,!tlabel", tlbl->key + 100);
emit2 ("or a,!immedbyte", (unsigned char) (0xff << blen));
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
}
aopPut (AOP (result), "a", offset++);
goto finish;
emit2 ("bit %d,a", blen - 1 - 8);
emit2 ("jp Z,!tlabel", tlbl->key + 100);
emit2 ("or a,!immedbyte", (unsigned char) (0xff << (blen - 8)));
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
}
emit2 ("ld h,a");
spillPair (PAIR_HL);
emit2 ("bit %d,a", rlen - 1);
emit2 ("jp Z,!tlabel", tlbl->key + 100);
emit2 ("or a,!immedbyte", (unsigned char) (0xff << rlen));
- emitLabel (tlbl->key + 100);
+ emitLabelNoSpill (tlbl->key + 100);
}
aopPut (AOP (result), "a", offset++);
}