mikrocontroller.net

Forum: Compiler & IDEs Calling Convention ARMGCC


Autor: Sam .. (sam1994)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Der folgende Code bietet sich eigentlich für das ABI der ARM-Architektur 
an:
while(...)
  x = func_ptr[i++](x);

Nach diesem Dokument http://caxapa.ru/thumbs/656023/IHI0042F_aapcs.pdf
sind R0-R3 auch sowohl Argument- als auch Resultregister. Daher müsste 
der Compiler nur einmal die Argumentregister befüllen und danach die 
Finger davon lassen. Allerdings bekomme ich vom Compiler andere 
Ergebnisse:

int => ok
double => ok
struct{int a;} => ok
struct{double a;} => Übergabe r2/r3; Ergebnis über Stack
struct{int a, b;} => Übergabe r1/r2; Ergebnis über Stack, nur 
komplizierter

Kompiliert wurde mit:
arm-none-eabi-g++.exe -S -O3 -mcpu=cortex-m4 test.cpp -mthumb -mabi=aapcs

Vielleicht kennt sich hier jemand damit aus und weiß, wo dieses 
Verhalten dokumentiert ist.

Autor: PittyJ (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Bei Links aus .ru bin ich immer vorsichtig. Da bekommt man dann Dinge 
mit dabei, die man nie wieder los wird.

Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war das erste was ich gefunden hatte. Hier ist das offizielle 
Dokument:

http://infocenter.arm.com/help/topic/com.arm.doc.i...

Autor: Ingo K. (unseen)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Sam .. schrieb:
> struct{int a;} => ok

Die struct ist klein genug, um in r0 zu passen und wird daher darin 
zurückgegeben.

> struct{double a;} => Übergabe r2/r3; Ergebnis über Stack

Die struct passt nicht mehr in die 4 Byte eines Registers und daher muss 
der Rückgabewert über den Stack laufen. Dazu wird in r0 die Adresse 
übergeben, an der das Ergebnis gespeichert werden soll. Der beim Aufruf 
übergebene double landet in r2/r3, weil doubles nur in den 
Registerpaaren r0/r1 oder r2/r3 übergeben werden dürfen, r1 blebt 
unbenutzt.

> struct{int a, b;} => Übergabe r1/r2; Ergebnis über Stack, nur
> komplizierter

Gleiches Prinzip wie vorher, aber da a und b nur 32-Bit-Werte sind 
können sie in r1 und r2 übergeben werden.

> Vielleicht kennt sich hier jemand damit aus und weiß, wo dieses
> Verhalten dokumentiert ist.

ARM IHI 0042F, "Procedure Call Standard for the ARM® Architecture", u.a. 
Abschnitte 5.4 (Result Return) und 5.5 (Parameter Passing)

: Bearbeitet durch User
Autor: Sam .. (sam1994)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo K. schrieb:
> ARM IHI 0042F, "Procedure Call Standard for the ARM® Architecture", u.a.
> Abschnitte 5.4 (Result Return) und 5.5 (Parameter Passing)

Ah, jetzt sehe ich es auch. Den entscheidenen Abschnitt habe ich wohl 
überlesen.
A Composite Type larger than 4 bytes, or whose size cannot be determined statically by both caller and 
callee, is stored in memory at an address passed as an extra argument when the function was called 
(§5.5, 
rule A.4)
.

D.h. es gibt wohl nur die Möglichkeit, einen "128
-bit containerized vector" als Rückgabewert für das gewünschte Verhalten 
zu nehmen. Darunter scheinen wohl nur die SIMD-Datentypen zu fallen, 
oder kann man da irgendwie tricksen?

Autor: Mw E. (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll die funktion den tun, sodass es auf das letzte Quäntchen 
Leistung ankommt?

Ansonsten nen Pointer auf das struct übergeben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.