1 /***************************** calling.doc *************************************
3 Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
5 See file COPYRIGHT for information on usage and disclaimer of warranties
7 Das ist eine kurze Dokumentation "uber die internen Aufrufskonventionen
8 der Java-Methoden in der DEC-ALHPA-Version.
10 Author: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
12 Last Change: 1997/02/05
14 *******************************************************************************/
17 Das ist eine kurze Dokumentation "uber die internen Aufrufskonventionen
18 der Java-Methoden in der DEC-ALHPA-Version.
20 -------------------------------------------------------------------------------
23 Die Aufrufskonventionen halten sich weitgehende an die Konventionen
24 f"ur normale C-Funktionen, allerdings mit einigen zus"atzlichen
27 R28 ..... enth"alt bei einem Methodenaufruf auf jeden Fall den Zeiger
28 auf die zugeh"orige 'methodinfo'-Struktur, die gegebenenfalls an
29 den JIT-Compiler weitergegeben werden muss.
31 Wenn von Java-Methoden aus direkt C-Funktionen aufgerufen werden,
32 (f"ur die nat"urlich auch keine 'methodinfo'-Struktur existiert),
33 dann hat dieses Register keinen definierten Wert (Alle von der
34 JavaVM verwendeten Funktionen, z. B. 'builtin_new', etc. werden
37 R1 ...... enth"alt nach Methodenbeendigung entweder NULL oder einen Zeiger
38 auf ein Objekt vom Typ java.lang.Throwable (oder einem davon
40 Wenn das der Fall ist, dann wurde in der Methode eine Exception
41 geworfen, die nicht abgefangen werden konnte, und jetzt beim
42 Aufrufer weiter bearbeitet werden muss.
46 Die restlichen Register folgen den normalen Konventionen, aber ich gebe
47 hier noch einmal eine kurze "Ubersicht:
52 R0 ........ R"uckgabewert von den Methoden f"ur die Typen:
55 R1 ........ Adresse der geworfenen Exception (oder NULL)
57 R2-R8 ..... tempor"are Register (werden im Unterprogram zerst"ort)
59 R9-R15 .... gesicherte Register (werden im Unterprogramm nicht ver"andert)
61 R16-R21 ... Argumentregister 1 - 6 (hier werden die ersten sechs Methoden-
62 Argumente eingetragen, sofern sie von den Typen INT,LONG,ADDRESS
63 sind. Diese Argumentregister werden im Unterprogramm zerst"ort
65 R22-R24 ... tempor"are Register
66 (werden im Unterprogramm zerst"ort)
68 R25 ....... tempor"ares Register f"ur kurzfristige Zwischenergebnisse
69 (wird im Unterprogramm zerst"ort)
71 R26 (ra) .. R"ucksprungadresse (bleibt im Unterprogramm erhalten)
73 R27 (pv) .. Prozedurzeiger. Dieses Register muss auf jeden Fall einen Zeiger
74 auf die aufgerufene Prozedur enthalten (damit die Zugriffe
75 auf das Datensegment funktionieren k"onnen).
76 (der Wert bleibt im Unterprogramm erhalten)
78 R28 ....... Zeiger auf die 'methodinfo' - Struktur. Muss auf jeden Fall bei
79 allen Methodenaufrufen richtig gesetzt sein (wegen eines eventuellen
81 (wird im Unterprogramm zerst"ort)
83 R29 ....... tempor"ares Register f"ur kurzfristige Zwischenergebnisse
84 (wird im Unterprogramm zerst"ort)
86 R30 (sp) .. Zeiger auf die Untergrenze des Stack (der Stack w"achst von
89 R31 ....... enth"alt immer NULL
96 F0 ........ enth"alt die R"uckgabewert der Methoden vom Typ:
98 F1 ........ enth"alt den Imagin"aranteil von einem komplexen Funktionswert
99 (wird von mir nicht benutzt)
101 F2-F9 ..... gesicherte Register (werden im Unterprogramm nicht ver"andert)
103 F10-F15 ... tempor"are Register (werden im Unterprogramm zerst"ort)
105 F16-F21 ... Argumentregister f"ur die ersten 6 Parameter, sofern diese
106 vom den Typen FLOAT oder DOUBLE sind
108 F22-F24 ... tempor"are Register (werden im Unterprogramm zerst"ort)
110 F25-F31 ... tempor"are Register f"ur kurzfristige Zwischenergebnisse
111 (werden im Unterprogramm zerst"ort)
113 F31 ....... enth"alt immer 0.0
117 PARAMETER"UBERGABE AM STACK:
119 Bei mehr als sechs Parametern reicht der Platz in den Registern nicht mehr
120 aus, daf"ur werden alle Parameter ab dem Siebenten am Stack "ubergeben,
121 und zwar nach folgendem Muster:
125 --------------------------------------------------
126 | Parameter 9 ( 64 bit, egal bei welchem Typ) |
127 --------------------------------------------------
128 | Parameter 8 ( 64 bit, egal bei welchem Typ |
129 --------------------------------------------------
130 R30 (sp) ---> | Parameter 7 ( 64 bit, egal bei welchem Typ) |
131 --------------------------------------------------
133 Der Stackpointer zeigt dabei auf die Untergrenze des Parameterbereichs.
139 VOLLST"ANDIGES LAYOUT EINES STACKFRAMES:
141 Jede Methode muss (wenn es keine Leaf-Methode ist, auf jeden Fall) gewisse
142 Registerinhalte am Stack sichern.
143 Eventuell werden auch noch lokale Werte, die nicht mehr in Registern
144 Platz finden, ebenfalls am Stack aufbewahrt, und die Parameter"ubergabe
145 bei mehr als 6 Parametern ben"otigt ebenfalls Platz am Stack.
147 Ein vollst"andiger Stackframe hat also dieses Aussehen (jeder Eintrag
148 im Stackframe ist unabh"angig vom Typ auf jedem Fall 64 bit lang, die
149 Gr"ossenangaben der Bereiche sind in solchen Einheiten von 64 Bit
152 ---------------------------------------------
153 | Parameter n (vom Aufrufer) |
154 ---------------------------------------------
156 ---------------------------------------------
158 ---------------------------------------------
159 SP vorher -> | Parameter 7 |
160 ============================================= ---
161 | gesichertes RA | savedregs_num
162 ---------------------------------------------
163 | andere gesicherte Register |
164 ============================================= ---
165 | Platz f"ur lokale Werte, die nicht mehr | localvars_num
166 | in Register passen |
167 ============================================= ---
168 | .... | arguments_num
169 ---------------------------------------------
171 ---------------------------------------------
172 SP ---> | Parameter 7 (f"ur aufgerufenen Methoden) |
173 ============================================= ---
176 Damit die Anf"ange der einzelnen Bereiche (im Codegenerator) leichter
177 ausgedr"uckt werden k"onnen, sind ein paar Hilfsvariablen vorgesehen, die
178 die Adressierung der einzelnen Bereiche vereinfachen:
179 localvars_base = arguments_num
180 savedregs_base = localvars_base + localvars_num
181 parentargs_base = savedregs_base + savedregs_num