Page 1 sur 1

SSE : mise en majuscule

Publié : mar. 14/avr./2009 18:19
par Ollivier
Bon, je sais, c'est un peu bourrin mais bon, je montre le principe.

En fait si A$ = "a"
alors Asc(A$) = 97
donc Bin(Asc(A$) ) = %01100001
Alors, (sachant que les bits d'un octet vont de 0 à 7) s'il nous vient l'idée de sauter le bit 5 à coup de masque ET, ça donne:
Asc(A$) & %11011111 = 65
Et pis, comble du boxon, ben :
Chr(65) = "A"
c.q.f.d. ...

Donc, après cte bref test, passage en instru ASM SSE:

Code : Tout sélectionner

   *BufferMAJ = AllocateMemory(32)
   For i = 0 To 15 ; on prépare le masque
      PokeC(*BufferMAJ + I, %11011111)
   Next i

   *BufferA = AllocateMemory(32)
   
   *BufferB = AllocateMemory(32)
   
   A$ = InputRequester("", "Ecrivez votre expression :", "")
   If Len(a$) > 16: A$ = Left(A$, 16): EndIf
   PokeS(*BufferA, A$)

   ! mov esi, [p_BufferMAJ] ; on charge l'adresse du masque
   ! movups xmm1, [esi] ; ainsi, on charge le masque

   ! mov esi, [p_BufferA]; on charge l'adresse de la source
   ! mov ebx, [p_BufferB]; on charge l'adresse de la cible

   ! movups xmm0,  [esi]; on charge la source
   ! andps  xmm0,  xmm1 ; on la filtre avec le masque
   ! movups [ebx], xmm0 ; on renvoie ça dans la cible
   Debug PeekS(*BufferB)
Woilà! Bonne bourre!

Publié : mer. 15/avr./2009 5:42
par venom
salut Ollivier,

sympa ton petit code mais si tu utilise la fonction UCase(Chaine$)
sa te permet d'économiser pas mal de ligne non ???

Code : Tout sélectionner

A$ = InputRequester("", "Ecrivez votre expression :", "")
Debug UCase(A$)




@++

Publié : mer. 15/avr./2009 8:36
par djes
C'est une version bien plus rapide!

Publié : mer. 15/avr./2009 14:11
par Fig
... Je crois que c'était voulu depuis l'invention du code à ski 7bits ... :mrgreen:

Idem pour Asc(BILL GATES III)=666 c'était écrit ... :roll: :twisted:


En mémoire de Bob Bemer je me permets "/" et [escape]. :oops:
Ce sont des inventions très utiles quand même... On sortirait d'un programme avec "²" sinon :idea:

Publié : mer. 15/avr./2009 22:35
par Backup
heu ! une simple addition de 32 , ça irai pas encore plus vite ?? 8O


65+ 32 = 97

97- 32 = 65

Publié : jeu. 16/avr./2009 8:46
par djes
Je crois que vous n'avez pas bien compris le code. Ollivier convertit par paquets de 16, c'est donc bien plus rapide! Oui, il aurait pu le faire avec un add, mais un and est plus rapide aussi. Il cherche avant tout à aller vite.

Publié : jeu. 16/avr./2009 16:35
par venom
a ok d'accord effectivement je n'avais pas compris :wink:
mais même si la vitesse varie je ne voie pas vraiment de différence fin si tu le dit Djes :wink:






@++

Publié : jeu. 16/avr./2009 18:39
par djes
Sur un caractère, pas de diff, mais sur 1 million de lignes de code, ça change tout :)
Le fait de mettre en majuscule permet (par exemple) de faciliter la reconnaissance des instructions.

Publié : jeu. 16/avr./2009 18:47
par Backup
djes a écrit :Je crois que vous n'avez pas bien compris le code. Ollivier convertit par paquets de 16, c'est donc bien plus rapide! Oui, il aurait pu le faire avec un add, mais un and est plus rapide aussi. Il cherche avant tout à aller vite.
une addition doit pouvoir se faire avec des Quad , donc 8 octets (64 bits)d'un coup
soit 8 caracteres d'un coup il me semble non ?

Publié : jeu. 16/avr./2009 19:08
par djes
Ben oui je pense, mais quel intérêt si le and fonctionne bien?

Publié : sam. 18/avr./2009 22:43
par lionel_om
Par contre ta fonction se veut marcher avec des lettres uniquement. Mais tu ne gère pas des autres caractères. Exemple: test avec "aa%aa". Le caractère pourcentage va être transformé en caractère illisible...

/Lio :wink:

Publié : mar. 21/avr./2009 12:15
par Ollivier
@Lio

Salut! Tout à fait, c'est très limité. C'est le projet de Progi1984 avec Moëbius qui m'a fait penser à ce truc. Je n'ai pas bien compris la totalité de son système mais une chose qui est sûre, c'est que son programme a besoin de chercher très vite des expressions alphabétiques particulières ("macro", "procedure", "proceduredll", etc...)

Alors, je pense à un modèle assez simple de "rechercheur" d'expression: Dans ce cas, 6 registres XMM 128bits stockent les expressions en majuscule, le 7ème registre stocke le masque présenté ci-dessus (pour mettre en majuscule) et le 8ème registre sert à fouiller la mémoire.

Il faut que je fasse 2 systèmes : l'un avec les accès mémoire alignés (adresse mémoire modulo 16) et l'autre sans : il doit y avoir une différence de vitesse...

Ollivier