From 12df6a6b3e280cc0b788a2700d151cc5c13d3ae2 Mon Sep 17 00:00:00 2001 From: bernhardheld Date: Fri, 9 Feb 2007 22:43:53 +0000 Subject: [PATCH] src/mcs51/gen.c (genRet): fixed RFE 1652561: added code for bit to bit moves in return statement git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4626 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 9 +++++++-- src/mcs51/gen.c | 54 ++++++++++++++++++++++++++----------------------- 2 files changed, 36 insertions(+), 27 deletions(-) diff --git a/ChangeLog b/ChangeLog index b4ef0b15..0183b635 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2007-02-09 Bernhard Held + + * src/mcs51/gen.c (genRet): fixed RFE 1652561: added code for bit to + bit moves in return statement + 2007-02-09 Borut Razem * src/SDCC.y: fixed bug #1159134: invalid duplicate declarations with @@ -22,8 +27,8 @@ * device/lib/printf_large.c (_print_format): fixed compare/assign bug, how can this have lived here for so many years? * src/SDCCicode.c (ast2iCode): return left instead of right for assignment, - fixes bug 1273984, see also patch 1645121, thanks Günther Jehle - * support/regression/tests/bug1273984.c: new, added, thanks Günther Jehle + fixes bug 1273984, see also patch 1645121, thanks Gnther Jehle + * support/regression/tests/bug1273984.c: new, added, thanks Gnther Jehle 2007-02-06 Bernhard Held diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 8ad42509..cfb3e44b 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -3983,38 +3983,42 @@ genRet (iCode * ic) if (IS_BIT(_G.currentFunc->etype)) { - movc (aopGet (IC_LEFT (ic), 0, FALSE, FALSE)); - size = 0; + 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)); } - - while (size--) + else { - char *l; - if (AOP_TYPE (IC_LEFT (ic)) == AOP_DPTR) + while (size--) { - /* #NOCHANGE */ - l = aopGet (IC_LEFT (ic), offset++, - FALSE, TRUE); - emitcode ("push", "%s", l); - pushed++; + char *l; + if (AOP_TYPE (IC_LEFT (ic)) == AOP_DPTR) + { + /* #NOCHANGE */ + l = aopGet (IC_LEFT (ic), offset++, + FALSE, TRUE); + emitcode ("push", "%s", l); + pushed++; + } + else + { + l = aopGet (IC_LEFT (ic), offset, + FALSE, FALSE); + if (strcmp (fReturn[offset], l)) + emitcode ("mov", "%s,%s", fReturn[offset++], l); + } } - else + + while (pushed) { - l = aopGet (IC_LEFT (ic), offset, - FALSE, FALSE); - if (strcmp (fReturn[offset], l)) - emitcode ("mov", "%s,%s", fReturn[offset++], l); + pushed--; + if (strcmp (fReturn[pushed], "a")) + emitcode ("pop", fReturn[pushed]); + else + emitcode ("pop", "acc"); } } - - while (pushed) - { - pushed--; - if (strcmp (fReturn[pushed], "a")) - emitcode ("pop", fReturn[pushed]); - else - emitcode ("pop", "acc"); - } freeAsmop (IC_LEFT (ic), NULL, ic, TRUE); jumpret: -- 2.30.2