Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » GFA-Basic TI68K » Bugs et suggestions » Aide optimisation GFA-TEM (22 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
geogeo Ecrit le: Vendredi 11 février 2005 à 21:38 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


GFA TEM est entièrement en ASM68K et je pense déjà avoir optimisé par mal de trucs mais j'ai peur que cela ne suffise pas vu mon niveau. SI vous avez le temps de jeter un coup d'oeil et me dire ce qui serait optimisable ça m'aiderai pas mal. :)

De plus je recherche un algorithme en ASM68K capable d'afficher un sprite X8 clippé. :)

Voici les dernières sources de GFA-TEM (11/02/05).
Sources GFA-TEM (11/02/05)


Merci d'avance. :)
-Edité le Vendredi 11 février 2005 à 21:39 par geogeo-
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°1   Marquer comme non lu.
geogeo Ecrit le: Lundi 14 février 2005 à 21:42 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Y a moyen d'optimiser cette routine?

|=========================================================================
|TokensExec_CopyString
|-------------------------------------------------------------------------
|Copie une chaîne de caractères 16 bits par 16 bits
|-------------------------------------------------------------------------
|input:
|  dc.w %d0 = Nombre d'octets à copier
|  dc.l %a0 = Zone mémoire source
|  dc.l %a1 = Zone mémoire destination
|  
|output: 
|
|destroy: 
|=========================================================================
|Copie sur 32 Bits
_TokensExec_CopyString_write_4_bytes:
    move.l     (%a0)+,(%a1)+
    subq.l     #4,%d0
    jbra       _TokensExec_CopyString_loop
    
|Copie sur 16 Bits
_TokensExec_CopyString_write_2_bytes:
    move.w     (%a0)+,(%a1)+
    subq.l     #2,%d0
    jbra       _TokensExec_CopyString_loop

TokensExec_CopyString:
    andi.l     #0xFFFF,%d0        |Force %d0 à être sur 32 bits    
_TokensExec_CopyString_loop:
    |Caractère NULL, fin de chaîne de caractères
    tst.w      %d0    
    jbeq       _TokensExec_CopyString_write_null
    
    |%a0 sur adresse impaire
    move.l     %a0,%d1
    andi.w     #1,%d1
    jbne       _TokensExec_CopyString_write_1_byte
    
    |%a1 sur adresse impaire
    move.l     %a1,%d1
    andi.w     #1,%d1
    jbne       _TokensExec_CopyString_write_1_byte
    
    |Meilleur copie possible?
    move.w     %d0,%d1
    subi.w     #4,%d1        |Copie sur 32 Bits?
    jbge       _TokensExec_CopyString_write_4_bytes
    move.w     %d0,%d1
    subi.w     #2,%d1
    jbge       _TokensExec_CopyString_write_2_bytes |Copie sur 16 Bits?

    |Copie simple
_TokensExec_CopyString_write_1_byte:    
    move.b     (%a0)+,(%a1)+
    dbf        %d0,_TokensExec_CopyString_loop
_TokensExec_CopyString_write_null:
    clr.b      (%a1)
    rts       


Cette routine est identique à strncpy mais en essayant d'optimiser la copie.
Or je me pose la question suivante, vu la taille de cette routine, serait-il plus rapide de copier octet par octet sans chercher à faire mieux?
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°2   Marquer comme non lu.
Kevin Kofler Ecrit le: Lundi 14 février 2005 à 21:48 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


    andi.l     #0xFFFF,%d0        |Force %d0 à être sur 32 bits

-->
    moveq.l    #0,%d1
    move.w     %d0,%d1

et tu échanges les rôles de %d0 et %d1 dans le reste de la routine.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°3   Marquer comme non lu.
geogeo Ecrit le: Lundi 14 février 2005 à 21:50 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Merci mais tu n'as pas répondu à ma dernière question. Car j'ai bien peur de me casser la tête pour rien!
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°4   Marquer comme non lu.
Kevin Kofler Ecrit le: Lundi 14 février 2005 à 21:55 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Ton algorithme de recopie est mauvais. Une routine bien optimisée ne teste pas la parité de %a0 et %a1 à chaque itération, par exemple (c'est carrément plus lent que de copier octet par octet, ça!), mais:
  • tu testes d'abord si %a0 et %a1 ont la même parité, si ce n'est pas le cas, tu copies octet par octet (ou alors tu optimises ce cas aussi avec une boucle spéciale)
  • si %a0 et %a1 sont tous les deux impairs, tu copies un octet, et les 2 sont pairs
  • tu peux ensuite copier word par word
Sinon, à mon avis, tu devrais utiliser le ROM_CALL memcpy qui est bien optimisé pour ces cas.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°5   Marquer comme non lu.
geogeo Ecrit le: Mardi 15 février 2005 à 12:05 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


memcpy est bien optimisée? Dans ce cas je ne vais pas me géner. :D
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°6   Marquer comme non lu.
Folco Ecrit le: Mardi 15 février 2005 à 13:11 Déconnecté(e)    Voir le profil de Folco Envoyer un email à Folco Envoyer un message privé à Folco  


Hum, avec Kevin, on ne sait pas s'il a parlé de place ou de vitesse :D
<<< Kernel Extremist©®™ >>>
Pas la peine d'aller là plus d'une fois tous les six mois...

"Il faut apprendre pour savoir qu'il faut apprendre pour savoir."
    
./Post n°7   Marquer comme non lu.
Kevin Kofler Ecrit le: Mardi 15 février 2005 à 15:35 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


memcpy est optimisée en vitesse. C'est nettement plus rapide que le code de geogeo (qui exécute plein d'instructions par itération) et aussi plus rapide (de manière significative) qu'une simple recopie octet par octet. (Tout ceci est valable pour le memcpy de AMS. PedroM copie bêtement octet par octet.)

Le fait que l'appel à memcpy prend beaucoup moins de place que le code de geogeo est un "plus", évidemment.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°8   Marquer comme non lu.
geogeo Ecrit le: Mardi 15 février 2005 à 16:02 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Bon j'ai redéveloppé une autre routine de copie de chaîne de caractère et elle un peu plus rapide que memcpy mais je pense qu'on peut encore l'optimiser!

Voilà les comparaisons faites entre memcpy et ma routine sur GFA-Basic:
Avec chaîne de 56 caractères sur adresses paires:
memcpy = 1371
routine GFA = 1466

Avec chaîne de 55 caractères sur adresses impaires:
memcpy = 1340
routine GFA = 1369


_TokensExec_CopyString_same_parity_address:
    tst.w      %d1          |Si paire?
    jbeq       _TokensExec_CopyString_fast_copy  |Copie directe    
    move.b     (%a0)+,(%a1)+      |Aligne données
    subq.l     #1,%d0
_TokensExec_CopyString_fast_copy:
    moveq.l    #0,%d1        |Efface %d1
    move.w     %d0,%d1        |%d0 dans %d1
    lsr.w      #2,%d1        |Divise %d1 par 4
    jbeq       _TokensExec_CopyString_no_fast_copy  |Copie simple si égale à 0
    subq.l     #1,%d1
_TokensExec_CopyString_fast_copy_loop:
    move.l     (%a0)+,(%a1)+
    subq.l     #4,%d0
    dbf        %d1,_TokensExec_CopyString_fast_copy_loop
    dbf        %d0,_TokensExec_CopyString_simple_copy
    clr.b      (%a1)
    rts      
    
TokensExec_CopyString:
    andi.l     #0xFFFF,%d0        |Force %d0 à être sur 32 bits
    jbeq       _TokensExec_CopyString_write_null  |Si taille 0   
    move.l     %a0,%d1        |%a0 dans %d1
    move.l     %a1,%d2        |%a1 dans %d2
    andi.w     #1,%d1        |Parité
    andi.w     #1,%d2        |Parité
    cmp.w      %d1,%d2        |Si égalitée
    jbeq       _TokensExec_CopyString_same_parity_address  |Détermine la parité    
_TokensExec_CopyString_no_fast_copy:    
    subq.l     #1,%d0
_TokensExec_CopyString_simple_copy:
    move.b     (%a0)+,(%a1)+
    dbf        %d0,_TokensExec_CopyString_simple_copy
_TokensExec_CopyString_write_null:    
    clr.b      (%a1)
    rts
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°9   Marquer comme non lu.
Kevin Kofler Ecrit le: Mardi 15 février 2005 à 16:22 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Il y a toujours cette horreur: andi.l #0xFFFF,%d0. #roll# Cf. post n°2...
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°10   Marquer comme non lu.
geogeo Ecrit le: Mardi 15 février 2005 à 19:52 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Ok j'ai corrigé ça mais y a pas de meilleurs optimisations???
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°11   Marquer comme non lu.
geogeo Ecrit le: Samedi 19 février 2005 à 21:20 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Voici les dernières sources de GFA-TEM (19/02/05).
Sources GFA-TEM (19/02/05)


Franchement plus GFA-TEM sera optimisé plus l'interpréteur sera rapide!
Je pense que les sources peuvent interesser certaines personnes en recherche de fonctions rapides en ASM comme la gestion des fichiers (recherche de fichiers, ouverture, récupération de pointeur...) ou encore les fonctions d'affichages (SpriteX8Clippé) et même une fonction haut niveau du clavier _kb_getkey avec Func_InputStr pour entrer du texte.

J'ai aussi réflechie et les allocations que l'on voit dans main.asm faites avec malloc seront je pense dans la pile SP.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°12   Marquer comme non lu.
Nyall Ecrit le: Jeudi 24 février 2005 à 05:20 Déconnecté(e)    Voir le profil de Nyall Envoyer un email à Nyall Visiter le site WEB de Nyall Envoyer un message privé à Nyall  

|=========================================================================
|Func_GetnBits
|-------------------------------------------------------------------------
|Renvoie le nombres de bits d'un nombre
|-------------------------------------------------------------------------
|input:
| dc.l %d0 = Nombre
|
|output:
| dc.l %d0 = Nombre de bits
|
|destroy:
|=========================================================================
_Func_GetnBits_return:
addq.w #1,%d1 |a word addition is faster
move.l %d1,%d0
rts

Func_GetnBits:
moveq.l #31,%d1 |use a moveq to load
_Func_GetnBits_loop:
add.l %d0,%d0
dbcs %d1,_Func_GetnBits_loop |decrements and branches until carry is set or counter gives out
jbcs.s _Func_GetnBits_return |jump if a bit was found to be set
moveq.l #1,%d0
rts

-Edité le Jeudi 24 février 2005 à 05:23 par nyall-
-Edité le Jeudi 24 février 2005 à 05:27 par nyall-
I am the one and only Cheerio
    
./Post n°13   Marquer comme non lu.
Nyall Ecrit le: Jeudi 24 février 2005 à 05:21 Déconnecté(e)    Voir le profil de Nyall Envoyer un email à Nyall Visiter le site WEB de Nyall Envoyer un message privé à Nyall  

Any quick english tutorials on how to post nicely formatted code ?
I am the one and only Cheerio
    
./Post n°14   Marquer comme non lu.
Nyall Ecrit le: Jeudi 24 février 2005 à 05:37 Déconnecté(e)    Voir le profil de Nyall Envoyer un email à Nyall Visiter le site WEB de Nyall Envoyer un message privé à Nyall  

|=========================================================================
|FILE_GenerateTIOSName
|-------------------------------------------------------------------------
|Créer un nom de fichier au format du TIOS
|-------------------------------------------------------------------------
|input:
| dc.l a0 = File name.
| dc.l a2 = Empty buffer.
|output:
| dc.l a2 = Buffer with the TIOS name format.
|
|destroy: d0
|=========================================================================
FILE_GenerateTIOSName:
clr.b (%a2)+ |buffer [0] = 0
_FILE_GenerateTIOSName_loop
move.b (%a0)+,(%a2)+
jbne _FILE_GenerateTIOSName_loop
subq.l #1,%a2
rts
I am the one and only Cheerio
    
./Post n°15   Marquer comme non lu.
Nyall Ecrit le: Jeudi 24 février 2005 à 05:41 Déconnecté(e)    Voir le profil de Nyall Envoyer un email à Nyall Visiter le site WEB de Nyall Envoyer un message privé à Nyall  

In 'FILE_GetSymByName'

movea.l #0,%a0 -> sub.l %a0,%a0
I am the one and only Cheerio
    
./Post n°16   Marquer comme non lu.
Dari Ecrit le: Jeudi 24 février 2005 à 11:20 Déconnecté(e)    Voir le profil de Dari Envoyer un email à Dari Visiter le site WEB de Dari Envoyer un message privé à Dari  

Use the [ code ] and [ /code ] (without blanks) tags. (the # in the buttons at the top of the message)
"iPod, therefore, I am."

http://media.laquadrature.net/Quadrature_black-out_HADOPI_468x60px.gif

    
./Post n°17   Marquer comme non lu.
geogeo Ecrit le: Jeudi 24 février 2005 à 13:07 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


Thank you Nyall. :)
You must use the tag [code] [/code] for show correctly your code. :)
More optimisations are there, more good is.
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°18   Marquer comme non lu.
Nyall Ecrit le: Vendredi 25 février 2005 à 00:17 Déconnecté(e)    Voir le profil de Nyall Envoyer un email à Nyall Visiter le site WEB de Nyall Envoyer un message privé à Nyall  


|=========================================================================
|TEM_Initialize_Variables
|-------------------------------------------------------------------------
|Met à zéro toutes les variables
|-------------------------------------------------------------------------
|input:
|
|output:
|
|destroy: d0, a0
|=========================================================================
TEM_Initialize_Variables:
    move.w    #(End_Variables-Start_Variables)/2-1,%d0 |don't need to load a long, just a word because dbra only works on words
                lea.l    Start_Variables(%PC),%a0
_Initialize_Variables_loop_erase:
    clr.w    (%a0)+
    dbf    %d0,_Initialize_Variables_loop_erase
    rts




-Edité le Vendredi 25 février 2005 à 00:21 par nyall-
-Edité le Vendredi 25 février 2005 à 00:22 par nyall-
I am the one and only Cheerio
    
./Post n°19   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 25 février 2005 à 22:08 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Note that you (at least currently) can't divide an address difference by 2 (nor by 4 or by anything else) if you compile with linker optimization enabled. (I guess I'll add half and quarter relocs at some point to address this.)
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
  :: Index » GFA-Basic TI68K » Bugs et suggestions » Aide optimisation GFA-TEM (22 réponse(s))
Pages : 1/2     « [1] 2 » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 49.8ms avec 18 requetes