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