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 Alpha calling conventions and register usage.
9 Authors: Andreas Krall EMAIL: cacao@complang.tuwien.ac.at
10 Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at
12 Last Change: 1998/11/05
14 *******************************************************************************/
16 Short documentation of the Java calling conventions for the Alpha.
18 --------------------------------------------------------------------------------
21 Die Aufrufskonventionen halten sich weitgehende an die Konventionen
22 f"ur normale C-Funktionen, allerdings mit einigen zus"atzlichen
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.
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
35 Die restlichen Register folgen den normalen Konventionen, aber ich gebe
36 hier noch einmal eine kurze "Ubersicht:
41 R0 ........ method result value for types INT, LONG and ADDRESS
43 R1-R8 ..... temporary registers (destroyed by called method)
45 R9-R15 .... saved registers (left unchanged by called method)
47 R16-R21 ... argument registers 0 - 5 (contain the first six method arguments
48 of type INT, LONG and ADDRESS. Argument registers are destroyed
51 R22-R24 ... temporary registers (destroyed by called method)
53 R25 ....... code generator temporary register (destroyed by called method)
55 R26 (ra) .. return address (left unchanged by called method)
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.
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
67 R29 ....... code generator temporary register (destroyed by called method)
69 R30 (sp) .. stack pointer. The stack grows from high to low.
71 R31 ....... always contains zero
74 floating point registers:
76 F0 ........ method result value for types FLOAT and DOUBLE
78 F1 ........ temporary register (destroyed by called method)
80 F2-F9 ..... saved registers (left unchanged by called method)
82 F10-F15 ... temporary registers (destroyed by called method)
84 F16-F21 ... argument registers 0 - 5 (contain the first six method arguments
85 of type FLOAT and DOUBLE. Argument registers are destroyed
87 F22-F27 ... temporary registers (destroyed by called method)
89 F28-F30 ... code generator temporary register (destroyed by called method)
91 F31 ....... always contains zero
96 PARAMETER"UBERGABE AM STACK:
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:
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 --------------------------------------------------
112 Der Stackpointer zeigt dabei auf die Untergrenze des Parameterbereichs.
118 VOLLST"ANDIGES LAYOUT EINES STACKFRAMES:
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.
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
131 ---------------------------------------------
132 | parameter n (passed from caller) |
133 ---------------------------------------------
135 ---------------------------------------------
137 ---------------------------------------------
139 old SP ---> ============================================= --- parentargs_base
141 --------------------------------------------- savedregs_num
142 | others saved registers |
143 ============================================= --- maxmemuse + 1
144 | optional monitor_exit argument |
145 ============================================= --- maxmemuse
146 | area for spilled registers |
147 =============================================
149 ---------------------------------------------
151 ---------------------------------------------
152 | parameter 7 (passed to called method) |
153 new SP ---> =============================================