Cecko pro PICe

Lukas Grepl L.Grepl@sh.cvut.cz
Středa Říjen 26 11:02:31 CEST 2005


>>Skusim. Taky jsem to skousel pres ty posuny ale vysledny kod je silene 
>>dlouhy....

> A mate zapnute (vsechny) optimalizace? Nezkousel jsem uvedene priklady, 
> ale obecne ma tohle PICC docela zvladnute, takze kod jako
> 
> if ((a >> 6) & 1)
> 	...;
> 
> preklada jako "btfsX a, 64" apod. Zkusim to ve volne chvilce nacpat do 
> prekladace, jak se s tim popere.

No, tak mi to nedalo a zkusil jsem prelozit ty ruzne varianty. Musim 
priznat, ze me kompilator zklamal, kdyz nepochopil (rozumnejte: 
nezoptimalizoval) ty tvary jako RB1 = data >> 4; a RB1 = u.bits.b4;.

Zbytek prelozil zhruba tak jak se dalo ocekavat:

------------------------------------------
void zapis1(char data)
{
	RB1 = RB2 = RB4 = RB5 = 0;
	if (data & (1 << 4))
		RB1 = 1;
	...

testbits.c: 5: RB1 = RB2 = RB4 = RB5 = 0;
	bcf	6,5
	bcf	6,4
	bcf	6,2
	bcf	6,1
;testbits.c: 6: if (data & (1 << 4))
	btfsc	?a_zapis1,4
;testbits.c: 7: RB1 = 1;
	bsf	6,1

------------------------------------------
void zapis2(char data)
{
	RB1 = data & 16 ? 1 : 0;
	...

;testbits.c: 18: RB1 = data & 16 ? 1 : 0;
	btfss	?a_zapis2,4
	goto	u50
	bsf	6,1
	goto	u64
u50
	bcf	6,1
u64

Identicky kod generuje i pro zapisy ve stylu:
	RB1 = (data & 16) > 0;
	RB1 = (data & 16) != 0;
	RB1 = !!(data & 16);
	RB1 = (data & 16) == 16;

------------------------------------------
void zapis3(char data)
{
	RB1 = data >> 4;
	RB2 = data >> 5;
	...

testbits.c: 26: RB1 = data >> 4;
	swapf	?a_zapis3,w
	andlw	15
	movwf	btemp
	rrf	btemp,w
	btfss	3,0
	goto	u130
	bsf	6,1
	goto	u144
u130
	bcf	6,1
u144
;testbits.c: 27: RB2 = data >> 5;
	bcf	3,5
	movf	?a_zapis3,w
	movwf	btemp
	movlw	5
	movwf	btemp+1
u155
	bcf	3,0
	rrf	btemp
	decfsz	btemp+1
	goto	u155
	movf	btemp,w
	movwf	btemp
	rrf	btemp,w
	btfss	3,0
	goto	u160
	bsf	6,2
	goto	u174
u160
	bcf	6,2
u174

Ten prvni radek jeste tak-nejak zoptimalizoval, ten druhy je uz je uplna 
tragedie... Variantu s unionem prelozil dost podobne, akorat nikde nedal 
  cykly, takze je ten kod "o neco efektivnejsi" - napr.:

;testbits.c: 40: RB4 = u.bits.b6;
	bcf	3,5
	swapf	?a_zapis4+1,w
	movwf	btemp
	rrf	btemp
	rrf	btemp,w
	andlw	1
	movwf	btemp
	rrf	btemp,w
	btfss	3,0
	goto	u280
	bsf	6,4
	goto	u294
u280
	bcf	6,4
u294

------------------------------------------

No a na zaver fce p.Hanzala v mem prekladu do C, po drobnych korekcich, 
v puvodnim zneni s titulky:

;testbits.c: 52: void zapis6(char data)
;testbits.c: 53: {
_zapis6
;	_data assigned to ?a_zapis6+0
_zapis6$data	set	?a_zapis6
;_data stored from w
	bcf	3,5
	movwf	?a_zapis6
;testbits.c: 54: data = (data >> 4) + (data << 4);
	swapf	?a_zapis6
;testbits.c: 55: data <<= 1;
	bcf	3,0
	rlf	?a_zapis6
;testbits.c: 56: PORTB ^= (PORTB ^ (data + (data & 0x18))) & 0x36;
	movf	?a_zapis6,w
	andlw	24
	addwf	?a_zapis6,w
	xorwf	6,w	;volatile
	andlw	54
	xorwf	6	;volatile
;testbits.c: 57: }
	return

S tou s poradil slusne - az na drobne detaily se temer nelisi od originalu:

 > swapf   data,f
 > rlf     data,w
 > movwf   temp
 > andlw   0x18
 > addwf   temp,w
 > xorwf   portb,w
 > andlw   0x36
 > xorwf   portb,f

Vse kompilovano s -Zg9 -O -S -16F84 (maximalni globalni optimalizace, 
assembler opt., vystup v asm, PIC16F84).

V priloze je kod toho testovaciho programku - zkuste to nekdo pro 
srovnani ve svem oblibenem kompilatoru...

Lukas Grepl
------------- další část ---------------
An embedded and charset-unspecified text was scrubbed...
Name: testbits.c
Url: http://list.hw.cz/pipermail/hw-list/attachments/20051026/f8476b1b/attachment.txt 


Další informace o konferenci Hw-list