From: Scott B. <br...@ri...> - 2003-10-22 20:33:24
|
When checking equality, an extra instruction can be saved and the b register not dirtied. This is the output code for if(a == buf) where a is a pointer and buf is a fixed location in memory: mov b,_a mov a,#_buf cjne a,b,nelabel This of course be better as: mov a,_a cjne a,#buf,nelabel The order of the arguments doesn't appear to matter. Would this make an effective peephole optimization? Should I file a bug / feature request? - Scott Here's an working example C file: #include <stdio.h> #define RINGSIZ 16 data unsigned char *data cp; data unsigned char ringbuf[RINGSIZ]; void main() { if(cp == &ringbuf[RINGSIZ]) { cp = &ringbuf[0]; } printf("Hello!\n"); } This compiles down to: ;isrtest.c:15: if(cp == &ringbuf[RINGSIZ]) { ; genCmpEq mov b,_cp mov a,#(_ringbuf + 0x0010) ; Peephole 132 changed ljmp to sjmp ; Peephole 199 optimized misc jump sequence cjne a,b,00102$ ;00106$: ; Peephole 200 removed redundant sjmp 00107$: C$isrtest.c$16$2$2 ==. ;isrtest.c:16: cp = &ringbuf[0]; ; genAddrOf mov _cp,#_ringbuf |
From: Scott B. <br...@ri...> - 2003-10-22 21:41:51
|
On Wed, 2003-10-22 at 12:52, Scott Bronson wrote: > > mov b,_a > mov a,#_buf > cjne a,b,nelabel Sorry, I mixed up a and b. That example SHOULD have been: mov a,_a mov b,#_buf cjne a,b,nelabel The rest of the post is OK. > This of course be better as: > > mov a,_a > cjne a,#buf,nelabel I shouldn't send mails right after lunch. :) - Scott |
From: Erik P. <epe...@iv...> - 2003-10-24 06:21:52
|
On Wed, 22 Oct 2003, Scott Bronson wrote: > When checking equality, an extra instruction can be saved > and the b register not dirtied. This is the output code > for if(a == buf) where a is a pointer and buf is a fixed > location in memory: > > mov b,_a > mov a,#_buf > cjne a,b,nelabel > > This of course be better as: > > mov a,_a > cjne a,#buf,nelabel Normally, sdcc already uses the shorter version. However, in your sample C code, the comparison was with a constant address rather than a numeric constant so this optimization wasn't recognized and sdcc fell back to using code for the most general case. This has been fixed in src/mcs51/gen.c 1.182 and src/ds390/gen.c 1.204. The changes should make it into a snapshot in the next day or two. Thanks for the help! Erik |