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