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

Delphi Discussion :

Adapter 2 routines et traduire bit en valeur


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut Adapter 2 routines et traduire bit en valeur
    J'utilise un code trouvé sur internet pour extraire les infos concernant les instructions (SSE, MMX, etc) supportées par le processeur.
    Ce code fonctionne bien mais j'aimerais y intégrer un test pour SSE 3.
    Le code pour SSE3, je l'ai trouvé mais sous une forme bien différente que j'aimerais traduire dans la même syntaxe (forme) que ma routine ci-dessous :

    Voici le code que j'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    function getCPUInfo: TCPUInfo;
    type
    TRegChar = array[0..3] of char;
    var
    lvCPUID : TCPUIDResult;
    I : Integer;
    begin
    lvCPUID := CPUID(0);
    Result.Vendor := TRegChar(lvCPUID.EBX) + TRegChar(lvCPUID.EDX) +
    TRegChar(lvCPUID.ECX);
    lvCPUID := CPUID(1);
    // Result.Frequency := GetCPUSpeed;
    Result.Family := (lvCPUID.EAX and $F00) shr 8;
    Result.Model := (lvCPUID.EAX and $78) shr 4;
    Result.Stepping := (lvCPUID.EAX and $F);
    Result.EFamily := (lvCPUID.EAX and $7800000) shr 20;
    Result.EModel := (lvCPUID.EAX and $78000) shr 16;
    Result.EStepping := (lvCPUID.EAX and $F);
    Result.APIC := (lvCPUID.EBX and $1FE00000) shr 23;
    Result.Brand := lvCPUID.EBX and $7F;
    Result.FXSAVE := (lvCPUID.EDX and $01000000) = $01000000;
    Result.MMX := (lvCPUID.EDX and $800000) = $800000;
    Result.SSE := (lvCPUID.EDX and $2000000) = $2000000;
    Result.SSE2 := (lvCPUID.EDX and $4000000) = $4000000;
    Result.IA64 := (lvCPUID.EDX and $40000000) = $40000000;
    lvCPUID := CPUID($80000001);
    Result.MMXPlus := (lvCPUID.EDX and $800000) = $800000;
    Result.AMD3DNow := (lvCPUID.EDX and $10000000) = $10000000;
    if (Result.Vendor = 'GenuineIntel') and ((Result.Family <> 15) or
    (Result.EFamily <> 0)) then
    Result.Name := Result.Vendor + ' Processor'
    else
    begin
    Result.Name := '';
    for i := 2 to 4 do
    begin
    lvCPUID := CPUID($80000000 + i);
    Result.Name := Result.Name +
    TRegChar(lvCPUID.EAX) +
    TRegChar(lvCPUID.EBX) +
    TRegChar(lvCPUID.ECX) +
    TRegChar(lvCPUID.EDX);
    end;
    Result.Name := Trim(Result.Name);
    end;
     
    et voici le code SSE3 a convertir et intégrer dans la syntaxe ci-dessus :
     
    var
    CPUInfo,
    CPUSSE3: Integer;
    begin
    asm
    MOV EAX, 01H;
    CPUID;
    MOV CPUInfo, EDX;
    MOV CPUSSE3, ECX;
    end;
     
    // SSE
    if (CPUInfo shr 25) and $1 = 1 then
    WriteLn('SSE: Enabled')
    else
    WriteLn('SSE: Disabled');
    // SSE2
    if (CPUInfo shr 26) and $1 = 1 then
    WriteLn('SSE2: Enabled')
    else
    WriteLn('SSE2: Disabled');
    // SSE3
    if CPUSSE3 and $1 = 1 then
    WriteLn('SSE3: Enabled') 
    else
    WriteLn('SSE3: Disabled');
    Au fait comment traduire un bit (ex : bit 23) en sa valeur => $800000

    Merci.

    Daniel

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    j'ai pas compris la question mais $800000 c'est "1 shl 23", soit un décalage à gauche de 23 bits, et odd(value shr 23) indique si le bit 23 de value est allumé.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 47
    Par défaut
    J'aimerais convertir le 2e code (sse3) au format du premier c'est à dire l'intégrer dans le code source de la première partie

    Merci.

  4. #4
    Membre émérite

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

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    si on regarde le 2 eme code... que fait-il...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    Var
      CPUInfo, CPUSSE3: Integer;
    Begin
      Asm
    MOV EAX, 01H;
    CPUID; //ici call CPUID avec $1 comme parametre...
    MOV CPUInfo, EDX;
    MOV CPUSSE3, ECX; //Met registre ECX dans CPUSSE3
      End;
      //un peut plus loin...si le bit 1 de CPUSSE3 est à 1, SSE3 est enabled...
      If CPUSSE3 And $1 = 1 Then
        WriteLn('SSE3: Enabled')
      Else
        WriteLn('SSE3: Disabled');
    alors...l'integration devrait ressembler a ceci...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
     //Call CPUID avec 0....
      lvCPUID := CPUID(0);
      //Met le resultat dans Result.Vendor...
      Result.Vendor := TRegChar(lvCPUID.EBX) + TRegChar(lvCPUID.EDX) +
        TRegChar(lvCPUID.ECX);
      //Call CPUID avec 1...humm.. comme l'autre code...interessant...
      lvCPUID := CPUID(1);
    // Result.Frequency := GetCPUSpeed;
      Result.Family := (lvCPUID.EAX And $F00) Shr 8;
      Result.Model := (lvCPUID.EAX And $78) Shr 4;
      Result.Stepping := (lvCPUID.EAX And $F);
      Result.EFamily := (lvCPUID.EAX And $7800000) Shr 20;
      Result.EModel := (lvCPUID.EAX And $78000) Shr 16;
      Result.EStepping := (lvCPUID.EAX And $F);
      Result.APIC := (lvCPUID.EBX And $1FE00000) Shr 23;
      Result.Brand := lvCPUID.EBX And $7F;
      Result.FXSAVE := (lvCPUID.EDX And $01000000) = $01000000;
      Result.MMX := (lvCPUID.EDX And $800000) = $800000;
      Result.SSE := (lvCPUID.EDX And $2000000) = $2000000;
      Result.SSE2 := (lvCPUID.EDX And $4000000) = $4000000;
      //Ajout ici..Compare ECX avec $1...et on met ca dans SSE3...
      Result.SSE3 := (lvCPUID.ECX And $1) = $1;
      ......
    Je suppose que TCPUInfo possède bien une propriété SSE3 de type boolean.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     Result.SSE  := (lvCPUID.EDX and $2000000) = $2000000;
     Result.SSE2 := (lvCPUID.EDX and $4000000) = $4000000;
     Result.SSE3 := (lvCPUID.ECX and 1) = 1;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 06/09/2014, 18h24
  2. Réponses: 4
    Dernier message: 01/06/2010, 00h31
  3. Réponses: 2
    Dernier message: 17/08/2007, 15h51
  4. Comment connaitre la valeur des bits ?
    Par secretman dans le forum Delphi
    Réponses: 2
    Dernier message: 09/06/2007, 20h53
  5. Valeur par defaut 'True' dans un champ de type bit
    Par Mouse dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2003, 15h26

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