1 /* src/vm/jit/i386/icm_uses_reg_res.inc - Table for reserved register usage
3 Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4 R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5 C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6 Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
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.
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.
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., 59 Temple Place - Suite 330, Boston, MA
25 Contact: cacao@complang.tuwien.ac.at
27 Authors: Christian Ullrich
30 #define NO 0 /* Register survives this ICMD */
31 #define S 1 /* Register can not be a source operand */
32 #define D 2 /* Register can not be a destination operand */
33 #define YES 4 /* Register does not survive this ICMD */
35 int lsra_reg_res[REG_RES_CNT]={EAX, ECX, EDX};
37 int icmd_uses_reg_res[256][REG_RES_CNT + 1] ={
38 /*EAX, ECX, EDX, OUTPUT */
39 { NO, NO, NO, REG_NULL}, /* ICMD_NOP */
40 { YES, NO, NO, REG_NULL}, /* ICMD_ACONST */
41 { NO, NO, NO, REG_NULL}, /* ICMD_NULLCHECKPOP */
42 { NO, NO, NO, REG_NULL}, /* ICMD_ICONST */
43 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF4 */
44 { YES, NO, NO, REG_NULL}, /* ICMD_IDIVPOW2 */
45 { YES, YES, NO, REG_NULL}, /* ICMD_LDIVPOW2 */
46 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF7 */
47 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF8 */
48 { NO, NO, NO, REG_NULL}, /* ICMD_LCONST */
49 { YES, YES, YES, REG_NULL}, /* ICMD_LCMPCONST */
50 { YES, NO, NO, REG_NULL}, /* ICMD_FCONST */
51 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF12 */
52 { YES, YES, YES, REG_NULL}, /* ICMD_ELSE_ICONST */
53 { YES, NO, NO, REG_NULL}, /* ICMD_DCONST */
54 { YES, YES, YES, REG_NULL}, /* ICMD_IFEQ_ICONST */
55 { YES, YES, YES, REG_NULL}, /* ICMD_IFNE_ICONST */
56 { YES, YES, YES, REG_NULL}, /* ICMD_IFLT_ICONST */
57 { YES, YES, YES, REG_NULL}, /* ICMD_IFGE_ICONST */
58 { YES, YES, YES, REG_NULL}, /* ICMD_IFGT_ICONST */
59 { YES, YES, YES, REG_NULL}, /* ICMD_IFLE_ICONST */
60 { YES, NO, NO, REG_NULL}, /* ICMD_ILOAD */
61 { NO, NO, NO, REG_NULL}, /* ICMD_LLOAD */
62 { NO, NO, NO, REG_NULL}, /* ICMD_FLOAD */
63 { NO, NO, NO, REG_NULL}, /* ICMD_DLOAD */
64 { YES, NO, NO, REG_NULL}, /* ICMD_ALOAD */
65 { NO, NO, NO, REG_NULL}, /* ICMD_IADDCONST */
66 { NO, NO, NO, REG_NULL}, /* ICMD_ISUBCONST */
67 { YES, NO, NO, REG_NULL}, /* ICMD_IMULCONST */
68 { YES, NO, NO, REG_NULL}, /* ICMD_IANDCONST */
69 { YES, NO, NO, REG_NULL}, /* ICMD_IORCONST */
70 { YES, NO, NO, REG_NULL}, /* ICMD_IXORCONST */
71 { YES, NO, NO, REG_NULL}, /* ICMD_ISHLCONST */
72 { YES, NO, NO, REG_NULL}, /* ICMD_ISHRCONST */
73 { YES, NO, NO, REG_NULL}, /* ICMD_IUSHRCONST */
74 { YES, YES, NO, REG_NULL}, /* ICMD_IREMPOW2 */
75 { NO, NO, NO, REG_NULL}, /* ICMD_LADDCONST */
76 { YES, NO, NO, REG_NULL}, /* ICMD_LSUBCONST */
77 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_LMULCONST */
78 { NO, NO, NO, REG_NULL}, /* ICMD_LANDCONST */
79 { NO, NO, NO, REG_NULL}, /* ICMD_LORCONST */
80 { NO, NO, NO, REG_NULL}, /* ICMD_LXORCONST */
81 { YES, YES, NO, REG_NULL}, /* ICMD_LSHLCONST */
82 { YES, YES, NO, REG_NULL}, /* ICMD_LSHRCONST */
83 { YES, YES, NO, REG_NULL}, /* ICMD_LUSHRCONST */
84 { YES, YES, NO, REG_NULL}, /* ICMD_LREMPOW2 */
85 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_IALOAD */
86 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_LALOAD */
87 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_FALOAD */
88 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_DALOAD */
89 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_AALOAD */
90 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_BALOAD */
91 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_CALOAD */
92 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_SALOAD */
93 { YES, NO, NO, REG_NULL}, /* ICMD_ISTORE */
94 { NO, NO, NO, REG_NULL}, /* ICMD_LSTORE */
95 { NO, NO, NO, REG_NULL}, /* ICMD_FSTORE */
96 { NO, NO, NO, REG_NULL}, /* ICMD_DSTORE */
97 { YES, NO, NO, REG_NULL}, /* ICMD_ASTORE */
98 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LEQ */
99 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LNE */
100 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LLT */
101 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LGE */
102 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LGT */
103 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LLE */
104 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LCMPEQ */
105 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LCMPNE */
106 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LCMPLT */
107 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LCMPGE */
108 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LCMPGT */
109 { YES, YES, YES, REG_NULL}, /* ICMD_IF_LCMPLE */
110 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF71 */
111 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF72 */
112 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF73 */
113 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF74 */
114 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF75 */
115 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF76 */
116 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF77 */
117 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF78 */
118 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_IASTORE */
119 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_LASTORE */
120 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_FASTORE */
121 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_DASTORE */
122 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_AASTORE */
123 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_BASTORE */
124 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_CASTORE */
125 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_SASTORE */
126 { NO, NO, NO, REG_NULL}, /* ICMD_POP */
127 { NO, NO, NO, REG_NULL}, /* ICMD_POP2 */
128 {YES|S|D,NO, NO, REG_NULL}, /* ICMD_DUP */
129 {YES|S|D,NO, NO, REG_NULL}, /* ICMD_DUP_X1 */
130 {YES|S|D,NO, NO, REG_NULL}, /* ICMD_DUP_X2 */
131 {YES|S|D,NO, NO, REG_NULL}, /* ICMD_DUP2 */
132 {YES|S|D,NO, NO, REG_NULL}, /* ICMD_DUP2_X1 */
133 {YES|S|D,NO, NO, REG_NULL}, /* ICMD_DUP2_X2 */
134 {YES|S|D,NO, NO, REG_NULL}, /* ICMD_SWAP */
135 { S|YES, NO, NO, REG_NULL}, /* ICMD_IADD */
136 { S|YES, NO, NO, REG_NULL}, /* ICMD_LADD */
137 { NO, NO, NO, REG_NULL}, /* ICMD_FADD */
138 { NO, NO, NO, REG_NULL}, /* ICMD_DADD */
139 { S|YES, NO, NO, REG_NULL}, /* ICMD_ISUB */
140 { YES, NO, NO, REG_NULL}, /* ICMD_LSUB */
141 { NO, NO, NO, REG_NULL}, /* ICMD_FSUB */
142 { NO, NO, NO, REG_NULL}, /* ICMD_DSUB */
143 { S|YES, NO, NO, EAX}, /* ICMD_IMUL */
144 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_LMUL */
145 { NO, NO, NO, REG_NULL}, /* ICMD_FMUL */
146 { NO, NO, NO, REG_NULL}, /* ICMD_DMUL */
147 { S|YES, S|YES, S|YES, EAX}, /* ICMD_IDIV */ /* Really uses EDX? */
148 { YES, YES, YES, REG_NULL}, /* ICMD_LDIV */
149 { NO, NO, NO, REG_NULL}, /* ICMD_FDIV */
150 { NO, NO, NO, REG_NULL}, /* ICMD_DDIV */
151 { S|YES, S|YES, S|YES, EDX}, /* ICMD_IREM */ /* last checked */
152 { YES, YES, YES, REG_NULL}, /* ICMD_LREM */
153 { NO, NO, NO, REG_NULL}, /* ICMD_FREM */
154 { NO, NO, NO, REG_NULL}, /* ICMD_DREM */
155 { YES, NO, NO, REG_NULL}, /* ICMD_INEG */
156 { YES, NO, NO, REG_NULL}, /* ICMD_LNEG */
157 { NO, NO, NO, REG_NULL}, /* ICMD_FNEG */
158 { NO, NO, NO, REG_NULL}, /* ICMD_DNEG */
159 { YES, D|S|YES, NO, REG_NULL}, /* ICMD_ISHL */
160 { S|YES, YES, S|YES, REG_NULL}, /* ICMD_LSHL */
161 { YES, D|S|YES, NO, REG_NULL}, /* ICMD_ISHR */
162 { S|YES, YES, S|YES, REG_NULL}, /* ICMD_LSHR */
163 { YES, D|S|YES, NO, REG_NULL}, /* ICMD_IUSHR */
164 { S|YES, YES, S|YES, REG_NULL}, /* ICMD_LUSHR */
165 { S|YES, NO, NO, REG_NULL}, /* ICMD_IAND */
166 { YES, NO, NO, REG_NULL}, /* ICMD_LAND */
167 { S|YES, NO, NO, REG_NULL}, /* ICMD_IOR */
168 { YES, NO, NO, REG_NULL}, /* ICMD_LOR */
169 { S|YES, NO, NO, REG_NULL}, /* ICMD_IXOR */
170 { YES, NO, NO, REG_NULL}, /* ICMD_LXOR */
171 { NO, NO, NO, REG_NULL}, /* ICMD_IINC */
172 { YES, NO, YES, REG_NULL}, /* ICMD_I2L */
173 { S|YES, NO, NO, REG_NULL}, /* ICMD_I2F */
174 { S|YES, NO, NO, REG_NULL}, /* ICMD_I2D */
175 { YES, NO, NO, REG_NULL}, /* ICMD_L2I */
176 { NO, NO, NO, REG_NULL}, /* ICMD_L2F */
177 { NO, NO, NO, REG_NULL}, /* ICMD_L2D */
178 { D|YES, NO, NO, EAX}, /* ICMD_F2I */
179 { YES, NO, YES, REG_NULL}, /* ICMD_F2L */
180 { NO, NO, NO, REG_NULL}, /* ICMD_F2D */
181 { D|YES, NO, NO, EAX}, /* ICMD_D2I */
182 { YES, NO, YES, REG_NULL}, /* ICMD_D2L */
183 { NO, NO, NO, REG_NULL}, /* ICMD_D2F */
184 { YES, NO, NO, REG_NULL}, /* ICMD_INT2BYTE */
185 { YES, NO, NO, REG_NULL}, /* ICMD_INT2CHAR */
186 { YES, NO, NO, REG_NULL}, /* ICMD_INT2SHORT */
187 { YES, YES, YES, REG_NULL}, /* ICMD_LCMP */
188 { YES, NO, NO, REG_NULL}, /* ICMD_FCMPL */
189 { YES, NO, NO, REG_NULL}, /* ICMD_FCMPG */
190 { YES, NO, NO, REG_NULL}, /* ICMD_DCMPL */
191 { YES, NO, NO, REG_NULL}, /* ICMD_DCMPG */
192 { YES, YES, YES, REG_NULL}, /* ICMD_IFEQ */
193 { YES, YES, YES, REG_NULL}, /* ICMD_IFNE */
194 { YES, YES, YES, REG_NULL}, /* ICMD_IFLT */
195 { YES, YES, YES, REG_NULL}, /* ICMD_IFGE */
196 { YES, YES, YES, REG_NULL}, /* ICMD_IFGT */
197 { YES, YES, YES, REG_NULL}, /* ICMD_IFLE */
198 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ICMPEQ */
199 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ICMPNE */
200 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ICMPLT */
201 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ICMPGE */
202 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ICMPGT */
203 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ICMPLE */
204 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ACMPEQ */
205 { YES, YES, YES, REG_NULL}, /* ICMD_IF_ACMPNE */
206 { YES, YES, YES, REG_NULL}, /* ICMD_GOTO */
207 { YES, YES, YES, REG_NULL}, /* ICMD_JSR */
208 { YES, YES, YES, REG_NULL}, /* ICMD_RET */
209 { YES, YES, YES, REG_NULL}, /* ICMD_TABLESWITCH */
210 { YES, YES, YES, REG_NULL}, /* ICMD_LOOKUPSWITCH */
211 { YES, YES, YES, REG_NULL}, /* ICMD_IRETURN */
212 { YES, YES, YES, REG_NULL}, /* ICMD_LRETURN */
213 { YES, YES, YES, REG_NULL}, /* ICMD_FRETURN */
214 { YES, YES, YES, REG_NULL}, /* ICMD_DRETURN */
215 { YES, YES, YES, REG_NULL}, /* ICMD_ARETURN */
216 { YES, YES, YES, REG_NULL}, /* ICMD_RETURN */
217 { S|YES, S|YES, S|YES, EAX}, /* ICMD_GETSTATIC*/
218 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_PUTSTATIC*/
219 { S|YES, S|YES, S|YES, EAX}, /* ICMD_GETFIELD */
220 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_PUTFIELD */
221 { S|YES, YES, YES, EAX}, /* ICMD_INVOKEVIRTUAL */
222 { S|YES, YES, YES, EAX}, /* ICMD_INVOKESPECIAL */
223 { S|YES, YES, YES, EAX}, /* ICMD_INVOKESTATIC */
224 { S|YES, YES, YES, EAX}, /* ICMD_INVOKEINTERFACE*/
225 { NO, NO, NO, REG_NULL}, /* UNDEF186 */
226 { YES, YES, YES, REG_NULL}, /* ICMD_NEW */
227 { YES, YES, YES, REG_NULL}, /* ICMD_NEWARRAY */
228 { YES, YES, YES, REG_NULL}, /* ICMD_ANEWARRAY */
229 { YES, NO, NO, REG_NULL}, /* ICMD_ARRAYLENGTH */
230 { YES, YES, YES, REG_NULL}, /* ICMD_ATHROW */
231 { YES, S|YES, S|YES, REG_NULL}, /* ICMD_CHECKCAST */
232 /* { S|D|YES, S|D|YES, S|D|YES, REG_NULL}, */ /* ICMD_CHECKCAST */
233 { S|D|YES, S|D|YES, S|D|YES, REG_NULL}, /* ICMD_INSTANCEOF */
234 /*{ S|D|YES, S|D|YES, S|D|YES, REG_NULL}, */ /* ICMD_INSTANCEOF */
235 { YES, YES, YES, REG_NULL}, /* ICMD_MONITORENTER */
236 { YES, YES, YES, REG_NULL}, /* ICMD_MONITOREXIT */
237 { NO, NO, NO, REG_NULL}, /* ICMD_UNDEF196 */
238 { S|YES, YES, YES, EAX}, /* ICMD_MULTIANEWARRAY */
239 { YES, YES, YES, REG_NULL}, /* ICMD_IFNULL */
240 { YES, YES, YES, REG_NULL}, /* ICMD_IFNONNULL */
241 { YES, YES, YES, REG_NULL}, /* ICMD_UNDEF200 */
242 { YES, YES, YES, REG_NULL}, /* ICMD_UNDEF201 */
243 { YES, YES, YES, REG_NULL}, /* ICMD_UNDEF202 */
244 { NO, NO, NO, REG_NULL}, /* UNDEF203 */
245 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_IASTORECONST */
246 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_LASTORECONST */
247 { S|YES, S|YES, YES, REG_NULL}, /* ICMD_FASTORECONST */
248 { S|YES, S|YES, YES, REG_NULL}, /* ICMD_DASTORECONST */
249 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_AASTORECONST */
250 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_BASTORECONST */
251 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_CASTORECONST */
252 { S|YES, S|YES, NO, REG_NULL}, /* ICMD_SASTORECONST */
253 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_PUTSTATICCONST */
254 { S|YES, S|YES, S|YES, REG_NULL}, /* ICMD_PUTFIELDCONST */
255 { YES, YES, YES, REG_NULL}, /* ICMD_IMULPOW2 */
256 { YES, YES, YES, REG_NULL}, /* ICMD_LMULPOW2 */
257 { NO, NO, NO, REG_NULL}, /* "UNDEF216" */
258 { NO, NO, NO, REG_NULL}, /* ,"UNDEF217" */
259 { NO, NO, NO, REG_NULL}, /* ,"UNDEF218" */
260 { NO, NO, NO, REG_NULL}, /* ,"UNDEF219" */
261 { NO, NO, NO, REG_NULL}, /* ,"UNDEF220", */
262 { NO, NO, NO, REG_NULL}, /* "UNDEF" */
263 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
264 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
265 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
266 { NO, NO, NO, REG_NULL}, /* ,"UNDEF", */
267 { NO, NO, NO, REG_NULL}, /* "UNDEF226" */
268 { NO, NO, NO, REG_NULL}, /* ,"UNDEF227" */
269 { NO, NO, NO, REG_NULL}, /* ,"UNDEF228" */
270 { NO, NO, NO, REG_NULL}, /* ,"UNDEF229" */
271 { NO, NO, NO, REG_NULL}, /* ,"UNDEF230", */
272 { NO, NO, NO, REG_NULL}, /* "UNDEF" */
273 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
274 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
275 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
276 { NO, NO, NO, REG_NULL}, /* ,"UNDEF", */
277 { NO, NO, NO, REG_NULL}, /* "UNDEF236" */
278 { NO, NO, NO, REG_NULL}, /* ,"UNDEF237" */
279 { NO, NO, NO, REG_NULL}, /* ,"UNDEF238" */
280 { NO, NO, NO, REG_NULL}, /* ,"UNDEF239" */
281 { NO, NO, NO, REG_NULL}, /* ,"UNDEF240", */
282 { NO, NO, NO, REG_NULL}, /* "UNDEF" */
283 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
284 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
285 { NO, NO, NO, REG_NULL}, /* ,"UNDEF" */
286 { NO, NO, NO, REG_NULL}, /* ,"UNDEF", */
287 { NO, NO, NO, REG_NULL}, /* "UNDEF246" */
288 { NO, NO, NO, REG_NULL}, /* ,"UNDEF247" */
289 { NO, NO, NO, REG_NULL}, /* ,"UNDEF248" */
290 { NO, NO, NO, REG_NULL}, /* ,"UNDEF249" */
291 { NO, NO, NO, REG_NULL}, /* ,"UNDEF250", */
292 { NO, NO, NO, REG_NULL}, /* ICMD_INLINE_START */
293 { NO, NO, NO, REG_NULL}, /* ICMD_INLINE_END */
294 { S|YES, YES, YES, EAX}, /* ICMD_BUILTIN3 */
295 { S|YES, YES, YES, EAX}, /* ICMD_BUILTIN2 */
296 { S|YES, YES, YES, EAX}, /* ICMD_BUILTIN1 */
301 * These are local overrides for various environment variables in Emacs.
302 * Please do not remove this and leave it at the end of the file, where
303 * Emacs will automagically detect them.
304 * ---------------------------------------------------------------------
307 * indent-tabs-mode: t