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