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