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 A short description of MIPS calling conventions and register usage.
9 Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at
11 Last Change: 1998/11/05
13 *******************************************************************************/
15 Short documentation of the Java calling conventions for the MIPS.
17 --------------------------------------------------------------------------------
20 Die Aufrufskonventionen halten sich weitgehende an die Konventionen
21 f"ur normale C-Funktionen, allerdings mit einigen zus"atzlichen
24 R28 ..... enth"alt bei einem Methodenaufruf auf jeden Fall den Zeiger
25 auf die zugeh"orige 'methodinfo'-Struktur, die gegebenenfalls an
26 den JIT-Compiler weitergegeben werden muss.
28 Wenn von Java-Methoden aus direkt C-Funktionen aufgerufen werden,
29 (f"ur die nat"urlich auch keine 'methodinfo'-Struktur existiert),
30 dann hat dieses Register keinen definierten Wert (Alle von der
31 JavaVM verwendeten Funktionen, z. B. 'builtin_new', etc. werden
34 Die restlichen Register folgen den normalen Konventionen, aber ich gebe
35 hier noch einmal eine kurze "Ubersicht:
40 R0 ........ always contains zero
42 R1 ........ code generator temporary register (destroyed by called method)
44 R2 ........ method result value for types INT, LONG and ADDRESS
46 R3 ........ code generator temporary register (destroyed by called method)
48 R4 -R11 ... argument registers 0 - 7 (contain the first six method arguments
49 of type INT, LONG and ADDRESS. Argument registers are destroyed
52 R12-R15 ... temporary registers (destroyed by called method)
54 R16-R23 ... saved registers (left unchanged by called method)
56 R24 ....... pointer to 'methodinfo' structure. This register has to be set
57 correctly, because it is needed in the case the jit is invoked.
58 Also used as code generator temporary register. It is destroyed
61 R25 (pv) .. procedure vector, points to the first instruction of the called
62 method. This vector is used for addressing the entries in the
63 data segment. The ov of the caller is recomputed from the ra.
64 Therefore it is necessary that a return is always done using ra.
66 R26-R27 ... reserved register (reserved for kernel)
68 R28 ....... saved registers (left unchanged by called method)
70 R29 (sp) .. stack pointer. The stack grows from high to low.
72 R30 ....... saved register (left unchanged by called method)
74 R31 (ra) .. return address (left unchanged by called method)
77 floating point registers:
79 F0 ........ method result value for types FLOAT and DOUBLE
81 F1-F3 ..... code generator temporary register (destroyed by called method)
83 F4 -F11 ... temporary register (destroyed by called method)
85 F12-F19 ... argument registers 0 - 7 (contain the first 8 method arguments
86 of type FLOAT and DOUBLE. Argument registers are destroyed
89 F20-F23 ... temporary registers (destroyed by called method)
91 F24 ....... saved register (left unchanged by called method)
93 F25 ....... temporary register (destroyed by called method)
95 F26 ....... saved register (left unchanged by called method)
97 F27 ....... temporary register (destroyed by called method)
99 F28 ....... saved register (left unchanged by called method)
101 F29 ....... temporary register (destroyed by called method)
103 F30 ....... saved register (left unchanged by called method)
105 F31 ....... temporary register (destroyed by called method)
108 PARAMETER"UBERGABE AM STACK:
110 Bei mehr als sechs Parametern reicht der Platz in den Registern nicht mehr
111 aus, daf"ur werden alle Parameter ab dem Siebenten am Stack "ubergeben,
112 und zwar nach folgendem Muster:
116 --------------------------------------------------
117 | Parameter 9 ( 64 bit, egal bei welchem Typ) |
118 --------------------------------------------------
119 | Parameter 8 ( 64 bit, egal bei welchem Typ |
120 --------------------------------------------------
121 R30 (sp) ---> | Parameter 7 ( 64 bit, egal bei welchem Typ) |
122 --------------------------------------------------
124 Der Stackpointer zeigt dabei auf die Untergrenze des Parameterbereichs.
130 VOLLST"ANDIGES LAYOUT EINES STACKFRAMES:
132 Jede Methode muss (wenn es keine Leaf-Methode ist, auf jeden Fall) gewisse
133 Registerinhalte am Stack sichern.
134 Eventuell werden auch noch lokale Werte, die nicht mehr in Registern
135 Platz finden, ebenfalls am Stack aufbewahrt, und die Parameter"ubergabe
136 bei mehr als 6 Parametern ben"otigt ebenfalls Platz am Stack.
138 Ein vollst"andiger Stackframe hat also dieses Aussehen (jeder Eintrag
139 im Stackframe ist unabh"angig vom Typ auf jedem Fall 64 bit lang, die
140 Gr"ossenangaben der Bereiche sind in solchen Einheiten von 64 Bit
143 ---------------------------------------------
144 | parameter n (passed from caller) |
145 ---------------------------------------------
147 ---------------------------------------------
149 ---------------------------------------------
151 old SP ---> ============================================= --- parentargs_base
153 --------------------------------------------- savedregs_num
154 | others saved registers |
155 ============================================= --- maxmemuse + 1
156 | optional monitor_exit argument |
157 ============================================= --- maxmemuse
158 | area for spilled registers |
159 =============================================
161 ---------------------------------------------
163 ---------------------------------------------
164 | parameter 7 (passed to called method) |
165 new SP ---> =============================================