From: maartenbrock Date: Tue, 28 Jun 2005 20:34:12 +0000 (+0000) Subject: * device/lib/_gptrget.c: also push/pop _PSBANK, added # to 0x03 X-Git-Url: https://git.gag.com/?a=commitdiff_plain;h=a1c6a8c341f0ddb164e3f0bb2723c6a1b86c7065;p=fw%2Fsdcc * device/lib/_gptrget.c: also push/pop _PSBANK, added # to 0x03 * device/lib/_itoa.c, * device/lib/_ltoa.c: optimized codesize * src/SDCCsymt.c (checkSClass): added sanity check for sfr at addresses, but don't know how to suppress the double warning. * src/mcs51/gen.c (genPlusIncr): fixed bug when incrementing volatile int's * support/Util/SDCCerr.c, * support/Util/SDCCerr.h: added warning W_SFR_ABSRANGE for sanity check git-svn-id: https://sdcc.svn.sourceforge.net/svnroot/sdcc/trunk/sdcc@3790 4a8a32a2-be11-0410-ad9d-d568d2c75423 --- diff --git a/ChangeLog b/ChangeLog index 31e62b6d..e58d4d90 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2005-06-28 Maarten Brock + + * device/lib/_gptrget.c: also push/pop _PSBANK, added # to 0x03 + * device/lib/_itoa.c, + * device/lib/_ltoa.c: optimized codesize + * src/SDCCsymt.c (checkSClass): added sanity check for sfr at addresses, + but don't know how to suppress the double warning. + * src/mcs51/gen.c (genPlusIncr): fixed bug when incrementing volatile int's + * support/Util/SDCCerr.c, + * support/Util/SDCCerr.h: added warning W_SFR_ABSRANGE for sanity check + 2005-06-27 Maarten Brock * as/mcs51/asexpr.c (expr): disabled warning "not in .flat24 mode", diff --git a/device/lib/_gptrget.c b/device/lib/_gptrget.c index 18a2f588..beb11aa2 100644 --- a/device/lib/_gptrget.c +++ b/device/lib/_gptrget.c @@ -49,53 +49,55 @@ _gptrget (char *gptr) _naked ; ; depending on the pointer type acc. to SDCCsymt.h ; - jb _B_7,codeptr$ ; >0x80 code ; 3 - jnb _B_6,xdataptr$ ; <0x40 far ; 3 + jb _B_7,codeptr$ ; >0x80 code ; 3 + jnb _B_6,xdataptr$ ; <0x40 far ; 3 - mov dph,r0 ; save r0 independant of regbank ; 2 - mov r0,dpl ; use only low order address ; 2 + mov dph,r0 ; save r0 independant of regbank ; 2 + mov r0,dpl ; use only low order address ; 2 - jb _B_5,pdataptr$ ; >0x60 pdata ; 3 + jb _B_5,pdataptr$ ; >0x60 pdata ; 3 ; ; Pointer to data space ; - mov a,@r0 ; 1 - mov r0,dph ; restore r0 ; 2 - mov dph,#0 ; restore dph ; 2 - ret ; 1 + mov a,@r0 ; 1 + mov r0,dph ; restore r0 ; 2 + mov dph,#0 ; restore dph ; 2 + ret ; 1 ; ; pointer to external stack or pdata ; pdataptr$: - movx a,@r0 ; 1 - mov r0,dph ; restore r0 ; 2 - mov dph,#0 ; restore dph ; 2 - ret ; 1 - ; - ; pointer to code area - ; + movx a,@r0 ; 1 + mov r0,dph ; restore r0 ; 2 + mov dph,#0 ; restore dph ; 2 + ret ; 1 + ; + ; pointer to code area + ; codeptr$: - ; implementation for SiLabs C8051F12x - mov a,b ; 2 - anl a,0x03 ; 2 - swap a ; 1 - anl _PSBANK,#0x0F ; 3 - orl _PSBANK,a ; 2 - - clr a ; 1 - movc a,@a+dptr ; 1 - ret ; 1 + ; implementation for SiLabs C8051F12x + mov a,b ; 2 + anl a,#0x03 ; 2 + swap a ; 1 + push _PSBANK ; 2 + anl _PSBANK,#0x0F ; 3 + orl _PSBANK,a ; 2 + + clr a ; 1 + movc a,@a+dptr ; 1 + pop _PSBANK ; 2 + ret ; 1 ; ; pointer to xternal data ; xdataptr$: - ; implementation for xram a16-a21 tied to P3 - mov _P3,b ; 3 + ; implementation for xram a16-a21 tied to P3 + mov _P3,b ; 3 - movx a,@dptr ; 1 - ret ; 1 - ;=== - ;43 bytes + movx a,@dptr ; 1 + ret ; 1 + ;=== + ;47 bytes _endasm ; } @@ -113,47 +115,47 @@ _gptrget (char *gptr) _naked ; ; depending on the pointer type acc. to SDCCsymt.h ; - mov b,dph ; 3 - jb _B_7,codeptr$ ; >0x80 code ; 3 - jnb _B_6,xdataptr$ ; <0x40 far ; 3 + mov b,dph ; 3 + jb _B_7,codeptr$ ; >0x80 code ; 3 + jnb _B_6,xdataptr$ ; <0x40 far ; 3 - mov b,r0 ; save r0 independant of regbank ; 2 - mov r0,dpl ; use only low order address ; 2 + mov b,r0 ; save r0 independant of regbank ; 2 + mov r0,dpl ; use only low order address ; 2 - jb _B_5,pdataptr$ ; >0x60 pdata ; 3 + jb _B_5,pdataptr$ ; >0x60 pdata ; 3 ; ; Pointer to data space ; - mov a,@r0 ; 1 - mov r0,b ; restore r0 ; 2 - ret ; 1 + mov a,@r0 ; 1 + mov r0,b ; restore r0 ; 2 + ret ; 1 ; ; pointer to xternal stack or pdata ; pdataptr$: - movx a,@r0 ; 1 - mov r0,b ; restore r0 ; 2 - ret ; 1 - ; - ; pointer to code area, max 15 bits - ; + movx a,@r0 ; 1 + mov r0,b ; restore r0 ; 2 + ret ; 1 + ; + ; pointer to code area, max 15 bits + ; codeptr$: - ; 0x8000 <= dptr <= 0xFFFF - ; no need to AND dph and restore from B if hardware wraps code memory - anl dph,#0x7F ; 3 - clr a ; 1 - movc a,@a+dptr ; 1 - mov dph,b ; 3 - ret ; 1 + ; 0x8000 <= dptr <= 0xFFFF + ; no need to AND dph and restore from B if hardware wraps code memory + anl dph,#0x7F ; 3 + clr a ; 1 + movc a,@a+dptr ; 1 + mov dph,b ; 3 + ret ; 1 ; ; pointer to xternal data, max 14 bits ; xdataptr$: - ; 0 <= dptr <= 0x3FFF - movx a,@dptr ; 1 - ret ; 1 - ;=== - ;35 bytes + ; 0 <= dptr <= 0x3FFF + movx a,@dptr ; 1 + ret ; 1 + ;=== + ;35 bytes _endasm ; } @@ -171,43 +173,43 @@ _gptrget (char *gptr) _naked ; ; depending on the pointer type acc. to SDCCsymt.h ; - jb _B_7,codeptr$ ; >0x80 code ; 3 - jnb _B_6,xdataptr$ ; <0x40 far ; 3 + jb _B_7,codeptr$ ; >0x80 code ; 3 + jnb _B_6,xdataptr$ ; <0x40 far ; 3 - mov dph,r0 ; save r0 independant of regbank ; 2 - mov r0,dpl ; use only low order address ; 2 + mov dph,r0 ; save r0 independant of regbank ; 2 + mov r0,dpl ; use only low order address ; 2 - jb _B_5,pdataptr$ ; >0x60 pdata ; 3 + jb _B_5,pdataptr$ ; >0x60 pdata ; 3 ; ; Pointer to data space ; - mov a,@r0 ; 1 - mov r0,dph ; restore r0 ; 2 - mov dph,#0 ; restore dph ; 2 - ret ; 1 + mov a,@r0 ; 1 + mov r0,dph ; restore r0 ; 2 + mov dph,#0 ; restore dph ; 2 + ret ; 1 ; ; pointer to xternal stack or pdata ; pdataptr$: - movx a,@r0 ; 1 - mov r0,dph ; restore r0 ; 2 - mov dph,#0 ; restore dph ; 2 - ret ; 1 - ; - ; pointer to code area, max 16 bits - ; + movx a,@r0 ; 1 + mov r0,dph ; restore r0 ; 2 + mov dph,#0 ; restore dph ; 2 + ret ; 1 + ; + ; pointer to code area, max 16 bits + ; codeptr$: - clr a ; 1 - movc a,@a+dptr ; 1 - ret ; 1 + clr a ; 1 + movc a,@a+dptr ; 1 + ret ; 1 ; ; pointer to xternal data, max 16 bits ; xdataptr$: - movx a,@dptr ; 1 - ret ; 1 - ;=== - ;30 bytes + movx a,@dptr ; 1 + ret ; 1 + ;=== + ;30 bytes _endasm ; } @@ -224,47 +226,47 @@ _gptrget (char *gptr) _naked ; ; depending on the pointer type acc. to SDCCsymt.h ; - mov a,b ; 2 - jz 00001$ ; 0 near ; 2 - dec a ; 1 - jz 00002$ ; 1 far ; 2 - dec a ; 1 - jz 00003$ ; 2 code ; 2 - dec a ; 1 - jz 00004$ ; 3 pdata ; 2 - dec a ; 4 skip generic pointer ; 1 - dec a ; 1 - jz 00001$ ; 5 idata ; 2 + mov a,b ; 2 + jz 00001$ ; 0 near ; 2 + dec a ; 1 + jz 00002$ ; 1 far ; 2 + dec a ; 1 + jz 00003$ ; 2 code ; 2 + dec a ; 1 + jz 00004$ ; 3 pdata ; 2 + dec a ; 4 skip generic pointer ; 1 + dec a ; 1 + jz 00001$ ; 5 idata ; 2 ; ; any other value for type ; return xFF - mov a,#0xff ; 2 - ret ; 1 + mov a,#0xff ; 2 + ret ; 1 ; ; Pointer to data space ; 00001$: - push ar0 ; 2 + push ar0 ; 2 ; - mov r0,dpl ; use only low order address ; 2 - mov a,@r0 ; 1 + mov r0,dpl ; use only low order address ; 2 + mov a,@r0 ; 1 ; - pop ar0 ; 2 + pop ar0 ; 2 ; - ret ; 1 + ret ; 1 ; ; pointer to xternal data ; 00002$: - movx a,@dptr ; 1 - ret ; 1 + movx a,@dptr ; 1 + ret ; 1 ; ; pointer to code area ; 00003$: ; clr a is already 0 - movc a,@a+dptr ; 1 - ret ; 1 + movc a,@a+dptr ; 1 + ret ; 1 ; ; pointer to xternal stack or pdata ; @@ -273,14 +275,14 @@ _gptrget (char *gptr) _naked mov dph,__XPAGE ; __XPAGE (usually p2) holds high byte for pdata access movx a,@dptr #else - push ar0 ; 2 - mov r0,dpl ; 2 - movx a,@r0 ; 1 - pop ar0 ; 2 + push ar0 ; 2 + mov r0,dpl ; 2 + movx a,@r0 ; 1 + pop ar0 ; 2 #endif - ret ; 1 - ;=== - ;40 bytes + ret ; 1 + ;=== + ;40 bytes _endasm ; } #endif @@ -301,13 +303,13 @@ _gptrgetWord (unsigned *gptr) ; ; depending on the pointer type acc. to SDCCsymt.h ; - jb _B_7,00003$ ; >0x80 code - jnb _B_6,00002$ ; <0x40 far + jb _B_7,00003$ ; >0x80 code + jnb _B_6,00002$ ; <0x40 far mov dph,r0 ; save r0 independant of regbank mov r0,dpl ; use only low order address - jb _B_5,00004$ ; >0x60 pdata + jb _B_5,00004$ ; >0x60 pdata ; ; Pointer to data space ; diff --git a/device/lib/_itoa.c b/device/lib/_itoa.c index b282dac6..f89ba9e4 100755 --- a/device/lib/_itoa.c +++ b/device/lib/_itoa.c @@ -40,10 +40,7 @@ void _itoa(int value, char* string, unsigned char radix) { if (value < 0 && radix == 10) { *string++ = '-'; - _uitoa(-value, string, radix); - } - else { - _uitoa(value, string, radix); + value = -value; } + _uitoa(value, string, radix); } - diff --git a/device/lib/_ltoa.c b/device/lib/_ltoa.c index 0ba0c3db..0ee8be26 100755 --- a/device/lib/_ltoa.c +++ b/device/lib/_ltoa.c @@ -39,10 +39,7 @@ void _ltoa(long value, char* string, unsigned char radix) { if (value < 0 && radix == 10) { *string++ = '-'; - _ultoa(-value, string, radix); - } - else { - _ultoa(value, string, radix); + value = -value; } + _ultoa(value, string, radix); } - diff --git a/src/SDCCsymt.c b/src/SDCCsymt.c index 1eff6770..fe796ebb 100644 --- a/src/SDCCsymt.c +++ b/src/SDCCsymt.c @@ -1373,6 +1373,26 @@ checkSClass (symbol * sym, int isProto) if (IS_ABSOLUTE (sym->etype)) SPEC_VOLATILE (sym->etype) = 1; + if (TARGET_IS_MCS51 && + IS_ABSOLUTE (sym->etype) && + SPEC_SCLS (sym->etype) == S_SFR) + { + int n, size; + unsigned addr; + + if (SPEC_NOUN (sym->etype) == V_CHAR) + size = 8; + else if (SPEC_LONG (sym->etype) == 0) + size = 16; + else + size = 32; + + addr = SPEC_ADDR (sym->etype); + for (n=0; n> n) & 0xFF) < 0x80) + werror (W_SFR_ABSRANGE, sym->name); + } + /* If code memory is read only, then pointers to code memory */ /* implicitly point to constants -- make this explicit */ t = sym->type; diff --git a/src/mcs51/gen.c b/src/mcs51/gen.c index e2252b7e..ebf6a532 100644 --- a/src/mcs51/gen.c +++ b/src/mcs51/gen.c @@ -3496,6 +3496,7 @@ genPlusIncr (iCode * ic) /* if increment >=16 bits in register or direct space */ if ((AOP_TYPE(IC_LEFT(ic)) == AOP_REG || AOP_TYPE(IC_LEFT(ic)) == AOP_DIR ) && sameRegs (AOP (IC_LEFT (ic)), AOP (IC_RESULT (ic))) && + !isOperandVolatile (IC_RESULT (ic), FALSE) && (size > 1) && (icount == 1)) { diff --git a/support/Util/SDCCerr.c b/support/Util/SDCCerr.c index 19594964..93cd4965 100644 --- a/support/Util/SDCCerr.c +++ b/support/Util/SDCCerr.c @@ -415,7 +415,9 @@ struct { W_COMPLEMENT, ERROR_LEVEL_WARNING, "using ~ on bit/bool/unsigned char variables can give unexpected results due to promotion to int" }, { E_SHADOWREGS_NO_ISR, ERROR_LEVEL_ERROR, - "ISR function attribute 'shadowregs' following non-ISR function `%s'" }, + "ISR function attribute 'shadowregs' following non-ISR function '%s'" }, +{ W_SFR_ABSRANGE, ERROR_LEVEL_WARNING, + "absolute address for sfr '%s' probably out of range." }, }; /* diff --git a/support/Util/SDCCerr.h b/support/Util/SDCCerr.h index dc2614db..df659776 100644 --- a/support/Util/SDCCerr.h +++ b/support/Util/SDCCerr.h @@ -197,6 +197,7 @@ SDCCERR - SDCC Standard error handler #define W_POSSBUG2 179 /* possible bug, new format */ #define W_COMPLEMENT 180 /* ~bit can give unexpected results */ #define E_SHADOWREGS_NO_ISR 181 /* shadowregs keyword following non-ISR function */ +#define W_SFR_ABSRANGE 182 /* sfr at address out of range */ #define MAX_ERROR_WARNING 256 /* size of disable warnings array */