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