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
Et sinon pour le clipping ça marche très bien comme ceci :
}
while(n--)
{
short mask = x_&7;
*(pointeur+1) |=((x_<232)?(*(pic)<<(8-mask)):0);
*(pointeur) |=((x_>-1)?(*(pic)>>(mask)):0);
*pic++;
*pointeur++;
x_=x_+8;
Donc les optimisation précédantes ne servent pas à grand chose pour une routine clippée. a moins qu'il y ait des optimisation à faire mais là je n'en vois aucune.