From 81cd49cd3298b973e88c4b9cdce1fa6f86a2f2b0 Mon Sep 17 00:00:00 2001 From: bernhardheld Date: Sat, 13 May 2006 20:38:14 +0000 Subject: [PATCH] * 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 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@4171 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 11 +++++++++++ src/avr/gen.c | 7 +++++++ src/ds390/gen.c | 8 ++++++++ src/hc08/gen.c | 8 ++++++++ src/mcs51/gen.c | 8 ++++++++ src/pic/gen.c | 8 ++++++++ src/pic16/gen.c | 4 ++++ src/z80/gen.c | 8 ++++++++ 8 files changed, 62 insertions(+) diff --git a/ChangeLog b/ChangeLog index fd5ac8b4..ac8245ac 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2006-05-13 Bernhard Held + + * 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 * doc/sdccman.lyx: documented numeric ranges, WEBDOC #1442369 diff --git a/src/avr/gen.c b/src/avr/gen.c index b06f5c8d..59dbabce 100644 --- a/src/avr/gen.c +++ b/src/avr/gen.c @@ -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; } diff --git a/src/ds390/gen.c b/src/ds390/gen.c index 28173930..8a0f30f1 100644 --- a/src/ds390/gen.c +++ b/src/ds390/gen.c @@ -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; } diff --git a/src/hc08/gen.c b/src/hc08/gen.c index 3b834a00..49347a20 100644 --- a/src/hc08/gen.c +++ b/src/hc08/gen.c @@ -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; diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index e8b5afab..52889d3f 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -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; } diff --git a/src/pic/gen.c b/src/pic/gen.c index a410c47c..1189c360 100644 --- a/src/pic/gen.c +++ b/src/pic/gen.c @@ -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), diff --git a/src/pic16/gen.c b/src/pic16/gen.c index 735f113c..7d58f400 100644 --- a/src/pic16/gen.c +++ b/src/pic16/gen.c @@ -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, diff --git a/src/z80/gen.c b/src/z80/gen.c index 912963d7..f1c6a241 100644 --- a/src/z80/gen.c +++ b/src/z80/gen.c @@ -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; } -- 2.30.2