Jump to content

Division signé dans les procs (Dsp, Gpu)


GT Turbo

Recommended Posts

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:

Link to comment
Share on other sites

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:

Link to comment
Share on other sites

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...

 

Link to comment
Share on other sites

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 ?

Link to comment
Share on other sites

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 :



<
Link to comment
Share on other sites

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é ;)
Link to comment
Share on other sites

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 !

Link to comment
Share on other sites

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 !! ;)

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 !! ;)
Link to comment
Share on other sites

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)

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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:
Link to comment
Share on other sites

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji 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.

×
×
  • Create New...