Fixed various bugs. Most noteworthy: A bug that lead to unnecessary marking;
[cacao.git] / alpha / 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 Alpha calling conventions and register usage.
8
9         Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
10                  Reinhard Grafl      EMAIL: cacao@complang.tuwien.ac.at
11
12         Last Change: 1998/11/05
13
14 *******************************************************************************/
15
16 Short documentation of the Java calling conventions for the Alpha.
17
18 --------------------------------------------------------------------------------
19
20
21 Die Aufrufskonventionen halten sich weitgehende an die Konventionen
22 f"ur normale C-Funktionen, allerdings mit einigen zus"atzlichen
23 Registerbelegungen:
24
25 R28 ..... enth"alt bei einem Methodenaufruf auf jeden Fall den Zeiger 
26           auf die zugeh"orige 'methodinfo'-Struktur, die gegebenenfalls an
27           den JIT-Compiler weitergegeben werden muss. 
28
29           Wenn von Java-Methoden aus direkt C-Funktionen aufgerufen werden,
30           (f"ur die nat"urlich auch keine 'methodinfo'-Struktur existiert),
31           dann hat dieses Register keinen definierten Wert (Alle von der
32           JavaVM verwendeten Funktionen, z. B. 'builtin_new', etc. werden
33           so aufgerufen)
34
35 Die restlichen Register folgen den normalen Konventionen, aber ich gebe
36 hier noch einmal eine kurze "Ubersicht:
37
38  
39 integer registers:
40
41 R0 ........ method result value for types INT, LONG and ADDRESS
42
43 R1-R8 ..... temporary registers (destroyed by called method)
44
45 R9-R15 .... saved registers (left unchanged by called method)
46
47 R16-R21 ... argument registers 0 - 5 (contain the first six method arguments
48             of type INT, LONG and ADDRESS. Argument registers are destroyed
49             by called method)
50
51 R22-R24 ... temporary registers (destroyed by called method)
52
53 R25 ....... code generator temporary register (destroyed by called method)
54
55 R26 (ra) .. return address (left unchanged by called method)
56
57 R27 (pv) .. procedure vector, points to the first instruction of the called
58             method. This vector is used for addressing the entries in the
59             data segment. The ov of the caller is recomputed from the ra.
60             Therefore it is necessary that a return is always done using ra.
61
62 R28 ....... pointer to 'methodinfo' structure. This register has to be set
63             correctly, because it is needed in the case the jit is invoked.
64             Also used as code generator temporary register. It isdestroyed
65             by called method)
66
67 R29 ....... code generator temporary register (destroyed by called method)
68
69 R30 (sp) .. stack pointer. The stack grows from high to low.
70
71 R31 ....... always contains zero
72
73  
74 floating point registers:
75
76 F0 ........ method result value for types FLOAT and DOUBLE
77
78 F1 ........ temporary register (destroyed by called method)
79                                 
80 F2-F9 ..... saved registers (left unchanged by called method)
81
82 F10-F15 ... temporary registers (destroyed by called method)
83
84 F16-F21 ... argument registers 0 - 5 (contain the first six method arguments
85             of type FLOAT and DOUBLE. Argument registers are destroyed
86             by called method)
87 F22-F27 ... temporary registers (destroyed by called method)
88
89 F28-F30 ... code generator temporary register (destroyed by called method)
90
91 F31 ....... always contains zero
92
93
94
95
96 PARAMETER"UBERGABE AM STACK:
97
98 Bei mehr als sechs Parametern reicht der Platz in den Registern nicht mehr
99 aus, daf"ur werden alle Parameter ab dem Siebenten am Stack "ubergeben,
100 und zwar nach folgendem Muster:
101
102
103                   | .....                                          |
104                                   --------------------------------------------------
105                   |  Parameter 9  ( 64 bit, egal bei welchem Typ)  |
106                   --------------------------------------------------
107                                   |  Parameter 8  ( 64 bit, egal bei welchem Typ   |
108                   --------------------------------------------------
109    R30 (sp) --->  |  Parameter 7  ( 64 bit, egal bei welchem Typ)  |
110                   --------------------------------------------------
111   
112 Der Stackpointer zeigt dabei auf die Untergrenze des Parameterbereichs.
113
114
115
116
117
118 VOLLST"ANDIGES LAYOUT EINES STACKFRAMES:
119
120 Jede Methode muss (wenn es keine Leaf-Methode ist, auf jeden Fall) gewisse
121 Registerinhalte am Stack sichern.
122 Eventuell werden auch noch lokale Werte, die nicht mehr in Registern
123 Platz finden, ebenfalls am Stack aufbewahrt, und die Parameter"ubergabe
124 bei mehr als 6 Parametern ben"otigt ebenfalls Platz am Stack.
125
126 Ein vollst"andiger Stackframe hat also dieses Aussehen (jeder Eintrag
127 im Stackframe ist unabh"angig vom Typ auf jedem Fall 64 bit lang, die
128 Gr"ossenangaben der Bereiche sind in solchen Einheiten von 64 Bit 
129 angegeben):
130         
131             ---------------------------------------------
132             |  parameter n (passed from caller)         |
133             ---------------------------------------------       
134             |  parameter n-1                            |
135             ---------------------------------------------
136             | ...                                       |
137             ---------------------------------------------
138             |  parameter 7                              |
139 old SP ---> ============================================= --- parentargs_base
140             |  saved RA                                 |
141             ---------------------------------------------     savedregs_num
142             |  others saved registers                   |
143             ============================================= --- maxmemuse + 1
144             |  optional monitor_exit argument           |
145             ============================================= --- maxmemuse
146             |  area for spilled registers               |
147             =============================================
148             |  ....                                     |
149             ---------------------------------------------
150             |  parameter 8                              |
151             ---------------------------------------------
152             |  parameter 7 (passed to called method)    |
153 new SP ---> =============================================