Oui, j'ai toujours trouvé les bench sur vraie TI très bizarres... Notamment selon l'agencement des instructions, le temps d'exécution pouvait varier légèrement (mais de manière fiable

)... En tout cas ça a été mentionné plusieurs fois ici et personne n'a été capable de trouver plus d'infos là-dessus.
Bon, alors voilà mon "petit" problème :
// arguments fournis
#define vs_w 128
long xdiff,ydiff;
TILE **tiles;
// variables de boucle
long xval,yval;
// contenu de la boucle
{
xval += xdiff;
yval += ydiff;
TILE *tile = tiles[((xval>>16)>>3)+vs_w*((yval>>16)>>3)];
SetNextGray4PixHorizontally(GetGray4Pix(tile,(xval>>16)&7,(yval>>16)&7));
}
Le but est d'optimiser le contenu de la boucle, sachant que :
[ul][li] on a le droit de faire tous les précalculs qu'on veut en dehors de la boucle (dans la limite du raisonnable

moins de 500 cycles par exemple)
[li] on peut prendre autant de registres que nécessaire
[li] la précision ne doit pas impérativement être celle que j'ai donnée, on peut très bien enlever une petite dizaine de bits si ça peut aider (par exemple on peut précalculer xdiff4 = xdiff>>4, et modifier à chaque itération xval4, approximation de xval>>4 calculée par xval4 += xdiff4, et utiliser xval4>>12 au lieu de xval>>16)
[li] important : on peut supposer que 'tile' change peu souvent (tous les 4 pixels disons)
[li] on peut optimiser le remplissage des pixels en regroupant les différentes exécutions de la boucle
[li] SetNextGray4PixHorizontally, la structure TILE et GetGray4Pix sont volontairement indéfinies, tous les formats de stockage sont acceptées, tant que :
[ul][li] il y a au plus, disons, 4 octets par pixel de tile
[li] le format de sortie est le format standard de l'écran
[li] par exemple, on peut avoir cette implémentation (peu efficace) :
typedef struct {
unsigned char dark[8];
unsigned char light[8];
};
#define GetGray4Pix(tile,x,y) tile->dark[(y)]&(1<<(x)),tile->light[(y)]&(1<<(x))
int cur_x=7; unsigned char *darkplane,*lightplane;
void SetNextGray4PixHorizontally(unsigned char dark,unsigned char light) {
if (dark)
*darkplane |= 1<<cur_x;
if (light)
*lightplane |= 1<<cur_x;
if (!cur_x--)
cur_x+=8, darkplane++, lightplane++;
}
[/ul]
[li]on peut supposer que xdiff, ydiff, xval et yval sont raisonnablement faibles, par exemple plus petits en valeur absolue que 128<<16[/ul]