Inline ASM: Clobberlist - kein vollständiges push/pop

Gast #5027583
Lesenswert?

Hallo,

ich habe eine zeitkritische Anwendung in meinem Inline-Assembler, wo ich 
alle Register benutze, die mir mein Controller (Xmega128A4U) zur 
Verfügung stellt. Natürlich kann man jetzt dadrüber streiten, dass ich 
die Zuweisung nicht von Hand vornehmen soll, darum gehts mir jetzt aber 
nicht.

In der Clobberlist gebe ich jedes Register an, da ich jedes benutze. In 
meinem .lss File aber sehe ich, dass er nicht alle Regiister mit 
push/pop sichert.

Das führt dazu, dass nachfolgender Code teilweise nicht mehr richtig 
funktioniert. Wenn ich alle Register von Hand push/pop zuweise gibts 
keine Probleme. Warum wird die Clobberliste nicht komplett beachtet?

Danke euch!
Persönliche Seite #5027624
Lesenswert?

Nils H. schrieb:
> Warum wird die Clobberliste nicht komplett beachtet?

Die clobber-Liste ist i.W. eine Anweisung für den Register-Allokator, 
welche Register im Inline Asm verändert werden.  R0 und R1 werden 
allerdings nicht vom Register-Allokator verwaltet, sondern quasi 
händisch.  Das wurde damals so entschieden und implementiert. 
Entsprechend muss man sich um R0 + R1 selbst kümmern, dito R16 + R17 bei 
avrtiny.

Gleiches gilt für Flags im SREG.  cc in die Clobber-Liste aufzunehmen 
hat auch keine Auswirkung bzw. ist bereits implizit in der Clobber-Liste 
drin.  Dennoch sichert der Compiler SREG nicht vor Inline Asm und stellt 
es danach wieder her.

Und Y kann auch nur dann geklabbert werden, wenn kein Frame-Pointer 
gebraucht wird.  Und SP zu clobber (also Register 33 + 34) hat auch 
keinen Effekt, weil SP nur intern verwaltet wird aber nicht vom 
Register-Allokator.
Beitrag #5027749 wurde von einem Moderator gelöscht.
Beitrag #5027767 wurde von einem Moderator gelöscht.
Beitrag #5027786 wurde von einem Moderator gelöscht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren