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