* src/avr/gen.c (aopop),
authorbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 13 May 2006 20:38:14 +0000 (20:38 +0000)
committerbernhardheld <bernhardheld@4a8a32a2-be11-0410-ad9d-d568d2c75423>
Sat, 13 May 2006 20:38:14 +0000 (20:38 +0000)
* src/ds390/gen.c (aopOp),
* src/hc08/gen.c (aopOp),
* src/mcs51/gen.c (aopop),
* src/pic16/gen.c (pic16_aopOp),
* src/pic/gen.c (aopOp),
* src/z80/gen.c (aopop): fix for bug #1479882; use new, exclusive asmop if size of operand is smaller than spill location

git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4171 4a8a32a2-be11-0410-ad9d-d568d2c75423

ChangeLog
src/avr/gen.c
src/ds390/gen.c
src/hc08/gen.c
src/mcs51/gen.c
src/pic/gen.c
src/pic16/gen.c
src/z80/gen.c

index fd5ac8b4f5455b5a35caf9b0ad36ab33d192d171..ac8245ace65f39f73531b464ae1c1d97bfd7c887 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2006-05-13 Bernhard Held <bernhard AT bernhardheld.de>
+
+       * src/avr/gen.c (aopop),
+       * src/ds390/gen.c (aopOp),
+       * src/hc08/gen.c (aopOp),
+       * src/mcs51/gen.c (aopop),
+       * src/pic16/gen.c (pic16_aopOp),
+       * src/pic/gen.c (aopOp),
+       * src/z80/gen.c (aopop): fix for bug #1479882; use new, exclusive asmop
+       if size of operand is smaller than spill location
+
 2006-05-12 Maarten Brock <sourceforge.brock AT dse.nl>
 
        * doc/sdccman.lyx: documented numeric ranges, WEBDOC #1442369
index b06f5c8dd612a860acbaa7d03e9ce3561c0f1298..59dbabcebc9e0eddf6839aaa1a806be213999ade 100644 (file)
@@ -758,6 +758,8 @@ aopOp (operand * op, iCode * ic, bool result)
           b) has a spill location */
        if (sym->isspilt || sym->nRegs == 0) {
 
+               asmop *oldAsmOp = NULL;
+
                /* rematerialize it NOW */
                if (sym->remat) {
                        sym->aop = op->aop = aop = aopForRemat (sym);
@@ -781,10 +783,15 @@ aopOp (operand * op, iCode * ic, bool result)
                /* else spill location  */
                if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
                    /* force a new aop if sizes differ */
+                   oldAsmOp = sym->usl.spillLoc->aop;
                    sym->usl.spillLoc->aop = NULL;
                }
                sym->aop = op->aop = aop =
                        aopForSym (ic, sym->usl.spillLoc, result);
+               if (getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
+                       /* Don't reuse the new aop, go with the last one */
+                       sym->usl.spillLoc->aop = oldAsmOp;
+               }
                aop->size = getSize (sym->type);
                return;
        }
index 28173930dd2e711c31564ade58cf9f9bd4ed8d46..8a0f30f1b0fd1bd2c392811ae487ee35ef55be08 100644 (file)
@@ -1205,13 +1205,21 @@ aopOp (operand * op, iCode * ic, bool result, bool useDP2)
 
       if (sym->usl.spillLoc)
         {
+          asmop *oldAsmOp = NULL;
+
           if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
             {
               /* force a new aop if sizes differ */
+              oldAsmOp = sym->usl.spillLoc->aop;
               sym->usl.spillLoc->aop = NULL;
             }
           sym->aop = op->aop = aop =
                      aopForSym (ic, sym->usl.spillLoc, result, useDP2);
+          if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
+            {
+              /* Don't reuse the new aop, go with the last one */
+              sym->usl.spillLoc->aop = oldAsmOp;
+            }
           aop->size = getSize (sym->type);
           return;
         }
