sse-register auf true testen



  • hallo

    ich hab da mal ne frage und zwar will ich zwei zeichenketten
    vergleichen und dafür die sse befehle des p4 benutzen um 16bytes
    parallel zu vergleichen.

    [code]
    mov esi,src
    mov edi,dst

    movdqa xmm0,[src]
    movdqa xmm1,[dst]

    pxor xmm0,xmm1

    so weit bin ich gekommen,da aber pxor keine flags setzt,kann
    ich jetzt ja nicht rauskriegen ob xmm0 den wert 0 oder irgendein anderen hat.
    ich hab mir von der intel seite mal ne befehlsübersicht runtergeladen aber um
    rauszukriegen ob ein bit des registers gesetzt ist wären mehrere befehle
    nötig die die optimierung wieder sinnlos machen würde.

    vielleicht kennt irgend jemand ein befehl mit dem das möglich ist(vielleicht hab ich ihn auch übersehen)

    danke schon mal im vorraus

    aurux


  • Mod

    movdqa ist etwas riskant, es sei denn, du kannst 16byte-alignment garantieren, andernfalls gibts 'nen protection fault - sonst movdqu nehmen

    versuch mal das: (ausgerichtete zeichenketten)

    mov        esi, src
           mov        edi, dest
    
           movdqa     xmm0, [ esi ]
           pcmpeqd    xmm0, [ edi ]
           pmovmskb   eax, xmm0
           inc        al
           jz         _gleich
    _ungleich:
           .
           .
           .
    _gleich:
           etc.
    

    wenn du einen größer/kleiner vergleich zwecks sortieren brauchst, kannst du pcmpgtd statt pcmpeqd verwenden (die auswertung von al ist dann etwas komplexer). wenn die operanden nicht ausgericht sind, natürlich entspr. movdqu xmm0, [ esi ] movdqu xmm1, [ edi ] und dann vergleichen

    edit: es muss nat. inc al heissen - alternativ auch cmp eax, 0ffh o.ä.; das ist vermutlich vorzuziehen, um verzögerungen wegen unterschiedlicher operandengrößen zu vermeiden


Anmelden zum Antworten