From: Patrick G. <P. GEHRIGER> - 2001-08-30 13:54:52
|
Dear SDCC-Team! There seems to be another problem with nearly identical C blocks: In my file prog8252.c beginning at line 664 you can see two nearly identical if blocks after each other. The only differences are the different text strings and the bit variables do_flag1 and do_flag2: void main(void) { bit do_flag1= 0; bit do_flag2= 0; char *ptr; // Other C code sometimes setting do_flag1 or do_flag2... // Send: if (do_flag1) { do_flag1= 0; // Reset do_flag. ptr= "Hello world, this is string 1!"; while (*ptr!='\0') { SBUF= *ptr; // Send character. ptr++; while (!TI); TI= 0; // Reset send flag. } } if (do_flag2) { do_flag2= 0; // Reset do_flag. ptr= "Hello world, this is string 2!"; while (*ptr!='\0') { SBUF= *ptr; // Send character. ptr++; while (!TI); TI= 0; // Reset send flag. } } // Other C code... } The problem is, that first block does NOT work, while the second one DOES!!!! To be more exact: The first BAD block sends as many bad (or whitespace) characters as long as the string "Hello world, this is string 1!" is, while the second block correctly sends the real string as it is. If I take a look - with my non-compiler-builder-eyes - at the corresponding area in file in prog8252.asm beginning at line 1620 I can't find anything really wrong, although I think there are still many redundant 'mov's. 00116$: ; prog8252.c 665 ; Peephole 111 removed ljmp by inverse jump logic jnb _main_do_flag1_1_1,00124$ 00181$: ; prog8252.c 667 clr _main_do_flag1_1_1 ; prog8252.c 669 mov r5,#__str_0 mov r6,#(__str_0 >> 8) mov r7,#0x02 ; prog8252.c 670 mov ar0,r5 mov ar1,r6 mov ar4,r7 00120$: mov dpl,r0 mov dph,r1 mov b,r4 lcall __gptrget mov r3,a cjne r3,#0x00,00182$ mov a,#0x01 sjmp 00183$ 00182$: clr a 00183$: ; Peephole 105 removed redundant mov mov _main_sloc0_1_0,a ; Peephole 109 removed ljmp by inverse jump logic jnz 00124$ 00184$: ; prog8252.c 672 mov _main_sloc1_1_0,r3 mov _SBUF,_main_sloc1_1_0 ; prog8252.c 673 inc r0 cjne r0,#0x00,00185$ inc r1 00185$: ; prog8252.c 674 00117$: ; Peephole 111 removed ljmp by inverse jump logic jnb _TI,00117$ 00186$: ; prog8252.c 675 clr _TI ; Peephole 132 changed ljmp to sjmp sjmp 00120$ 00124$: ; prog8252.c 678 ; Peephole 111 removed ljmp by inverse jump logic jnb _main_do_flag2_1_1,00132$ 00187$: ; prog8252.c 680 clr _main_do_flag2_1_1 ; prog8252.c 682 mov r5,#__str_1 mov r6,#(__str_1 >> 8) mov r7,#0x02 ; prog8252.c 683 mov ar4,r6 mov ar3,r7 00128$: mov dpl,r5 mov dph,r4 mov b,r3 lcall __gptrget mov r6,a cjne r6,#0x00,00188$ mov a,#0x01 sjmp 00189$ 00188$: clr a 00189$: ; Peephole 105 removed redundant mov mov r7,a ; Peephole 109 removed ljmp by inverse jump logic jnz 00132$ 00190$: ; prog8252.c 685 mov ar0,r6 mov _SBUF,r0 ; prog8252.c 686 inc r5 cjne r5,#0x00,00191$ inc r4 00191$: ; prog8252.c 687 00125$: ; Peephole 111 removed ljmp by inverse jump logic jnb _TI,00125$ 00192$: ; prog8252.c 688 clr _TI ; Peephole 132 changed ljmp to sjmp sjmp 00128$ 00132$: What might be the problem? If you need the entire source and output files, OR ANY FURTHER INFORMATION, please let me know. I hope someone in your team will reply to my queries and that nobody feels beeing spammed! Please tell me, if I should change anything in future requests (e. g. write shorter mails, be more precise and concise, alway send entire source and/or asm files, reduce my code example and isolate the problem, be more friendly, tell more about the exact circumstances, enhance my english, use a form, first read something at a place (website) I do not know yet, ...) Thank's a lot in advance and have a nice day! =;-) Best regards, Patrick -- * * * Patrick GEHRIGER Elektronik und Software Karlstr. 95 DE-64285 DARMSTADT Tel, Fax: +49 6151 22093 mailto:p.g...@ma... |