Jump to content
Jagware
Sign in to follow this  
GT Turbo

Division signé dans les procs (Dsp, Gpu)

Recommended Posts

GT Turbo    5

La division executé par les deux artistes (Gpu et Dsp) n'est pas signé, en clair pas de chiffre négatif sinon cela va mal se finir, j'ai passé un petit moment a chercher le moyen le plus court de remettre le bon signe en fin d'opération et propose cela :

 

 

 

 

 

movei #$80000000,r21 ; le registre r21 a juste le bit de signe mis

 

moveq #0,r20

 

abs r0 ; Valeur absolue du registre r0

 

jr PL,Positif_0 ; le registre était positif si oui va a Positif_0

 

nop ; instruction bidon obligatoire

 

move r21,r20 ; sinon r20=$80000000

 

Positif_0:

 

 

 

abs r1 ; Valeur absolue du registre r1

 

jr PL,Positif_1 ; registre positif avant ? Si oui va en positif_1

 

nop ; pareil qu'avant

 

add r21,r20 ; sinon add $80000000

 

Positif_1:

 

 

 

divu r0,r1 ; pratique notre division

 

or r2,r1 ; rajoute le signe

 

 

 

 

 

Explication :

 

 

 

Les procs faisant tout en 32 bit, le bit de signe est le 31 (Dernier car on a un bit 0), celui est placé si bien sur la valeur est négative. J'utilises la valeur $80000000, celle ci place juste le bit de signe sur 1 donc négatif.

 

 

 

J'initialises un registre a 0, si le premier chiffre est négatif, ce registre passe a $80000000, ce qui nous fait un registre négatif. Si le second chiffre est aussi négatif on lui additionne $80000000 de nouveau, pourquoi c'est simple. Si on additionne $80000000 cela donne 0. Donc on se retrouve avec la règle des signes.

 

 

 

- + = -

 

- - = -

 

+ + = +

 

 

 

Ce qui fait que dans ce registre on a juste le bon signe, qu'on replace après la division par un or.

 

Si quelqu'un a mieux ou plus court je suis preneur.

 

 

 

GT Divisé :wacko:

Share this post


Link to post
Share on other sites
Azrael    0

PAs de division signee ???? j'hallucine :blink: !

 

 

 

Ca a l'air correct :)

 

 

 

Ce qui casse toute la vitesse c'est les tests :( pour l'instant je ne vois pas le moyen de les virer... a moins que...

Share this post


Link to post
Share on other sites
GT Turbo    5

Azrael a trouvé mieux :

 

 

 

 

movei #$80000000,r20

 

 

 

move r1,r3

 

and r20,r3 ; on récup juste le bit de signe de r1 dans r3

 

 

 

move r2,r4

 

and r20,r4 ; on récup juste le bit de signe de r2 dans r4

 

 

 

abs r1 ; Absolution de r1 !!

 

abs r2 ; Absolution de r2 !!

 

 

 

div r1,r2 ; on divise r2 par r1

 

 

 

add r3,r4 ; on fait ta magouille sur les signes

 

or r4,r2 ; on rajoute le signe...

 

 

 

 

le dernier or peut etre remplacé par un add r4,r2 cela fait pareil

 

 

 

GT Battu par Azrael qui osera se mesurer a lui ! ;)

 

 

 

P.S. : Le genre de code que j'aime !! :yes:

Share this post


Link to post
Share on other sites
Azrael    0

encore plus court, mais peut etre pas plus rapide :

 

 

movei #$80000000,r20

 

 

 

move r1,r3

 

mul r2,r3 ; on fait une petite mul pour recuperer signe de r1*r2

 

and r20,r3 ; on récup juste le bit de signe de r3 dans r3

 

 

 

abs r1 ; Absolution de r1 !!

 

abs r2 ; Absolution de r2 !!

 

 

 

div r1,r2 ; on divise r2 par r1

 

 

 

or r3,r2 ; on rajoute le signe...

 

Share this post


Link to post
Share on other sites
GT Turbo    5

Et m.... il va falloir compter les cycles !! :wacko:

 

 

 

C'est possible que ta dernière solution soit encore plus rapide, SCPCD t'en penses quoi? Pour moi c'est la plus rapide !!

 

 

 

GT Parti pour divisé :wacko:

Share this post


Link to post
Share on other sites
Azrael    0

enfin bon, faire une multiplication pour une division... c'est quand meme un comble !!! il n'y a vraiment pas de division signee ???? c'est une puce prehistorique, c'est pas possible !!!

 

 

 

Il n'y a pas une histoire de cache et d'instruction qu'il faut entrelacer pour que ca aille plus vite ?

Share this post


Link to post
Share on other sites
GT Turbo    5
Azrael :


enfin bon, faire une multiplication pour une division... c'est quand meme un comble !!! il n'y a vraiment pas de division signee ???? c'est une puce prehistorique, c'est pas possible !!!





En creant ces puces, ils avaient pas d'envie de ce faire c...



Azrael :


Il n'y a pas une histoire de cache et d'instruction qu'il faut entrelacer pour que ca aille plus vite ?





J'étais en train d'y penser, le but du jeu, c'est qu'aucune instruction n'utilise un résultat calculé précédemment (Règle générale), ca pourrait donner cela :



<

Share this post


Link to post
Share on other sites
Azrael    0

Enfin le plus pratique c'est quand meme d'ecrire une macro qui fait ca, tant pit pour les cycles perdus, a moins d'etre dans une boucle assez courte auquel cas la macro est remplacee par ce code.

Share this post


Link to post
Share on other sites
GT Turbo    5
Azrael :


Enfin le plus pratique c'est quand meme d'ecrire une macro qui fait ca





Pour la division ? Pour ces quelques lignes, je fais un couper coller. Et faut optimiser, car penses a la routine 3D (2 div signé par point) quand il y aura 1000 points a calculer, ce genre d'optim peut faire gagner un gros paquet de cycles.



Le plus important c'est que maintenant on a une petite routine qui va bien après c'est a ces clowns de codeur d'optimiser !! (C'est moi qui est dit cela :blink:)





GT En train d'optimisé ;)

Share this post


Link to post
Share on other sites
GT Turbo    5
Azrael :


Au fait, le dernier bit (celui de signe) est toujours mis a zero dans le resultat de la division ?





Non, tout est considéré comme positif donc traité comme.



GT ;)

Share this post


Link to post
Share on other sites
SCPCD    0

Je pense que la derniere est la plus rapide pour la division mais c'est IMULT et non MULT pour les multiplications signés. (:D)

Share this post


Link to post
Share on other sites
Azrael    0

ok, merci de le préciser :) quelle equipe !!

 

 

 

