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