null Le 01/02/2003 à 23:10 Je voulais faire une routine asm pour échanger des variables plus vite qu'en C, malheureusement je ne sais pas trop comment faire. J'ai essayé en faissant comme cela mais ça marche pas:
inline void swap_var(register int var1 asm("d0"),register int var_1 asm("d1"),register int var2 asm("d2"),register int var_2 asm("d3"))
{
asm("exg %d1,%d0
exg %d2,%d3");
}
Il n'y a pas d'erreur à la compilation mais les variables ne sont pas échangées. Peut-être qu'ensuite il faut que les variables chargent les registres mais je ne sais pas comment faire.
Quelqu'un aurait une idée ?
www.wikio.fr/user1921&info=comments
C'est parce que tu passes le contenu de la variable, et non son adresse à la fonction.
De toute façon, c'est très lente de faire une fonction juste pour ça. Tu ferais mieux de faire une macro.
La fonction est inlinée de toute façon.
C'est surtout que le fait de le mettre en fonction sauve les registres, c'est normal qu'au retour de la fonction on ne voit pas que les registres ont été échangés.
Ah oui, j'avais pas fait gaffe au inline.
le coup du truc pr échanger les variables (je sais plus trop, mais c quelque chose du style a^=b^=a^=b ) est pas bien optimisé ?
Non je n'ai pas l'impression.
Par rapport à un exg pas vraiment je pense.
enfin ca depend comment tigcc optimise ca ms bon... un exg sera tjrs plus rapide que trois eor...
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960
*** Ne sous-estimez pas la puissance de la Marmotte ***
©
Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina
BiHi Le 02/02/2003 à 01:55Edité par BiHi le 02/02/2003 à 01:58 Ouais en C j'utiliserais pas les 3 xor pour échanger 2 variables.
Je ferais plutôt:
void echange (int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
Mais là dans la question de Raphaël il y a 4 variables à échanger et il voudrait le faire en ASM. Je pense que tu peux laisser la routine en C, je pense pas que ça sera si lent que ça.

;)
null Le 02/02/2003 à 08:02 Oui en fait je fais bien comme ça en C:
void echange (int *a, int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
...sauf que je ne fais pas de fonction.
www.wikio.fr/user1921&info=comments
On dirati que la solution la plus rapide sans tomber dans l'ASM est celle que propose squale92
#define EXCH(a,b) ((a)^=(b)^=(a)^=(b))
Sinon bien sur avec une variable auxiliaire
#define EXCH(a,b) \
{\
int tmp;\
\
tmp=a;\
a=b;\
b=tmp;\
}
Reste à savoir laquelle est meilleure après l'optimisation du compilateur
En tout cas, une fct avec des pointers c'est hors question, car on rajoute l'overhead des indirections.
Boogerman
Bouger, travailler, manger et se reposer, c'est la devise de la tortue!
null Le 02/02/2003 à 16:33 J'ai essayer la méthode de squale92 mais même avec des test assez poussés je n'ai vu aucune différence avec cet méthode :
#define EXCH(a,b) \
{\
int tmp;\
\
tmp=a;\
a=b;\
b=tmp;\
}
www.wikio.fr/user1921&info=comments
je suppose que ça dépend des options de compilation, ou du compilateur...
a^=b^=a^=b n'est en général pas optimisé du tout par rapport à d'autres méthodes. Mais je crois que GCC est cependant assez fin pour optimiser dans certains cas bien particuliers, notamment:
unsigned long long x,z;
x=(unsigned long long)0x0123456789ABCDEF;
z=(unsigned long long)0xFEDCBA9876543210;
x^=z^=x^=z;
printf_xy(0,0,"%lu",x);
printf_xy(0,10,"%lu",z);
[x et z ne sont utilisées nulle part aillleurs].
bah l'echange avec la variable temporaire serait logiquement plus rapide si un registre est utilise en temps que var temporaire...
ms je c pas si gcc le fait sans qu'on mette register dans la declaration de la var... ca depend aussi surement des options de compilation...
In many respects the Yoshi is like a beautiful woman. A man can come so enamoured that he bestows on her all his time, his energy and his fortune.
- Fred whipple, 1960
*** Ne sous-estimez pas la puissance de la Marmotte ***
©
Marmotte Team : LaMarmotte, sBibi, Vark & Sabrina
null Le 03/02/2003 à 20:26 Ah, bah non finalement en refaisant des tests je constate aucune différence entre toutes les routines... bizarre.
Par contre en utilisant ClearGrayScreen2B();, j'ai gagné 1 Fps (avant j'utilisais memset() ).
www.wikio.fr/user1921&info=comments
null Le 04/02/2003 à 18:43 La routine je l'utilise uniquement pour le remplissage des triangles. Et justement c'est après en faisant un bench qui contenait une boucle où j' exécutais cette routine plus de 10 000 fois par fps, où j'ai vu que finalement aucune routine n'est plus rapide que l'autre... pourtant on ne dirait pas comme ça. Et pour la taille je n'ai pas regardé.
www.wikio.fr/user1921&info=comments
Kevin Kofler Le 06/02/2003 à 20:22Edité par Kevin Kofler le 06/02/2003 à 20:24 C'est le même principe que pour les XOR.
Et je te déconseille de faire ça avec des variables signées, parce qu'en cas de débordement, le standard C ne garantit que ça marche comme prévu que pour les variables non signées. Pour les variables signées, le compilateur peut faire ce qu'il veut.