Bug bei Float Variablen?

Fragen und Bugreports zur PureBasic 4.0-Beta.
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

Ich bin ja MMX/SSEx-Fan und eigentlich gehts hier lt. Titel auch um Floats, aber zu MMX/SSEx folgender Hinweis: Bei MMX/SSEx-Integer-Rechen-Befehlen werden nicht die Flags wie "üblich" gesetzt! Hier ein Beispiel für´s Zero-Flag, betrifft aber genauso z.B. Carry und Overflow:

Code: Alles auswählen

a.q = 33464646464643347 
b.q = 33464646464643347 
asmres.q 

!XOR eax,eax
!INC eax           ;Zero-Flag löschen
pbres.q = a - b
!JNZ l_w1
Debug "Richtig!"
W1:

!XOR eax,eax
!INC eax           ;Zero-Flag löschen
!MOVQ mm0, qword[v_a] 
!PSUBQ mm0, qword[v_b]     ;SSE2!
!MOVQ qword[v_asmres], mm0 
!JNZ l_w2
Debug "Falsch!"    ;wird nicht angezeigt!!!
W2:
!EMMS 

Debug pbres 
Debug asmres
Eine Quad-Berechnung kann nicht einfach durch MMX/SSEx ersetzt werden!

Gruss
Helle
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Du, Helle, ma ne frage. Ich habe mal im FASM Forum gelesen, dass man
statt dem

Code: Alles auswählen

XOR EAX, EAX
lieber das hier nutzen sollte

Code: Alles auswählen

AND EAX, 0
Da zwar AND die 0 mehr einlesen muss aber dafür auch die einfachere
Logik für den Prozessor hat und somit auch schneller ist. Stimmt das?
Bild
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag von Helle »

@MVXA: Ist stets ein beliebtes Thema :D ! Aber auch im FAsm-Forum ist wohl XOR der Favorit (mit Zeitmessungen). Mit AND ist die Opcode-Sequenz 1 Byte länger (2 zu 3), und Platz in der Cache-Line ist immer knapp. Ausserdem zerstören ungerade Sequenzen ein evtl. vorhandenes Alignment im RAM. Die Unterschiede der Ausführungszeiten sind aber so gering, dass es wohl im Prinzip egal ist. Ich persönlich rede mir ein, dass eine Operation, die nur Registerwerte bearbeitet (XOR reg,reg) schneller sein muss als eine Operation mit Zahlenwerten. Habe halt mit Programmieren angefangen, als Cache noch ein absolutes Fremdwort war und eine Pipeline nur was mit Erdöl zu tun hatte... :mrgreen:.

Gruss
Helle
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

Naja, is auf jeden fall alles besser als mov eax, 0 :P...
Bild
armada
Beiträge: 100
Registriert: 10.10.2005 18:00
Kontaktdaten:

Beitrag von armada »

hmm die flags werden nich gesetzt...aber das ergebnis is das gleiche
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

@MVXA: Vergiss diese Diskussion, schreib was du am besten lesen kannst!
Hier trotzdem mal ein Speedtest. Bei mir ist XOR am schnellsten. Aber
ev. blockiert es die parallele Ausführung von Befehlen etwas mehr in
bestimmten Fällen.

Code: Alles auswählen

#N = 999999999
Delay(500)


; Anti-Cool'n'Quiet
MOV Ecx, #N
!ALIGN 4
loopstart0:;>
DEC Ecx;<
JNZ l_loopstart0


empty = timeGetTime_()
MOV Ecx, #N
!ALIGN 4
loopstart:;>
  !MOV Eax, 0
  !MOV Edx, 0
  !MOV Ebx, 0
  !MOV Esi, 0
  !MOV Edi, 0
DEC Ecx;<
JNZ l_loopstart
empty = timeGetTime_() - empty


pbadd = timeGetTime_()
MOV Ecx, #N
!ALIGN 4
loopstart2:;>
  !AND Eax, 0
  !AND Edx, 0
  !AND Ebx, 0
  !AND Esi, 0
  !AND Edi, 0
DEC Ecx;<
JNZ l_loopstart2
pbadd = timeGetTime_() - pbadd



asmadd = timeGetTime_()
MOV Ecx, #N
!ALIGN 4
loopstart3: ;>
  !XOR Eax, Eax
  !XOR Edx, Edx
  !XOR Ebx, Ebx
  !XOR Esi, Esi
  !XOR Edi, Edi
DEC Ecx;<
JNZ l_loopstart3
asmadd = timeGetTime_() - asmadd



MessageRequester("Addition:",  " Time: " + Str(empty) + " " +  Str(pbadd) + " " + Str(asmadd))
Gesperrt