Pages: 1 2 [3]   Bas de page
Imprimer
Auteur Fil de discussion: [NDS] Optimisation de code ARM  (Lu 5128 fois)
0 Membres et 1 Invité sur ce fil de discussion.
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #30 : 14 Novembre 2008, 22:33:02 »

Oui oui vu que tu utilise r2 dans la boucle j'étais persuadé que non  Cry
Journalisée
mikegba Hors ligne
VIP
****
Messages: 35


Voir le profil
« Réponse #31 : 14 Novembre 2008, 22:33:52 »

si on supprime le sub r2,r2,#1 qui est entre les 2 boucles, ça va faire foirer le stoquage de r5 de la 2em boucle puisque on se sert de r2 aussi pour indiquer ou stoquer.
Journalisée
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #32 : 14 Novembre 2008, 22:35:00 »

oui mais d'ailleurs ne peut on pas se passer d'utiliser r2 pour stocker ? Ce qui permettrait de supprimer un sub...
Journalisée
mikegba Hors ligne
VIP
****
Messages: 35


Voir le profil
« Réponse #33 : 14 Novembre 2008, 22:48:02 »

à mon avis , si on met en jeu un autre registre que r2 pour le stoquage, ce qu'on va gagner en supprimant le sub du milieu de boucle, on va le perdre, voir surement davantage, avec les instructions qu'on va devoir rajouter pour gérer le nouveau registre.

A mon avis la vraie optimisation pour ce genre de code passerait par un ré agencement de la façon dont sont stoquées les données, de manière à pouvoir y accéder plus rapidement. Ceci dit, je sais pas du tout comment tout le reste est géré, donc voilà, sans voire le reste pas évident de voire si c'est opportun ou pas.

à titre d'info ça bouffe combien de cpu le bout de code là ?
Journalisée
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #34 : 14 Novembre 2008, 23:15:28 »

Sans doute j'avais juste pensé à ca :

Code
(asm):
modpalCPA:
 ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
 mov r8, r6, lsl #26
 ldr r5,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
 mov r8, r6, lsl #18
 ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
 orr r5,r5,r7,lsl #8             ;@
 
 mov r8, r6, lsl #10
 ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
 orr r5,r5,r7,lsl #16             ;@  
 
 mov r8,r6, lsl #2
 ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
 orr r5,r5,r7,lsl #24             ;@  
 
 str r5,[r4],#4            ;@ *(u32*)(&TabPoints[GateArray.scr_mode][ i ][ 0 ]) = ...
 
 sub r2,r2,#1                    ;@ fin de for (i=0;i<256;i++)
 bpl modpalCPA
 

mais je sais pas ce qui est plus rapide entre :

str r5,[r4],#4 et str r5,[r4,r2,lsl#2]
Journalisée
mikegba Hors ligne
VIP
****
Messages: 35


Voir le profil
« Réponse #35 : 17 Novembre 2008, 19:14:00 »

 Smiley Hello , suite au dernier post de Copper, peut être une dernière optimisation possible.

On oublie r2 comme index de stoquage, on s'en sert juste comme compteur de boucle, et pour l'adresse de stoquage on incrémente  r4  comme le dernier post de Copper.

Par contre vu qu'on déboucle, et qu'il reste pas mal de registre dispo, on peut déboucler 4 fois et on stoque 1 seule fois / 4 avec un stoquage multiple. On se sert de r9,r10,r11 et r12 comme sauvegarde temporaire.

l'adresse de stoquage r4 est incrémentée automatiquement avec Stmia  ( incrémente  after )


Le code devient donc:


modpalCPA:
  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r9,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r9,r9,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r9,r9,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r9,r9,r7,lsl #24             ;@
 
  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r10,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r10,r10,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r10,r10,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r10,r10,r7,lsl #24             ;@

  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r11,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r11,r11,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r11,r11,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r11,r11,r7,lsl #24             ;@

  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r12,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r12,r12,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r12,r12,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r12,r12,r7,lsl #24             ;@

  stmia r4,{r9,r10,r11,r12}            ;@ *(u32*)(&TabPoints[GateArray.scr_mode][ i ][ 0 ]) = ...

  subs r2,r2,#4                    ;@ fin de for (i=0;i<256;i++)
  bpl modpalCPA


