gnupic: Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16


Previous by date: 3 Aug 2006 13:02:07 +0100 unPIC alpha 003 released, Tamas Rudnai
Next by date: 3 Aug 2006 13:02:07 +0100 Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16, Dave Tweed
Previous in thread: 3 Aug 2006 13:02:07 +0100 Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16, George M. Gallant, Jr.
Next in thread: 3 Aug 2006 13:02:07 +0100 Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16, Dave Tweed

Subject: Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16
From: Dave Tweed ####@####.####
Date: 3 Aug 2006 13:02:07 +0100
Message-Id: <E1G8btr-0004Wx-00@pop-canoe.atl.sa.earthlink.net>

mengjin su ####@####.#### wrote:
> I did a testing using SDCC (v2.5.0?).  I feel the code efficiency
> is not satisfying.  Here is the test C code I wrote:
> 
> void strcpy (char *des, char *src)
> {
>     while ( (*des++ = *src++) ) {}
> }
> 
> The assembly code SDCC generated is
> 
> ; ; Starting pCode block
> S_main__strcpy	code
> _strcpy:
> ;	.line	11; main.c	void strcpy (char *des, char *src)
> 	MOVFF	FSR2L, POSTDEC1     ; update stack frame pointer
> 	MOVFF	FSR1L, FSR2L
> 	MOVFF	r0x00, POSTDEC1     ; save registers we want to use
> 	MOVFF	r0x01, POSTDEC1
> 	MOVFF	r0x02, POSTDEC1
> 	MOVFF	r0x03, POSTDEC1
> 	MOVFF	r0x04, POSTDEC1
> 	MOVFF	r0x05, POSTDEC1
> 	MOVFF	r0x06, POSTDEC1
> 	MOVLW	0x02                ; copy arguments to registers
> 	MOVFF	PLUSW2, r0x00
> 	MOVLW	0x03
> 	MOVFF	PLUSW2, r0x01
> 	MOVLW	0x04
> 	MOVFF	PLUSW2, r0x02
> 	MOVLW	0x05
> 	MOVFF	PLUSW2, r0x03
> 	MOVLW	0x06
> 	MOVFF	PLUSW2, r0x04
> 	MOVLW	0x07
> 	MOVFF	PLUSW2, r0x05
> _00105_DS_:
> ;	.line	13; main.c	while ( (*des++ = *src++) ) {}
> 	MOVFF	r0x03, FSR0L        ; get src pointer
> 	MOVFF	r0x04, PRODL
> 	MOVF	r0x05, W
> 	CALL	__gptrget1          ; get the byte it points to
> 	MOVWF	r0x06
> 	INCF	r0x03, F            ; increment src pointer
> 	BTFSC	STATUS, 0
> 	INCF	r0x04, F
> 	BTFSC	STATUS, 0
> 	INCF	r0x05, F
> 	MOVFF	r0x06, POSTDEC1     ; push byte on stack for __gptrput1()
> 	MOVFF	r0x00, FSR0L        ; get des pointer
> 	MOVFF	r0x01, PRODL
> 	MOVF	r0x02, W
> 	CALL	__gptrput1          ; store the byte it points to
> 	INCF	r0x00, F            ; increment des pointer
> 	BTFSC	STATUS, 0
> 	INCF	r0x01, F
> 	BTFSC	STATUS, 0
> 	INCF	r0x02, F
> 	MOVF	r0x06, W            ; test byte for zero
> 	BTFSS	STATUS, 2
> 	GOTO	_00105_DS_
> 	MOVFF	PREINC1, r0x06      ; restore saved regsiters
> 	MOVFF	PREINC1, r0x05
> 	MOVFF	PREINC1, r0x04
> 	MOVFF	PREINC1, r0x03
> 	MOVFF	PREINC1, r0x02
> 	MOVFF	PREINC1, r0x01
> 	MOVFF	PREINC1, r0x00
> 	MOVFF	PREINC1, FSR2L      ; restore stack frame pointer
> 	RETURN
> 
> What do you think?

Having looked at lots of compiler-generated code for lots of different
8-bit processors, I think it looks quite reasonable, given that the C
code, as written, is perfectly general. (See the annotations above.)
This means that the compiler must use 3-byte pointers and generic
memory access routines like __gptrget1() and __gptrput1(), because it
doesn't know whether the pointers point to RAM, EERPOM or Flash PROM
(code memory).

On processors with multiple memory spaces, you must be careful to take
advantage of whatever storage class qualifiers the compiler provides on
both variables and the pointers that point to them, in order to give
the compiler the information it needs to produce more highly optimized
code.

I know nothing about the details of SDCC for the PIC, but if there's a
way to tell it that both of the pointers can only point to objects in
on-chip RAM, I'm sure the generated code will look much better to you.

-- Dave Tweed

Previous by date: 3 Aug 2006 13:02:07 +0100 unPIC alpha 003 released, Tamas Rudnai
Next by date: 3 Aug 2006 13:02:07 +0100 Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16, Dave Tweed
Previous in thread: 3 Aug 2006 13:02:07 +0100 Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16, George M. Gallant, Jr.
Next in thread: 3 Aug 2006 13:02:07 +0100 Re: [gnupic] SDCC 2.6.0, finds pic14 header files but not pic16, Dave Tweed


Powered by ezmlm-browse 0.20.