X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=src%2Fz80%2Fgen.c;h=08cf5b4cae3c5745927430f3c5ba9f163fcdfd39;hb=392c1fa33992bd16e6d98895b70d19428686902f;hp=527f3c1e91b359e4ff06ad1613b651646895ff5a;hpb=e29becd95456cf7510a45c41af35bee5fa362ba8;p=fw%2Fsdcc diff --git a/src/z80/gen.c b/src/z80/gen.c index 527f3c1e..08cf5b4c 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -128,16 +128,16 @@ enum }; static char *_z80_return[] = -{"l", "h", "e", "d"}; + {"l", "h", "e", "d"}; static char *_gbz80_return[] = -{"e", "d", "l", "h"}; + {"e", "d", "l", "h"}; static char *_fReceive[] = { "c", "b", "e", "d" }; static char **_fReturn; static char **_fTmp; -extern FILE *codeOutFile; +extern struct dbuf_s *codeOutBuf; enum { @@ -388,7 +388,7 @@ _tidyUp (char *buf) } static lineNode * -_newLineNode (char *line) +_newLineNode (const char *line) { lineNode *pl; @@ -401,11 +401,16 @@ _newLineNode (char *line) static void _vemit2 (const char *szFormat, va_list ap) { - char buffer[INITIAL_INLINEASM]; + struct dbuf_s dbuf; + const char *buffer; - tvsprintf (buffer, sizeof(buffer), szFormat, ap); + dbuf_init(&dbuf, INITIAL_INLINEASM); - _tidyUp (buffer); + dbuf_tvprintf (&dbuf, szFormat, ap); + + buffer = dbuf_c_str(&dbuf); + + _tidyUp ((char *)buffer); _G.lines.current = (_G.lines.current ? connectLine (_G.lines.current, _newLineNode (buffer)) : (_G.lines.head = _newLineNode (buffer))); @@ -413,6 +418,9 @@ _vemit2 (const char *szFormat, va_list ap) _G.lines.current->isInline = _G.lines.isInline; _G.lines.current->isDebug = _G.lines.isDebug; _G.lines.current->ic = _G.current_iCode; + _G.lines.current->isComment = (*buffer == ';'); + + dbuf_destroy(&dbuf); } static void @@ -1636,6 +1644,7 @@ static void emitLabel (int key) { emit2 ("!tlabeldef", key); + _G.lines.current->isLabel = 1; spillCached (); } @@ -2513,6 +2522,16 @@ assignResultValue (operand * oper) } else { + if ((AOP_TYPE (oper) == AOP_REG) && (AOP_SIZE (oper) == 4) && + !strcmp (AOP (oper)->aopu.aop_reg[size-1]->name, _fReturn[size-2])) + { + size--; + _emitMove ("a", _fReturn[size-1]); + _emitMove (_fReturn[size-1], _fReturn[size]); + _emitMove (_fReturn[size], "a"); + aopPut (AOP (oper), _fReturn[size], size-1); + size--; + } while (size--) { aopPut (AOP (oper), _fReturn[size], size); @@ -2899,6 +2918,7 @@ emitCall (iCode * ic, bool ispcall) fetchHL (AOP (IC_LEFT (ic))); emit2 ("jp !*hl"); emit2 ("!tlabeldef", (rlbl->key + 100)); + _G.lines.current->isLabel = 1; _G.stack.pushed -= 2; } freeAsmop (IC_LEFT (ic), NULL, ic); @@ -3112,8 +3132,10 @@ genFunction (iCode * ic) { sprintf (buffer, "%s_start", sym->rname); emit2 ("!labeldef", buffer); + _G.lines.current->isLabel = 1; } emit2 ("!functionlabeldef", sym->rname); + _G.lines.current->isLabel = 1; ftype = operandType (IC_LEFT (ic)); @@ -3332,6 +3354,7 @@ genEndFunction (iCode * ic) emit2 ("jp PO,!tlabel", tlbl->key + 100); emit2 ("!ei"); emit2 ("!tlabeldef", (tlbl->key + 100)); + _G.lines.current->isLabel = 1; } } } @@ -3359,6 +3382,7 @@ genEndFunction (iCode * ic) { sprintf (buffer, "%s_end", sym->rname); emit2 ("!labeldef", buffer); + _G.lines.current->isLabel = 1; } _G.flushStatics = 1; @@ -4779,11 +4803,11 @@ gencjneshort (operand * left, operand * right, symbol * lbl) { while (size--) { - emit2 ("ld a,%s", aopGet (AOP (left), offset, FALSE)); - if ((AOP_TYPE (right) == AOP_LIT) && lit == 0) + _moveA (aopGet (AOP (left), offset, FALSE)); + if ((unsigned int) ((lit >> (offset * 8)) & 0x0FFL) == 0) emit2 ("or a,a"); else - emit2 ("cp a,%s", aopGet (AOP (right), offset, FALSE)); + emit2 ("sub a,%s", aopGet (AOP (right), offset, FALSE)); emit2 ("jp NZ,!tlabel", lbl->key + 100); offset++; } @@ -4798,13 +4822,18 @@ gencjneshort (operand * left, operand * right, symbol * lbl) while (size--) { _moveA (aopGet (AOP (left), offset, FALSE)); - if ((AOP_TYPE (left) == AOP_DIR && AOP_TYPE (right) == AOP_LIT) && + if (/*AOP_TYPE (left) == AOP_DIR &&*/ AOP_TYPE (right) == AOP_LIT && ((unsigned int) ((lit >> (offset * 8)) & 0x0FFL) == 0)) - /* PENDING */ - emit2 ("jp NZ,!tlabel", lbl->key + 100); + { + /* PENDING */ + /* MB: pending what? doesn't this need "or a,a"? */ + /* and I don't think AOP_TYPE(left) has anything to do with this */ + emit2 ("or a,a"); + emit2 ("jp NZ,!tlabel", lbl->key + 100); + } else { - emit2 ("cp %s", aopGet (AOP (right), offset, FALSE)); + emit2 ("sub %s", aopGet (AOP (right), offset, FALSE)); emit2 ("jp NZ,!tlabel", lbl->key + 100); } offset++; @@ -5164,6 +5193,7 @@ genAnd (iCode * ic, iCode * ifx) { emit2 ("clr c"); emit2 ("!tlabeldef", tlbl->key + 100); + _G.lines.current->isLabel = 1; } // if(left & literal) else @@ -7464,6 +7494,7 @@ genCritical (iCode *ic) emit2 ("jp PO,!tlabel", tlbl->key + 100); aopPut (AOP (IC_RESULT (ic)), "!one", 0); emit2 ("!tlabeldef", (tlbl->key + 100)); + _G.lines.current->isLabel = 1; freeAsmop (IC_RESULT (ic), NULL, ic); } else @@ -7508,6 +7539,7 @@ genEndCritical (iCode *ic) emit2 ("jp PO,!tlabel", tlbl->key + 100); emit2 ("!ei"); emit2 ("!tlabeldef", (tlbl->key + 100)); + _G.lines.current->isLabel = 1; } } @@ -8084,7 +8116,9 @@ genZ80Code (iCode * lic) } if (options.iCodeInAsm) { - emit2 (";ic:%d: %s", ic->key, printILine(ic)); + char *iLine = printILine(ic); + emit2 (";ic:%d: %s", ic->key, iLine); + dbuf_free(iLine); } /* if the result is marked as spilt and rematerializable or code for @@ -8121,7 +8155,7 @@ genZ80Code (iCode * lic) spilt live range, if there is an ifx statement following this pop then the if statement might be using some of the registers being popped which - would destory the contents of the register so + would destroy the contents of the register so we need to check for this condition and handle it */ if (ic->next && ic->next->op == IFX && @@ -8368,16 +8402,16 @@ genZ80Code (iCode * lic) /* This is unfortunate */ /* now do the actual printing */ { - FILE *fp = codeOutFile; - if (isInHome () && codeOutFile == code->oFile) - codeOutFile = home->oFile; - printLine (_G.lines.head, codeOutFile); + struct dbuf_s *buf = codeOutBuf; + if (isInHome () && codeOutBuf == &code->oBuf) + codeOutBuf = &home->oBuf; + printLine (_G.lines.head, codeOutBuf); if (_G.flushStatics) { flushStatics (); _G.flushStatics = 0; } - codeOutFile = fp; + codeOutBuf = buf; } freeTrace(&_G.lines.trace);