PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Quersumme von SSE-Register


Matti
2004-06-30, 11:10:28
ich will alle 4 Floats in einem SSE-Register addieren. Bei 3dnow gibts ja einen Befehl dafür, bei SSE aber nicht. Klar könnte man das auch so machen:

1. xmm0->xmm1
2. xmm1 um 32 Bit verschieben
3. xmm0+xmm1
4. xmm1 um 32 Bit verschieben
5. xmm0+xmm1
6. xmm1 um 32 Bit verschieben
7. xmm0+xmm1

Dann steht die Summe in xmm0. Ist jetzt die Frage, ob man das vielleicht auch effektiver machen könnte...

Matti
2004-06-30, 13:01:42
zu allem Übel habe ich jetzt noch festgestellt, daß Shift-Operationen mit xmm-Registern erst ab SSE2 möglich sind. Wie kann man die Quersumme mit SSE1 berechnen???

Demirug
2004-06-30, 13:53:01
Schuffeln könnte helfen. Aber der SSE Experte ist Zecki.

RLZ
2004-06-30, 14:10:06
Wenn du was findest wohl mit Shuffle oder Unpack.
Mit nem UNPCKHPS von reg1 und reg1 nach reg2 und nem add der beiden hast du hinten schon a+c und b+d stehen.
Zum Weiterüberlegen bin zu faul ;)
Aber so dürfte das irgendwie ohne teuren Shift gehen.
Allerdings weiss ich die kosten für ein unpack nicht und die Tabelle liegt irgendwie grad nid hier rum :(

Matti
2004-06-30, 14:42:52
ist zwar OT, aber:
wo kann man eine Befehls-Beschreibung aller SSE-Befehle her bekommen? ...ich hab bis jetzt nur eine Liste, wo ASM-Befehl und die deutsche Übersetzung drinsteht, aber in einigen Fällen brauche ich eben auch eine kurze Beschreibung und vor allem die Syntax (welche Operationen sind mit 1 und welche mit 2 Registern).

zeckensack
2004-06-30, 15:13:32
;xmm0:= d | c | b | a

XORPS xmm1,xmm1 ;lösch0rn (wegen den ungenutzen hohen Bits)
MOVHLPS xmm1,xmm0 ;xmm1:= 0 | 0 | d | c
ADDPS xmm0,xmm0 ;xmm0:= d | c | d+b | c+a
MOVSS xmm1,xmm0 ;xmm1:= 0 | 0 | d | c+a
SHUFPS xmm0,xmm0,1 ;xmm0:= c+a | c+a| c+a | d+b
ADDSS xmm1,xmm0 ;xmm1:= 0 | 0 | d | c+a+d+b

MOVSS dword [hinfort_damit],xmm1

Als Dokumentation empfehle ich die Arbeit des NASM-Projekts (http://sourceforge.net/projects/nasm). Dieses Paket (http://prdownloads.sourceforge.net/nasm/nasm-0.98.38-xdoc.zip?download) enthält unter anderem eine Kurzreferenz zum kompletten Befehlssatz, im HTML-Format.

Für Detailfragen wirst du dieses Monster-PDF von Intel (http://www.intel.com/design/pentiumii/manuals/243191.htm) bemühen müssen.

Matti
2004-06-30, 16:17:27
Original geschrieben von zeckensack
Dieses Paket (http://prdownloads.sourceforge.net/nasm/nasm-0.98.38-xdoc.zip?download) enthält unter anderem eine Kurzreferenz zum kompletten Befehlssatz, im HTML-Format.

Danke! Genau sowas habe ich gesucht :)

...und den Code werde ich dann mal ausprobieren...

micki
2004-07-02, 09:47:23
wenn ich mich nicht irre, geht das in SSE3 mit einem Befehl *hehe*

MfG
micki

zeckensack
2004-07-02, 11:47:56
Original geschrieben von micki
wenn ich mich nicht irre, geht das in SSE3 mit einem Befehl *hehe*

MfG
micki Ja (http://www.forum-3dcenter.org/vbulletin/showthread.php?threadid=123719).
Auf einem K6-2 kann man das so lösen:;mm0:= b | a
;mm1:= d | c
PFACC mm0,mm1 ;mm0:= d+c | b+a
PFACC mm0,mm0 ;mm0:= b+a+d+c | b+a+d+c

MOVD dword [hinfort_damit],mm0Intel ist eben ein bisserl rückständig ;)