SSE : mise en majuscule

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

SSE : mise en majuscule

Message 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!
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message 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$)




@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

C'est une version bien plus rapide!
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Message 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:
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

heu ! une simple addition de 32 , ça irai pas encore plus vite ?? 8O


65+ 32 = 97

97- 32 = 65
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
Avatar de l’utilisateur
venom
Messages : 3128
Inscription : jeu. 29/juil./2004 16:33
Localisation : Klyntar
Contact :

Message 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:






@++
Windows 10 x64, PureBasic 5.73 x86 & x64
GPU : radeon HD6370M, CPU : p6200 2.13Ghz
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message 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.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Message par djes »

Ben oui je pense, mais quel intérêt si le and fonctionne bien?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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:
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Ollivier
Messages : 4197
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Message 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
Répondre