Hallo!
Gibt's beim Upgrade von WinAVR irgendwas zu beachten? Ich hatte bis vor
kurzem WinAVR 2006 installiert. Jetzt hab ich auf WinAVR 2007 upgedated
und meinen Webserver neucompiliert. Leider funktioniert nun die
Checksummenberechnung nicht mehr.
m4444x wrote:
> Sieht so aus als ob die Funktion in 'inline' umgewandelt wird.
Ja. Der Compiler hat keine Ahnung, dass dein inline asm statement
ziemlich länglich ist. Für ihn ist es ein einzelnes statement (insn),
und das lohnt es sich allemal zu inlinen.
Du kannst das ggf. mit __attribute__((noinline)) verhindern.
> Aber warum tut er R31:R30 doppelt belegen?!?
Hast du mal ein aufs Minimum zusammengestrichenes Codeschnipsel, damit
man es selbst durch den Compiler schieben kann?
Das scheint schon zu reichen, um den Fehler zu reproduzieren.
Danke für den Tip mit dem noinline. Aber ich werd' wohl erstmal wieder
mit dem alten gcc compilieren.
Den Regeln von GCC entsprechend dürfen Input- und Output-Operand im
gleichen Register landen, sofern das nicht ausdrücklich verboten wurde.
Das ist also nicht das Problem des Compilers, sondern wie üblich des
Programmierers, der die Doku nicht genau genug gelesen hat:
"Unless an output operand has the `&' constraint modifier, GCC may
allocate it in the same register as an unrelated input operand, on the
assumption the inputs are consumed before the outputs are produced. This
assumption may be false if the assembler code actually consists of more
than one instruction. In such a case, use `&' for each output operand
that may not overlap an input."