J'ai tenté de faire une fonction en C pour effacer un buffer (bon ici c'est l'écran) histoire de voir comment je pouvais optimiser au maximum (je pense que ça ne sert pas à grand chose de dérouler encore la boucle) ça et voilà ce que ça donne :
__attribute__((regparm))void clrbuff()
{
short i=0;
unsigned long long *screen_long = (long long*)LCD_MEM;
while(i<750) // 750 = 3000 / 32
{
*screen_long++=0x00000000;
*screen_long++=0x00000000;
*screen_long++=0x00000000;
*screen_long++=0x00000000;
*screen_long++=0x00000000;
*screen_long++=0x00000000;
*screen_long++=0x00000000;
*screen_long++=0x00000000;
i=i+16;
}
}
Je serais curieux de savoir comment on peut faire pour l'optimiser encore plus (si possible) en C.... enfin ça ne me dérange pas si il y a de l'asm non plus.
En asm ça donne :
move.w #19456,%a0
move.w #736,%d0
.L8:
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
clr.l (%a0)+
add.w #-16,%d0
jbpl .L8
Ca ne doit pas vraiment être ce qu'il y a de plus rapide. Je crois que movem.l va est bcp plus rapide mais je ne sais pas comment l'utiliser.
).

je fais d'une pierre deux coups).
On a un projet de compilo, et en principe on est censé faire un compilo d'un sous-ensemble de CAML en CAML, mais c'est pas obligatoire donc je fais un compilo C en C++
(mais je suis obligé de refaire le parser pour que le code soit entièrement de moi, même si GTC n'utilisera pas ce parser) Par contre ça avancera pas la première beta
). Une autre solution serait de rajouter une passe après avoir alloué les move #0 pour voir si c'est rentable de garder move #0 ou s'il faut passer aux clr, mais ça peut nécessiter une passe supplémentaire d'allocation de registre...