mais je n'ai pas les instructions gpu/dsp sous la main, d'ailleurs je ne sais pas comment fonctionne la puce (nombre de registres de données et d'adresse, instructions possibles avec des constantes...)

 

 

 

un "idiv" ca serait le pied !

Share this post


Link to post
Share on other sites
GT Turbo    5
mais je n'ai pas les instructions gpu/dsp sous la main, d'ailleurs je ne sais pas comment fonctionne la puce (nombre de registres de données et d'adresse, instructions possibles avec des constantes...)

 

 

 

Je me fais c.. a recopier et traduire la doc Atari :

 

 

 

Tout sur le Gpu / Dsp

 

 

 

A lalala !!

 

 

 

GT Un copieur !! ;)

Share this post


Link to post
Share on other sites
GT Turbo    5
Azrael :


un "idiv" ca serait le pied !





Non c'est un 'divs'



GT En train de corriger ce chenapan !! :P

Share this post


Link to post
Share on other sites
Azrael    0

Je veux pas trop jouer mon chieur, mais d'après ta propre traduction IMULT est une multiplication signee alors que MULT n'est pas signee, donc le pied serait quand meme d'avoir un IDIV et pas un DIVS.

 

 

 

Ceci dit on a un petit probleme avec la routine precedente. La multiplication prend des registres de 16 bits alors que la division en prend de 32 bit. Bref, quand on evalue le bit de signe c'est avec des registres de 16 bits. Il faudrait faire un decalage de chaque registre a multiplier pour avoir le bit de signe au bon endroit... ou bien le bit de signe est toujours en position 32 meme pour des entiers codes sur 16 bits ? Si la reponse a derniere question est vrai, alors la routine doit marcher... En fait je crois que ca marche, sinon c'est un enfer a coder... J'ai rien dit, vous pouvez aller mater la tele tranquille... moi je retourne me coucher.

Share this post


Link to post
Share on other sites
SCPCD    0

Il y a un mode pour les divisions pour faire des divisions 16bits.

 

il faut mettre a 1 le bit du registre $F1A11C. (DIVCTRL)

Share this post


Link to post
Share on other sites
GT Turbo    5
Azrael :


Ceci dit on a un petit probleme avec la routine precedente. La multiplication prend des registres de 16 bits alors que la division en prend de 32 bit. Bref, quand on evalue le bit de signe c'est avec des registres de 16 bits. Il faudrait faire un decalage de chaque registre a multiplier pour avoir le bit de signe au bon endroit... ou bien le bit de signe est toujours en position 32 meme pour des entiers codes sur 16 bits ? Si la reponse a derniere question est vrai, alors la routine doit marcher... En fait je crois que ca marche, sinon c'est un enfer a coder... J'ai rien dit, vous pouvez aller mater la tele tranquille... moi je retourne me coucher.





Bien noté, tu as raison et SCPCD derrière toi aussi, on peut faire des div sur 16 bits.



Pour l'instant je vais y reflechir, je peux enfin allumer mon Falcon et ma Jag.



GT Parti, a plus !! ;)

Share this post


Link to post
Share on other sites
GT Turbo    5

Pour résumé tout cela, la routine a utilisé est celle la :

 

 

 

movei #$80000000,r20

 

 

 

move r1,r3

 

and r20,r3 ; on récup juste le bit de signe de r1 dans r3

 

 

 

move r2,r4

 

and r20,r4 ; on récup juste le bit de signe de r2 dans r4

 

 

 

abs r1 ; Absolution de r1 !!

 

abs r2 ; Absolution de r2 !!

 

 

 

div r1,r2 ; on divise r2 par r1

 

 

 

add r3,r4 ; on fait ta magouille sur les signes

 

or r4,r2 ; on rajoute le signe...

 

 

 

GT Turbo B)

Share this post


Link to post
Share on other sites
cts    0

heuuu...on arrete et on réfléchit ?

 

 

 

genre (j'le fais en 8 bits) :

 

 

 

-20/2=-10

 

 

 

avec ta routine on tombe sur un $8A, négatif certes, mais pas - 10. (#-10 = $f6)

 

 

 

 

 

Faire mumuse avec le bit de poids fort suffit pas, trop simple ;)

 

 

 

A mon avis, y'a pas moyen de s'en sortir sans au moins un JR

Share this post


Link to post
Share on other sites
GT Turbo    5
cts :


heuuu...on arrete et on réfléchit ?



genre (j'le fais en 8 bits) :



-20/2=-10



avec ta routine on tombe sur un $8A, négatif certes, mais pas - 10. (#-10 = $f6)





Faire mumuse avec le bit de poids fort suffit pas, trop simple ;)



A mon avis, y'a pas moyen de s'en sortir sans au moins un JR





Un très grand merci a toi (Cts) pour l'info, c'est vrai que la routine n'a pas été essayé c'était du travail théorique. Faut que j'y reflechisses plus, et surtout faire des essais.



GT En train de planté !! :wacko:

Share this post


Link to post
Share on other sites
Guest
You are commenting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoticons maximum are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×