Décalage de n bit

sniper83 Messages postés 2 Date d'inscription mardi 26 avril 2005 Statut Membre Dernière intervention 17 janvier 2008 - 17 janv. 2008 à 21:58
Spoolega Messages postés 65 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 27 février 2011 - 20 janv. 2008 à 15:53
Bonjour a tous

La fonction suivante fait un décalage a droite de n bit dans mot de 64 bits:

typedeflonglong Word64;
 
staticinline Word64 sar64(Word64 valeur, int nb)
{int temoin,b;
Word64 provisoir;
unsignedint poidfort,poidfaible;
 
provisoir=valeur;
provisoir>>=32;
poidfort=(int)provisoir;

provisoir=valeur;
poidfaible=(int)provisoir;

nb &= 0x3F; // prudence : pas plus de 63 décalages
 
for(b = 0; b < nb; b++)
{
temoin = poidfort & 0x00000001;
poidfort >>= nb;
poidfaible >>= nb;
poidfaible |= temoin;

}

provisoir=0;
provisoir=poidfort;
provisoir<<=32;
provisoir+=poidfaible;

return provisoir;
}

Pouvez vous m'aidez a l'optimisé par du assembleur ARM ou avec des changements dans le code.
sachant que la platform est le microcontroleur ARM.
Merci d'avance.

1 réponse

Spoolega Messages postés 65 Date d'inscription dimanche 8 janvier 2006 Statut Membre Dernière intervention 27 février 2011 1
20 janv. 2008 à 15:53
Bonjour,

Je pense que ta boucle for peut être améliorée un peu:
   poidfaible >>= nb;
   poidfaible |= temoin;
a changer en :  poidfaible = (poidfaible >> nb) | temoin;


Il me semble que le code peut être optimisé, après la boucle for par exemple:
provisoir=0;
provisoir=poidfort;
la première instruction (provisoir=0) ne sert à rien, puisque tu affectes une autre valeur juste après.

Ces lignes peuvent être améliorées je pense:
   provisoir=poidfort;
   provisoir<<=32;  
   provisoir+=poidfaible;
   return provisoir;
par :
   provisoir = poidfort;
   return ( (provisoir<<32) + poidfaible );

Ces modifications nous font gagner quelques cycles machines.
 
++
0
Rejoignez-nous