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