first part of mips port
[cacao.git] / mips / calling.doc
1 /* calling.doc *****************************************************************
2
3         Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
4
5         See file COPYRIGHT for information on usage and disclaimer of warranties
6
7         A short description of MIPS calling conventions and register usage.
8
9         Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
10
11         Last Change: 1998/11/05
12
13 *******************************************************************************/
14
15 Short documentation of the Java calling conventions for the MIPS.
16
17 --------------------------------------------------------------------------------
18
19
20 Die Aufrufskonventionen halten sich weitgehende an die Konventionen
21 f"ur normale C-Funktionen, allerdings mit einigen zus"atzlichen
22 Registerbelegungen:
23
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. 
27
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
32           so aufgerufen)
33
34 Die restlichen Register folgen den normalen Konventionen, aber ich gebe
35 hier noch einmal eine kurze "Ubersicht:
36
37  
38 integer registers:
39
40 R0 ........ always contains zero
41
42 R1 ........ code generator temporary register (destroyed by called method)
43
44 R2 ........ method result value for types INT, LONG and ADDRESS
45
46 R3 ........ code generator temporary register (destroyed by called method)
47
48 R4 -R11 ... argument registers 0 - 7 (contain the first six method arguments
49             of type INT, LONG and ADDRESS. Argument registers are destroyed
50             by called method)
51
52 R12-R15 ... temporary registers (destroyed by called method)
53
54 R16-R23 ... saved registers (left unchanged by called method)
55
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
59             by called method)
60
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.
65
66 R26-R27 ... reserved register (reserved for kernel)
67
68 R28 ....... saved registers (left unchanged by called method)
69
70 R29 (sp) .. stack pointer. The stack grows from high to low.
71
72 R30 ....... saved register (left unchanged by called method)
73
74 R31 (ra) .. return address (left unchanged by called method)
75
76
77 floating point registers:
78
79 F0 ........ method result value for types FLOAT and DOUBLE
80
81 F1-F3 ..... code generator temporary register (destroyed by called method)
82
83 F4 -F11 ... temporary register (destroyed by called method)
84                                 
85 F12-F19 ... argument registers 0 - 7 (contain the first 8 method arguments
86             of type FLOAT and DOUBLE. Argument registers are destroyed
87             by called method)
88
89 F20-F23 ... temporary registers (destroyed by called method)
90
91 F24 ....... saved register (left unchanged by called method)
92
93 F25 ....... temporary register (destroyed by called method)
94
95 F26 ....... saved register (left unchanged by called method)
96
97 F27 ....... temporary register (destroyed by called method)
98
99 F28 ....... saved register (left unchanged by called method)
100
101 F29 ....... temporary register (destroyed by called method)
102
103 F30 ....... saved register (left unchanged by called method)
104
105 F31 ....... temporary register (destroyed by called method)
106
107
108 PARAMETER"UBERGABE AM STACK:
109
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:
113
114
115                   | .....                                          |
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                   --------------------------------------------------
123   
124 Der Stackpointer zeigt dabei auf die Untergrenze des Parameterbereichs.
125
126
127
128
129
130 VOLLST"ANDIGES LAYOUT EINES STACKFRAMES:
131
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.
137
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 
141 angegeben):
142         
143             ---------------------------------------------
144             |  parameter n (passed from caller)         |
145             ---------------------------------------------       
146             |  parameter n-1                            |
147             ---------------------------------------------
148             | ...                                       |
149             ---------------------------------------------
150             |  parameter 7                              |
151 old SP ---> ============================================= --- parentargs_base
152             |  saved RA                                 |
153             ---------------------------------------------     savedregs_num
154             |  others saved registers                   |
155             ============================================= --- maxmemuse + 1
156             |  optional monitor_exit argument           |
157             ============================================= --- maxmemuse
158             |  area for spilled registers               |
159             =============================================
160             |  ....                                     |
161             ---------------------------------------------
162             |  parameter 8                              |
163             ---------------------------------------------
164             |  parameter 7 (passed to called method)    |
165 new SP ---> =============================================