addition/multiplikation mit xmm registern

philomat
Erstie
Erstie
Beiträge: 17
Registriert: 28. Mär 2011 14:50

addition/multiplikation mit xmm registern

Beitrag von philomat »

ich habe folgendes problem:
wenn ich mit dem befehl mulps/divps zwei xmm register multipliziere/addiere
erhalte ich nicht das gewünschte ergebnis.
bei der addition klappts, und bei der subtraktion auch, solange das ergebnis >= 0.

in den wunderbaren folien steht es auch nicht wirklich anders.
muss ich movaps benutzen, wenn ich multiplizieren will?
wenn ja, wie stelle ich sicher, dass die adressen meiner zeilen etc druch 4 teilbar sind.

Code: Alles auswählen

.data
zeile0: .long 10,10,10,10
vektor: .long 20,3,2,1
result: .long 0,0,0,0
str: .string "%d\n"
.text
.globl main
main:
    leal zeile0, %esi
    movups (%esi), %xmm0

    leal vektor, %esi
    movups (%esi), %xmm3
  
    #addps %xmm0, %xmm3 # liefert 30
    #divps %xmm0, %xmm3 # liefert 1073741834 anstatt 20/10 = 2
    #subps %xmm0, %xmm3 # liefert 20-10 = 10
    #mulps %xmm0, %xmm3 # liefert 0 anstatt 200

    leal result, %eax
    movups %xmm3, (%eax)
    
    movl (%eax), %eax
 
    pushl %eax
    pushl $str
    call printf
    
end:
    movl $1, %eax
    int $0x80

Benutzeravatar
Ronny
BASIC-Programmierer
BASIC-Programmierer
Beiträge: 133
Registriert: 18. Nov 2005 14:33
Wohnort: IGD

Re: addition/multiplikation mit xmm registern

Beitrag von Ronny »

movups, addps, divps und subps sind alles Befehle die mit Floatingpointzahlen arbeiten(siehe saemtliche Folien zu SSE in der Vorlesung 7).
Das ps steht fuer packed single precision floating point.
Es ist quasi Zufall, dass die Addition und die Subtraktion funktioniert haben.
Streng genommen haben auch Division und Multiplikation funktioniert.
Die Bitmuster deiner Integerwerte wurden als floats interpretiert, wobei zufaellig positive denormalisierten Zahlen herauskamen (nur Mantisse ungleich Null).

Die Ergebnisse der Addition und der Subtraktion waren auch wieder positive denormalisierte Zahlen, deren Bitmuster als Integer interpretiert das richtige Ergebnis lieferten.
Bei der Division wurde bei mir 1073741824 statt 1073741834 ausgegeben(hast du dich verschrieben?).
Das Binaermuster dieser Zahl als float interpretiert ist gerade 2,0. Du hast sie aber als integer ausgegeben.
Bei der Multiplikation kommt natuerlich Null raus, da beide Faktoren denormalisiert, also fast 0 sind und das Produkt mit single precision nur noch als Null darstellbar ist.
Die Binaerdarstellung der float 0 ist identisch mit der integer 0.

Es gibt auch SSE-Befehle fuer Integerarithmetik. Die wurden aber nicht in der Vorlesung vorgestellt und werden auch nicht im Praktikum benoetigt.

studypad
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 158
Registriert: 30. Mär 2011 11:46

Re: addition/multiplikation mit xmm registern

Beitrag von studypad »

Ein nettes Beispiel mit allem drum herum, das ist echt gut, doch wie kriege ich es denn nun hin, zwei zahlen sinngemäß zu multiplizieren... bzw kann man den code auf floats umstellen? Ich bin da etwas überfordert mit und finde die Folien sind wenig hilfreich..

philomat
Erstie
Erstie
Beiträge: 17
Registriert: 28. Mär 2011 14:50

Re: addition/multiplikation mit xmm registern

Beitrag von philomat »

danker erstmal an ronny für die aufklärung funktioniert jetzt alles so wie es sollte.

@studypad
du kannst den code quasi auf float umstellen, nur so wie ich es verstanden habe kannst du eine float nur über die fpu auf den stack pushen und somit
überprüfen ob die rechnung geklappt hat.
ich hab mal meinen code überarbeitet, sollte beim ausführen jetzt 40.0 liefern:

Code: Alles auswählen

.data

zeile0: .float 10.0, 10.0,10.0,10.0
vektor: .float 4.0,3.0,2.0,1.0
result: .float 0.0,0.0,0.0
str: .string "%f\n"

.text
.globl main

main:
    	leal zeile0, %esi
    	movups (%esi), %xmm0
    	leal vektor, %esi
    	movups (%esi), %xmm1
     
    	mulps %xmm0, %xmm1
    	leal result, %eax
	movss %xmm1, (%eax)
print: 
	movl $0, %ecx
    	fld result(, %ecx, 4)
    	subl $8, %esp
    	fstpl (%esp)

    	pushl $str
    	call printf
    
end:
    movl $1, %eax
    int $0x80

studypad
Endlosschleifenbastler
Endlosschleifenbastler
Beiträge: 158
Registriert: 30. Mär 2011 11:46

Re: addition/multiplikation mit xmm registern

Beitrag von studypad »

und wie gebe ich jetzt die anderen werte aus...? ich kriege ja immern nur den ersten wert?

philomat
Erstie
Erstie
Beiträge: 17
Registriert: 28. Mär 2011 14:50

Re: addition/multiplikation mit xmm registern

Beitrag von philomat »

Code: Alles auswählen

leal result, %eax
movss %xmm1, (%eax)
hier schiebe ich den ersten wert des xmm1 registers and die stelle 0 im result array.
verstehst du was hier passiert?
wenn du alle werte aus dem xmm1 register haben willst, solltest du dir nochmal anschauen was movss macht und was movups macht.

wie man floats ausgibt solltest du dir anhand meines beispiel codes erschließen können oder lies es nochmal nach in den folien
Pflücker hat geschrieben:
xarfai hat geschrieben: Im Foliensatz mit der Gleitkommarechnung steht ein beispielprogramm das eine float ausgiebt. Ich hab es damit mit recht wenig Zeilen hinbekommen.
Ich danke vielmals, damit geht es in der Tat flott ;)
Edit: @others: Es ist von Folie 29, Foliensatz 6 die Rede ;)

radix89
Mausschubser
Mausschubser
Beiträge: 66
Registriert: 13. Apr 2011 13:45

Re: addition/multiplikation mit xmm registern

Beitrag von radix89 »

Ich habe exakt deinen Code kopiert, aber jedesmal, wenn ich ihn komplieren lassen will kommt folgendes:

error: invalid size for operand 1

und zwar in der Zeile fld result(,%ecx,4)

Warum?

kai j
Erstie
Erstie
Beiträge: 20
Registriert: 2. Nov 2011 22:50

Re: addition/multiplikation mit xmm registern

Beitrag von kai j »

Apropos Vl 6 Folie 29, wozu ist denn das subl $8, %esp? Ich hab es mal auskommentiert und es ändert nichts an der Ausgabe, der Stack wird scheinbar gar nicht verändert??

Antworten

Zurück zu „Archiv“