IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

Variable en registre


Sujet :

Langage Delphi

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 182
    Points : 212
    Points
    212
    Par défaut Variable en registre
    Je cherche a obliger le compilateur a mettre une variable en registre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if a= b or a=c or a=d....then
    Quand on regarde le code genere
    on a mov A et CMP b, puis Mov a Cmp c...
    a chaque sous test il recharge A. En mettant A en registre on double la vitesse
    J'appelle cette routine des millions de fois alors le gain est important
    Cela fonctionne parfaitement en ASM mais je voudrai le faire en Pascal
    Boris

    (J'espere que je suis sur le bon forum ...)
    Papy

    Nul ne pourra jamais vous empêchez d'être libre.

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Inverse l'ordre des comparaisons et se sera beaucoup mieux...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (b=a) or (c=a) or (d=a) or (e=a)
    Le code generé sera plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Mov eax,b
    cmp eax,a
    jz..
    Mov eax,c
    cmp eax,a
    jz...
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 862
    Points : 11 318
    Points
    11 318
    Billets dans le blog
    6
    Par défaut
    Bonjour , JohnBorisAfond !

    Si ta fonction est déclarée register, le 1° paramètre sera dans EAX (ce sera le self, implicite, si c'est une méthode d'objet), le second dans ECX (à vérifier ; ce sera ton 1° paramètre pour une méthode d'objet).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function test(a: integer): Boolean; register;
    begin
      // a est stocké dans EAX
    end;
    reste à voir si le code produit est amélioré pour autant...
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Inactif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 182
    Points : 212
    Points
    212
    Par défaut + Rapide?
    Citation Envoyé par Eric Boisvert Voir le message
    Inverse l'ordre des comparaisons et se sera beaucoup mieux...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (b=a) or (c=a) or (d=a) or (e=a)
    Le code generé sera plus rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Mov eax,b
    cmp eax,a
    jz..
    Mov eax,c
    cmp eax,a
    jz...
    Pourquoi plus rapide ? En ASM je fais Mov EAX,A puis des
    cmp eax,b
    jz
    cmp eax,c
    jz ....

    Boris
    (La prochaine fois j'essaye Rapidos...)
    Papy

    Nul ne pourra jamais vous empêchez d'être libre.

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Points : 915
    Points
    915
    Par défaut
    Oui, désolé, j'avais cru qu'il y avait 2 mov + cmp...
    mais tu as raison l'inversion de la comparaison ne change rien.

    le mode register est celui par défault dans Delphi.

    Par contre, si tu active l'option d'optimisation de delphi,
    tu sera surpris du resultat généré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if (b=a) or (c=a) or (d=a) or (e=a)...
    Genere:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    cmp eax,edx
    jz
    cmp eax,esi
    jz
    cmp eax,d
    jz
    cmp eax,e
    jz
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  6. #6
    Inactif
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 182
    Points : 212
    Points
    212
    Par défaut Optimisation.
    On peut enlever option?

    D'accord avec toi les codeurs de chez Borland (a l"epoque) etaient balaises.
    Le plus spectaculaire est l'optimisation des boucles for
    Je crois avoir réussi a convaincre chez CodeGear pour que les opiisations
    soient faites sur les autres itérations pout lD10 (64 bits)
    Mais les compilos sont vraiment de plus en plus fort:
    Malheureusement pour moi la proceduire est enorme (71 repeat imùbriqué)
    et quand j'arrive les registres sont deja submergés

    Je suis quand même un peu surpris que pour des or classiques la valeur se sont pas systématiquement en registre; la structure me semble-t-il est assez facile a identifier.

    Boris
    Papy

    Nul ne pourra jamais vous empêchez d'être libre.

  7. #7
    Membre actif

    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Mars 2009
    Messages : 128
    Points : 203
    Points
    203
    Par défaut
    Bonjour
    tourlourou a raison dans son idée. Toute tentative de transposition directe de code pascal en code asm se solde par un alourdissement consécutif dû au mode de lecture-codage du compilateur et on a vite fait d'accuser l'asm de ne rien apporter. Exact !

    Mais si on bâtit sa routine en logique "technologie du processeur" alors on "force" le compilateur à un autre comportement.

    Dans le cas présent il suffit de "raisonner" son code asm pour éviter les rechargements successifs de eax, c'est tout.

Discussions similaires

  1. Passage de variable dans registre
    Par Nyko17 dans le forum x86 16-bits
    Réponses: 5
    Dernier message: 15/05/2008, 14h45
  2. Réponses: 3
    Dernier message: 02/10/2006, 21h20
  3. Réponses: 2
    Dernier message: 07/06/2006, 15h37
  4. les variables importantes de la base de registre
    Par masvivi dans le forum Windows
    Réponses: 2
    Dernier message: 26/08/2005, 09h27
  5. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo