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