Quand vous écrivez ça : Edité par Martial Demolins le 07-03-2008 à 12:28:38.movem.l %a2-%a3/%d3-%d5,-(%sp) [...] move.w #mode,-(%sp) |sp - 2 pea.l String(%pc) |sp - 6 move.w y(%pc),-(%sp) |sp - 8 move.w x(%pc),-(%sp) |sp - 10 RC DrawStr lea.l 10(%sp),%sp [...] movem.l (%sp)+,%a2-%a3/%d3-%d5 rts Vous faites un lea pour restaurer la pile (4 octets, puis ça bouffe des cycles parce que c'est long à décoder cette cochonnerie). Je vous propose ça : movem.l %a2-%a3/%d0/%d3-%d5,-(%sp) |rajoutez un petit d0, ou d1 ou autre, mais en-dessous de ce que voulez garder [...] move.w #mode,(%sp) |écrasez-le sans pitié, puis à mon avis ç gagne des cycles de pas post-décrémenter la pile pea.l String(%pc) |sp - 4 move.w y(%pc),-(%sp) |sp - 6 move.w x(%pc),-(%sp) |sp - 8 RC DrawStr addq.l #8,%sp |et voilà ! deux octets et encore des cycles grapillés ! [...] movem.l (%sp)+,%a2-%a3/%d1/%d3-%d5 |vous pouvez même en trasher un autre si le coeur vous en dit rts Et voilà ! Formidable, n'est-il pas ? Je suis sûr que cette technique (prononcer : "teuchnaïk") vous sera profitable à tous ! (j'ai bien dit : "à tous !". Enjoy et bonne journée. Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
heu honnêtement, gagner 2 ou 4 pauvres cycles quand on utilise des romcall c'est comment dire ... useless ? (sans parler du movem ...) |
je sais, au niveau cycle, c'est nul C'était surtout pour les deux octets du lea->addq. Ca, j'y tiens. Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
Le GCC de TIGCC est capable (enfin, à une époque, il l'a été, je n'ai pas vérifié récemment) de réutiliser (sp) au lieu d'utiliser -(sp), à partir du deuxième appel à une fonction stkparm (si assez de données ont été empilées lors du premier appel, naturellement) addq.l #8,%sp |et voilà ! deux octets et encore des cycles grapillés ! Deux octets gaspillés par rapport à lea 8(sp), sp - mais aucun cycle. Membre de la TI-Chess Team. Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP. |
tiens, marrant, lire un entier sur deux octets en plus ne prend pas de temps ? Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
non, c'est plus lent de lire un char ou un long sur un 68000 que de lire un short car le bus de donnée est... sur 16bits |
Oui et non Godzil, lire un long est plus long, mais lire un octet ou deux, c'est pareil. Et il y a aussi le fait que le bus de donné est pas utilisé pour un addq.l #imm,%an, vu que le '8' est codé directement dans le corps des deux octets de l'instruction, alors que pour lea, l'offset est écrit en dur dans les octets 2 et 3 de l'instruction. Ca montre juste qu'il met du temps à décoder un addq (8 cycles pour l'instruction complète). Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
Pour l'octet c'est non dans un cas, si l'octet est a une valeur impaire, tu as un décalage a faire (enfin pas toi, le cpu) |
Tu es sûr de toi ? Il ne parle pas du fait qu'un octet soit rendu à une adresse paire ou impaire dans le 68kPM... Par contre, si tu veux lire un word à une adresse imparaire, oui, ça va te prendre du temps. Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
oui je suis sur, meme que sur certain révision du 68000 lire un octet sur une @ impaire est impossible directement faudrait que j'aille chercher ma doc sur le 68000 mais si tu regarde le bus A du 68000 il n'y a pas de A0 (bon il est possible de "l'émuler" via d'autre signaux, mais bon) |
Un accès .b prend le même temps que l'adresse soit paire ou impaire. |
C'est que le 68k qu'on a en est capable |
pourquoi ce serait différent sur d'autres versions du 68k? a mon avis le shifter doit être en hard sur le bus quand on doit lire un byte sur d8-d15 avec /UDS, nan? Nspire wiki CONDUCTEUR Va-et-vient Des QUATRE MANCHE AVEC DES DIODES |
Euh... connu tout ça, et j'appele pas ça de l'"extrême optimising", mais de l'optimisation de base Mais merci pour le lien. Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
squalyl (./12) : parce qu'entre les premiers sortit et les derniers sortit le coeur a evolué meme en restant compatible. Je prendrais comme exemple le 6502 qui entre les premieres et dernieres version (le 65C02, la version CMOS) il y a de legere différence au niveau du nombre de cycles, mais surtout des instructions en plus, pourtant ce sont des 6502 tout ça pour dire que quelque a moins que le 68000 a chercher directement a une adresse impaire la valeur, il faut, pour un octet, forcement un shift, alors que quand l'octet est a une adresse pair, le shift n'est pas utile, donc ça rajoute forcement du temps de calcul, meme si c'est juste un simple cycle en plus |
D'après les timings des tables du 68000 User's Manual de Motorola, ça n'a pas l'air de faire de différence entre byte et word ? La seule particularité du 68000 (qui ne se traduit peut-être pas sur les processeurs suivants de la famille, je ne sais pas) avec la gestion des bytes/words que je connaisse, est le shift rapide à gauche de 8 rangs: move.b <ea>, -(sp) à la place de move.b <ea>, dn (même taille, plus lent). La routine de décompression ttunpack fait grand usage de cette optimisation. Membre de la TI-Chess Team. Co-mainteneur de GCC4TI (documentation en ligne de GCC4TI), TIEmu et TILP. |
Godzil => tu nous fais un bench pour voir ? Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
./0: Connu. J'ai du l'utiliser quelque part çà (dans PedroM ou genlib) |
GCC le fait GTC je ne sais pas. Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com Quelques idées personnelles ici. |
PpHd (./18) : Oui mais à toi, je ne prétends rien apprendre Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
Godzil (./9) :Je veux bien te croire, mais ça paraît quand même énorme. Ça casserait la compatibilité avec énormément de code, et c'est franchement pénible de ne pas avoir d'accès byte, en particulier pour les écritures (qui ne sont plus atomiques, du coup). Godzil (./15) :Euh, je suis de l'avis de squalyl, y'a de fortes chances que ce soit implémenté sous la forme d'un multiplexeur et pas d'un shift, et dans ce cas le temps de traitement c'est pas de l'ordre du cycle, mais du temps de propagation dans les éléments logiques « Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau |
9 ns pour la logique TTL si mes souvenirs sont bons. Pour le MOS, c'est combien ? Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com Quelques idées personnelles ici. |
Ça dépend du process de fabrication « Tout homme porte sur l'épaule gauche un singe et, sur l'épaule droite, un perroquet. » — Jean Cocteau |
Zerosquare (./21) :Je veux bien te croire, mais ça paraît quand même énorme. Ça casserait la compatibilité avec énormément de code, et c'est franchement pénible de ne pas avoir d'accès byte, en particulier pour les écritures (qui ne sont plus atomiques, du coup). quand tu n'a pas de ligne 0 sur le bus d'addresse il faut bien faire avec ! Faudrait que je retrouve mes infos la dessus, mais je me souviens d'une carte 68000 ou accéder en 8bit était plus que déconseillé... |
Il me semble que, dans la doc présentée par martial sur le forum assembleur, on parle de deus lignes appelées UDS et LDS, qui permettent de lire soit la mémoire impaire, soit la mémoire paire, ou les deux... Si j'ai bien compris, le processeur 68000 peut donc lire sur un octet impair, un octet pair, ou les deux à la fois... Je me souviens Ad mari usque ad mare GENERATION 23: The first time you see this, copy it into your sig on any forum and add 1 to the generation. Social experiment. |
oui mais utiliser UDS/LDS pour cabler la mémoire n'est pas indispensable (et oui) |
Mais arrêtez de vous battre, apparemment c'est pas toujours possible, mais sur TI on peut, ça va pas chercher plus loin hein Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
Amélioration, toujours du jour : FunctionSection DrawWindowsFrame movem.l %a2/%d0/%d3-%d6,-(%sp) |d0 will be trashed RC ScreenClear [...] move.w #A_NORMAL,(%sp) |mode move.w (%a2),-(%sp) |y1 move.w SCR_WIDTH(%fp),-(%sp) |x1 move.w (%a2)+,-(%sp) |y0 clr.w -(%sp) |x0 RC DrawLine addq.l #8,%sp [...] DrawWindowsFrameEnd: movem.l (%sp)+,%a2/%d0/%d3-%d6 rts Version optimisée : FunctionSection DrawWindowsFrame movem.l %a2/%d0/%d3-%d6,-(%sp) |d0 will be trashed RC ScreenClear [...] move.w #A_NORMAL,(%sp) |mode move.w (%a2),-(%sp) |y1 move.w SCR_WIDTH(%fp),-(%sp) |x1 move.w (%a2)+,-(%sp) |y0 clr.w -(%sp) |x0 RC DrawLine |addq.l #8,%sp |don't pop args /!\see DrawWindowsFrameEnd [...] DrawWindowsFrameEnd: movem.l (%sp)+,%a2/%d0-%d6 |added d1-d2 to pop status line drawing arguments rts Le modernisme ne diffère guère de la libre pensée absolue que par sa prétention de demeurer catholique. |
Et quand tu changes ton code, tu ne comprendras pas pourquoi tu as un Address Error ou une Illegal Instruction... |