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