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,dstmovdqa 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
-
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