From 95cde5f467441549dac166139cff601fcf46e73b Mon Sep 17 00:00:00 2001 From: kvigor Date: Fri, 11 Apr 2003 19:29:35 +0000 Subject: [PATCH] Fix bug 706781 git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@2508 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 4 ++++ src/ds390/gen.c | 18 ++++++++++++++---- src/ds390/peeph.def | 7 +++++++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index cf42d9fa..8d16daee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2003-04-11 kevin Vigor + + * ds390/gen.c ds390/peeph.def: fix bug 706781 + 2003-04-11 Borut Razem * support/Util/dbuf.c, support/Util/dbuf.h: update to version 1.1.1 - re-added C++ stuff to make it still more portable diff --git a/src/ds390/gen.c b/src/ds390/gen.c index d417b07f..d4a79b53 100644 --- a/src/ds390/gen.c +++ b/src/ds390/gen.c @@ -3812,11 +3812,21 @@ bool aopOp3(iCode * ic) // AOP_IS_DPTRn(IC_LEFT(ic)) ? "true" : "false", // AOP_IS_DPTRn(IC_RIGHT(ic)) ? "true" : "false", // AOP_IS_DPTRn(IC_RESULT(ic)) ? "true" : "false"); -// ); - +// ); - // Right uses DPTR unless left or result is an AOP_STR. - aopOp (IC_RIGHT(ic),ic,FALSE, AOP_IS_STR(IC_LEFT(ic)) || AOP_IS_STR(IC_RESULT(ic))); + // Right uses DPTR unless left or result is an AOP_STR; however, + // if right is an AOP_STR, it must use DPTR regardless. + if ((AOP_IS_STR(IC_LEFT(ic)) || AOP_IS_STR(IC_RESULT(ic))) + && !AOP_IS_STR(IC_RIGHT(ic))) + { + useDp2 = TRUE; + } + else + { + useDp2 = FALSE; + } + + aopOp (IC_RIGHT(ic),ic,FALSE, useDp2); // if the right used DPTR, left MUST use DPTR2. // if the right used DPTR2, left MUST use DPTR. diff --git a/src/ds390/peeph.def b/src/ds390/peeph.def index abf84ab6..11f42204 100644 --- a/src/ds390/peeph.def +++ b/src/ds390/peeph.def @@ -1575,6 +1575,13 @@ replace { mov dptr,%1 } +replace { + push acc + pop acc +} by { + ; Peephole 202b removed redundant push pop +} + replace { mov r%1,_spx lcall %2 -- 2.39.5