372Fermer374
Kevin KoflerLe 17/02/2004 à 22:15
Raphaël :
Voici avec ton optimisation :
while(n--)         {                  short mask
	jbra .L21
	.even
.L24:
#L1449	= x_&7;
	move.w %d3,%d1
	and.w #7,%d1
#L1456	*(pointeur++) |=*(pic)>>(mask);
	clr.w %d0
	move.b (%a1),%d0
	asr.w %d1,%d0
	or.b (%a0),%d0
	move.b %d0,(%a0)+
#L1472	*(pointeur) |=*(pic++)<<(8-mask);          //*(pointeur+1) |=*(pic)<<(8-mask);          //*(pointeur++) |=*(pic++)>>(mask);          //*(pointeur++) |=((x_>0)?(*(pic)>>(mask)):0);            //*(pointeur) |=((x_<152)?(*(pic++)<<(8-mask)):0);
	clr.w %d0
	move.b (%a1)+,%d0
	moveq.l #8,%d6
	sub.w %d1,%d6
	lsl.w %d6,%d0
	or.b %d0,(%a0)
#L1498	x_=x_+8;                          }
	addq.w #8,%d3
.L21:
	dbra %d2,.L24
#L1508	y ...
	add.w #256,%d4
	add.w #16,%d5
#L1366	; ...
	addq.w #1,%d7
.L17:
	cmp.w %a2,%d7
	jblt .L25
#L1514	}      //*((char*)LCD_MEM+addr)=x&7;    void _main(void)  {
	movm.l (%sp)+,#0x3cf8
	unlk %a6
	rts


et voici sans :
while(n--)         {                  short mask
	jbra .L21
	.even
.L24:
#L1449	= x_&7;         //*(pointeur++) |=*(pic)>>(mask);         //*(pointeur) |=*(pic++)<<(8-mask);
	move.w %d4,%d2
	and.w #7,%d2
#L1460	*(pointeur+1) |=*(pic)<<(8-mask);
	clr.w %d0
	move.b (%a1),%d0
	moveq.l #8,%d1
	sub.w %d2,%d1
	lsl.w %d1,%d0
	or.b %d0,1(%a0)
#L1479	*(pointeur++) |=*(pic++)>>(mask);          //*(pointeur++) |=((x_>0)?(*(pic)>>(mask)):0);            //*(pointeur) |=((x_<152)?(*(pic++)<<(8-mask)):0);
	clr.w %d0
	move.b (%a1)+,%d0
	asr.w %d2,%d0
	or.b (%a0),%d0
	move.b %d0,(%a0)+
#L1500	x_=x_+8;                          }
	addq.w #8,%d4
.L21:
	dbra %d3,.L24
#L1510	y ...
	add.w #256,%d5
	add.w #16,%d6
#L1366	; ...
	addq.w #1,%a2
.L17:
	move.w %a3,%d0
	cmp.w %a2,%d0
	jbgt .L25
#L1516	}      //*((char*)LCD_MEM+addr)=x&7;    void _main(void)  {
	movm.l (%sp)+,#0x3cf8
	unlk %a6
	rts

Le code avec mon optimisation est nettement meilleur. Presque le même, mais avec un (%a0) (4 cycles) à la place d'un 1(%a0) (8 cycles, 2 octets de plus). C'est ton bench qui était mauvais.