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