Voilà à tester si Alek à encore envie de se replonger là dedans !! Grin Grin

Sinon, j'avais pas vu que Copper était dijonnais !!     La moutarde est en force sur Dev-fr !! Cool Cool
Journalisée
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #36 : 17 Novembre 2008, 19:51:02 »

Eh oui je pense que la moutarde est en force (c'est pas Ariala qui nous dira le contraire)

C'est vraiment une bonne idée le coup du stmia (ca me rappelle quand on utilisait le movem en 680x0)

Il me semble qu'il y a encore r1 comme registre disponible on pourrait du coup l'utiliser pour faire 2 ldmia r3!, {r6, r1} pour remplacer 4 ldr r6,[r3],#4 (et en remplacant biensur r6 par r1 au bons endroit)

Dommage qu'on ait pas encore 2 autre registres à disposition par contre...
« Dernière édition: 18 Novembre 2008, 07:57:40 par Copper » Journalisée
Alekmaul Hors ligne
Papi codeur et
Administrateur
*****
Messages: 1401


Voir le profil WWW
Out of memory error ...

« Réponse #37 : 17 Novembre 2008, 20:58:33 »

* Alekmaul teste et va éditer ce post après ... Azn  Tongue

Bon, ça marche pas (ça plante pas quand même Azn), je vais chercher pourquoi ... les couleurs sont cra cra à l'écran ...

Par contre Copper, r0 et r1 ne sont pas dispo, ils sont pris par le mode ecran et le pointeur palette :

Citation
  ldr r0,GAscr_mode_local
  ldr r1,[r0]
  ldr r0,GApalette_local

 

Voici le code global, je vois pas pourquoi y'a un blem avec les couleurs  Huh?
Citation
CalcPointsArm:
  ;@ r0 = pointer to GateArray.palette
  ;@ r1 = GateArray.scr_mode
  ;@#########################################   
  stmfd   sp!, {r4-r12, lr}
 
  ldr r0,GAscr_mode_local
  ldr r1,[r0]
  ldr r0,GApalette_local
 
  mov r2,#255                       ;@  for (i=0;i<256;i++)
 
  ldr r3,TabPointsDef_local
  add r3,r3,r1,lsl #10            ;@ TabPointsDef+mode*256*4
  @add r3,r3,r2,lsl #2             ;@ TabPointsDef+mode*256*4
 
  ldr r4,TabPoints_local
  add r4,r4,r1,lsl #10            ;@ TabPoints+mode*256*4

modpalCPA:
  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r9,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r9,r9,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r9,r9,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r9,r9,r7,lsl #24             ;@




  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r10,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r10,r10,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r10,r10,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r10,r10,r7,lsl #24             ;@




  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r11,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r11,r11,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r11,r11,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r11,r11,r7,lsl #24             ;@



  ldr r6,[r3],#4                  ;@ TabPointsDef[GateArray.scr_mode][ i ][ 0 ]
  mov r8, r6, lsl #26
  ldr r12,[r0,r8,lsr #24]          ;@ GateArray.palette[
 
  mov r8, r6, lsl #18
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 8
  orr r12,r12,r7,lsl #8             ;@
 
  mov r8, r6, lsl #10
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 16
  orr r12,r12,r7,lsl #16             ;@
 
  mov r8,r6, lsl #2
  ldr r7,[r0,r8,lsr #24]          ;@ GateArray.palette[ << 24
  orr r12,r12,r7,lsl #24             ;@

 stmia r4,{r9,r10,r11,r12}            ;@ *(u32*)(&TabPoints[GateArray.scr_mode][ i ][ 0 ]) = ...

  subs r2,r2,#4                    ;@ fin de for (i=0;i<256;i++)
  bpl modpalCPA
     
  ldr r3, UpdateInk_local
  mov   r2, #0
   str   r2, [r3]
 
  ldmfd   sp!, {r4-r12, pc}
« Dernière édition: 17 Novembre 2008, 21:16:11 par Alekmaul » Journalisée

Mon site PortableDev : l'émulation sur GBA et sur DS
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #38 : 17 Novembre 2008, 21:26:59 »

Oui mais r1 tu peux quand même l'utiliser dans la boucle car tu n'en a plus besoin après il me semble (il faudrait peut-être le sauvegarder avant la boucle et le restaurer après)
Journalisée
Alekmaul Hors ligne
Papi codeur et
Administrateur
*****
Messages: 1401


Voir le profil WWW
Out of memory error ...

« Réponse #39 : 17 Novembre 2008, 22:04:19 »

Oui mais r1 tu peux quand même l'utiliser dans la boucle car tu n'en a plus besoin après il me semble (il faudrait peut-être le sauvegarder avant la boucle et le restaurer après)
C'est pas faux, il me sert juste à utiliser le mode au début ... effectivement Wink, bien vu !
* Alekmaul a toujours pas trouvé où ça plante dans la version avec stmia ...
« Dernière édition: 17 Novembre 2008, 22:06:15 par Alekmaul » Journalisée

Mon site PortableDev : l'émulation sur GBA et sur DS
Copper Hors ligne
Mega Member
***
Messages: 1296


Voir le profil
« Réponse #40 : 17 Novembre 2008, 22:10:49 »

C'est possible d'avoir des copies d'écran ?

Sinon je pense qu'il manque le ! après r4 :

stmia r4!,{r9,r10,r11,r12}

« Dernière édition: 17 Novembre 2008, 22:15:12 par Copper » Journalisée
Toiletking Hors ligne
Mega Member
***
Messages: 1293


Voir le profil WWW
"Caca Boudin!"

« Réponse #41 : 17 Novembre 2008, 23:24:57 »

Je ne fais que passer, pom po pom...

whistle-_--__-
Journalisée
mikegba Hors ligne
VIP
****
Messages: 35


Voir le profil
« Réponse #42 : 18 Novembre 2008, 00:22:35 »

 Smiley oui, Copper a raison, ce qui est sur c'est qu'il manque le !  après le r4, sinon y'a pas d'incrémentation ...

... c'est ma faute , désolé Alek , me suis pas relu quand j'ai fait les copier / coller  Grin Grin
Journalisée
Alekmaul Hors ligne
Papi codeur et
Administrateur
*****
Messages: 1401


Voir le profil WWW
Out of memory error ...

« Réponse #43 : 18 Novembre 2008, 06:56:37 »

mais oui, quel con, et dire que je l'ai pas vu  Lips Sealed !!!!
Super, ça fonctionne et on gagne un peu en % de fps, avant ça oscillait entre 77 et 85%, là , on passe à 79 ~87%. Bravo à Copper et mikegba Cheesy !

Je ne fais que passer, pom po pom...
Je ne sais pas si j'ai bien compris mais si c'est le cas, t'inquiète, il arrive aussi Azn, zeblackos m'a livré des écrans superbes pour faire l'interface, écrans que j'ai copié pour AmeDS tellement ça m'a botté Azn

Pour info, en utilisant la même technique sur la routine d'affichage en elle même, je suis maintenant entre 84 et 92%  Cheesy
Journalisée

Mon site PortableDev : l'émulation sur GBA et sur DS
mikegba Hors ligne
VIP
****
Messages: 35


Voir le profil
« Réponse #44 : 18 Novembre 2008, 11:44:45 »

Bon ben , bien content que ça marche  Azn

Mais, la vraie question est : au final est ce qu'on a réussi à niquer le compilo avec le code C d'origine ? Grin
Journalisée
Pages: 1 2 [3]   Haut de page
Imprimer

Aller à: