* ICMD_ARRAYCHECKCAST: added
[cacao.git] / src / vm / jit / jit.c
1 /* src/vm/jit/jit.c - calls the code generation functions
2
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
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., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Andreas Krall
28             Reinhard Grafl
29
30    Changes: Edwin Steiner
31             Christian Thalinger
32
33    $Id: jit.c 2932 2005-07-08 11:57:08Z twisti $
34
35 */
36
37
38 #include "config.h"
39 #include "disass.h"
40 #include "types.h"
41 #include "mm/memory.h"
42 #include "toolbox/logging.h"
43 #include "vm/builtin.h"
44 #include "vm/class.h"
45 #include "vm/global.h"
46 #include "vm/initialize.h"
47 #include "vm/loader.h"
48 #include "vm/method.h"
49 #include "vm/options.h"
50 #include "vm/statistics.h"
51 #include "vm/tables.h"
52 #include "vm/jit/asmpart.h"
53 #include "vm/jit/codegen.inc.h"
54 #include "vm/jit/jit.h"
55 #ifdef LSRA
56 #include "vm/jit/lsra.h"
57 #endif
58 #include "vm/jit/parse.h"
59 #include "vm/jit/reg.h"
60 #include "vm/jit/stack.h"
61
62 #if defined(USE_INLINING)
63 #include "vm/jit/inline/inline.h"
64 #include "vm/jit/inline/parseRT.h"
65 #include "vm/jit/inline/parseXTA.h"
66 #endif
67
68 #include "vm/jit/loop/analyze.h"
69 #include "vm/jit/loop/graph.h"
70 #include "vm/jit/loop/loop.h"
71 #include "vm/jit/verify/typecheck.h"
72
73 #if defined(USE_THREADS)
74 # if defined(NATIVE_THREADS)
75 #  include "threads/native/threads.h"
76 # else
77 #  include "threads/green/threads.h"
78 # endif
79 #endif
80
81
82
83 /* global switches ************************************************************/
84
85 int stackreq[256];
86
87                                 
88 int jcommandsize[256] = {
89
90 #define JAVA_NOP               0
91 #define ICMD_NOP               0
92         1,
93 #define JAVA_ACONST_NULL       1
94 #define ICMD_ACONST            1        /* val.a = constant                   */
95         1,
96 #define JAVA_ICONST_M1         2
97 #define ICMD_CHECKNULL         2
98         1,
99 #define JAVA_ICONST_0          3
100 #define ICMD_ICONST            3        /* val.i = constant                   */
101         1,
102 #define JAVA_ICONST_1          4
103         1,
104 #define JAVA_ICONST_2          5
105 #define ICMD_IDIVPOW2          5        /* val.i = constant                   */
106         1,
107 #define JAVA_ICONST_3          6
108 #define ICMD_LDIVPOW2          6        /* val.l = constant                   */
109         1,
110 #define JAVA_ICONST_4          7
111         1,
112 #define JAVA_ICONST_5          8
113         1,
114 #define JAVA_LCONST_0          9
115 #define ICMD_LCONST            9        /* val.l = constant                   */
116         1,
117 #define JAVA_LCONST_1         10
118 #define ICMD_LCMPCONST        10        /* val.l = constant                   */
119         1,
120 #define JAVA_FCONST_0         11
121 #define ICMD_FCONST           11        /* val.f = constant                   */
122         1,
123 #define JAVA_FCONST_1         12
124         1,
125 #define JAVA_FCONST_2         13
126 #define ICMD_ELSE_ICONST      13
127         1,
128 #define JAVA_DCONST_0         14
129 #define ICMD_DCONST           14        /* val.d = constant                   */
130         1,
131 #define JAVA_DCONST_1         15
132 #define ICMD_IFEQ_ICONST      15
133         1,
134 #define JAVA_BIPUSH           16
135 #define ICMD_IFNE_ICONST      16
136         2,
137 #define JAVA_SIPUSH           17
138 #define ICMD_IFLT_ICONST      17
139         3,
140 #define JAVA_LDC1             18
141 #define ICMD_IFGE_ICONST      18
142         2,
143 #define JAVA_LDC2             19
144 #define ICMD_IFGT_ICONST      19
145         3,
146 #define JAVA_LDC2W            20
147 #define ICMD_IFLE_ICONST      20
148         3,
149                                             /* order of LOAD instructions must be */
150                                             /* equal to order of TYPE_XXX defines */
151 #define JAVA_ILOAD            21
152 #define ICMD_ILOAD            21        /* op1 = local variable               */
153         2,                      
154 #define JAVA_LLOAD            22
155 #define ICMD_LLOAD            22        /* op1 = local variable               */
156         2,
157 #define JAVA_FLOAD            23
158 #define ICMD_FLOAD            23        /* op1 = local variable               */
159         2,
160 #define JAVA_DLOAD            24
161 #define ICMD_DLOAD            24        /* op1 = local variable               */
162         2,
163 #define JAVA_ALOAD            25
164 #define ICMD_ALOAD            25        /* op1 = local variable               */
165         2,
166 #define JAVA_ILOAD_0          26
167 #define ICMD_IADDCONST        26        /* val.i = constant                   */
168         1,
169 #define JAVA_ILOAD_1          27
170 #define ICMD_ISUBCONST        27        /* val.i = constant                   */
171         1,
172 #define JAVA_ILOAD_2          28
173 #define ICMD_IMULCONST        28        /* val.i = constant                   */
174         1,
175 #define JAVA_ILOAD_3          29
176 #define ICMD_IANDCONST        29        /* val.i = constant                   */
177         1,
178 #define JAVA_LLOAD_0          30
179 #define ICMD_IORCONST         30        /* val.i = constant                   */
180         1,
181 #define JAVA_LLOAD_1          31
182 #define ICMD_IXORCONST        31        /* val.i = constant                   */
183         1,
184 #define JAVA_LLOAD_2          32
185 #define ICMD_ISHLCONST        32        /* val.i = constant                   */
186         1,
187 #define JAVA_LLOAD_3          33
188 #define ICMD_ISHRCONST        33        /* val.i = constant                   */
189         1,
190 #define JAVA_FLOAD_0          34
191 #define ICMD_IUSHRCONST       34        /* val.i = constant                   */
192         1,
193 #define JAVA_FLOAD_1          35
194 #define ICMD_IREMPOW2         35        /* val.i = constant                   */
195         1,
196 #define JAVA_FLOAD_2          36
197 #define ICMD_LADDCONST        36        /* val.l = constant                   */
198         1,
199 #define JAVA_FLOAD_3          37
200 #define ICMD_LSUBCONST        37        /* val.l = constant                   */
201         1,
202 #define JAVA_DLOAD_0          38
203 #define ICMD_LMULCONST        38        /* val.l = constant                   */
204         1,
205 #define JAVA_DLOAD_1          39
206 #define ICMD_LANDCONST        39        /* val.l = constant                   */
207         1,
208 #define JAVA_DLOAD_2          40
209 #define ICMD_LORCONST         40        /* val.l = constant                   */
210         1,
211 #define JAVA_DLOAD_3          41
212 #define ICMD_LXORCONST        41        /* val.l = constant                   */
213         1,
214 #define JAVA_ALOAD_0          42
215 #define ICMD_LSHLCONST        42        /* val.l = constant                   */
216         1,
217 #define JAVA_ALOAD_1          43
218 #define ICMD_LSHRCONST        43        /* val.l = constant                   */
219         1,
220 #define JAVA_ALOAD_2          44
221 #define ICMD_LUSHRCONST       44        /* val.l = constant                   */
222         1,
223 #define JAVA_ALOAD_3          45
224 #define ICMD_LREMPOW2         45        /* val.l = constant                   */
225         1,
226 #define JAVA_IALOAD           46
227 #define ICMD_IALOAD           46
228         1,
229 #define JAVA_LALOAD           47
230 #define ICMD_LALOAD           47
231         1,
232 #define JAVA_FALOAD           48
233 #define ICMD_FALOAD           48
234         1,
235 #define JAVA_DALOAD           49
236 #define ICMD_DALOAD           49
237         1,
238 #define JAVA_AALOAD           50
239 #define ICMD_AALOAD           50
240         1,
241 #define JAVA_BALOAD           51
242 #define ICMD_BALOAD           51
243         1,
244 #define JAVA_CALOAD           52
245 #define ICMD_CALOAD           52
246         1,
247 #define JAVA_SALOAD           53
248 #define ICMD_SALOAD           53
249         1,
250                                             /* order of STORE instructions must be*/
251                                             /* equal to order of TYPE_XXX defines */
252 #define JAVA_ISTORE           54
253 #define ICMD_ISTORE           54        /* op1 = local variable               */
254         2,
255 #define JAVA_LSTORE           55
256 #define ICMD_LSTORE           55        /* op1 = local variable               */
257         2,
258 #define JAVA_FSTORE           56
259 #define ICMD_FSTORE           56        /* op1 = local variable               */
260         2,
261 #define JAVA_DSTORE           57
262 #define ICMD_DSTORE           57        /* op1 = local variable               */
263         2,
264 #define JAVA_ASTORE           58
265 #define ICMD_ASTORE           58        /* op1 = local variable               */
266         2,
267 #define JAVA_ISTORE_0         59
268 #define ICMD_IF_LEQ           59        /* op1 = target JavaVM pc, val.l      */
269         1,
270 #define JAVA_ISTORE_1         60
271 #define ICMD_IF_LNE           60        /* op1 = target JavaVM pc, val.l      */
272         1,
273 #define JAVA_ISTORE_2         61
274 #define ICMD_IF_LLT           61        /* op1 = target JavaVM pc, val.l      */
275         1,
276 #define JAVA_ISTORE_3         62
277 #define ICMD_IF_LGE           62        /* op1 = target JavaVM pc, val.l      */
278         1,
279 #define JAVA_LSTORE_0         63
280 #define ICMD_IF_LGT           63        /* op1 = target JavaVM pc, val.l      */
281         1,
282 #define JAVA_LSTORE_1         64
283 #define ICMD_IF_LLE           64        /* op1 = target JavaVM pc, val.l      */
284         1,
285 #define JAVA_LSTORE_2         65
286 #define ICMD_IF_LCMPEQ        65        /* op1 = target JavaVM pc             */
287         1,
288 #define JAVA_LSTORE_3         66
289 #define ICMD_IF_LCMPNE        66        /* op1 = target JavaVM pc             */
290         1,
291 #define JAVA_FSTORE_0         67
292 #define ICMD_IF_LCMPLT        67        /* op1 = target JavaVM pc             */
293         1,
294 #define JAVA_FSTORE_1         68
295 #define ICMD_IF_LCMPGE        68        /* op1 = target JavaVM pc             */
296         1,
297 #define JAVA_FSTORE_2         69
298 #define ICMD_IF_LCMPGT        69        /* op1 = target JavaVM pc             */
299         1,
300 #define JAVA_FSTORE_3         70
301 #define ICMD_IF_LCMPLE        70        /* op1 = target JavaVM pc             */
302         1,
303 #define JAVA_DSTORE_0         71
304         1,
305 #define JAVA_DSTORE_1         72
306         1,
307 #define JAVA_DSTORE_2         73
308         1,
309 #define JAVA_DSTORE_3         74
310         1,
311 #define JAVA_ASTORE_0         75
312         1,
313 #define JAVA_ASTORE_1         76
314         1,
315 #define JAVA_ASTORE_2         77
316         1,
317 #define JAVA_ASTORE_3         78
318         1,
319 #define JAVA_IASTORE          79
320 #define ICMD_IASTORE          79
321         1,
322 #define JAVA_LASTORE          80
323 #define ICMD_LASTORE          80
324         1,
325 #define JAVA_FASTORE          81
326 #define ICMD_FASTORE          81
327         1,
328 #define JAVA_DASTORE          82
329 #define ICMD_DASTORE          82
330         1,
331 #define JAVA_AASTORE          83
332 #define ICMD_AASTORE          83
333         1,
334 #define JAVA_BASTORE          84
335 #define ICMD_BASTORE          84
336         1,
337 #define JAVA_CASTORE          85
338 #define ICMD_CASTORE          85
339         1,
340 #define JAVA_SASTORE          86
341 #define ICMD_SASTORE          86
342         1,
343 #define JAVA_POP              87
344 #define ICMD_POP              87
345         1,
346 #define JAVA_POP2             88
347 #define ICMD_POP2             88
348         1,
349 #define JAVA_DUP              89
350 #define ICMD_DUP              89
351         1,
352 #define JAVA_DUP_X1           90
353 #define ICMD_DUP_X1           90
354         1,
355 #define JAVA_DUP_X2           91
356 #define ICMD_DUP_X2           91
357         1,
358 #define JAVA_DUP2             92
359 #define ICMD_DUP2             92
360         1,
361 #define JAVA_DUP2_X1          93
362 #define ICMD_DUP2_X1          93
363         1,
364 #define JAVA_DUP2_X2          94
365 #define ICMD_DUP2_X2          94
366         1,
367 #define JAVA_SWAP             95
368 #define ICMD_SWAP             95
369         1,
370 #define JAVA_IADD             96
371 #define ICMD_IADD             96
372         1,
373 #define JAVA_LADD             97
374 #define ICMD_LADD             97
375         1,
376 #define JAVA_FADD             98
377 #define ICMD_FADD             98
378         1,
379 #define JAVA_DADD             99
380 #define ICMD_DADD             99
381         1,
382 #define JAVA_ISUB             100
383 #define ICMD_ISUB             100
384         1,
385 #define JAVA_LSUB             101
386 #define ICMD_LSUB             101
387         1,
388 #define JAVA_FSUB             102
389 #define ICMD_FSUB             102
390         1,
391 #define JAVA_DSUB             103
392 #define ICMD_DSUB             103
393         1,
394 #define JAVA_IMUL             104
395 #define ICMD_IMUL             104
396         1,
397 #define JAVA_LMUL             105
398 #define ICMD_LMUL             105
399         1,
400 #define JAVA_FMUL             106
401 #define ICMD_FMUL             106
402         1,
403 #define JAVA_DMUL             107
404 #define ICMD_DMUL             107
405         1,
406 #define JAVA_IDIV             108
407 #define ICMD_IDIV             108
408         1,
409 #define JAVA_LDIV             109
410 #define ICMD_LDIV             109
411         1,
412 #define JAVA_FDIV             110
413 #define ICMD_FDIV             110
414         1,
415 #define JAVA_DDIV             111
416 #define ICMD_DDIV             111
417         1,
418 #define JAVA_IREM             112
419 #define ICMD_IREM             112
420         1,
421 #define JAVA_LREM             113
422 #define ICMD_LREM             113
423         1,
424 #define JAVA_FREM             114
425 #define ICMD_FREM             114
426         1,
427 #define JAVA_DREM             115
428 #define ICMD_DREM             115
429         1,
430 #define JAVA_INEG             116
431 #define ICMD_INEG             116
432         1,
433 #define JAVA_LNEG             117
434 #define ICMD_LNEG             117
435         1,
436 #define JAVA_FNEG             118
437 #define ICMD_FNEG             118
438         1,
439 #define JAVA_DNEG             119
440 #define ICMD_DNEG             119
441         1,
442 #define JAVA_ISHL             120
443 #define ICMD_ISHL             120
444         1,
445 #define JAVA_LSHL             121
446 #define ICMD_LSHL             121
447         1,
448 #define JAVA_ISHR             122
449 #define ICMD_ISHR             122
450         1,
451 #define JAVA_LSHR             123
452 #define ICMD_LSHR             123
453         1,
454 #define JAVA_IUSHR            124
455 #define ICMD_IUSHR            124
456         1,
457 #define JAVA_LUSHR            125
458 #define ICMD_LUSHR            125
459         1,
460 #define JAVA_IAND             126
461 #define ICMD_IAND             126
462         1,
463 #define JAVA_LAND             127
464 #define ICMD_LAND             127
465         1,
466 #define JAVA_IOR              128
467 #define ICMD_IOR              128
468         1,
469 #define JAVA_LOR              129
470 #define ICMD_LOR              129
471         1,
472 #define JAVA_IXOR             130
473 #define ICMD_IXOR             130
474         1,
475 #define JAVA_LXOR             131
476 #define ICMD_LXOR             131
477         1,
478 #define JAVA_IINC             132
479 #define ICMD_IINC             132   /* op1 = local variable, val.i = constant */
480         3,
481 #define JAVA_I2L              133
482 #define ICMD_I2L              133
483         1,
484 #define JAVA_I2F              134
485 #define ICMD_I2F              134
486         1,
487 #define JAVA_I2D              135
488 #define ICMD_I2D              135
489         1,
490 #define JAVA_L2I              136
491 #define ICMD_L2I              136
492         1,
493 #define JAVA_L2F              137
494 #define ICMD_L2F              137
495         1,
496 #define JAVA_L2D              138
497 #define ICMD_L2D              138
498         1,
499 #define JAVA_F2I              139
500 #define ICMD_F2I              139
501         1,
502 #define JAVA_F2L              140
503 #define ICMD_F2L              140
504         1,
505 #define JAVA_F2D              141
506 #define ICMD_F2D              141
507         1,
508 #define JAVA_D2I              142
509 #define ICMD_D2I              142
510         1,
511 #define JAVA_D2L              143
512 #define ICMD_D2L              143
513         1,
514 #define JAVA_D2F              144
515 #define ICMD_D2F              144
516         1,
517 #define JAVA_INT2BYTE         145
518 #define ICMD_INT2BYTE         145
519         1,
520 #define JAVA_INT2CHAR         146
521 #define ICMD_INT2CHAR         146
522         1,
523 #define JAVA_INT2SHORT        147
524 #define ICMD_INT2SHORT        147
525         1,
526 #define JAVA_LCMP             148
527 #define ICMD_LCMP             148
528         1,
529 #define JAVA_FCMPL            149
530 #define ICMD_FCMPL            149
531         1,
532 #define JAVA_FCMPG            150
533 #define ICMD_FCMPG            150
534         1,
535 #define JAVA_DCMPL            151
536 #define ICMD_DCMPL            151
537         1,
538 #define JAVA_DCMPG            152
539 #define ICMD_DCMPG            152
540         1,
541 #define JAVA_IFEQ             153
542 #define ICMD_IFEQ             153       /* op1 = target JavaVM pc, val.i      */
543         3,
544 #define JAVA_IFNE             154
545 #define ICMD_IFNE             154       /* op1 = target JavaVM pc, val.i      */
546         3,
547 #define JAVA_IFLT             155
548 #define ICMD_IFLT             155       /* op1 = target JavaVM pc, val.i      */
549         3,
550 #define JAVA_IFGE             156
551 #define ICMD_IFGE             156       /* op1 = target JavaVM pc, val.i      */
552         3,
553 #define JAVA_IFGT             157
554 #define ICMD_IFGT             157       /* op1 = target JavaVM pc, val.i      */
555         3,
556 #define JAVA_IFLE             158
557 #define ICMD_IFLE             158       /* op1 = target JavaVM pc, val.i      */
558         3,
559 #define JAVA_IF_ICMPEQ        159
560 #define ICMD_IF_ICMPEQ        159       /* op1 = target JavaVM pc             */
561         3,
562 #define JAVA_IF_ICMPNE        160
563 #define ICMD_IF_ICMPNE        160       /* op1 = target JavaVM pc             */
564         3,
565 #define JAVA_IF_ICMPLT        161
566 #define ICMD_IF_ICMPLT        161       /* op1 = target JavaVM pc             */
567         3,
568 #define JAVA_IF_ICMPGE        162
569 #define ICMD_IF_ICMPGE        162       /* op1 = target JavaVM pc             */
570         3,
571 #define JAVA_IF_ICMPGT        163
572 #define ICMD_IF_ICMPGT        163       /* op1 = target JavaVM pc             */
573         3,
574 #define JAVA_IF_ICMPLE        164
575 #define ICMD_IF_ICMPLE        164       /* op1 = target JavaVM pc             */
576         3,
577 #define JAVA_IF_ACMPEQ        165
578 #define ICMD_IF_ACMPEQ        165       /* op1 = target JavaVM pc             */
579         3,
580 #define JAVA_IF_ACMPNE        166
581 #define ICMD_IF_ACMPNE        166       /* op1 = target JavaVM pc             */
582         3,
583 #define JAVA_GOTO             167
584 #define ICMD_GOTO             167       /* op1 = target JavaVM pc             */
585         3,
586 #define JAVA_JSR              168
587 #define ICMD_JSR              168       /* op1 = target JavaVM pc             */
588         3,
589 #define JAVA_RET              169
590 #define ICMD_RET              169       /* op1 = local variable               */
591         2,
592 #define JAVA_TABLESWITCH      170
593 #define ICMD_TABLESWITCH      170       /* val.a = pointer to s4 table        */
594         0,                                  /* length must be computed            */
595 #define JAVA_LOOKUPSWITCH     171
596 #define ICMD_LOOKUPSWITCH     171       /* val.a = pointer to s4 table        */
597         0,                                  /* length must be computed            */
598 #define JAVA_IRETURN          172
599 #define ICMD_IRETURN          172
600         1,
601 #define JAVA_LRETURN          173
602 #define ICMD_LRETURN          173
603         1,
604 #define JAVA_FRETURN          174
605 #define ICMD_FRETURN          174
606         1,
607 #define JAVA_DRETURN          175
608 #define ICMD_DRETURN          175
609         1,
610 #define JAVA_ARETURN          176
611 #define ICMD_ARETURN          176
612         1,
613 #define JAVA_RETURN           177
614 #define ICMD_RETURN           177
615         1,
616 #define JAVA_GETSTATIC        178
617 #define ICMD_GETSTATIC        178       /* op1 = type, val.a = field address  */
618         3,
619 #define JAVA_PUTSTATIC        179
620 #define ICMD_PUTSTATIC        179       /* op1 = type, val.a = field address  */
621         3,
622 #define JAVA_GETFIELD         180
623 #define ICMD_GETFIELD         180       /* op1 = type, val.i = field offset   */
624         3,
625 #define JAVA_PUTFIELD         181
626 #define ICMD_PUTFIELD         181       /* op1 = type, val.i = field offset   */
627         3,
628 #define JAVA_INVOKEVIRTUAL    182
629 #define ICMD_INVOKEVIRTUAL    182       /* val.a = method info pointer        */
630         3,
631 #define JAVA_INVOKESPECIAL    183
632 #define ICMD_INVOKESPECIAL    183       /* val.a = method info pointer        */
633         3,
634 #define JAVA_INVOKESTATIC     184
635 #define ICMD_INVOKESTATIC     184       /* val.a = method info pointer        */
636         3,
637 #define JAVA_INVOKEINTERFACE  185
638 #define ICMD_INVOKEINTERFACE  185       /* val.a = method info pointer        */
639         5,
640 #define ICMD_CHECKASIZE       186       /*                                    */
641         1, /* unused */
642 #define JAVA_NEW              187
643 #define ICMD_NEW              187       /* op1 = 1, val.a = class pointer     */
644         3,
645 #define JAVA_NEWARRAY         188
646 #define ICMD_NEWARRAY         188       /* op1 = basic type                   */
647         2,
648 #define JAVA_ANEWARRAY        189
649 #define ICMD_ANEWARRAY        189       /* op1 = 0, val.a = array pointer     */
650         3,                                  /* op1 = 1, val.a = class pointer     */
651 #define JAVA_ARRAYLENGTH      190
652 #define ICMD_ARRAYLENGTH      190
653         1,
654 #define JAVA_ATHROW           191
655 #define ICMD_ATHROW           191
656         1,
657 #define JAVA_CHECKCAST        192
658 #define ICMD_CHECKCAST        192       /* op1 = 0, val.a = array pointer     */
659         3,                                  /* op1 = 1, val.a = class pointer     */
660 #define JAVA_INSTANCEOF       193
661 #define ICMD_INSTANCEOF       193       /* op1 = 0, val.a = array pointer     */
662         3,                                  /* op1 = 1, val.a = class pointer     */
663 #define JAVA_MONITORENTER     194
664 #define ICMD_MONITORENTER     194
665         1,
666 #define JAVA_MONITOREXIT      195
667 #define ICMD_MONITOREXIT      195
668         1,
669 #define JAVA_WIDE             196
670         0, /* length must be computed */
671 #define JAVA_MULTIANEWARRAY   197
672 #define ICMD_MULTIANEWARRAY   197       /* op1 = dimension, val.a = array     */
673         4,                                  /* pointer                            */
674 #define JAVA_IFNULL           198
675 #define ICMD_IFNULL           198       /* op1 = target JavaVM pc             */
676         3,
677 #define JAVA_IFNONNULL        199
678 #define ICMD_IFNONNULL        199       /* op1 = target JavaVM pc             */
679         3,
680 #define JAVA_GOTO_W           200
681         5,
682 #define JAVA_JSR_W            201
683         5,
684 #define JAVA_BREAKPOINT       202
685         1,
686 #define ICMD_CHECKEXCEPTION   203
687         1,
688 #define ICMD_IASTORECONST     204
689         1,
690 #define ICMD_LASTORECONST     205
691         1,
692 #define ICMD_FASTORECONST     206
693         1,
694 #define ICMD_DASTORECONST     207
695         1,
696 #define ICMD_AASTORECONST     208
697         1,
698 #define ICMD_BASTORECONST     209
699         1,
700 #define ICMD_CASTORECONST     210
701         1,
702 #define ICMD_SASTORECONST     211
703         1,
704 #define ICMD_PUTSTATICCONST   212
705         1,
706 #define ICMD_PUTFIELDCONST    213
707         1,
708 #define ICMD_IMULPOW2         214
709         1,
710 #define ICMD_LMULPOW2         215
711         1,
712
713         /* unused */
714                     1,1,1,1,
715         1,1,1,1,1,1,1,1,1,1,
716         1,1,1,1,1,1,1,1,1,1,
717         1,1,1,1,1,1,1,1,1,1,
718         1,1,1,1,1
719 };
720
721
722 char *icmd_names[256] = {
723         "NOP            ", /*               0 */
724         "ACONST         ", /*               1 */
725         "CHECKNULL      ", /* ICONST_M1     2 */
726         "ICONST         ", /*               3 */
727         "UNDEF4         ", /* ICONST_1      4 */
728         "IDIVPOW2       ", /* ICONST_2      5 */
729         "LDIVPOW2       ", /* ICONST_3      6 */
730         "UNDEF7         ", /* ICONST_4      7 */
731         "UNDEF8         ", /* ICONST_5      8 */
732         "LCONST         ", /*               9 */
733         "LCMPCONST      ", /* LCONST_1     10 */
734         "FCONST         ", /*              11 */
735         "UNDEF12        ", /* FCONST_1     12 */
736         "ELSE_ICONST    ", /* FCONST_2     13 */
737         "DCONST         ", /*              14 */
738         "IFEQ_ICONST    ", /* DCONST_1     15 */
739         "IFNE_ICONST    ", /* BIPUSH       16 */
740         "IFLT_ICONST    ", /* SIPUSH       17 */
741         "IFGE_ICONST    ", /* LDC1         18 */
742         "IFGT_ICONST    ", /* LDC2         19 */
743         "IFLE_ICONST    ", /* LDC2W        20 */
744         "ILOAD          ", /*              21 */
745         "LLOAD          ", /*              22 */
746         "FLOAD          ", /*              23 */
747         "DLOAD          ", /*              24 */
748         "ALOAD          ", /*              25 */
749         "IADDCONST      ", /* ILOAD_0      26 */
750         "ISUBCONST      ", /* ILOAD_1      27 */
751         "IMULCONST      ", /* ILOAD_2      28 */
752         "IANDCONST      ", /* ILOAD_3      29 */
753         "IORCONST       ", /* LLOAD_0      30 */
754         "IXORCONST      ", /* LLOAD_1      31 */
755         "ISHLCONST      ", /* LLOAD_2      32 */
756         "ISHRCONST      ", /* LLOAD_3      33 */
757         "IUSHRCONST     ", /* FLOAD_0      34 */
758         "IREMPOW2       ", /* FLOAD_1      35 */
759         "LADDCONST      ", /* FLOAD_2      36 */
760         "LSUBCONST      ", /* FLOAD_3      37 */
761         "LMULCONST      ", /* DLOAD_0      38 */
762         "LANDCONST      ", /* DLOAD_1      39 */
763         "LORCONST       ", /* DLOAD_2      40 */
764         "LXORCONST      ", /* DLOAD_3      41 */
765         "LSHLCONST      ", /* ALOAD_0      42 */
766         "LSHRCONST      ", /* ALOAD_1      43 */
767         "LUSHRCONST     ", /* ALOAD_2      44 */
768         "LREMPOW2       ", /* ALOAD_3      45 */
769         "IALOAD         ", /*              46 */
770         "LALOAD         ", /*              47 */
771         "FALOAD         ", /*              48 */
772         "DALOAD         ", /*              49 */
773         "AALOAD         ", /*              50 */
774         "BALOAD         ", /*              51 */
775         "CALOAD         ", /*              52 */
776         "SALOAD         ", /*              53 */
777         "ISTORE         ", /*              54 */
778         "LSTORE         ", /*              55 */
779         "FSTORE         ", /*              56 */
780         "DSTORE         ", /*              57 */
781         "ASTORE         ", /*              58 */
782         "IF_LEQ         ", /* ISTORE_0     59 */
783         "IF_LNE         ", /* ISTORE_1     60 */
784         "IF_LLT         ", /* ISTORE_2     61 */
785         "IF_LGE         ", /* ISTORE_3     62 */
786         "IF_LGT         ", /* LSTORE_0     63 */
787         "IF_LLE         ", /* LSTORE_1     64 */
788         "IF_LCMPEQ      ", /* LSTORE_2     65 */
789         "IF_LCMPNE      ", /* LSTORE_3     66 */
790         "IF_LCMPLT      ", /* FSTORE_0     67 */
791         "IF_LCMPGE      ", /* FSTORE_1     68 */
792         "IF_LCMPGT      ", /* FSTORE_2     69 */
793         "IF_LCMPLE      ", /* FSTORE_3     70 */
794         "UNDEF71        ", /* DSTORE_0     71 */
795         "UNDEF72        ", /* DSTORE_1     72 */
796         "UNDEF73        ", /* DSTORE_2     73 */
797         "UNDEF74        ", /* DSTORE_3     74 */
798         "UNDEF75        ", /* ASTORE_0     75 */
799         "UNDEF76        ", /* ASTORE_1     76 */
800         "UNDEF77        ", /* ASTORE_2     77 */
801         "UNDEF78        ", /* ASTORE_3     78 */
802         "IASTORE        ", /*              79 */
803         "LASTORE        ", /*              80 */
804         "FASTORE        ", /*              81 */
805         "DASTORE        ", /*              82 */
806         "AASTORE        ", /*              83 */
807         "BASTORE        ", /*              84 */
808         "CASTORE        ", /*              85 */
809         "SASTORE        ", /*              86 */
810         "POP            ", /*              87 */
811         "POP2           ", /*              88 */
812         "DUP            ", /*              89 */
813         "DUP_X1         ", /*              90 */
814         "DUP_X2         ", /*              91 */
815         "DUP2           ", /*              92 */
816         "DUP2_X1        ", /*              93 */
817         "DUP2_X2        ", /*              94 */
818         "SWAP           ", /*              95 */
819         "IADD           ", /*              96 */
820         "LADD           ", /*              97 */
821         "FADD           ", /*              98 */
822         "DADD           ", /*              99 */
823         "ISUB           ", /*             100 */
824         "LSUB           ", /*             101 */
825         "FSUB           ", /*             102 */
826         "DSUB           ", /*             103 */
827         "IMUL           ", /*             104 */
828         "LMUL           ", /*             105 */
829         "FMUL           ", /*             106 */
830         "DMUL           ", /*             107 */
831         "IDIV           ", /*             108 */
832         "LDIV           ", /*             109 */
833         "FDIV           ", /*             110 */
834         "DDIV           ", /*             111 */
835         "IREM           ", /*             112 */
836         "LREM           ", /*             113 */
837         "FREM           ", /*             114 */
838         "DREM           ", /*             115 */
839         "INEG           ", /*             116 */
840         "LNEG           ", /*             117 */
841         "FNEG           ", /*             118 */
842         "DNEG           ", /*             119 */
843         "ISHL           ", /*             120 */
844         "LSHL           ", /*             121 */
845         "ISHR           ", /*             122 */
846         "LSHR           ", /*             123 */
847         "IUSHR          ", /*             124 */
848         "LUSHR          ", /*             125 */
849         "IAND           ", /*             126 */
850         "LAND           ", /*             127 */
851         "IOR            ", /*             128 */
852         "LOR            ", /*             129 */
853         "IXOR           ", /*             130 */
854         "LXOR           ", /*             131 */
855         "IINC           ", /*             132 */
856         "I2L            ", /*             133 */
857         "I2F            ", /*             134 */
858         "I2D            ", /*             135 */
859         "L2I            ", /*             136 */
860         "L2F            ", /*             137 */
861         "L2D            ", /*             138 */
862         "F2I            ", /*             139 */
863         "F2L            ", /*             140 */
864         "F2D            ", /*             141 */
865         "D2I            ", /*             142 */
866         "D2L            ", /*             143 */
867         "D2F            ", /*             144 */
868         "INT2BYTE       ", /*             145 */
869         "INT2CHAR       ", /*             146 */
870         "INT2SHORT      ", /*             147 */
871         "LCMP           ", /*             148 */
872         "FCMPL          ", /*             149 */
873         "FCMPG          ", /*             150 */
874         "DCMPL          ", /*             151 */
875         "DCMPG          ", /*             152 */
876         "IFEQ           ", /*             153 */
877         "IFNE           ", /*             154 */
878         "IFLT           ", /*             155 */
879         "IFGE           ", /*             156 */
880         "IFGT           ", /*             157 */
881         "IFLE           ", /*             158 */
882         "IF_ICMPEQ      ", /*             159 */
883         "IF_ICMPNE      ", /*             160 */
884         "IF_ICMPLT      ", /*             161 */
885         "IF_ICMPGE      ", /*             162 */
886         "IF_ICMPGT      ", /*             163 */
887         "IF_ICMPLE      ", /*             164 */
888         "IF_ACMPEQ      ", /*             165 */
889         "IF_ACMPNE      ", /*             166 */
890         "GOTO           ", /*             167 */
891         "JSR            ", /*             168 */
892         "RET            ", /*             169 */
893         "TABLESWITCH    ", /*             170 */
894         "LOOKUPSWITCH   ", /*             171 */
895         "IRETURN        ", /*             172 */
896         "LRETURN        ", /*             173 */
897         "FRETURN        ", /*             174 */
898         "DRETURN        ", /*             175 */
899         "ARETURN        ", /*             176 */
900         "RETURN         ", /*             177 */
901         "GETSTATIC      ", /*             178 */
902         "PUTSTATIC      ", /*             179 */
903         "GETFIELD       ", /*             180 */
904         "PUTFIELD       ", /*             181 */
905         "INVOKEVIRTUAL  ", /*             182 */
906         "INVOKESPECIAL  ", /*             183 */
907         "INVOKESTATIC   ", /*             184 */
908         "INVOKEINTERFACE", /*             185 */
909         "CHECKASIZE     ", /* UNDEF186    186 */
910         "NEW            ", /*             187 */
911         "NEWARRAY       ", /*             188 */
912         "ANEWARRAY      ", /*             189 */
913         "ARRAYLENGTH    ", /*             190 */
914         "ATHROW         ", /*             191 */
915         "CHECKCAST      ", /*             192 */
916         "INSTANCEOF     ", /*             193 */
917         "MONITORENTER   ", /*             194 */
918         "MONITOREXIT    ", /*             195 */
919         "UNDEF196       ", /* WIDE        196 */
920         "MULTIANEWARRAY ", /*             197 */
921         "IFNULL         ", /*             198 */
922         "IFNONNULL      ", /*             199 */
923         "UNDEF200       ", /* GOTO_W      200 */
924         "UNDEF201       ", /* JSR_W       201 */
925         "UNDEF202       ", /* BREAKPOINT  202 */
926         "CHECKEXCEPTION ", /* UNDEF203    203 */
927         "IASTORECONST   ", /*             204 */
928         "LASTORECONST   ", /*             205 */
929         "FASTORECONST   ", /*             206 */
930         "DASTORECONST   ", /*             207 */
931         "AASTORECONST   ", /*             208 */
932         "BASTORECONST   ", /*             209 */
933         "CASTORECONST   ", /*             210 */
934         "SASTORECONST   ", /*             211 */
935         "PUTSTATICCONST ", /*             212 */
936         "PUTFIELDCONST  ", /*             213 */
937         "IMULPOW2       ", /*             214 */
938         "LMULPOW2       ", /*             215 */
939         "ARRAYCHECKCAST ", /*             216 */
940
941                     "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
942         "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
943         "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
944         "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
945         "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
946         "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
947         "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
948
949         "INLINE_START   ", /*             251 */
950         "INLINE_END     ", /*             252 */
951
952         "UNDEF253", "UNDEF254",
953
954         "BUILTIN        "  /*             255 */
955 };
956
957
958 char *opcode_names[256] = {
959         "NOP            ", /*               0 */
960         "ACONST         ", /*               1 */
961         "ICONST_M1      ", /* ICONST_M1     2 */
962         "ICONST_0       ", /* ICONST_0      3 */
963         "ICONST_1       ", /* ICONST_1      4 */
964         "ICONST_2       ", /* ICONST_2      5 */
965         "ICONST_3       ", /* ICONST_3      6 */
966         "ICONST_4       ", /* ICONST_4      7 */
967         "ICONST_5       ", /* ICONST_5      8 */
968         "LCONST_0       ", /* LCONST_0      9 */
969         "LCONST_1       ", /* LCONST_1     10 */
970         "FCONST_0       ", /* FCONST_0     11 */
971         "FCONST_1       ", /* FCONST_1     12 */
972         "FCONST_2       ", /* FCONST_2     13 */
973         "DCONST_0       ", /* DCONST_0     14 */
974         "DCONST_1       ", /* DCONST_1     15 */
975         "BIPUSH         ", /* BIPUSH       16 */
976         "SIPUSH         ", /* SIPUSH       17 */
977         "LDC            ", /* LDC          18 */
978         "LDC_W          ", /* LDC_W        19 */
979         "LDC2_W         ", /* LDC2_W       20 */
980         "ILOAD          ", /*              21 */
981         "LLOAD          ", /*              22 */
982         "FLOAD          ", /*              23 */
983         "DLOAD          ", /*              24 */
984         "ALOAD          ", /*              25 */
985         "ILOAD_0        ", /* ILOAD_0      26 */
986         "ILOAD_1        ", /* ILOAD_1      27 */
987         "ILOAD_2        ", /* ILOAD_2      28 */
988         "ILOAD_3        ", /* ILOAD_3      29 */
989         "LLOAD_0        ", /* LLOAD_0      30 */
990         "LLOAD_1        ", /* LLOAD_1      31 */
991         "LLOAD_2        ", /* LLOAD_2      32 */
992         "LLOAD_3        ", /* LLOAD_3      33 */
993         "FLOAD_0        ", /* FLOAD_0      34 */
994         "FLOAD_1        ", /* FLOAD_1      35 */
995         "FLOAD_2        ", /* FLOAD_2      36 */
996         "FLOAD_3        ", /* FLOAD_3      37 */
997         "DLOAD_0        ", /* DLOAD_0      38 */
998         "DLOAD_1        ", /* DLOAD_1      39 */
999         "DLOAD_2        ", /* DLOAD_2      40 */ 
1000         "DLOAD_3        ", /* DLOAD_3      41 */
1001         "ALOAD_0        ", /* ALOAD_0      42 */
1002         "ALOAD_1        ", /* ALOAD_1      43 */
1003         "ALOAD_2        ", /* ALOAD_2      44 */
1004         "ALOAD_3        ", /* ALOAD_3      45 */
1005         "IALOAD         ", /*              46 */
1006         "LALOAD         ", /*              47 */
1007         "FALOAD         ", /*              48 */
1008         "DALOAD         ", /*              49 */
1009         "AALOAD         ", /*              50 */
1010         "BALOAD         ", /*              51 */
1011         "CALOAD         ", /*              52 */
1012         "SALOAD         ", /*              53 */
1013         "ISTORE         ", /*              54 */
1014         "LSTORE         ", /*              55 */
1015         "FSTORE         ", /*              56 */
1016         "DSTORE         ", /*              57 */
1017         "ASTORE         ", /*              58 */
1018         "ISTORE_0       ", /* ISTORE_0     59 */
1019         "ISTORE_1       ", /* ISTORE_1     60 */
1020         "ISTORE_2       ", /* ISTORE_2     61 */
1021         "ISTORE_3       ", /* ISTORE_3     62 */
1022         "LSTORE_0       ", /* LSTORE_0     63 */
1023         "LSTORE_1       ", /* LSTORE_1     64 */
1024         "LSTORE_2       ", /* LSTORE_2     65 */
1025         "LSTORE_3       ", /* LSTORE_3     66 */
1026         "FSTORE_0       ", /* FSTORE_0     67 */
1027         "FSTORE_1       ", /* FSTORE_1     68 */
1028         "FSTORE_2       ", /* FSTORE_2     69 */
1029         "FSTORE_3       ", /* FSTORE_3     70 */
1030         "DSTORE_0       ", /* DSTORE_0     71 */
1031         "DSTORE_1       ", /* DSTORE_1     72 */
1032         "DSTORE_2       ", /* DSTORE_2     73 */
1033         "DSTORE_3       ", /* DSTORE_3     74 */
1034         "ASTORE_0       ", /* ASTORE_0     75 */
1035         "ASTORE_1       ", /* ASTORE_1     76 */
1036         "ASTORE_2       ", /* ASTORE_2     77 */
1037         "ASTORE_3       ", /* ASTORE_3     78 */
1038         "IASTORE        ", /*              79 */
1039         "LASTORE        ", /*              80 */
1040         "FASTORE        ", /*              81 */
1041         "DASTORE        ", /*              82 */
1042         "AASTORE        ", /*              83 */
1043         "BASTORE        ", /*              84 */
1044         "CASTORE        ", /*              85 */
1045         "SASTORE        ", /*              86 */
1046         "POP            ", /*              87 */
1047         "POP2           ", /*              88 */
1048         "DUP            ", /*              89 */
1049         "DUP_X1         ", /*              90 */
1050         "DUP_X2         ", /*              91 */
1051         "DUP2           ", /*              92 */
1052         "DUP2_X1        ", /*              93 */
1053         "DUP2_X2        ", /*              94 */
1054         "SWAP           ", /*              95 */
1055         "IADD           ", /*              96 */
1056         "LADD           ", /*              97 */
1057         "FADD           ", /*              98 */
1058         "DADD           ", /*              99 */
1059         "ISUB           ", /*             100 */
1060         "LSUB           ", /*             101 */
1061         "FSUB           ", /*             102 */
1062         "DSUB           ", /*             103 */
1063         "IMUL           ", /*             104 */
1064         "LMUL           ", /*             105 */
1065         "FMUL           ", /*             106 */
1066         "DMUL           ", /*             107 */
1067         "IDIV           ", /*             108 */
1068         "LDIV           ", /*             109 */
1069         "FDIV           ", /*             110 */
1070         "DDIV           ", /*             111 */
1071         "IREM           ", /*             112 */
1072         "LREM           ", /*             113 */
1073         "FREM           ", /*             114 */
1074         "DREM           ", /*             115 */
1075         "INEG           ", /*             116 */
1076         "LNEG           ", /*             117 */
1077         "FNEG           ", /*             118 */
1078         "DNEG           ", /*             119 */
1079         "ISHL           ", /*             120 */
1080         "LSHL           ", /*             121 */
1081         "ISHR           ", /*             122 */
1082         "LSHR           ", /*             123 */
1083         "IUSHR          ", /*             124 */
1084         "LUSHR          ", /*             125 */
1085         "IAND           ", /*             126 */
1086         "LAND           ", /*             127 */
1087         "IOR            ", /*             128 */
1088         "LOR            ", /*             129 */
1089         "IXOR           ", /*             130 */
1090         "LXOR           ", /*             131 */
1091         "IINC           ", /*             132 */
1092         "I2L            ", /*             133 */
1093         "I2F            ", /*             134 */
1094         "I2D            ", /*             135 */
1095         "L2I            ", /*             136 */
1096         "L2F            ", /*             137 */
1097         "L2D            ", /*             138 */
1098         "F2I            ", /*             139 */
1099         "F2L            ", /*             140 */
1100         "F2D            ", /*             141 */
1101         "D2I            ", /*             142 */
1102         "D2L            ", /*             143 */
1103         "D2F            ", /*             144 */
1104         "INT2BYTE       ", /*             145 */
1105         "INT2CHAR       ", /*             146 */
1106         "INT2SHORT      ", /*             147 */
1107         "LCMP           ", /*             148 */
1108         "FCMPL          ", /*             149 */
1109         "FCMPG          ", /*             150 */
1110         "DCMPL          ", /*             151 */
1111         "DCMPG          ", /*             152 */
1112         "IFEQ           ", /*             153 */
1113         "IFNE           ", /*             154 */
1114         "IFLT           ", /*             155 */
1115         "IFGE           ", /*             156 */
1116         "IFGT           ", /*             157 */
1117         "IFLE           ", /*             158 */
1118         "IF_ICMPEQ      ", /*             159 */
1119         "IF_ICMPNE      ", /*             160 */
1120         "IF_ICMPLT      ", /*             161 */
1121         "IF_ICMPGE      ", /*             162 */
1122         "IF_ICMPGT      ", /*             163 */
1123         "IF_ICMPLE      ", /*             164 */
1124         "IF_ACMPEQ      ", /*             165 */
1125         "IF_ACMPNE      ", /*             166 */
1126         "GOTO           ", /*             167 */
1127         "JSR            ", /*             168 */
1128         "RET            ", /*             169 */
1129         "TABLESWITCH    ", /*             170 */
1130         "LOOKUPSWITCH   ", /*             171 */
1131         "IRETURN        ", /*             172 */
1132         "LRETURN        ", /*             173 */
1133         "FRETURN        ", /*             174 */
1134         "DRETURN        ", /*             175 */
1135         "ARETURN        ", /*             176 */
1136         "RETURN         ", /*             177 */
1137         "GETSTATIC      ", /*             178 */
1138         "PUTSTATIC      ", /*             179 */
1139         "GETFIELD       ", /*             180 */
1140         "PUTFIELD       ", /*             181 */
1141         "INVOKEVIRTUAL  ", /*             182 */
1142         "INVOKESPECIAL  ", /*             183 */
1143         "INVOKESTATIC   ", /*             184 */
1144         "INVOKEINTERFACE", /*             185 */
1145         "UNDEF186       ", /*             186 */
1146         "NEW            ", /*             187 */
1147         "NEWARRAY       ", /*             188 */
1148         "ANEWARRAY      ", /*             189 */
1149         "ARRAYLENGTH    ", /*             190 */
1150         "ATHROW         ", /*             191 */
1151         "CHECKCAST      ", /*             192 */
1152         "INSTANCEOF     ", /*             193 */
1153         "MONITORENTER   ", /*             194 */
1154         "MONITOREXIT    ", /*             195 */
1155         "WIDE           ", /* WIDE        196 */
1156         "MULTIANEWARRAY ", /*             197 */
1157         "IFNULL         ", /*             198 */
1158         "IFNONNULL      ", /*             199 */
1159         "GOTO_W         ", /* GOTO_W      200 */
1160         "JSR_W          ", /* JSR_W       201 */
1161         "BREAKPOINT     ", /* BREAKPOINT  202 */
1162
1163                                 "UNDEF203", "UNDEF204", "UNDEF205",
1164         "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1165         "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1166         "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1167         "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1168         "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1169         "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1170         "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1171         "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1172         "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1173         "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1174 };
1175
1176
1177 /* include compiler subsystems ************************************************/
1178
1179 /* dummy function, used when there is no JavaVM code available                */
1180
1181 static functionptr do_nothing_function()
1182 {
1183         return NULL;
1184 }
1185
1186
1187 /* jit_compile *****************************************************************
1188
1189    jit_compile, new version of compiler, translates one method to machine code
1190
1191 *******************************************************************************/
1192
1193 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1194                                                                           registerdata *rd, loopdata *ld,
1195                                                                           t_inlining_globals *id);
1196
1197 functionptr jit_compile(methodinfo *m)
1198 {
1199         functionptr         r;
1200         codegendata        *cd;
1201         registerdata       *rd;
1202         loopdata           *ld;
1203         t_inlining_globals *id;
1204         s4                  dumpsize;
1205
1206 #if defined(STATISTICS)
1207         if (opt_stat)
1208                 count_jit_calls++;
1209 #endif
1210
1211         /* this is the case if a native function is called by jni */
1212
1213         if (m->flags & ACC_NATIVE)
1214                 return (functionptr) (ptrint) m->stubroutine;
1215
1216 #if defined(USE_THREADS)
1217         /* enter a monitor on the method */
1218
1219         builtin_monitorenter((java_objectheader *) m);
1220 #endif
1221
1222         /* if method has been already compiled return immediately */
1223
1224         if (m->entrypoint) {
1225 #if defined(USE_THREADS)
1226                 builtin_monitorexit((java_objectheader *) m);
1227 #endif
1228
1229                 return m->entrypoint;
1230         }
1231
1232 #if defined(STATISTICS)
1233         if (opt_stat)
1234                 count_methods++;
1235 #endif
1236
1237         /* if there is no javacode, print error message and return empty method   */
1238
1239         if (!m->jcode) {
1240                 if (compileverbose)
1241                         log_message_method("No code given for: ", m);
1242
1243                 m->entrypoint = (functionptr) do_nothing_function;
1244
1245                 return m->entrypoint;    /* return empty method     */
1246         }
1247
1248 #if defined(STATISTICS)
1249         /* measure time */
1250
1251         if (getcompilingtime)
1252                 compilingtime_start();
1253 #endif
1254
1255         /* mark start of dump memory area */
1256
1257         dumpsize = dump_size();
1258
1259         /* allocate memory */
1260
1261         cd = DNEW(codegendata);
1262         rd = DNEW(registerdata);
1263         ld = DNEW(loopdata);
1264         id = DNEW(t_inlining_globals);
1265
1266 #if defined(USE_INLINING)
1267         /* RTA static analysis must be called before inlining */
1268         if (opt_rt)
1269                 RT_jit_parse(m); /* will be called just once */
1270                              /* return value ignored for now */
1271         /* XTA static analysis must be called before inlining */
1272         if (opt_xta)
1273                 XTA_jit_parse(m); /* will be called just once */
1274                               /* return value ignored for now */
1275
1276         /* must be called before reg_setup, because it can change maxlocals */
1277         /* init reqd to initialize for parse even in no inlining */
1278         inlining_setup(m, id);
1279 #endif
1280
1281         /* initialize the register allocator */
1282         reg_setup(m, rd, id);
1283
1284         /* setup the codegendata memory */
1285         codegen_setup(m, cd, id);
1286
1287         /* now call internal compile function */
1288
1289         r = jit_compile_intern(m, cd, rd, ld, id);
1290
1291         /* free some memory */
1292
1293         reg_free(m, rd);
1294         codegen_free(m, cd);
1295
1296         /* clear pointers to dump memory area */
1297
1298         m->basicblocks = NULL;
1299         m->basicblockindex = NULL;
1300         m->instructions = NULL;
1301         m->stack = NULL;
1302         /* NO !!! m->exceptiontable = NULL; */
1303
1304         /* release dump area */
1305
1306         dump_release(dumpsize);
1307
1308 #if defined(STATISTICS)
1309         /* measure time */
1310
1311         if (getcompilingtime)
1312                 compilingtime_stop();
1313 #endif
1314
1315         /* define in options.h; Used in main.c, jit.c & inline.c */
1316 #ifdef INAFTERMAIN
1317         if ((utf_new_char("main") == m->name) && (useinliningm))
1318                 useinlining = false;
1319 #endif
1320
1321 #if defined(USE_THREADS)
1322         /* leave the monitor */
1323
1324         builtin_monitorexit((java_objectheader *) m );
1325 #endif
1326
1327         if (r) {
1328                 if (compileverbose)
1329                         log_message_method("Running: ", m);
1330         }
1331
1332         /* return pointer to the methods entry point */
1333
1334         return r;
1335 }
1336
1337
1338 /* jit_compile_intern **********************************************************
1339
1340    Static internal function which does the actual compilation.
1341
1342 *******************************************************************************/
1343
1344 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1345                                                                           registerdata *rd, loopdata *ld,
1346                                                                           t_inlining_globals *id)
1347 {
1348 #ifdef LSRA
1349         bool old_opt_lsra;
1350 #endif
1351
1352
1353         /* print log message for compiled method */
1354
1355         if (compileverbose)
1356                 log_message_method("Compiling: ", m);
1357
1358         /* initialize the static function's class */
1359
1360         if (m->flags & ACC_STATIC && !m->class->initialized) {
1361                 if (initverbose)
1362                         log_message_class("Initialize class ", m->class);
1363
1364                 if (!initialize_class(m->class))
1365                         return NULL;
1366         }
1367
1368         /* initialisation of variables and subsystems */
1369
1370         m->isleafmethod = true;
1371
1372 #if defined(STATISTICS)
1373         if (opt_stat) {
1374                 count_tryblocks += m->exceptiontablelength;
1375                 count_javacodesize += m->jcodelength + 18;
1376                 count_javaexcsize += m->exceptiontablelength * SIZEOF_VOID_P;
1377         }
1378 #endif
1379
1380         /* initialise parameter type descriptor */
1381
1382         method_descriptor2types(m);
1383
1384         /* call the compiler passes ***********************************************/
1385
1386         if (compileverbose)
1387                 log_message_method("Parsing: ", m);
1388
1389         /* call parse pass */
1390         if (!parse(m, cd, id)) {
1391                 if (compileverbose)
1392                         log_message_method("Exception while parsing: ", m);
1393
1394                 return NULL;
1395         }
1396
1397         if (compileverbose) {
1398                 log_message_method("Parsing done: ", m);
1399                 log_message_method("Analysing: ", m);
1400         }
1401
1402         /* call stack analysis pass */
1403         if (!analyse_stack(m, cd, rd)) {
1404                 if (compileverbose)
1405                         log_message_method("Exception while analysing: ", m);
1406
1407                 return NULL;
1408         }
1409
1410         if (compileverbose)
1411                 log_message_method("Analysing done: ", m);
1412
1413 #ifdef CACAO_TYPECHECK
1414         if (opt_verify) {
1415                 if (compileverbose)
1416                         log_message_method("Typechecking: ", m);
1417
1418                 /* call typecheck pass */
1419                 if (!typecheck(m, cd, rd)) {
1420                         if (compileverbose)
1421                                 log_message_method("Exception while typechecking: ", m);
1422
1423                         return NULL;
1424                 }
1425
1426                 if (compileverbose)
1427                         log_message_method("Typechecking done: ", m);
1428         }
1429 #endif
1430
1431         if (opt_loops) {
1432                 depthFirst(m, ld);
1433                 analyseGraph(m, ld);
1434                 optimize_loops(m, cd, ld);
1435         }
1436    
1437 #ifdef SPECIALMEMUSE
1438 /*      preregpass(m, rd); */
1439 #endif
1440
1441         if (compileverbose)
1442                 log_message_method("Allocating registers: ", m);
1443
1444         /* allocate registers */
1445 #ifdef LSRA
1446         old_opt_lsra=opt_lsra;
1447         if (opt_lsra) {
1448                 if (!lsra(m, cd, rd, id)) {
1449                         opt_lsra = false;
1450 /*                      log_message_method("Regalloc Fallback: ", m); */
1451                         regalloc( m, cd, rd );
1452                 } else {
1453 #ifdef STATISTICS
1454                         if (opt_stat) count_methods_allocated_by_lsra++;
1455 #endif
1456 /*                      log_message_method("Regalloc LSRA: ", m); */
1457                 }
1458         }
1459         else
1460 #endif /* LSRA */
1461         {
1462 #ifdef STATISTICS
1463                 if (opt_stat)
1464 #ifdef LSRA
1465                         if (!opt_lsra)
1466 #endif          
1467                                 count_locals_conflicts += (cd->maxlocals-1)*(cd->maxlocals);
1468 #endif          
1469                 regalloc(m, cd, rd);
1470         }
1471
1472 #ifdef STATISTICS
1473         if (opt_stat)
1474                 reg_make_statistics(m, cd, rd);
1475 #endif
1476
1477         if (compileverbose) {
1478                 log_message_method("Allocating registers done: ", m);
1479                 log_message_method("Generating code: ", m);
1480         }
1481
1482         /* now generate the machine code */
1483         codegen(m, cd, rd);
1484
1485         if (compileverbose)
1486                 log_message_method("Generating code done: ", m);
1487
1488         /* intermediate and assembly code listings */
1489                 
1490         if (showintermediate) {
1491                 show_icmd_method(m, cd, rd);
1492
1493         } else if (showdisassemble) {
1494                 disassemble((void *) ((long) m->mcode + cd->dseglen), 
1495                                         m->mcodelength - cd->dseglen);
1496         }
1497
1498         if (showddatasegment)
1499                 dseg_display(m, cd);
1500
1501         if (compileverbose)
1502                 log_message_method("Compiling done: ", m);
1503
1504 #ifdef LSRA
1505         opt_lsra=old_opt_lsra;
1506 #endif
1507         /* return pointer to the methods entry point */
1508
1509         return m->entrypoint;
1510
1511
1512
1513 void compile_all_class_methods(classinfo *c)
1514 {
1515         s4 i;
1516
1517         for (i = 0; i < c->methodscount; i++) {
1518                 (void) jit_compile(&(c->methods[i]));
1519         }
1520 }
1521
1522
1523 /* jit_init ********************************************************************
1524
1525    XXX
1526
1527 *******************************************************************************/
1528
1529 void jit_init(void)
1530 {
1531         s4 i;
1532
1533 #if defined(__ALPHA__)
1534         has_ext_instr_set = ! has_no_x_instr_set();
1535 #endif
1536
1537         for (i = 0; i < 256; i++)
1538                 stackreq[i] = 1;
1539
1540         stackreq[JAVA_NOP]          = 0;
1541         stackreq[JAVA_ISTORE]       = 0;
1542         stackreq[JAVA_LSTORE]       = 0;
1543         stackreq[JAVA_FSTORE]       = 0;
1544         stackreq[JAVA_DSTORE]       = 0;
1545         stackreq[JAVA_ASTORE]       = 0;
1546         stackreq[JAVA_ISTORE_0]     = 0;
1547         stackreq[JAVA_ISTORE_1]     = 0;
1548         stackreq[JAVA_ISTORE_2]     = 0;
1549         stackreq[JAVA_ISTORE_3]     = 0;
1550         stackreq[JAVA_LSTORE_0]     = 0;
1551         stackreq[JAVA_LSTORE_1]     = 0;
1552         stackreq[JAVA_LSTORE_2]     = 0;
1553         stackreq[JAVA_LSTORE_3]     = 0;
1554         stackreq[JAVA_FSTORE_0]     = 0;
1555         stackreq[JAVA_FSTORE_1]     = 0;
1556         stackreq[JAVA_FSTORE_2]     = 0;
1557         stackreq[JAVA_FSTORE_3]     = 0;
1558         stackreq[JAVA_DSTORE_0]     = 0;
1559         stackreq[JAVA_DSTORE_1]     = 0;
1560         stackreq[JAVA_DSTORE_2]     = 0;
1561         stackreq[JAVA_DSTORE_3]     = 0;
1562         stackreq[JAVA_ASTORE_0]     = 0;
1563         stackreq[JAVA_ASTORE_1]     = 0;
1564         stackreq[JAVA_ASTORE_2]     = 0;
1565         stackreq[JAVA_ASTORE_3]     = 0;
1566         stackreq[JAVA_IASTORE]      = 0;
1567         stackreq[JAVA_LASTORE]      = 0;
1568         stackreq[JAVA_FASTORE]      = 0;
1569         stackreq[JAVA_DASTORE]      = 0;
1570         stackreq[JAVA_AASTORE]      = 0;
1571         stackreq[JAVA_BASTORE]      = 0;
1572         stackreq[JAVA_CASTORE]      = 0;
1573         stackreq[JAVA_SASTORE]      = 0;
1574         stackreq[JAVA_POP]          = 0;
1575         stackreq[JAVA_POP2]         = 0;
1576         stackreq[JAVA_IINC]         = 0;
1577         stackreq[JAVA_IFEQ]         = 0;
1578         stackreq[JAVA_IFNE]         = 0;
1579         stackreq[JAVA_IFLT]         = 0;
1580         stackreq[JAVA_IFGE]         = 0;
1581         stackreq[JAVA_IFGT]         = 0;
1582         stackreq[JAVA_IFLE]         = 0;
1583         stackreq[JAVA_IF_ICMPEQ]    = 0;
1584         stackreq[JAVA_IF_ICMPNE]    = 0;
1585         stackreq[JAVA_IF_ICMPLT]    = 0;
1586         stackreq[JAVA_IF_ICMPGE]    = 0;
1587         stackreq[JAVA_IF_ICMPGT]    = 0;
1588         stackreq[JAVA_IF_ICMPLE]    = 0;
1589         stackreq[JAVA_IF_ACMPEQ]    = 0;
1590         stackreq[JAVA_IF_ACMPNE]    = 0;
1591         stackreq[JAVA_GOTO]         = 0;
1592         stackreq[JAVA_RET]          = 0;
1593         stackreq[JAVA_TABLESWITCH]  = 0;
1594         stackreq[JAVA_LOOKUPSWITCH] = 0;
1595         stackreq[JAVA_IRETURN]      = 0;
1596         stackreq[JAVA_LRETURN]      = 0;
1597         stackreq[JAVA_FRETURN]      = 0;
1598         stackreq[JAVA_DRETURN]      = 0;
1599         stackreq[JAVA_ARETURN]      = 0;
1600         stackreq[JAVA_RETURN]       = 0;
1601         stackreq[JAVA_PUTSTATIC]    = 0;
1602         stackreq[JAVA_PUTFIELD]     = 0;
1603         stackreq[JAVA_MONITORENTER] = 0;
1604         stackreq[JAVA_MONITOREXIT]  = 0;
1605         stackreq[JAVA_WIDE]         = 0;
1606         stackreq[JAVA_IFNULL]       = 0;
1607         stackreq[JAVA_IFNONNULL]    = 0;
1608         stackreq[JAVA_GOTO_W]       = 0;
1609         stackreq[JAVA_BREAKPOINT]   = 0;
1610
1611         stackreq[JAVA_SWAP] = 2;
1612         stackreq[JAVA_DUP2] = 2;
1613         stackreq[JAVA_DUP_X1] = 3;
1614         stackreq[JAVA_DUP_X2] = 4;
1615         stackreq[JAVA_DUP2_X1] = 3;
1616         stackreq[JAVA_DUP2_X2] = 4;
1617
1618         /* initialize the codegen stuff */
1619         codegen_init();
1620 }
1621
1622
1623 void jit_close()
1624 {
1625 }
1626
1627
1628 /*
1629  * These are local overrides for various environment variables in Emacs.
1630  * Please do not remove this and leave it at the end of the file, where
1631  * Emacs will automagically detect them.
1632  * ---------------------------------------------------------------------
1633  * Local variables:
1634  * mode: c
1635  * indent-tabs-mode: t
1636  * c-basic-offset: 4
1637  * tab-width: 4
1638  * End:
1639  */