From 770ad4b1a93892619759d3779a8fcb973ca26bb9 Mon Sep 17 00:00:00 2001 From: maartenbrock Date: Thu, 22 Sep 2005 16:43:33 +0000 Subject: [PATCH] * src/mcs51/gen.c (genMinus): fix for undetected bug introduced 3 months ago by me * support/regression/tests/addsub.c: added test for the bug git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3896 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- ChangeLog | 6 +++++ src/mcs51/gen.c | 41 ++++++++++++++++++++----------- support/regression/tests/addsub.c | 3 +++ 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index 2885d07d..9dbe8a17 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2005-09-22 Maarten Brock + + * src/mcs51/gen.c (genMinus): fix for undetected bug introduced 3 months + ago by me + * support/regression/tests/addsub.c: added test for the bug + 2005-09-21 Raphael Neider * device/include/pic16/pic18f1220.h, diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index 7ae3fa4e..317a4b16 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -4314,7 +4314,7 @@ release: } /*-----------------------------------------------------------------*/ -/* genMinusDec :- does subtraction with deccrement if possible */ +/* genMinusDec :- does subtraction with decrement if possible */ /*-----------------------------------------------------------------*/ static bool genMinusDec (iCode * ic) @@ -4527,22 +4527,35 @@ genMinus (iCode * ic) while (size--) { - if (useCarry || ((lit >> (offset * 8)) & 0x0FFL)) { + if (useCarry || ((lit >> (offset * 8)) & 0x0FFL)) + { MOVA (aopGet (IC_LEFT (ic), offset, FALSE, FALSE)); - if (!offset && !size && lit== (unsigned long) -1) { - emitcode ("dec", "a"); - } else if (!useCarry) { - /* first add without previous c */ - emitcode ("add", "a,#0x%02x", - (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); - useCarry = TRUE; - } else { - emitcode ("addc", "a,#0x%02x", - (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); + if (!offset && !size && lit== (unsigned long) -1) + { + emitcode ("dec", "a"); + } + else if (!useCarry) + { + /* first add without previous c */ + emitcode ("add", "a,#0x%02x", + (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); + useCarry = TRUE; + } + else + { + emitcode ("addc", "a,#0x%02x", + (unsigned int) ((lit >> (offset * 8)) & 0x0FFL)); + } + aopPut (IC_RESULT (ic), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); } - aopPut (IC_RESULT (ic), "a", offset++, isOperandVolatile (IC_RESULT (ic), FALSE)); - } else { + else + { /* no need to add zeroes */ + if (!sameRegs (AOP (IC_RESULT (ic)), AOP (IC_LEFT (ic)))) + { + aopPut (IC_RESULT (ic), aopGet (IC_LEFT (ic), offset, FALSE, FALSE), + offset, isOperandVolatile (IC_RESULT (ic), FALSE)); + } offset++; } } diff --git a/support/regression/tests/addsub.c b/support/regression/tests/addsub.c index 641f7098..3fb3dc1a 100644 --- a/support/regression/tests/addsub.c +++ b/support/regression/tests/addsub.c @@ -67,4 +67,7 @@ testSub(void) result = left-right; ASSERT(result == (-39+20)); + + result = left-(signed)0x1200; + ASSERT(result == ({type})(-39-(signed)0x1200)); } -- 2.47.2