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"); |