index 3b834a005fe12c559119fd6dbaccf862e07f20f9..49347a2055fbaaa99cec461c044e6729c38fb007 100644 (file)
@@ -1801,14 +1801,22 @@ aopOp (operand * op, iCode * ic, bool result)
       /* else spill location  */
       if (sym->usl.spillLoc)
         {
+          asmop *oldAsmOp = NULL;
+
           if (sym->usl.spillLoc->aop
               && sym->usl.spillLoc->aop->size != getSize (sym->type))
             {
              /* force a new aop if sizes differ */
+              oldAsmOp = sym->usl.spillLoc->aop;
              sym->usl.spillLoc->aop = NULL;
              //printf ("forcing new aop\n");
             }
          sym->aop = op->aop = aop = aopForSym (ic, sym->usl.spillLoc, result);
+          if (sym->usl.spillLoc->aop->size != getSize (sym->type))
+            {
+              /* Don't reuse the new aop, go with the last one */
+              sym->usl.spillLoc->aop = oldAsmOp;
+            }
          aop->size = getSize (sym->type);
          aop->op = op;
          aop->isaddr = op->isaddr;
index e8b5afaba5abf93112addd9f882e2f8953a2e29e..52889d3f5609731fe3b6ab4549634f875b3423b9 100644 (file)
@@ -954,13 +954,21 @@ aopOp (operand * op, iCode * ic, bool result)
 
       if (sym->usl.spillLoc)
         {
+          asmop *oldAsmOp = NULL;
+
           if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
             {
               /* force a new aop if sizes differ */
+              oldAsmOp = sym->usl.spillLoc->aop;
               sym->usl.spillLoc->aop = NULL;
             }
           sym->aop = op->aop = aop =
                      aopForSym (ic, sym->usl.spillLoc, result);
+          if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
+            {
+              /* Don't reuse the new aop, go with the last one */
+              sym->usl.spillLoc->aop = oldAsmOp;
+            }
           aop->size = getSize (sym->type);
           return;
         }
index a410c47cb0a30fd6d51481bb34894d4963bc824b..1189c3607d38e85514974140de8ba63fc9cff657 100644 (file)
@@ -942,9 +942,12 @@ void aopOp (operand *op, iCode *ic, bool result)
                /* else spill location  */
                if (sym->usl.spillLoc)
                {
+                       asmop *oldAsmOp = NULL;
+
                        if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
                        {
                                /* force a new aop if sizes differ */
+                               oldAsmOp = sym->usl.spillLoc->aop;
                                sym->usl.spillLoc->aop = NULL;
                        }
                        DEBUGpic14_emitcode(";","%s %d %s sym->rname = %s, offset %d",
@@ -953,6 +956,11 @@ void aopOp (operand *op, iCode *ic, bool result)
                                sym->rname, sym->usl.spillLoc->offset);
                
                        sym->aop = op->aop = aop = newAsmop(AOP_PCODE);
+                       if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
+                       {
+                               /* Don't reuse the new aop, go with the last one */
+                               sym->usl.spillLoc->aop = oldAsmOp;
+                       }
                        //aop->aopu.pcop = popGetImmd(sym->usl.spillLoc->rname,0,sym->usl.spillLoc->offset);
                        aop->aopu.pcop = popRegFromString(sym->usl.spillLoc->rname, 
                                getSize(sym->type), 
index 735f113ccfc8e3ce4515644761cde442b807b04d..7d58f40030e7aa79666aef838d393bc61b2d5280 100644 (file)
@@ -1289,6 +1289,10 @@ void pic16_aopOp (operand *op, iCode *ic, bool result)
 #endif
 
        sym->aop = op->aop = aop = newAsmop(AOP_PCODE);
+       if (sym->usl.spillLoc && getSize(sym->type) != getSize(sym->usl.spillLoc->type)) {
+           /* Don't reuse the new aop */
+           sym->usl.spillLoc->aop = NULL;
+       }
        //aop->aopu.pcop = pic16_popGetImmd(sym->usl.spillLoc->rname,0,sym->usl.spillLoc->offset);
        if (sym->usl.spillLoc && sym->usl.spillLoc->rname) {
          aop->aopu.pcop = pic16_popRegFromString(sym->usl.spillLoc->rname, 
index 912963d751706292c48104689eb89ac2034707da..f1c6a241a5471ea7a6c2d56861d2b7ab6335e33a 100644 (file)
@@ -1127,13 +1127,21 @@ aopOp (operand * op, iCode * ic, bool result, bool requires_a)
 
       if (sym->usl.spillLoc)
         {
+          asmop *oldAsmOp = NULL;
+
           if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
             {
               /* force a new aop if sizes differ */
+              oldAsmOp = sym->usl.spillLoc->aop;
               sym->usl.spillLoc->aop = NULL;
             }
           sym->aop = op->aop = aop =
                      aopForSym (ic, sym->usl.spillLoc, result, requires_a);
+          if (getSize(sym->type) != getSize(sym->usl.spillLoc->type))
+            {
+              /* Don't reuse the new aop, go with the last one */
+              sym->usl.spillLoc->aop = oldAsmOp;
+            }
           aop->size = getSize (sym->type);
           return;
         }