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