From: Frieder F. <fri...@we...> - 2002-07-30 23:44:24
|
Hi, this patch saves a few cycles when accessing variables in code space (on the 8051 port). Hopefully I got it right. Regards, Frieder With the patch the assignment i=c in the program: --8<----- long int i; long int code c=0x01234567; main() { i=c; } -->8----- compiles to: ; test.c:6: i=c; mov dptr,#_c clr a movc a,@a+dptr mov _i,a mov a,#0x01 movc a,@a+dptr mov (_i + 1),a mov a,#0x02 movc a,@a+dptr mov (_i + 2),a mov a,#0x03 movc a,@a+dptr mov (_i + 3),a before it was: ; test.c:6: i=c; mov dptr,#_c clr a movc a,@a+dptr mov _i,a inc dptr clr a movc a,@a+dptr mov (_i + 1),a inc dptr clr a movc a,@a+dptr mov (_i + 2),a inc dptr clr a movc a,@a+dptr mov (_i + 3),a patch to sdcc/src/mcs51/gen.c: --- gen.c.orig Wed Mar 20 23:26:16 2002 +++ gen.c Wed Jul 31 01:13:08 2002 @@ -801,6 +801,15 @@ return rs; case AOP_DPTR: + + /* if possible use indexed addressing mode for code data access with positive byte offset */ + if ( (aop->code) && (offset == (offset & 0xff)) ) + { + emitcode ("mov", "a,#0x%02x", offset & 0xff); + emitcode ("movc", "a,@a+dptr"); + return (dname ? "acc" : "a"); + } + while (offset > aop->coff) { emitcode ("inc", "dptr"); |
From: Frieder F. <fri...@we...> - 2003-01-26 11:47:54
|
Hi, this is basically a repost of a patch I sent last july. The patch would still apply although it now has a few lines offset;) Regards, Frieder -------- Original Message -------- Hi, this patch saves a few cycles when accessing variables in code space (on the 8051 port). Hopefully I got it right. Regards, Frieder With the patch the assignment i=c in the program: --8<----- long int i; long int code c=0x01234567; main() { i=c; } -->8----- compiles to: ; test.c:6: i=c; mov dptr,#_c clr a movc a,@a+dptr mov _i,a mov a,#0x01 movc a,@a+dptr mov (_i + 1),a mov a,#0x02 movc a,@a+dptr mov (_i + 2),a mov a,#0x03 movc a,@a+dptr mov (_i + 3),a before it was: ; test.c:6: i=c; mov dptr,#_c clr a movc a,@a+dptr mov _i,a inc dptr clr a movc a,@a+dptr mov (_i + 1),a inc dptr clr a movc a,@a+dptr mov (_i + 2),a inc dptr clr a movc a,@a+dptr mov (_i + 3),a patch to sdcc/src/mcs51/gen.c: --- gen.c.orig Wed Mar 20 23:26:16 2002 +++ gen.c Wed Jul 31 01:13:08 2002 @@ -801,6 +801,15 @@ return rs; case AOP_DPTR: + + /* if possible use indexed addressing mode for code data access with positive byte offset */ + if ( (aop->code) && (offset == (offset & 0xff)) ) + { + emitcode ("mov", "a,#0x%02x", offset & 0xff); + emitcode ("movc", "a,@a+dptr"); + return (dname ? "acc" : "a"); + } + while (offset > aop->coff) { emitcode ("inc", "dptr"); ------------------------------------------------------- This sf.net email is sponsored by: Dice - The leading online job board for high-tech professionals. Search and apply for tech jobs today! http://seeker.dice.com/seeker.epl?rel_code=31 _______________________________________________ sdcc-devel mailing list sdc...@li... https://lists.sourceforge.net/lists/listinfo/sdcc-devel |
From: Johan K. <joh...@id...> - 2003-01-26 12:54:07
|
> + /* if possible use indexed addressing mode for code data access with positive byte offset */ > + if ( (aop->code) && (offset == (offset & 0xff)) ) > + { > + emitcode ("mov", "a,#0x%02x", offset & 0xff); > + emitcode ("movc", "a,@a+dptr"); > + return (dname ? "acc" : "a"); > + } > + > while (offset > aop->coff) > { > emitcode ("inc", "dptr"); The generated code looks nicer and does save time although it doesn't save space . But this doesn't take into account the fact that aop->coff could already be != 0. Very unlikely and maybe even impossible, but still. I think this is too dangerous. Nice catch though! Please go on. Johan |
From: Johan K. <joh...@id...> - 2003-01-26 13:26:24
|
> The generated code looks nicer and does save time although it doesn't save > space . But this doesn't take into account the fact that aop->coff could > already be != 0. Very unlikely and maybe even impossible, but still. I think > this is too dangerous. On second thought, this could be safely done with a small modification: if (aop->code && aop->coff==0 && offset>=1) { emitcode ("mov", "a,#0x%02x", offset); emitcode ("movc", "a,@a+dptr"); return (dname ? "acc" : "a"); } Commited in src/mcs51/gen.c:1.142 |