Orion_ :
ah ça je dit pas![]()
mais disont que le C c'est pour les flemard ^^ (et parfois je le suis un peu)
Ou les gars qui ont la meme signature que moi

GT

unsigned int gcd(unsigned int u,unsigned int v) { if (u%2>v%2 || u%2==v%2 && u>v) swap(u,v); if (!u) return v; else if (v%2==0) return gcd(u/2,v/2)*2; else if (u%2==0) return gcd(u/2,v); else return gcd(v-u,v); }
Pollux :
GT Turbo>
oui oui mais kochise savait pas que c'était du 68000 à ce moment-là, j'allais pas lui reprocher ça![]()
enfin sinon c'est pas passionnant le calcul de la factorielle parce que ça overflowe super vite, pourquoi ne pas prendre un truc un peu plus intéressant du style :unsigned int gcd(unsigned int u,unsigned int v) { if (u%2>v%2 || u%2==v%2 && u>v) swap(u,v); if (!u) return v; else if (v%2==0) return gcd(u/2,v/2)*2; else if (u%2==0) return gcd(u/2,v); else return gcd(v-u,v); }
(avec par exemple des entiers 16 bits, c'est suffisant)
Pollux
:SebRmv :
c'est quoi swap ?
échanger u et v ^^
Pollux :
#define swap(u,v) { unsigned int temp = u; u = v; v = temp; }
#points_sur_les_i#![]()
unsigned int gcd(unsigned int u,unsigned int v) { if (u%2>v%2 || u%2==v%2 && u>v) swap(u,v); if (!u) return v; else if (v%2==0) return gcd(u/2,v/2)*2; else if (u%2==0) return gcd(u/2,v); else return gcd(v-u,u); })
Pollux :
algorithme d'euclide binaire pour calculer le pgcd ^^
(et euh je me suis planté pour la dernière ligne, c'est gcd(v-u,u), pas gcd(v-u,v) :unsigned int gcd(unsigned int u,unsigned int v) { if (u%2>v%2 || u%2==v%2 && u>v) swap(u,v); if (!u) return v; else if (v%2==0) return gcd(u/2,v/2)*2; else if (u%2==0) return gcd(u/2,v); else return gcd(v-u,u); })
Pollux
:Orion_ :![]()
Bah oui, forcément :
lea p(PC),A0 move.l (4,SP),D0 move.l (0,A0,D0.w*4),D0 RTS p: dc.l 1,1,2,6,24,120,720,5040,40320,362880,3628800,39916800,479001600
Euh, tu fais le malin mais c'est encore loin d'être optimal -- tu pourrais utiliser un adressage pc-relatif, et ne charger que 16 bits dans d0![]()
Pollux :
KochiseMais n'importe quoi, quel est le rapport avec C99 ? Et j'aurais plutôt tendance à penser que pour les "vieilles" plateformes style 68k qui sont plus trop maintenues, un compilo comme Gcc ne s'améliore pas avec le temps, bien au contraire, il "pourrit" :/
:SebRmv :
[...]en fait, j'ai été plutôt étonné par le code produit par gcc[...]
Positivement ou négativement ? Depuis 1998 et la nouvelle norme ISO, les compilos sont dotés d'un nouveau cerveau et pondent en général un code proche d'un assemblage alamanoGcc est pas trop mal foutu dans le domaine !
SebRmv :
ouais, t'as pas pris la version la plus sympa pour gcc
j'imagine qu'en ASM on écrit une jolie version optimisée très facilement alors que gcc ne fera pas les optim
Kochise :
dc.L <- un L comme L donc on charge un LONG dans D0
Godzil :
Je suis entienrement d'accord avec toi, mais il doit y avoir une cible 68k qui doit tjrs être plus ou moins activement maintenue dans GCC, c'est celle poru les Coldfire, qui sont apres tout des 680x0... Il me semble pas que ce µC soit trop en perte de vitesse...
Pollux
:SebRmv :
ouais, t'as pas pris la version la plus sympa pour gcc
j'imagine qu'en ASM on écrit une jolie version optimisée très facilement alors que gcc ne fera pas les optim
rien compris, de quelle optim tu parles ?
SebRmv
: l'intuition... à coup de décalage et de bit C du CCR, on doit pouvoir faire une belle version en ASM et ça m'étonnerait beaucoup que gcc approche de cette version
Kochise :
Ouais mais c'est un peu normal, bien que la cible 68k (aka 68332) est très utilisée dans le milieu industriel, c'est pas GCC qu'ils utilisent mais plutôt GreenHill et consorts. Et ces compilos industriels, je peut vous dire qu'ils sont au poil coté optimisation (genre orienté "3 ko dans le GPU et 16 ko dans le DSP") ! Mais comme dit, du à la désuétude de la plateforme 68k dans les ordinateurs de bureau (le Mac l'ayant abandonné depuis longtemps, seul CodeWarrior s'y interresse encore), c'est un peu normal qu'on se traine une vieille 2.95 pour 68k depuis des lustres![]()
Orion_ :
pourquoi faut il que ça parte toujours en troll des que certaine personne debarque :/
Kochise :
GreenHill
Kochise :
une vieille 2.95 pour 68k
SebRmv :Oui, les voici
alors, vos impressions?
voyons voir maintenant ce que donne l'option -O2Là je commente :
_fact: movel d2,sp@- movel sp@(8),d2 ; oui, on pourrait s'autoriser à faire "move.w 10(sp),d2" moveq #1,d0 tstl d2 ; dommage, le test était gratuit si on ramenait le move.l ici! jeq L1 ; bien vu! le plus souvent, ce test sera négatif. movel d2,a0 pea a0@(-1) ; ok, mais ça c'est "pea -1(a0)" ou "pea -(a0)" ? jbsr _fact mulsl d2,d0 ; ok, mais on pouvait pas faire du récursif terminal?? ;-) addql #4,sp .even L1: movel sp@+,d2 rtsMaintenant que j'y réfléchis, "pea -(a0)" ça n'existe peut-être pas. En tout cas, ça rajoute un mot (le -1) à l'instruction, qui pourrait nous servir à caser un "subq.l #1,dx". On s'extasie à juste titre de l'astuce, mais chrono en main, y gagne-t-on vraiment?
en fait, c'est là que j'ai été un peu surpris par l'utilisation de pea pour calculer (n-1) et en même temps empiler le paramètreOui, tiens j'en reparlerai dans mon article à venir sur des optims 68k.
(je n'aurais jamais pensé à ça en fait !)
je suis content d'avoir appris cette optim en tout cas![]()
enfin, voici ce que donne gcc quand on donne comme processeur m68000 au lieu de m680x0 (par défaut), avec -fomit-frame-pointer et -O2Pas mal du tout!
_fact: movel a2,sp@- movel sp@(8),a2 moveq #1,d0 cmpw #0,a2 ; sublime, le cmp.w !! jeq L1 pea a2@(-1) jbsr _fact movel d0,sp@- movel a2,sp@- jbsr ___mulsi3 lea sp@(12),sp ; pas mal d'avoir regroupé les 2 corrections de pile! .even L1: movel sp@+,a2 rts
on remarque que là ce n'est plus mulsl qui est utilisé mais une fonction auxiliaire qui émule cette multiplication longue (modulo 2^32)Oui elles sont malines ces fonctions, c'est marrant à déssassembler
stabylo :
Bref, pour conclure c'est génial de pouvoir code la Jaguar en C, c'est quand même bien ça l'essentiel!!![]()
GT Turbo :En fait, il me semble que c'est plus malin qu'il n'y paraît. Certes il n'est pas possible de faire un "tst.l a2", c'est un "cmp" qui est utilisé. ok. Mais il aurait pu faire "cmp.L", mais non, il fait un "cmp.W" car l'extention du #0 de 16 à 32 bits permet de gagner 2 octets dans le code produit. C'est ça que je trouve joli (et sans ironie!).
Du bon code de compilo rien de tel pour rigoler un coup
![]()