X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fz80%2Fgen.c;h=d055c7a1cb419b62e341609c59b3ce77e52c7797;hb=99bc0b93a68e12551d7c061a435715008835d50a;hp=0874fbe5ad561a9e914b552854427de49eb71c66;hpb=bc72e3ca6fae0d92de0bfcf0ebf63253d755ac96;p=fw%2Fsdcc diff --git a/src/z80/gen.c b/src/z80/gen.c index 0874fbe5..d055c7a1 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -396,15 +396,15 @@ static void _vemit2 (const char *szFormat, va_list ap) { struct dbuf_s dbuf; - const char *buffer; + char *buffer; dbuf_init(&dbuf, INITIAL_INLINEASM); dbuf_tvprintf (&dbuf, szFormat, ap); - buffer = dbuf_c_str(&dbuf); + buffer = (char *)dbuf_c_str(&dbuf); - _tidyUp ((char *)buffer); + _tidyUp (buffer); _G.lines.current = (_G.lines.current ? connectLine (_G.lines.current, _newLineNode (buffer)) : (_G.lines.head = _newLineNode (buffer))); @@ -432,6 +432,8 @@ emit2 (const char *szFormat,...) static void emitDebug (const char *szFormat,...) { + if (!options.verboseAsm) + return; if (!DISABLE_DEBUG) { va_list ap; @@ -1260,7 +1262,7 @@ aopGetLitWordLong (asmop * aop, int offset, bool with_hash) /* otherwise it is fairly simple */ if (!IS_FLOAT (val->type)) { - unsigned long v = (unsigned long) floatFromVal (val); + unsigned long v = ulFromVal (val); if (offset == 2) { @@ -1508,8 +1510,18 @@ fetchPairLong (PAIR_ID pairId, asmop * aop, iCode *ic, int offset) } else { - emit2 ("ld %s,%s", _pairs[pairId].l, aopGet (aop, offset, FALSE)); - emit2 ("ld %s,%s", _pairs[pairId].h, aopGet (aop, offset + 1, FALSE)); + /* Swapping register contents within register pair */ + if(!strcmp(aopGet (aop, offset, FALSE), _pairs[pairId].h)) + { + emit2 ("ld a,%s",aopGet (aop, offset + 1, FALSE)); + emit2 ("ld %s,%s", _pairs[pairId].l, aopGet (aop, offset, FALSE)); + emit2 ("ld %s,a", _pairs[pairId].h); + } + else + { + emit2 ("ld %s,%s", _pairs[pairId].l, aopGet (aop, offset, FALSE)); + emit2 ("ld %s,%s", _pairs[pairId].h, aopGet (aop, offset + 1, FALSE)); + } } /* PENDING: check? */ if (pairId == PAIR_HL) @@ -1807,11 +1819,9 @@ aopGet (asmop * aop, int offset, bool bit16) case AOP_PAIRPTR: setupPair (aop->aopu.aop_pairId, aop, offset); if (aop->aopu.aop_pairId==PAIR_IX) - SNPRINTF (buffer, sizeof(buffer), - "!*ixx", 0); + tsprintf (buffer, sizeof(buffer), "!*ixx", offset); else if (aop->aopu.aop_pairId==PAIR_IY) - SNPRINTF (buffer, sizeof(buffer), - "!*iyx", 0); + tsprintf (buffer, sizeof(buffer), "!*iyx", offset); else SNPRINTF (buffer, sizeof(buffer), "(%s)", _pairs[aop->aopu.aop_pairId].name); @@ -2523,7 +2533,7 @@ assignResultValue (operand * oper) aopPut (AOP (oper), _fReturn[size], size-1); size--; } - while (size--) + while(size--) { aopPut (AOP (oper), _fReturn[size], size); } @@ -2946,19 +2956,6 @@ emitCall (iCode * ic, bool ispcall) /* Mark the registers as restored. */ _G.saves.saved = FALSE; - /* if we need assign a result value */ - if ((IS_ITEMP (IC_RESULT (ic)) && - (OP_SYMBOL (IC_RESULT (ic))->nRegs || - OP_SYMBOL (IC_RESULT (ic))->spildir)) || - IS_TRUE_SYMOP (IC_RESULT (ic))) - { - aopOp (IC_RESULT (ic), ic, FALSE, FALSE); - - assignResultValue (IC_RESULT (ic)); - - freeAsmop (IC_RESULT (ic), NULL, ic); - } - /* adjust the stack for parameters if required */ if (ic->parmBytes) { @@ -2993,6 +2990,19 @@ emitCall (iCode * ic, bool ispcall) } } + /* if we need assign a result value */ + if ((IS_ITEMP (IC_RESULT (ic)) && + (OP_SYMBOL (IC_RESULT (ic))->nRegs || + OP_SYMBOL (IC_RESULT (ic))->spildir)) || + IS_TRUE_SYMOP (IC_RESULT (ic))) + { + aopOp (IC_RESULT (ic), ic, FALSE, FALSE); + + assignResultValue (IC_RESULT (ic)); + + freeAsmop (IC_RESULT (ic), NULL, ic); + } + spillCached (); if (IC_RESULT (ic)) { @@ -3264,7 +3274,22 @@ genFunction (iCode * ic) else if (sym->stack && IS_GB && sym->stack > -INT8MIN) emit2 ("!enterxl", sym->stack); else if (sym->stack) - emit2 ("!enterx", sym->stack); + { + if ((optimize.codeSize && sym->stack <= 8) || sym->stack <= 4) + { + int stack = sym->stack; + emit2 ("!enter"); + while (stack > 1) + { + emit2 ("push af"); + stack -= 2; + } + if(stack > 0) + emit2 ("dec sp"); + } + else + emit2 ("!enterx", sym->stack); + } else emit2 ("!enter"); @@ -3500,7 +3525,7 @@ genPlusIncr (iCode * ic) emitDebug ("; genPlusIncr"); - icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit); + icount = (unsigned int) ulFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit); /* If result is a pair */ if (resultId != PAIR_INVALID) @@ -3834,7 +3859,16 @@ genPlus (iCode * ic) { fetchPair (PAIR_HL, AOP (IC_LEFT (ic))); emit2 ("add hl,%s", getPairName (AOP (IC_RIGHT (ic)))); - spillCached(); + spillPair (PAIR_HL); + commitPair ( AOP (IC_RESULT (ic)), PAIR_HL); + goto release; + } + + if (isPair (AOP (IC_LEFT (ic))) && AOP_TYPE (IC_RIGHT (ic)) == AOP_LIT && getPairId (AOP (IC_LEFT (ic))) != PAIR_HL) + { + fetchPair (PAIR_HL, AOP (IC_RIGHT (ic))); + emit2 ("add hl,%s", getPairName (AOP (IC_LEFT (ic)))); + spillPair (PAIR_HL); commitPair ( AOP (IC_RESULT (ic)), PAIR_HL); goto release; } @@ -3912,28 +3946,57 @@ genPlus (iCode * ic) setupToPreserveCarry (ic); - while (size--) + /* This is ugly, but it fixes the worst code generation bug on Z80. */ + /* Probably something similar has to be done for addition of larger numbers, too. */ + if(size == 2) { - if (AOP_TYPE (IC_LEFT (ic)) == AOP_ACC) + _moveA (aopGet (AOP (IC_LEFT (ic)), 0, FALSE)); + emit2 ("add a,%s", aopGet (AOP (IC_RIGHT (ic)), 0, FALSE)); + if(strcmp (aopGet (AOP (IC_RESULT (ic)), 0, FALSE), aopGet (AOP (IC_LEFT (ic)), 1, FALSE))) { - _moveA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE)); - if (offset == 0) - emit2 ("add a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE)); - else - emit2 ("adc a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE)); + aopPut (AOP (IC_RESULT (ic)), "a", 0); + _moveA (aopGet (AOP (IC_LEFT (ic)), 1, FALSE)); } else { - _moveA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE)); - if (offset == 0) - emit2 ("add a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE)); + emitDebug ("; Addition result is in same register as operand of next addition."); + if(strchr (aopGet (AOP (IC_RESULT (ic)), 0, FALSE), 'c') || + strchr (aopGet (AOP (IC_RESULT (ic)), 0, FALSE), 'b') ) + { + emit2 ("push de"); + emit2 ("ld e, a"); + emit2 ("ld a, %s", aopGet (AOP (IC_LEFT (ic)), 1, FALSE)); + emit2 ("ld d, a"); + emit2 ("ld a, e"); + emit2 ("ld %s, a", aopGet (AOP (IC_RESULT (ic)), 0, FALSE)); + emit2 ("ld a, d"); + emit2 ("pop de"); + } else - emit2 ("adc a,%s", - aopGet (AOP (IC_RIGHT (ic)), offset, FALSE)); + { + emit2 ("push bc"); + emit2 ("ld c, a"); + emit2 ("ld a, %s", aopGet (AOP (IC_LEFT (ic)), 1, FALSE)); + emit2 ("ld b, a"); + emit2 ("ld a, c"); + emit2 ("ld %s, a", aopGet (AOP (IC_RESULT (ic)), 0, FALSE)); + emit2 ("ld a, b"); + emit2 ("pop bc"); + } + } + emit2 ("adc a,%s", aopGet (AOP (IC_RIGHT (ic)), 1, FALSE)); + aopPut (AOP (IC_RESULT (ic)), "a", 1); + goto release; + } + + while (size--) + { + _moveA (aopGet (AOP (IC_LEFT (ic)), offset, FALSE)); + if (offset == 0) + emit2 ("add a,%s", aopGet (AOP (IC_RIGHT (ic)), offset, FALSE)); + else + emit2 ("adc a,%s", aopGet (AOP (IC_RIGHT (ic)), offset, FALSE)); aopPut (AOP (IC_RESULT (ic)), "a", offset++); } @@ -3960,7 +4023,7 @@ genMinusDec (iCode * ic) /* if the literal value of the right hand side is greater than 4 then it is not worth it */ - if ((icount = (unsigned int) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 2) + if ((icount = (unsigned int) ulFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit)) > 2) return FALSE; size = getDataSize (IC_RESULT (ic)); @@ -4050,7 +4113,7 @@ genMinus (iCode * ic) } else { - lit = (unsigned long) floatFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit); + lit = ulFromVal (AOP (IC_RIGHT (ic))->aopu.aop_lit); lit = -(long) lit; } @@ -4126,7 +4189,12 @@ genMinus (iCode * ic) { /* first add without previous c */ if (!offset) - emit2 ("add a,!immedbyte", (unsigned int) (lit & 0x0FFL)); + { + if (size == 0 && (unsigned int) (lit & 0x0FFL) == 0xFF) + emit2 ("dec a"); + else + emit2 ("add a,!immedbyte", (unsigned int) (lit & 0x0FFL)); + } else emit2 ("adc a,!immedbyte", (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); } @@ -4147,6 +4215,72 @@ release: 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 */ /*-----------------------------------------------------------------*/ @@ -4181,9 +4315,15 @@ genMult (iCode * ic) 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)floatFromVal ( AOP (IC_RIGHT (ic))->aopu.aop_lit); + val = (int) ulFromVal ( AOP (IC_RIGHT (ic))->aopu.aop_lit); // wassertl (val > 0, "Multiply must be positive"); wassertl (val != 1, "Can't multiply by 1"); @@ -4192,7 +4332,9 @@ genMult (iCode * ic) _G.stack.pushedDE = TRUE; } - if ( AOP_SIZE (IC_LEFT (ic)) == 1 && !SPEC_USIGN (getSpec (operandType ( IC_LEFT (ic))))) + if (byteResult) + emit2 ("ld a,%s", aopGet (AOP (IC_LEFT (ic)), LSB, FALSE)); + else if ( AOP_SIZE (IC_LEFT (ic)) == 1 && !SPEC_USIGN (getSpec (operandType ( IC_LEFT (ic))))) { emit2 ("ld e,%s", aopGet (AOP (IC_LEFT (ic)), LSB, FALSE)); if (!byteResult) @@ -4210,32 +4352,40 @@ genMult (iCode * ic) i = val; - /* Fully unroled version of mul.s. Not the most efficient. - */ for (count = 0; count < 16; count++) { if (count != 0 && active) { - emit2 ("add hl,hl"); + if (byteResult) + emit2 ("add a,a"); + else + emit2 ("add hl,hl"); } if (i & 0x8000U) { if (active == FALSE) { - emit2 ("ld l,e"); - if (!byteResult) - emit2 ("ld h,d"); + if (byteResult) + emit2("ld e,a"); + else + { + emit2 ("ld l,e"); + emit2 ("ld h,d"); + } } else { - emit2 ("add hl,de"); + if (byteResult) + emit2 ("add a,e"); + else + emit2 ("add hl,de"); } active = TRUE; } i <<= 1; } - spillCached(); + spillPair(PAIR_HL); if (IS_Z80 && _G.stack.pushedDE) { @@ -4244,7 +4394,7 @@ genMult (iCode * ic) } if (byteResult) - aopPut (AOP (IC_RESULT (ic)), _pairs[PAIR_HL].l, 0); + aopPut (AOP (IC_RESULT (ic)), "a", 0); else commitPair ( AOP (IC_RESULT (ic)), PAIR_HL); @@ -4474,7 +4624,7 @@ _getPairIdName (PAIR_ID id) { if (AOP_TYPE (right) == AOP_LIT) { - lit = (unsigned long) floatFromVal (AOP (right)->aopu.aop_lit); + lit = ulFromVal (AOP (right)->aopu.aop_lit); /* optimize if(x < 0) or if(x >= 0) */ if (lit == 0L) { @@ -4505,8 +4655,7 @@ _getPairIdName (PAIR_ID id) bool fDidXor = FALSE; if (AOP_TYPE (left) == AOP_LIT) { - unsigned long lit = (unsigned long) - floatFromVal (AOP (left)->aopu.aop_lit); + unsigned long lit = ulFromVal (AOP (left)->aopu.aop_lit); emit2 ("ld %s,!immedbyte", _fTmp[0], 0x80 ^ (unsigned int) ((lit >> ((size - 1) * 8)) & 0x0FFL)); } @@ -4519,8 +4668,7 @@ _getPairIdName (PAIR_ID id) } if (AOP_TYPE (right) == AOP_LIT) { - unsigned long lit = (unsigned long) - floatFromVal (AOP (right)->aopu.aop_lit); + unsigned long lit = ulFromVal (AOP (right)->aopu.aop_lit); emit2 ("ld %s,!immedbyte", _fTmp[1], 0x80 ^ (unsigned int) ((lit >> ((size - 1) * 8)) & 0x0FFL)); } @@ -4603,7 +4751,7 @@ genCmp (operand * left, operand * right, if (AOP_TYPE (right) == AOP_LIT) { - lit = (unsigned long) floatFromVal (AOP (right)->aopu.aop_lit); + lit = ulFromVal (AOP (right)->aopu.aop_lit); /* optimize if(x < 0) or if(x >= 0) */ if (lit == 0) { @@ -4711,13 +4859,16 @@ genCmpGt (iCode * ic, iCode * ifx) letype = getSpec (operandType (left)); retype = getSpec (operandType (right)); sign = !(SPEC_USIGN (letype) | SPEC_USIGN (retype)); - /* assign the amsops */ + /* assign the asmops */ aopOp (left, ic, FALSE, FALSE); aopOp (right, ic, FALSE, FALSE); aopOp (result, ic, TRUE, FALSE); + setupToPreserveCarry (ic); + genCmp (right, left, result, ifx, sign); + _G.preserveCarry = FALSE; freeAsmop (left, NULL, ic); freeAsmop (right, NULL, ic); freeAsmop (result, NULL, ic); @@ -4741,13 +4892,16 @@ genCmpLt (iCode * ic, iCode * ifx) retype = getSpec (operandType (right)); sign = !(SPEC_USIGN (letype) | SPEC_USIGN (retype)); - /* assign the amsops */ + /* assign the asmops */ aopOp (left, ic, FALSE, FALSE); aopOp (right, ic, FALSE, FALSE); aopOp (result, ic, TRUE, FALSE); + setupToPreserveCarry (ic); + genCmp (left, right, result, ifx, sign); + _G.preserveCarry = FALSE; freeAsmop (left, NULL, ic); freeAsmop (right, NULL, ic); freeAsmop (result, NULL, ic); @@ -4775,7 +4929,7 @@ gencjneshort (operand * left, operand * right, symbol * lbl) /* if the right side is a literal then anything goes */ if (AOP_TYPE (right) == AOP_LIT) { - lit = (unsigned long) floatFromVal (AOP (right)->aopu.aop_lit); + lit = ulFromVal (AOP (right)->aopu.aop_lit); if (lit == 0) { _moveA (aopGet (AOP (left), offset, FALSE)); @@ -5160,7 +5314,7 @@ genAnd (iCode * ic, iCode * ifx) left = tmp; } if (AOP_TYPE (right) == AOP_LIT) - lit = (unsigned long) floatFromVal (AOP (right)->aopu.aop_lit); + lit = ulFromVal (AOP (right)->aopu.aop_lit); size = AOP_SIZE (result); @@ -5351,7 +5505,7 @@ genOr (iCode * ic, iCode * ifx) left = tmp; } if (AOP_TYPE (right) == AOP_LIT) - lit = (unsigned long) floatFromVal (AOP (right)->aopu.aop_lit); + lit = ulFromVal (AOP (right)->aopu.aop_lit); size = AOP_SIZE (result); @@ -5509,7 +5663,7 @@ genXor (iCode * ic, iCode * ifx) left = tmp; } if (AOP_TYPE (right) == AOP_LIT) - lit = (unsigned long) floatFromVal (AOP (right)->aopu.aop_lit); + lit = ulFromVal (AOP (right)->aopu.aop_lit); size = AOP_SIZE (result); @@ -5635,37 +5789,49 @@ static void genInline (iCode * ic) { char *buffer, *bp, *bp1; + bool inComment = FALSE; _G.lines.isInline += (!options.asmpeep); - buffer = bp = bp1 = Safe_calloc(1, strlen(IC_INLINE(ic))+1); - strcpy (buffer, IC_INLINE (ic)); + buffer = bp = bp1 = Safe_strdup (IC_INLINE (ic)); /* emit each line as a code */ while (*bp) { - if (*bp == '\n') + switch (*bp) { + case ';': + inComment = TRUE; + ++bp; + break; + + case '\n': + inComment = FALSE; *bp++ = '\0'; emit2 (bp1); bp1 = bp; - } - else - { - if (*bp == ':') + break; + + default: + /* Add \n for labels, not dirs such as c:\mydir */ + if (!inComment && (*bp == ':') && (isspace((unsigned char)bp[1]))) { - bp++; + ++bp; *bp = '\0'; - bp++; + ++bp; emit2 (bp1); bp1 = bp; } else - bp++; + ++bp; + break; } } if (bp1 != bp) emit2 (bp1); + + Safe_free (buffer); + _G.lines.isInline -= (!options.asmpeep); } @@ -6000,13 +6166,25 @@ shiftL1Left2Result (operand * left, int offl, operand * result, int offr, int shCount) { const char *l; - l = aopGet (AOP (left), offl, FALSE); - _moveA (l); - /* shift left accumulator */ - AccLsh (shCount); - aopPut (AOP (result), "a", offr); -} + /* If operand and result are the same we can shift in place. + However shifting in acc using add is cheaper than shifting + in place using sla; when shifting by more than 2 shifting in + acc is worth the additional effort for loading from/to acc. */ + if (sameRegs (AOP (left), AOP (result)) && shCount <= 2 && offr == offl) + { + while (shCount--) + emit2 ("sla %s", aopGet (AOP (result), 0, FALSE)); + } + else + { + l = aopGet (AOP (left), offl, FALSE); + _moveA (l); + /* shift left accumulator */ + AccLsh (shCount); + aopPut (AOP (result), "a", offr); + } +} /*-----------------------------------------------------------------*/ /* genlshTwo - left shift two bytes by known amount */ @@ -6073,7 +6251,7 @@ genLeftShiftLiteral (operand * left, operand * result, iCode * ic) { - int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit); + int shCount = (int) ulFromVal (AOP (right)->aopu.aop_lit); int size; freeAsmop (right, NULL, ic); @@ -6330,7 +6508,7 @@ genRightShiftLiteral (operand * left, iCode * ic, int sign) { - int shCount = (int) floatFromVal (AOP (right)->aopu.aop_lit); + int shCount = (int) ulFromVal (AOP (right)->aopu.aop_lit); int size; freeAsmop (right, NULL, ic); @@ -6788,7 +6966,7 @@ genPackBits (sym_link * etype, { /* Case with a bitfield length <8 and literal source */ - litval = (int) floatFromVal (AOP (right)->aopu.aop_lit); + litval = (int) ulFromVal (AOP (right)->aopu.aop_lit); litval <<= bstr; litval &= (~mask) & 0xff; emit2 ("ld a,!*pair", _pairs[pair].name); @@ -6853,7 +7031,7 @@ genPackBits (sym_link * etype, { /* Case with partial byte and literal source */ - litval = (int) floatFromVal (AOP (right)->aopu.aop_lit); + litval = (int) ulFromVal (AOP (right)->aopu.aop_lit); litval >>= (blen-rlen); litval &= (~mask) & 0xff; emit2 ("ld a,!*pair", _pairs[pair].name); @@ -7109,7 +7287,7 @@ genAddrOf (iCode * ic) { if (sym->onStack) { - spillCached (); + spillPair (PAIR_HL); if (sym->stack <= 0) { setupPairFromSP (PAIR_HL, sym->stack + _G.stack.pushed + _G.stack.offset); @@ -7128,7 +7306,7 @@ genAddrOf (iCode * ic) } else { - spillCached (); + spillPair (PAIR_HL); if (sym->onStack) { /* if it has an offset then we need to compute it */ @@ -7189,7 +7367,7 @@ genAssign (iCode * ic) if (AOP_TYPE (right) == AOP_LIT) { - lit = (unsigned long) floatFromVal (AOP (right)->aopu.aop_lit); + lit = ulFromVal (AOP (right)->aopu.aop_lit); } if (isPair (AOP (result))) @@ -7308,7 +7486,7 @@ genJumpTab (iCode * ic) emit2 ("ld e,%s", l); emit2 ("ld d,!zero"); jtab = newiTempLabel (NULL); - spillCached (); + spillPair (PAIR_HL); emit2 ("ld hl,!immed!tlabel", jtab->key + 100); emit2 ("add hl,de"); emit2 ("add hl,de"); @@ -7393,8 +7571,7 @@ genCast (iCode * ic) else { /* we need to extend the sign :{ */ - const char *l = aopGet (AOP (right), AOP_SIZE (right) - 1, - FALSE); + const char *l = aopGet (AOP (right), AOP_SIZE (right) - 1, FALSE); _moveA (l); emit2 ("rla "); emit2 ("sbc a,a"); @@ -7516,7 +7693,7 @@ genCritical (iCode *ic) //disable interrupt emit2 ("!di"); //save P/O flag - emit2 ("push af"); + _push (PAIR_AF); } } @@ -7545,7 +7722,7 @@ genEndCritical (iCode *ic) else { //restore P/O flag - emit2 ("pop af"); + _pop (PAIR_AF); //parity odd <==> P/O=0 <==> interrupt enable flag IFF2 was 0 <==> //don't enable interrupts as they were off before emit2 ("jp PO,!tlabel", tlbl->key + 100); @@ -8128,7 +8305,7 @@ genZ80Code (iCode * lic) } if (options.iCodeInAsm) { - char *iLine = printILine(ic); + const char *iLine = printILine(ic); emit2 (";ic:%d: %s", ic->key, iLine); dbuf_free(iLine); } @@ -8459,7 +8636,7 @@ fetchLitSpecial (asmop * aop, bool negate, bool xor) wassert (aop->type == AOP_LIT); wassert (!IS_FLOAT (val->type)); - v = (unsigned long) floatFromVal (val); + v = ulFromVal (val); if (xor) v ^= 0x8000;