Voilà mon problème : je fais un calcul du style a*b/c mais je ne suis pas satisfait du code assembleur produit. J'aimerais que TIGCC utilise muls puis divs, mais rien à faire, j'ai essayer de transtyper de beaucoup de façons différentes, à chaque fois TIGCC utilise __divsi3 ou bien ne fait une division que de 16 bits / 16 bits alors que moi j'ai besoin de 32 bits / 16 bits.
Je me suis donc mis en tête d'écrire une macro qui écrive le code correct.
(c)); \ resultat;})
J'ai donc essayé ça :#define ProduitCroix(a,b,c) \ ({ unsigned long resultat; \ asm("muls.w %2,%1; divs.w %3,%1" \ : "=d"(resultat) \ : "d" (a), "d"(b), "d"Mais sauf que parfois d0 est utilisé pour resultat mais a correspond à un autre registre, ce qui crée des erreurs lors de la suite du programme, donc j'ai corrigé en mettant ça :
#define ProduitCroix(a,b,c) \ ({ unsigned long resultat; \ asm("muls.w %2,%1; divs.w %3,%1; move.w %1,%0" \ : "=d"(resultat) \ : "d" (a), "d"(b), "d"(c)); \ resultat;})Mais le problème c'est que quand d0 est utilisé pour resultat et qu'il est aussi utilisé à la base pour a ça me sort un move.w %d0,%d0

et puis j'ai l'impression aussi que ça plante parfois, mais je ne suis pas sûr que ce soit à cause de ma macro (même si je la soupçonne très fortement, parce qu'avant ça ne plantait presque pas).
Merci.