SSE Crash
-
Wenn ich bei meinem Projekt den Compiler (mingw 3.4) auf automatische sse - befehlsgeneration (-mfpmath=sse), crasht mein Programm. Erst dachte ich an einen Alignmentfehler. Die Stelle an der das Programm crasht, sieht so aus:
... leave ret .section .rdata,"dr" .align 16 LC1: .long -2147483648 .long 0 .long 0 .long 0 .align 4 LC2: .long 0 .text .align 2 ... L8: movl 44(%edx), %eax # <variable>.sound11khz, <variable>.sound11khz leal -24(%ebp), %ebx #, tmp90 [b]xorps LC1, %xmm3 #, <variable>.speed.y //crash [/b] movss %xmm3, 24(%esi) # <variable>.speed.y, <variable>.speed.y movl %eax, 12(%esp) # <variable>.sound11khz, movl $0, 8(%esp) #, ...
Wie gesagt, erst dachte ich, das LC1 misaligned ist. Sieht aber für mich so aus, als wäre von dem her alles in Ordnung. Also hat jemand eine Ahnung, wieso das nicht funktioniert?
-
ich nehme an, das ist der code, den der compiler erzeigt. wie sieht denn der original quelltext aus?
-
// Diese Funktion: void Ball::flipY() { //std::cout << "foo"; this->speed.y *= -1; } // hier geinlined (automatisch vom Compiler): ... if(rect.top <= home.getField().top || rect.bottom >= home.getField().bottom) { this->flipY(); home.soundWall(); } ...
Wieso ich dieses "//std::cout << "foo";" drinhabe kommt daher, das ich draufgekommen bin, das wenn das einkommentiert ist, der Compiler keinen SSE Code für "this->speed.y *= -1;" erzeugt und das Programm dann nicht crasht. Daher lag mir auch der Verdacht nahe, das der Fehler beim Compiler liegt, aber jetzt wo ich die Stelle gesehen habe...
Wobei ich jetzt nicht so gut Assembler kann um definitiv zu sagen ob der Code Valid ist.
-
ich kann keinen grund erkennen, warum es ausgerechnet an dieser stelle crasht. du solltest evtl. versuchen zunächt alle optimierungen (ausser der erzeugung von sse code) auszuschalten und prüfen, ob das problem bestehen bleibt. wenn ja, ist das problem vermutlich trotzdem an anderer stelle zu suchen. (an dieser speziellen stelle lohnt sich sse sowieso nicht).
-
camper schrieb:
ich kann keinen grund erkennen, warum es ausgerechnet an dieser stelle crasht
Das Problem ist folgendes: Es crasht nicht nur hier. Ich habe clanlib mal mit -mfpmath=sse compiliert und es startet nicht mal. Unabhängig von anderen Optimierungen. Ich glaube langsam der Vectorizer vom gcc (oder zumindest mingw) ist buggy. Ich kanns mir zwar nicht vorstellen, denn sonst würde man ja (sehr viel) davon hören, aber was bleibt sonst.
Wegen diesem Verdacht hab ich mir mal den Assemblercode angesehn, doch WTF ?? --> kein erkennbarer Fehler, zumindest für mich als Assembler-schon-mal-wo-gesehn-haber.
Ich habe im Zusammenhang mit dem folgenden google grep auch Schauergeschichten über nonkonforme sse Implementierungen des Athlon XP gelesen, aber das ist wohl eher nicht der Fall.
Naja, werde mal versuchen den Fehler kontrolliert zu reproduzieren. Ist auch ne Chance mal vernünftig Asm zu lernen ;).
Falls jemand was einfällt, bitte posten. Wenn jemand den (ekelhaften) Quelltext / das Assembler listing haben will, bitte mail an: h_hochleitner {at} gmx {punkt} at , oder hier melden.