* Removed all Id tags.
[cacao.git] / src / vm / jit / i386 / md-abi.c
1 /* src/vm/jit/i386/md-abi.c - functions for i386 Linux ABI
2
3    Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6    J. Wenninger, Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23    02110-1301, USA.
24
25 */
26
27
28 #include "config.h"
29 #include "vm/types.h"
30
31 #include "vm/jit/i386/md-abi.h"
32
33 #include "vm/global.h"
34
35 #include "vm/jit/abi.h"
36
37 #include "vmcore/descriptor.h"
38
39
40 /* register descripton - array ************************************************/
41
42 s4 nregdescint[] = {
43     REG_RET, REG_RES, REG_RES, REG_TMP, REG_RES, REG_SAV, REG_SAV, REG_SAV,
44     REG_END
45 };
46
47 const char *abi_registers_integer_name[] = {
48         "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
49 };
50
51 const s4 abi_registers_integer_argument[] = {
52         -1,
53 };
54
55 const s4 abi_registers_integer_saved[] = {
56         5, /* s0 */
57         6, /* s1 */
58         7, /* s2 */
59 };
60
61 const s4 abi_registers_integer_temporary[] = {
62         3, /* t0 */
63 };
64
65
66 s4 nregdescfloat[] = {
67  /* rounding problems with callee saved registers */
68  /* REG_SAV, REG_SAV, REG_SAV, REG_SAV, REG_TMP, REG_TMP, REG_RES, REG_RES, */
69  /* REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_TMP, REG_RES, REG_RES, */
70     REG_RES, REG_RES, REG_RES, REG_RES, REG_RES, REG_RES, REG_RES, REG_RES,
71     REG_END
72 };
73
74 const s4 abi_registers_float_argument[] = {
75         -1,
76 };
77
78 const s4 abi_registers_float_saved[] = {
79         -1,
80 };
81
82 const s4 abi_registers_float_temporary[] = {
83         -1,
84 };
85
86
87 /* md_param_alloc **************************************************************
88
89    Allocate Arguments to Stackslots according the Calling Conventions
90
91    --- in
92    md->paramcount:           Number of arguments for this method
93    md->paramtypes[].type:    Argument types
94    
95    --- out
96    md->params[].inmemory:    Argument spilled on stack
97    md->params[].regoff:      Stack offset or rd->arg[int|flt]regs index
98    md->memuse:               Stackslots needed for argument spilling
99    md->argintreguse:         max number of integer arguments used
100    md->argfltreguse:         max number of float arguments used
101
102 *******************************************************************************/
103
104 void md_param_alloc(methoddesc *md)
105 {
106         paramdesc *pd;
107         int        stacksize;
108         int        i;
109
110         pd = md->params;
111         stacksize = 0;
112
113         for (i = 0; i < md->paramcount; i++, pd++) {
114                 pd->inmemory = true;
115                 pd->index    = stacksize;
116                 pd->regoff   = stacksize * 8;
117                 stacksize++;
118         }
119
120         md->memuse       = stacksize;
121         md->argintreguse = 0;
122         md->argfltreguse = 0;
123 }
124
125
126 /* md_param_alloc_native *******************************************************
127
128    Pre-allocate arguments according the native ABI.
129
130 *******************************************************************************/
131
132 void md_param_alloc_native(methoddesc *md)
133 {
134         paramdesc *pd;
135         int        stacksize;
136         int        i;
137
138         pd = md->params;
139         stacksize = 0;
140
141         for (i = 0; i < md->paramcount; i++, pd++) {
142                 pd->inmemory  = true;
143                 pd->index     = stacksize;
144                 pd->regoff    = stacksize * 4;
145                 stacksize    += IS_2_WORD_TYPE(md->paramtypes[i].type) ? 2 : 1;
146         }
147
148         md->memuse       = stacksize;
149         md->argintreguse = 0;
150         md->argfltreguse = 0;
151 }
152
153
154 /* md_return_alloc *************************************************************
155
156    No straight forward precoloring of the Java Stackelement containing
157    the return value possible for i386, since it uses "reserved"
158    registers for return values
159
160 *******************************************************************************/
161
162 void md_return_alloc(jitdata *jd, stackptr stackslot)
163 {
164         /* nothing */
165 }
166
167
168 /*
169  * These are local overrides for various environment variables in Emacs.
170  * Please do not remove this and leave it at the end of the file, where
171  * Emacs will automagically detect them.
172  * ---------------------------------------------------------------------
173  * Local variables:
174  * mode: c
175  * indent-tabs-mode: t
176  * c-basic-offset: 4
177  * tab-width: 4
178  * End:
179  */