freeAsmop (IC_RESULT (ic), NULL, ic);
}
+/*-----------------------------------------------------------------*/
+/* genMultChar - generates code for unsigned 8x8 multiplication */
+/*-----------------------------------------------------------------*/
+static void
+genMultOneChar (iCode * ic)
+{
+ symbol *tlbl1, *tlbl2;
+ bool savedB = FALSE;
+
+ if(IS_GB)
+ {
+ wassertl (0, "Multiplication is handled through support function calls on gbz80");
+ return;
+ }
+
+ /* Save b into a if b is in use. */
+ if (bitVectBitValue (ic->rMask, B_IDX) &&
+ !(getPairId (AOP (IC_RESULT (ic))) == PAIR_BC))
+ {
+ emit2 ("ld a, b");
+ savedB = TRUE;
+ }
+ if (isPairInUse (PAIR_DE, ic) &&
+ !(getPairId (AOP (IC_RESULT (ic))) == PAIR_DE))
+ {
+ _push (PAIR_DE);
+ _G.stack.pushedDE = TRUE;
+ }
+
+ tlbl1 = newiTempLabel (NULL);
+ tlbl2 = newiTempLabel (NULL);
+
+ emit2 ("ld e,%s", aopGet (AOP (IC_RIGHT (ic)), LSB, FALSE));
+ emit2 ("ld h,%s", aopGet (AOP (IC_LEFT (ic)), LSB, FALSE));
+ emit2 ("ld l,#0x00");
+ emit2 ("ld d,l");
+ emit2 ("ld b,#0x08");
+ emitLabel (tlbl1->key + 100);
+ emit2 ("add hl,hl");
+ emit2 ("jp NC,!tlabel", tlbl2->key + 100);
+ emit2 ("add hl,de");
+ emitLabel (tlbl2->key + 100);
+ emit2 ("djnz !tlabel", tlbl1->key + 100);
+
+ spillPair(PAIR_HL);
+
+ if (IS_Z80 && _G.stack.pushedDE)
+ {
+ _pop (PAIR_DE);
+ _G.stack.pushedDE = FALSE;
+ }
+ if (savedB)
+ {
+ emit2 ("ld b, a");
+ }
+
+ if (AOP_SIZE (IC_RESULT (ic)) == 1)
+ aopPut (AOP (IC_RESULT (ic)), "l", 0);
+ else
+ commitPair ( AOP (IC_RESULT (ic)), PAIR_HL);
+
+ freeAsmop (IC_LEFT (ic), NULL, ic);
+ freeAsmop (IC_RIGHT (ic), NULL, ic);
+ freeAsmop (IC_RESULT (ic), NULL, ic);
+}
+
/*-----------------------------------------------------------------*/
/* genMult - generates code for multiplication */
/*-----------------------------------------------------------------*/
IC_LEFT (ic) = t;
}
+ if (AOP_TYPE (IC_RIGHT (ic)) != AOP_LIT)
+ {
+ genMultOneChar (ic);
+ return;
+ }
+
wassertl (AOP_TYPE (IC_RIGHT (ic)) == AOP_LIT, "Right must be a literal");
val = (int) ulFromVal ( AOP (IC_RIGHT (ic))->aopu.aop_lit);
strncmp(pl->line, "sub\t", 4) == 0 ||
strncmp(pl->line, "xor\t", 4) == 0)
{
- if( strstr(pl->line + 3, what) == 0 && strcmp("a", what))
- return FALSE;
+ if( strstr(pl->line + 3, what) != 0)
+ return TRUE;
+ if( strstr(pl->line + 3, "hl") == 0 && strcmp("a", what) == 0)
+ return TRUE;
+ return FALSE;
}
if(strncmp(pl->line, "pop\t", 4) == 0)
(bool)(strncmp(pl->line, "jr\t", 3)) == 0)
return FALSE;
+ if(strncmp(pl->line, "djnz\t", 5) == 0)
+ return(strchr(what, 'b') != 0);
+
if(strncmp(pl->line, "rla", 3) == 0 ||
strncmp(pl->line, "rlca", 4) == 0)
return(strcmp(what, "a") == 0);
z80CondJump(const lineNode *pl)
{
if((strncmp(pl->line, "jp\t", 3) == 0 ||
- strncmp(pl->line, "jr\t", 3) == 0) && strchr(pl->line, ',') != 0)
+ strncmp(pl->line, "jr\t", 3) == 0) && strchr(pl->line, ',') != 0 ||
+ strncmp(pl->line, "djnz\t", 5) == 0)
return TRUE;
return FALSE;
}