*** empty log message ***
[cacao.git] / src / vm / jit / jit.c
1 /* vm/jit/jit.c - calls the code generation functions
2
3    Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4    R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5    C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6    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., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Andreas Krall
28             Reinhard Grafl
29
30    Changes: Edwin Steiner
31
32    $Id: jit.c 1953 2005-02-17 13:42:23Z christian $
33
34 */
35
36
37 #include <stdlib.h>
38
39 #include "codegen.h"
40 #include "disass.h"
41 #include "types.h"
42 #include "mm/memory.h"
43 #include "toolbox/logging.h"
44 #include "vm/builtin.h"
45 #include "vm/global.h"
46 #include "vm/loader.h"
47 #include "vm/options.h"
48 #include "vm/statistics.h"
49 #include "vm/tables.h"
50 #include "vm/jit/codegen.inc.h"
51 #include "vm/jit/jit.h"
52 #ifdef LSRA
53 #include "vm/jit/lsra.h"
54 #endif
55 #include "vm/jit/parse.h"
56 #include "vm/jit/reg.h"
57 #include "vm/jit/stack.h"
58 #include "vm/jit/inline/inline.h"
59 #include "vm/jit/inline/parseRT.h"
60 #include "vm/jit/inline/parseXTA.h"
61 #include "vm/jit/loop/analyze.h"
62 #include "vm/jit/loop/graph.h"
63 #include "vm/jit/loop/loop.h"
64 #include "vm/jit/verify/typecheck.h"
65
66 #if defined(USE_THREADS)
67 # if defined(NATIVE_THREADS)
68 #  include "threads/native/threads.h"
69 # else
70 #  include "threads/green/threads.h"
71 # endif
72 #endif
73
74
75
76 /* global switches ************************************************************/
77
78 int stackreq[256];
79
80                                 
81 int jcommandsize[256] = {
82
83 #define JAVA_NOP               0
84 #define ICMD_NOP               0
85         1,
86 #define JAVA_ACONST_NULL       1
87 #define ICMD_ACONST            1        /* val.a = constant                   */
88         1,
89 #define JAVA_ICONST_M1         2
90 #define ICMD_NULLCHECKPOP      2
91         1,
92 #define JAVA_ICONST_0          3
93 #define ICMD_ICONST            3        /* val.i = constant                   */
94         1,
95 #define JAVA_ICONST_1          4
96         1,
97 #define JAVA_ICONST_2          5
98 #define ICMD_IDIVPOW2          5        /* val.i = constant                   */
99         1,
100 #define JAVA_ICONST_3          6
101 #define ICMD_LDIVPOW2          6        /* val.l = constant                   */
102         1,
103 #define JAVA_ICONST_4          7
104         1,
105 #define JAVA_ICONST_5          8
106         1,
107 #define JAVA_LCONST_0          9
108 #define ICMD_LCONST            9        /* val.l = constant                   */
109         1,
110 #define JAVA_LCONST_1         10
111 #define ICMD_LCMPCONST        10        /* val.l = constant                   */
112         1,
113 #define JAVA_FCONST_0         11
114 #define ICMD_FCONST           11        /* val.f = constant                   */
115         1,
116 #define JAVA_FCONST_1         12
117         1,
118 #define JAVA_FCONST_2         13
119 #define ICMD_ELSE_ICONST      13
120         1,
121 #define JAVA_DCONST_0         14
122 #define ICMD_DCONST           14        /* val.d = constant                   */
123         1,
124 #define JAVA_DCONST_1         15
125 #define ICMD_IFEQ_ICONST      15
126         1,
127 #define JAVA_BIPUSH           16
128 #define ICMD_IFNE_ICONST      16
129         2,
130 #define JAVA_SIPUSH           17
131 #define ICMD_IFLT_ICONST      17
132         3,
133 #define JAVA_LDC1             18
134 #define ICMD_IFGE_ICONST      18
135         2,
136 #define JAVA_LDC2             19
137 #define ICMD_IFGT_ICONST      19
138         3,
139 #define JAVA_LDC2W            20
140 #define ICMD_IFLE_ICONST      20
141         3,
142                                             /* order of LOAD instructions must be */
143                                             /* equal to order of TYPE_XXX defines */
144 #define JAVA_ILOAD            21
145 #define ICMD_ILOAD            21        /* op1 = local variable               */
146         2,                      
147 #define JAVA_LLOAD            22
148 #define ICMD_LLOAD            22        /* op1 = local variable               */
149         2,
150 #define JAVA_FLOAD            23
151 #define ICMD_FLOAD            23        /* op1 = local variable               */
152         2,
153 #define JAVA_DLOAD            24
154 #define ICMD_DLOAD            24        /* op1 = local variable               */
155         2,
156 #define JAVA_ALOAD            25
157 #define ICMD_ALOAD            25        /* op1 = local variable               */
158         2,
159 #define JAVA_ILOAD_0          26
160 #define ICMD_IADDCONST        26        /* val.i = constant                   */
161         1,
162 #define JAVA_ILOAD_1          27
163 #define ICMD_ISUBCONST        27        /* val.i = constant                   */
164         1,
165 #define JAVA_ILOAD_2          28
166 #define ICMD_IMULCONST        28        /* val.i = constant                   */
167         1,
168 #define JAVA_ILOAD_3          29
169 #define ICMD_IANDCONST        29        /* val.i = constant                   */
170         1,
171 #define JAVA_LLOAD_0          30
172 #define ICMD_IORCONST         30        /* val.i = constant                   */
173         1,
174 #define JAVA_LLOAD_1          31
175 #define ICMD_IXORCONST        31        /* val.i = constant                   */
176         1,
177 #define JAVA_LLOAD_2          32
178 #define ICMD_ISHLCONST        32        /* val.i = constant                   */
179         1,
180 #define JAVA_LLOAD_3          33
181 #define ICMD_ISHRCONST        33        /* val.i = constant                   */
182         1,
183 #define JAVA_FLOAD_0          34
184 #define ICMD_IUSHRCONST       34        /* val.i = constant                   */
185         1,
186 #define JAVA_FLOAD_1          35
187 #define ICMD_IREMPOW2         35        /* val.i = constant                   */
188         1,
189 #define JAVA_FLOAD_2          36
190 #define ICMD_LADDCONST        36        /* val.l = constant                   */
191         1,
192 #define JAVA_FLOAD_3          37
193 #define ICMD_LSUBCONST        37        /* val.l = constant                   */
194         1,
195 #define JAVA_DLOAD_0          38
196 #define ICMD_LMULCONST        38        /* val.l = constant                   */
197         1,
198 #define JAVA_DLOAD_1          39
199 #define ICMD_LANDCONST        39        /* val.l = constant                   */
200         1,
201 #define JAVA_DLOAD_2          40
202 #define ICMD_LORCONST         40        /* val.l = constant                   */
203         1,
204 #define JAVA_DLOAD_3          41
205 #define ICMD_LXORCONST        41        /* val.l = constant                   */
206         1,
207 #define JAVA_ALOAD_0          42
208 #define ICMD_LSHLCONST        42        /* val.l = constant                   */
209         1,
210 #define JAVA_ALOAD_1          43
211 #define ICMD_LSHRCONST        43        /* val.l = constant                   */
212         1,
213 #define JAVA_ALOAD_2          44
214 #define ICMD_LUSHRCONST       44        /* val.l = constant                   */
215         1,
216 #define JAVA_ALOAD_3          45
217 #define ICMD_LREMPOW2         45        /* val.l = constant                   */
218         1,
219 #define JAVA_IALOAD           46
220 #define ICMD_IALOAD           46
221         1,
222 #define JAVA_LALOAD           47
223 #define ICMD_LALOAD           47
224         1,
225 #define JAVA_FALOAD           48
226 #define ICMD_FALOAD           48
227         1,
228 #define JAVA_DALOAD           49
229 #define ICMD_DALOAD           49
230         1,
231 #define JAVA_AALOAD           50
232 #define ICMD_AALOAD           50
233         1,
234 #define JAVA_BALOAD           51
235 #define ICMD_BALOAD           51
236         1,
237 #define JAVA_CALOAD           52
238 #define ICMD_CALOAD           52
239         1,
240 #define JAVA_SALOAD           53
241 #define ICMD_SALOAD           53
242         1,
243                                             /* order of STORE instructions must be*/
244                                             /* equal to order of TYPE_XXX defines */
245 #define JAVA_ISTORE           54
246 #define ICMD_ISTORE           54        /* op1 = local variable               */
247         2,
248 #define JAVA_LSTORE           55
249 #define ICMD_LSTORE           55        /* op1 = local variable               */
250         2,
251 #define JAVA_FSTORE           56
252 #define ICMD_FSTORE           56        /* op1 = local variable               */
253         2,
254 #define JAVA_DSTORE           57
255 #define ICMD_DSTORE           57        /* op1 = local variable               */
256         2,
257 #define JAVA_ASTORE           58
258 #define ICMD_ASTORE           58        /* op1 = local variable               */
259         2,
260 #define JAVA_ISTORE_0         59
261 #define ICMD_IF_LEQ           59        /* op1 = target JavaVM pc, val.l      */
262         1,
263 #define JAVA_ISTORE_1         60
264 #define ICMD_IF_LNE           60        /* op1 = target JavaVM pc, val.l      */
265         1,
266 #define JAVA_ISTORE_2         61
267 #define ICMD_IF_LLT           61        /* op1 = target JavaVM pc, val.l      */
268         1,
269 #define JAVA_ISTORE_3         62
270 #define ICMD_IF_LGE           62        /* op1 = target JavaVM pc, val.l      */
271         1,
272 #define JAVA_LSTORE_0         63
273 #define ICMD_IF_LGT           63        /* op1 = target JavaVM pc, val.l      */
274         1,
275 #define JAVA_LSTORE_1         64
276 #define ICMD_IF_LLE           64        /* op1 = target JavaVM pc, val.l      */
277         1,
278 #define JAVA_LSTORE_2         65
279 #define ICMD_IF_LCMPEQ        65        /* op1 = target JavaVM pc             */
280         1,
281 #define JAVA_LSTORE_3         66
282 #define ICMD_IF_LCMPNE        66        /* op1 = target JavaVM pc             */
283         1,
284 #define JAVA_FSTORE_0         67
285 #define ICMD_IF_LCMPLT        67        /* op1 = target JavaVM pc             */
286         1,
287 #define JAVA_FSTORE_1         68
288 #define ICMD_IF_LCMPGE        68        /* op1 = target JavaVM pc             */
289         1,
290 #define JAVA_FSTORE_2         69
291 #define ICMD_IF_LCMPGT        69        /* op1 = target JavaVM pc             */
292         1,
293 #define JAVA_FSTORE_3         70
294 #define ICMD_IF_LCMPLE        70        /* op1 = target JavaVM pc             */
295         1,
296 #define JAVA_DSTORE_0         71
297         1,
298 #define JAVA_DSTORE_1         72
299         1,
300 #define JAVA_DSTORE_2         73
301         1,
302 #define JAVA_DSTORE_3         74
303         1,
304 #define JAVA_ASTORE_0         75
305         1,
306 #define JAVA_ASTORE_1         76
307         1,
308 #define JAVA_ASTORE_2         77
309         1,
310 #define JAVA_ASTORE_3         78
311         1,
312 #define JAVA_IASTORE          79
313 #define ICMD_IASTORE          79
314         1,
315 #define JAVA_LASTORE          80
316 #define ICMD_LASTORE          80
317         1,
318 #define JAVA_FASTORE          81
319 #define ICMD_FASTORE          81
320         1,
321 #define JAVA_DASTORE          82
322 #define ICMD_DASTORE          82
323         1,
324 #define JAVA_AASTORE          83
325 #define ICMD_AASTORE          83
326         1,
327 #define JAVA_BASTORE          84
328 #define ICMD_BASTORE          84
329         1,
330 #define JAVA_CASTORE          85
331 #define ICMD_CASTORE          85
332         1,
333 #define JAVA_SASTORE          86
334 #define ICMD_SASTORE          86
335         1,
336 #define JAVA_POP              87
337 #define ICMD_POP              87
338         1,
339 #define JAVA_POP2             88
340 #define ICMD_POP2             88
341         1,
342 #define JAVA_DUP              89
343 #define ICMD_DUP              89
344         1,
345 #define JAVA_DUP_X1           90
346 #define ICMD_DUP_X1           90
347         1,
348 #define JAVA_DUP_X2           91
349 #define ICMD_DUP_X2           91
350         1,
351 #define JAVA_DUP2             92
352 #define ICMD_DUP2             92
353         1,
354 #define JAVA_DUP2_X1          93
355 #define ICMD_DUP2_X1          93
356         1,
357 #define JAVA_DUP2_X2          94
358 #define ICMD_DUP2_X2          94
359         1,
360 #define JAVA_SWAP             95
361 #define ICMD_SWAP             95
362         1,
363 #define JAVA_IADD             96
364 #define ICMD_IADD             96
365         1,
366 #define JAVA_LADD             97
367 #define ICMD_LADD             97
368         1,
369 #define JAVA_FADD             98
370 #define ICMD_FADD             98
371         1,
372 #define JAVA_DADD             99
373 #define ICMD_DADD             99
374         1,
375 #define JAVA_ISUB             100
376 #define ICMD_ISUB             100
377         1,
378 #define JAVA_LSUB             101
379 #define ICMD_LSUB             101
380         1,
381 #define JAVA_FSUB             102
382 #define ICMD_FSUB             102
383         1,
384 #define JAVA_DSUB             103
385 #define ICMD_DSUB             103
386         1,
387 #define JAVA_IMUL             104
388 #define ICMD_IMUL             104
389         1,
390 #define JAVA_LMUL             105
391 #define ICMD_LMUL             105
392         1,
393 #define JAVA_FMUL             106
394 #define ICMD_FMUL             106
395         1,
396 #define JAVA_DMUL             107
397 #define ICMD_DMUL             107
398         1,
399 #define JAVA_IDIV             108
400 #define ICMD_IDIV             108
401         1,
402 #define JAVA_LDIV             109
403 #define ICMD_LDIV             109
404         1,
405 #define JAVA_FDIV             110
406 #define ICMD_FDIV             110
407         1,
408 #define JAVA_DDIV             111
409 #define ICMD_DDIV             111
410         1,
411 #define JAVA_IREM             112
412 #define ICMD_IREM             112
413         1,
414 #define JAVA_LREM             113
415 #define ICMD_LREM             113
416         1,
417 #define JAVA_FREM             114
418 #define ICMD_FREM             114
419         1,
420 #define JAVA_DREM             115
421 #define ICMD_DREM             115
422         1,
423 #define JAVA_INEG             116
424 #define ICMD_INEG             116
425         1,
426 #define JAVA_LNEG             117
427 #define ICMD_LNEG             117
428         1,
429 #define JAVA_FNEG             118
430 #define ICMD_FNEG             118
431         1,
432 #define JAVA_DNEG             119
433 #define ICMD_DNEG             119
434         1,
435 #define JAVA_ISHL             120
436 #define ICMD_ISHL             120
437         1,
438 #define JAVA_LSHL             121
439 #define ICMD_LSHL             121
440         1,
441 #define JAVA_ISHR             122
442 #define ICMD_ISHR             122
443         1,
444 #define JAVA_LSHR             123
445 #define ICMD_LSHR             123
446         1,
447 #define JAVA_IUSHR            124
448 #define ICMD_IUSHR            124
449         1,
450 #define JAVA_LUSHR            125
451 #define ICMD_LUSHR            125
452         1,
453 #define JAVA_IAND             126
454 #define ICMD_IAND             126
455         1,
456 #define JAVA_LAND             127
457 #define ICMD_LAND             127
458         1,
459 #define JAVA_IOR              128
460 #define ICMD_IOR              128
461         1,
462 #define JAVA_LOR              129
463 #define ICMD_LOR              129
464         1,
465 #define JAVA_IXOR             130
466 #define ICMD_IXOR             130
467         1,
468 #define JAVA_LXOR             131
469 #define ICMD_LXOR             131
470         1,
471 #define JAVA_IINC             132
472 #define ICMD_IINC             132   /* op1 = local variable, val.i = constant */
473         3,
474 #define JAVA_I2L              133
475 #define ICMD_I2L              133
476         1,
477 #define JAVA_I2F              134
478 #define ICMD_I2F              134
479         1,
480 #define JAVA_I2D              135
481 #define ICMD_I2D              135
482         1,
483 #define JAVA_L2I              136
484 #define ICMD_L2I              136
485         1,
486 #define JAVA_L2F              137
487 #define ICMD_L2F              137
488         1,
489 #define JAVA_L2D              138
490 #define ICMD_L2D              138
491         1,
492 #define JAVA_F2I              139
493 #define ICMD_F2I              139
494         1,
495 #define JAVA_F2L              140
496 #define ICMD_F2L              140
497         1,
498 #define JAVA_F2D              141
499 #define ICMD_F2D              141
500         1,
501 #define JAVA_D2I              142
502 #define ICMD_D2I              142
503         1,
504 #define JAVA_D2L              143
505 #define ICMD_D2L              143
506         1,
507 #define JAVA_D2F              144
508 #define ICMD_D2F              144
509         1,
510 #define JAVA_INT2BYTE         145
511 #define ICMD_INT2BYTE         145
512         1,
513 #define JAVA_INT2CHAR         146
514 #define ICMD_INT2CHAR         146
515         1,
516 #define JAVA_INT2SHORT        147
517 #define ICMD_INT2SHORT        147
518         1,
519 #define JAVA_LCMP             148
520 #define ICMD_LCMP             148
521         1,
522 #define JAVA_FCMPL            149
523 #define ICMD_FCMPL            149
524         1,
525 #define JAVA_FCMPG            150
526 #define ICMD_FCMPG            150
527         1,
528 #define JAVA_DCMPL            151
529 #define ICMD_DCMPL            151
530         1,
531 #define JAVA_DCMPG            152
532 #define ICMD_DCMPG            152
533         1,
534 #define JAVA_IFEQ             153
535 #define ICMD_IFEQ             153       /* op1 = target JavaVM pc, val.i      */
536         3,
537 #define JAVA_IFNE             154
538 #define ICMD_IFNE             154       /* op1 = target JavaVM pc, val.i      */
539         3,
540 #define JAVA_IFLT             155
541 #define ICMD_IFLT             155       /* op1 = target JavaVM pc, val.i      */
542         3,
543 #define JAVA_IFGE             156
544 #define ICMD_IFGE             156       /* op1 = target JavaVM pc, val.i      */
545         3,
546 #define JAVA_IFGT             157
547 #define ICMD_IFGT             157       /* op1 = target JavaVM pc, val.i      */
548         3,
549 #define JAVA_IFLE             158
550 #define ICMD_IFLE             158       /* op1 = target JavaVM pc, val.i      */
551         3,
552 #define JAVA_IF_ICMPEQ        159
553 #define ICMD_IF_ICMPEQ        159       /* op1 = target JavaVM pc             */
554         3,
555 #define JAVA_IF_ICMPNE        160
556 #define ICMD_IF_ICMPNE        160       /* op1 = target JavaVM pc             */
557         3,
558 #define JAVA_IF_ICMPLT        161
559 #define ICMD_IF_ICMPLT        161       /* op1 = target JavaVM pc             */
560         3,
561 #define JAVA_IF_ICMPGE        162
562 #define ICMD_IF_ICMPGE        162       /* op1 = target JavaVM pc             */
563         3,
564 #define JAVA_IF_ICMPGT        163
565 #define ICMD_IF_ICMPGT        163       /* op1 = target JavaVM pc             */
566         3,
567 #define JAVA_IF_ICMPLE        164
568 #define ICMD_IF_ICMPLE        164       /* op1 = target JavaVM pc             */
569         3,
570 #define JAVA_IF_ACMPEQ        165
571 #define ICMD_IF_ACMPEQ        165       /* op1 = target JavaVM pc             */
572         3,
573 #define JAVA_IF_ACMPNE        166
574 #define ICMD_IF_ACMPNE        166       /* op1 = target JavaVM pc             */
575         3,
576 #define JAVA_GOTO             167
577 #define ICMD_GOTO             167       /* op1 = target JavaVM pc             */
578         3,
579 #define JAVA_JSR              168
580 #define ICMD_JSR              168       /* op1 = target JavaVM pc             */
581         3,
582 #define JAVA_RET              169
583 #define ICMD_RET              169       /* op1 = local variable               */
584         2,
585 #define JAVA_TABLESWITCH      170
586 #define ICMD_TABLESWITCH      170       /* val.a = pointer to s4 table        */
587         0,                                  /* length must be computed            */
588 #define JAVA_LOOKUPSWITCH     171
589 #define ICMD_LOOKUPSWITCH     171       /* val.a = pointer to s4 table        */
590         0,                                  /* length must be computed            */
591 #define JAVA_IRETURN          172
592 #define ICMD_IRETURN          172
593         1,
594 #define JAVA_LRETURN          173
595 #define ICMD_LRETURN          173
596         1,
597 #define JAVA_FRETURN          174
598 #define ICMD_FRETURN          174
599         1,
600 #define JAVA_DRETURN          175
601 #define ICMD_DRETURN          175
602         1,
603 #define JAVA_ARETURN          176
604 #define ICMD_ARETURN          176
605         1,
606 #define JAVA_RETURN           177
607 #define ICMD_RETURN           177
608         1,
609 #define JAVA_GETSTATIC        178
610 #define ICMD_GETSTATIC        178       /* op1 = type, val.a = field address  */
611         3,
612 #define JAVA_PUTSTATIC        179
613 #define ICMD_PUTSTATIC        179       /* op1 = type, val.a = field address  */
614         3,
615 #define JAVA_GETFIELD         180
616 #define ICMD_GETFIELD         180       /* op1 = type, val.i = field offset   */
617         3,
618 #define JAVA_PUTFIELD         181
619 #define ICMD_PUTFIELD         181       /* op1 = type, val.i = field offset   */
620         3,
621 #define JAVA_INVOKEVIRTUAL    182
622 #define ICMD_INVOKEVIRTUAL    182       /* val.a = method info pointer        */
623         3,
624 #define JAVA_INVOKESPECIAL    183
625 #define ICMD_INVOKESPECIAL    183       /* val.a = method info pointer        */
626         3,
627 #define JAVA_INVOKESTATIC     184
628 #define ICMD_INVOKESTATIC     184       /* val.a = method info pointer        */
629         3,
630 #define JAVA_INVOKEINTERFACE  185
631 #define ICMD_INVOKEINTERFACE  185       /* val.a = method info pointer        */
632         5,
633 #define ICMD_CHECKASIZE       186       /*                                    */
634         1, /* unused */
635 #define JAVA_NEW              187
636 #define ICMD_NEW              187       /* op1 = 1, val.a = class pointer     */
637         3,
638 #define JAVA_NEWARRAY         188
639 #define ICMD_NEWARRAY         188       /* op1 = basic type                   */
640         2,
641 #define JAVA_ANEWARRAY        189
642 #define ICMD_ANEWARRAY        189       /* op1 = 0, val.a = array pointer     */
643         3,                                  /* op1 = 1, val.a = class pointer     */
644 #define JAVA_ARRAYLENGTH      190
645 #define ICMD_ARRAYLENGTH      190
646         1,
647 #define JAVA_ATHROW           191
648 #define ICMD_ATHROW           191
649         1,
650 #define JAVA_CHECKCAST        192
651 #define ICMD_CHECKCAST        192       /* op1 = 0, val.a = array pointer     */
652         3,                                  /* op1 = 1, val.a = class pointer     */
653 #define JAVA_INSTANCEOF       193
654 #define ICMD_INSTANCEOF       193       /* op1 = 0, val.a = array pointer     */
655         3,                                  /* op1 = 1, val.a = class pointer     */
656 #define JAVA_MONITORENTER     194
657 #define ICMD_MONITORENTER     194
658         1,
659 #define JAVA_MONITOREXIT      195
660 #define ICMD_MONITOREXIT      195
661         1,
662 #define JAVA_WIDE             196
663         0, /* length must be computed */
664 #define JAVA_MULTIANEWARRAY   197
665 #define ICMD_MULTIANEWARRAY   197       /* op1 = dimension, val.a = array     */
666         4,                                  /* pointer                            */
667 #define JAVA_IFNULL           198
668 #define ICMD_IFNULL           198       /* op1 = target JavaVM pc             */
669         3,
670 #define JAVA_IFNONNULL        199
671 #define ICMD_IFNONNULL        199       /* op1 = target JavaVM pc             */
672         3,
673 #define JAVA_GOTO_W           200
674         5,
675 #define JAVA_JSR_W            201
676         5,
677 #define JAVA_BREAKPOINT       202
678         1,
679 #define ICMD_CHECKEXCEPTION   203
680         1,
681 #define ICMD_IASTORECONST     204
682         1,
683 #define ICMD_LASTORECONST     205
684         1,
685 #define ICMD_FASTORECONST     206
686         1,
687 #define ICMD_DASTORECONST     207
688         1,
689 #define ICMD_AASTORECONST     208
690         1,
691 #define ICMD_BASTORECONST     209
692         1,
693 #define ICMD_CASTORECONST     210
694         1,
695 #define ICMD_SASTORECONST     211
696         1,
697
698         /* unused */
699             1,1,1,1,1,1,1,1,
700         1,1,1,1,1,1,1,1,1,1,
701         1,1,1,1,1,1,1,1,1,1,
702         1,1,1,1,1,1,1,1,1,1,
703         1,1,1,1,1
704 };
705
706
707 char *icmd_names[256] = {
708         "NOP            ", /*               0 */
709         "ACONST         ", /*               1 */
710         "NULLCHECKPOP   ", /* ICONST_M1     2 */
711         "ICONST         ", /*               3 */
712         "UNDEF4         ", /* ICONST_1      4 */
713         "IDIVPOW2       ", /* ICONST_2      5 */
714         "LDIVPOW2       ", /* ICONST_3      6 */
715         "UNDEF7         ", /* ICONST_4      7 */
716         "UNDEF8         ", /* ICONST_5      8 */
717         "LCONST         ", /*               9 */
718         "LCMPCONST      ", /* LCONST_1     10 */
719         "FCONST         ", /*              11 */
720         "UNDEF12        ", /* FCONST_1     12 */
721         "ELSE_ICONST    ", /* FCONST_2     13 */
722         "DCONST         ", /*              14 */
723         "IFEQ_ICONST    ", /* DCONST_1     15 */
724         "IFNE_ICONST    ", /* BIPUSH       16 */
725         "IFLT_ICONST    ", /* SIPUSH       17 */
726         "IFGE_ICONST    ", /* LDC1         18 */
727         "IFGT_ICONST    ", /* LDC2         19 */
728         "IFLE_ICONST    ", /* LDC2W        20 */
729         "ILOAD          ", /*              21 */
730         "LLOAD          ", /*              22 */
731         "FLOAD          ", /*              23 */
732         "DLOAD          ", /*              24 */
733         "ALOAD          ", /*              25 */
734         "IADDCONST      ", /* ILOAD_0      26 */
735         "ISUBCONST      ", /* ILOAD_1      27 */
736         "IMULCONST      ", /* ILOAD_2      28 */
737         "IANDCONST      ", /* ILOAD_3      29 */
738         "IORCONST       ", /* LLOAD_0      30 */
739         "IXORCONST      ", /* LLOAD_1      31 */
740         "ISHLCONST      ", /* LLOAD_2      32 */
741         "ISHRCONST      ", /* LLOAD_3      33 */
742         "IUSHRCONST     ", /* FLOAD_0      34 */
743         "IREMPOW2       ", /* FLOAD_1      35 */
744         "LADDCONST      ", /* FLOAD_2      36 */
745         "LSUBCONST      ", /* FLOAD_3      37 */
746         "LMULCONST      ", /* DLOAD_0      38 */
747         "LANDCONST      ", /* DLOAD_1      39 */
748         "LORCONST       ", /* DLOAD_2      40 */
749         "LXORCONST      ", /* DLOAD_3      41 */
750         "LSHLCONST      ", /* ALOAD_0      42 */
751         "LSHRCONST      ", /* ALOAD_1      43 */
752         "LUSHRCONST     ", /* ALOAD_2      44 */
753         "LREMPOW2       ", /* ALOAD_3      45 */
754         "IALOAD         ", /*              46 */
755         "LALOAD         ", /*              47 */
756         "FALOAD         ", /*              48 */
757         "DALOAD         ", /*              49 */
758         "AALOAD         ", /*              50 */
759         "BALOAD         ", /*              51 */
760         "CALOAD         ", /*              52 */
761         "SALOAD         ", /*              53 */
762         "ISTORE         ", /*              54 */
763         "LSTORE         ", /*              55 */
764         "FSTORE         ", /*              56 */
765         "DSTORE         ", /*              57 */
766         "ASTORE         ", /*              58 */
767         "IF_LEQ         ", /* ISTORE_0     59 */
768         "IF_LNE         ", /* ISTORE_1     60 */
769         "IF_LLT         ", /* ISTORE_2     61 */
770         "IF_LGE         ", /* ISTORE_3     62 */
771         "IF_LGT         ", /* LSTORE_0     63 */
772         "IF_LLE         ", /* LSTORE_1     64 */
773         "IF_LCMPEQ      ", /* LSTORE_2     65 */
774         "IF_LCMPNE      ", /* LSTORE_3     66 */
775         "IF_LCMPLT      ", /* FSTORE_0     67 */
776         "IF_LCMPGE      ", /* FSTORE_1     68 */
777         "IF_LCMPGT      ", /* FSTORE_2     69 */
778         "IF_LCMPLE      ", /* FSTORE_3     70 */
779         "UNDEF71        ", /* DSTORE_0     71 */
780         "UNDEF72        ", /* DSTORE_1     72 */
781         "UNDEF73        ", /* DSTORE_2     73 */
782         "UNDEF74        ", /* DSTORE_3     74 */
783         "UNDEF75        ", /* ASTORE_0     75 */
784         "UNDEF76        ", /* ASTORE_1     76 */
785         "UNDEF77        ", /* ASTORE_2     77 */
786         "UNDEF78        ", /* ASTORE_3     78 */
787         "IASTORE        ", /*              79 */
788         "LASTORE        ", /*              80 */
789         "FASTORE        ", /*              81 */
790         "DASTORE        ", /*              82 */
791         "AASTORE        ", /*              83 */
792         "BASTORE        ", /*              84 */
793         "CASTORE        ", /*              85 */
794         "SASTORE        ", /*              86 */
795         "POP            ", /*              87 */
796         "POP2           ", /*              88 */
797         "DUP            ", /*              89 */
798         "DUP_X1         ", /*              90 */
799         "DUP_X2         ", /*              91 */
800         "DUP2           ", /*              92 */
801         "DUP2_X1        ", /*              93 */
802         "DUP2_X2        ", /*              94 */
803         "SWAP           ", /*              95 */
804         "IADD           ", /*              96 */
805         "LADD           ", /*              97 */
806         "FADD           ", /*              98 */
807         "DADD           ", /*              99 */
808         "ISUB           ", /*             100 */
809         "LSUB           ", /*             101 */
810         "FSUB           ", /*             102 */
811         "DSUB           ", /*             103 */
812         "IMUL           ", /*             104 */
813         "LMUL           ", /*             105 */
814         "FMUL           ", /*             106 */
815         "DMUL           ", /*             107 */
816         "IDIV           ", /*             108 */
817         "LDIV           ", /*             109 */
818         "FDIV           ", /*             110 */
819         "DDIV           ", /*             111 */
820         "IREM           ", /*             112 */
821         "LREM           ", /*             113 */
822         "FREM           ", /*             114 */
823         "DREM           ", /*             115 */
824         "INEG           ", /*             116 */
825         "LNEG           ", /*             117 */
826         "FNEG           ", /*             118 */
827         "DNEG           ", /*             119 */
828         "ISHL           ", /*             120 */
829         "LSHL           ", /*             121 */
830         "ISHR           ", /*             122 */
831         "LSHR           ", /*             123 */
832         "IUSHR          ", /*             124 */
833         "LUSHR          ", /*             125 */
834         "IAND           ", /*             126 */
835         "LAND           ", /*             127 */
836         "IOR            ", /*             128 */
837         "LOR            ", /*             129 */
838         "IXOR           ", /*             130 */
839         "LXOR           ", /*             131 */
840         "IINC           ", /*             132 */
841         "I2L            ", /*             133 */
842         "I2F            ", /*             134 */
843         "I2D            ", /*             135 */
844         "L2I            ", /*             136 */
845         "L2F            ", /*             137 */
846         "L2D            ", /*             138 */
847         "F2I            ", /*             139 */
848         "F2L            ", /*             140 */
849         "F2D            ", /*             141 */
850         "D2I            ", /*             142 */
851         "D2L            ", /*             143 */
852         "D2F            ", /*             144 */
853         "INT2BYTE       ", /*             145 */
854         "INT2CHAR       ", /*             146 */
855         "INT2SHORT      ", /*             147 */
856         "LCMP           ", /*             148 */
857         "FCMPL          ", /*             149 */
858         "FCMPG          ", /*             150 */
859         "DCMPL          ", /*             151 */
860         "DCMPG          ", /*             152 */
861         "IFEQ           ", /*             153 */
862         "IFNE           ", /*             154 */
863         "IFLT           ", /*             155 */
864         "IFGE           ", /*             156 */
865         "IFGT           ", /*             157 */
866         "IFLE           ", /*             158 */
867         "IF_ICMPEQ      ", /*             159 */
868         "IF_ICMPNE      ", /*             160 */
869         "IF_ICMPLT      ", /*             161 */
870         "IF_ICMPGE      ", /*             162 */
871         "IF_ICMPGT      ", /*             163 */
872         "IF_ICMPLE      ", /*             164 */
873         "IF_ACMPEQ      ", /*             165 */
874         "IF_ACMPNE      ", /*             166 */
875         "GOTO           ", /*             167 */
876         "JSR            ", /*             168 */
877         "RET            ", /*             169 */
878         "TABLESWITCH    ", /*             170 */
879         "LOOKUPSWITCH   ", /*             171 */
880         "IRETURN        ", /*             172 */
881         "LRETURN        ", /*             173 */
882         "FRETURN        ", /*             174 */
883         "DRETURN        ", /*             175 */
884         "ARETURN        ", /*             176 */
885         "RETURN         ", /*             177 */
886         "GETSTATIC      ", /*             178 */
887         "PUTSTATIC      ", /*             179 */
888         "GETFIELD       ", /*             180 */
889         "PUTFIELD       ", /*             181 */
890         "INVOKEVIRTUAL  ", /*             182 */
891         "INVOKESPECIAL  ", /*             183 */
892         "INVOKESTATIC   ", /*             184 */
893         "INVOKEINTERFACE", /*             185 */
894         "CHECKASIZE     ", /* UNDEF186    186 */
895         "NEW            ", /*             187 */
896         "NEWARRAY       ", /*             188 */
897         "ANEWARRAY      ", /*             189 */
898         "ARRAYLENGTH    ", /*             190 */
899         "ATHROW         ", /*             191 */
900         "CHECKCAST      ", /*             192 */
901         "INSTANCEOF     ", /*             193 */
902         "MONITORENTER   ", /*             194 */
903         "MONITOREXIT    ", /*             195 */
904         "UNDEF196       ", /* WIDE        196 */
905         "MULTIANEWARRAY ", /*             197 */
906         "IFNULL         ", /*             198 */
907         "IFNONNULL      ", /*             199 */
908         "UNDEF200       ", /* GOTO_W      200 */
909         "UNDEF201       ", /* JSR_W       201 */
910         "UNDEF202       ", /* BREAKPOINT  202 */
911         "CHECKEXCEPTION ", /* UNDEF203    203 */
912         "IASTORECONST   ", /*             204 */
913         "LASTORECONST   ", /*             205 */
914         "FASTORECONST   ", /*             206 */
915         "DASTORECONST   ", /*             207 */
916         "AASTORECONST   ", /*             208 */
917         "BASTORECONST   ", /*             209 */
918         "CASTORECONST   ", /*             210 */
919         "SASTORECONST   ", /*             211 */
920
921                     "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
922         "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
923         "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
924         "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
925         "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
926         "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
927         "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
928         "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
929
930         "INLINE_START   ", /*             251 */
931         "INLINE_END     ", /*             252 */
932
933         "BUILTIN3       ", /*             253 */
934         "BUILTIN2       ", /*             254 */
935         "BUILTIN1       "  /*             255 */
936 };
937
938
939 char *opcode_names[256] = {
940         "NOP            ", /*               0 */
941         "ACONST         ", /*               1 */
942         "ICONST_M1      ", /* ICONST_M1     2 */
943         "ICONST_0       ", /* ICONST_0      3 */
944         "ICONST_1       ", /* ICONST_1      4 */
945         "ICONST_2       ", /* ICONST_2      5 */
946         "ICONST_3       ", /* ICONST_3      6 */
947         "ICONST_4       ", /* ICONST_4      7 */
948         "ICONST_5       ", /* ICONST_5      8 */
949         "LCONST_0       ", /* LCONST_0      9 */
950         "LCONST_1       ", /* LCONST_1     10 */
951         "FCONST_0       ", /* FCONST_0     11 */
952         "FCONST_1       ", /* FCONST_1     12 */
953         "FCONST_2       ", /* FCONST_2     13 */
954         "DCONST_0       ", /* DCONST_0     14 */
955         "DCONST_1       ", /* DCONST_1     15 */
956         "BIPUSH         ", /* BIPUSH       16 */
957         "SIPUSH         ", /* SIPUSH       17 */
958         "LDC            ", /* LDC          18 */
959         "LDC_W          ", /* LDC_W        19 */
960         "LDC2_W         ", /* LDC2_W       20 */
961         "ILOAD          ", /*              21 */
962         "LLOAD          ", /*              22 */
963         "FLOAD          ", /*              23 */
964         "DLOAD          ", /*              24 */
965         "ALOAD          ", /*              25 */
966         "ILOAD_0        ", /* ILOAD_0      26 */
967         "ILOAD_1        ", /* ILOAD_1      27 */
968         "ILOAD_2        ", /* ILOAD_2      28 */
969         "ILOAD_3        ", /* ILOAD_3      29 */
970         "LLOAD_0        ", /* LLOAD_0      30 */
971         "LLOAD_1        ", /* LLOAD_1      31 */
972         "LLOAD_2        ", /* LLOAD_2      32 */
973         "LLOAD_3        ", /* LLOAD_3      33 */
974         "FLOAD_0        ", /* FLOAD_0      34 */
975         "FLOAD_1        ", /* FLOAD_1      35 */
976         "FLOAD_2        ", /* FLOAD_2      36 */
977         "FLOAD_3        ", /* FLOAD_3      37 */
978         "DLOAD_0        ", /* DLOAD_0      38 */
979         "DLOAD_1        ", /* DLOAD_1      39 */
980         "DLOAD_2        ", /* DLOAD_2      40 */ 
981         "DLOAD_3        ", /* DLOAD_3      41 */
982         "ALOAD_0        ", /* ALOAD_0      42 */
983         "ALOAD_1        ", /* ALOAD_1      43 */
984         "ALOAD_2        ", /* ALOAD_2      44 */
985         "ALOAD_3        ", /* ALOAD_3      45 */
986         "IALOAD         ", /*              46 */
987         "LALOAD         ", /*              47 */
988         "FALOAD         ", /*              48 */
989         "DALOAD         ", /*              49 */
990         "AALOAD         ", /*              50 */
991         "BALOAD         ", /*              51 */
992         "CALOAD         ", /*              52 */
993         "SALOAD         ", /*              53 */
994         "ISTORE         ", /*              54 */
995         "LSTORE         ", /*              55 */
996         "FSTORE         ", /*              56 */
997         "DSTORE         ", /*              57 */
998         "ASTORE         ", /*              58 */
999         "ISTORE_0       ", /* ISTORE_0     59 */
1000         "ISTORE_1       ", /* ISTORE_1     60 */
1001         "ISTORE_2       ", /* ISTORE_2     61 */
1002         "ISTORE_3       ", /* ISTORE_3     62 */
1003         "LSTORE_0       ", /* LSTORE_0     63 */
1004         "LSTORE_1       ", /* LSTORE_1     64 */
1005         "LSTORE_2       ", /* LSTORE_2     65 */
1006         "LSTORE_3       ", /* LSTORE_3     66 */
1007         "FSTORE_0       ", /* FSTORE_0     67 */
1008         "FSTORE_1       ", /* FSTORE_1     68 */
1009         "FSTORE_2       ", /* FSTORE_2     69 */
1010         "FSTORE_3       ", /* FSTORE_3     70 */
1011         "DSTORE_0       ", /* DSTORE_0     71 */
1012         "DSTORE_1       ", /* DSTORE_1     72 */
1013         "DSTORE_2       ", /* DSTORE_2     73 */
1014         "DSTORE_3       ", /* DSTORE_3     74 */
1015         "ASTORE_0       ", /* ASTORE_0     75 */
1016         "ASTORE_1       ", /* ASTORE_1     76 */
1017         "ASTORE_2       ", /* ASTORE_2     77 */
1018         "ASTORE_3       ", /* ASTORE_3     78 */
1019         "IASTORE        ", /*              79 */
1020         "LASTORE        ", /*              80 */
1021         "FASTORE        ", /*              81 */
1022         "DASTORE        ", /*              82 */
1023         "AASTORE        ", /*              83 */
1024         "BASTORE        ", /*              84 */
1025         "CASTORE        ", /*              85 */
1026         "SASTORE        ", /*              86 */
1027         "POP            ", /*              87 */
1028         "POP2           ", /*              88 */
1029         "DUP            ", /*              89 */
1030         "DUP_X1         ", /*              90 */
1031         "DUP_X2         ", /*              91 */
1032         "DUP2           ", /*              92 */
1033         "DUP2_X1        ", /*              93 */
1034         "DUP2_X2        ", /*              94 */
1035         "SWAP           ", /*              95 */
1036         "IADD           ", /*              96 */
1037         "LADD           ", /*              97 */
1038         "FADD           ", /*              98 */
1039         "DADD           ", /*              99 */
1040         "ISUB           ", /*             100 */
1041         "LSUB           ", /*             101 */
1042         "FSUB           ", /*             102 */
1043         "DSUB           ", /*             103 */
1044         "IMUL           ", /*             104 */
1045         "LMUL           ", /*             105 */
1046         "FMUL           ", /*             106 */
1047         "DMUL           ", /*             107 */
1048         "IDIV           ", /*             108 */
1049         "LDIV           ", /*             109 */
1050         "FDIV           ", /*             110 */
1051         "DDIV           ", /*             111 */
1052         "IREM           ", /*             112 */
1053         "LREM           ", /*             113 */
1054         "FREM           ", /*             114 */
1055         "DREM           ", /*             115 */
1056         "INEG           ", /*             116 */
1057         "LNEG           ", /*             117 */
1058         "FNEG           ", /*             118 */
1059         "DNEG           ", /*             119 */
1060         "ISHL           ", /*             120 */
1061         "LSHL           ", /*             121 */
1062         "ISHR           ", /*             122 */
1063         "LSHR           ", /*             123 */
1064         "IUSHR          ", /*             124 */
1065         "LUSHR          ", /*             125 */
1066         "IAND           ", /*             126 */
1067         "LAND           ", /*             127 */
1068         "IOR            ", /*             128 */
1069         "LOR            ", /*             129 */
1070         "IXOR           ", /*             130 */
1071         "LXOR           ", /*             131 */
1072         "IINC           ", /*             132 */
1073         "I2L            ", /*             133 */
1074         "I2F            ", /*             134 */
1075         "I2D            ", /*             135 */
1076         "L2I            ", /*             136 */
1077         "L2F            ", /*             137 */
1078         "L2D            ", /*             138 */
1079         "F2I            ", /*             139 */
1080         "F2L            ", /*             140 */
1081         "F2D            ", /*             141 */
1082         "D2I            ", /*             142 */
1083         "D2L            ", /*             143 */
1084         "D2F            ", /*             144 */
1085         "INT2BYTE       ", /*             145 */
1086         "INT2CHAR       ", /*             146 */
1087         "INT2SHORT      ", /*             147 */
1088         "LCMP           ", /*             148 */
1089         "FCMPL          ", /*             149 */
1090         "FCMPG          ", /*             150 */
1091         "DCMPL          ", /*             151 */
1092         "DCMPG          ", /*             152 */
1093         "IFEQ           ", /*             153 */
1094         "IFNE           ", /*             154 */
1095         "IFLT           ", /*             155 */
1096         "IFGE           ", /*             156 */
1097         "IFGT           ", /*             157 */
1098         "IFLE           ", /*             158 */
1099         "IF_ICMPEQ      ", /*             159 */
1100         "IF_ICMPNE      ", /*             160 */
1101         "IF_ICMPLT      ", /*             161 */
1102         "IF_ICMPGE      ", /*             162 */
1103         "IF_ICMPGT      ", /*             163 */
1104         "IF_ICMPLE      ", /*             164 */
1105         "IF_ACMPEQ      ", /*             165 */
1106         "IF_ACMPNE      ", /*             166 */
1107         "GOTO           ", /*             167 */
1108         "JSR            ", /*             168 */
1109         "RET            ", /*             169 */
1110         "TABLESWITCH    ", /*             170 */
1111         "LOOKUPSWITCH   ", /*             171 */
1112         "IRETURN        ", /*             172 */
1113         "LRETURN        ", /*             173 */
1114         "FRETURN        ", /*             174 */
1115         "DRETURN        ", /*             175 */
1116         "ARETURN        ", /*             176 */
1117         "RETURN         ", /*             177 */
1118         "GETSTATIC      ", /*             178 */
1119         "PUTSTATIC      ", /*             179 */
1120         "GETFIELD       ", /*             180 */
1121         "PUTFIELD       ", /*             181 */
1122         "INVOKEVIRTUAL  ", /*             182 */
1123         "INVOKESPECIAL  ", /*             183 */
1124         "INVOKESTATIC   ", /*             184 */
1125         "INVOKEINTERFACE", /*             185 */
1126         "UNDEF186       ", /*             186 */
1127         "NEW            ", /*             187 */
1128         "NEWARRAY       ", /*             188 */
1129         "ANEWARRAY      ", /*             189 */
1130         "ARRAYLENGTH    ", /*             190 */
1131         "ATHROW         ", /*             191 */
1132         "CHECKCAST      ", /*             192 */
1133         "INSTANCEOF     ", /*             193 */
1134         "MONITORENTER   ", /*             194 */
1135         "MONITOREXIT    ", /*             195 */
1136         "WIDE           ", /* WIDE        196 */
1137         "MULTIANEWARRAY ", /*             197 */
1138         "IFNULL         ", /*             198 */
1139         "IFNONNULL      ", /*             199 */
1140         "GOTO_W         ", /* GOTO_W      200 */
1141         "JSR_W          ", /* JSR_W       201 */
1142         "BREAKPOINT     ", /* BREAKPOINT  202 */
1143
1144                                 "UNDEF203", "UNDEF204", "UNDEF205",
1145         "UNDEF206", "UNDEF207", "UNDEF208", "UNDEF209", "UNDEF210",
1146         "UNDEF211", "UNDEF212", "UNDEF213", "UNDEF214", "UNDEF215",
1147         "UNDEF216", "UNDEF217", "UNDEF218", "UNDEF219", "UNDEF220",
1148         "UNDEF221", "UNDEF222", "UNDEF223", "UNDEF224", "UNDEF225",
1149         "UNDEF226", "UNDEF227", "UNDEF228", "UNDEF229", "UNDEF230",
1150         "UNDEF231", "UNDEF232", "UNDEF233", "UNDEF234", "UNDEF235",
1151         "UNDEF236", "UNDEF237", "UNDEF238", "UNDEF239", "UNDEF240",
1152         "UNDEF241", "UNDEF242", "UNDEF243", "UNDEF244", "UNDEF245",
1153         "UNDEF246", "UNDEF247", "UNDEF248", "UNDEF249", "UNDEF250",
1154         "UNDEF251", "UNDEF252", "UNDEF253", "UNDEF254", "UNDEF255"
1155 };
1156
1157
1158 #if defined(USEBUILTINTABLE)
1159
1160 #if 0
1161 stdopdescriptor builtintable[] = {
1162         { ICMD_LCMP,   TYPE_LONG, TYPE_LONG, TYPE_INT, ICMD_BUILTIN2,
1163           (functionptr) builtin_lcmp , SUPPORT_LONG && SUPPORT_LONG_CMP, false },
1164         { ICMD_LAND,   TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1165           (functionptr) builtin_land , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1166         { ICMD_LOR,    TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1167           (functionptr) builtin_lor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1168         { ICMD_LXOR,   TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1169           (functionptr) builtin_lxor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
1170         { ICMD_LSHL,   TYPE_LONG, TYPE_INT,  TYPE_LONG, ICMD_BUILTIN2,
1171           (functionptr) builtin_lshl , SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1172         { ICMD_LSHR,   TYPE_LONG, TYPE_INT,  TYPE_LONG, ICMD_BUILTIN2,
1173           (functionptr) builtin_lshr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1174         { ICMD_LUSHR,  TYPE_LONG, TYPE_INT,  TYPE_LONG, ICMD_BUILTIN2,
1175           (functionptr) builtin_lushr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
1176         { ICMD_LADD,   TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1177           (functionptr) builtin_ladd , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1178         { ICMD_LSUB,   TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1179           (functionptr) builtin_lsub , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
1180         { ICMD_LNEG,   TYPE_LONG, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1, 
1181           (functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, true },
1182         { ICMD_LMUL,   TYPE_LONG, TYPE_LONG, TYPE_LONG, ICMD_BUILTIN2,
1183           (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MUL, false },
1184         { ICMD_I2F,    TYPE_INT, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1185           (functionptr) builtin_i2f, SUPPORT_FLOAT && SUPPORT_IFCVT, true },
1186         { ICMD_I2D,    TYPE_INT, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1, 
1187           (functionptr) builtin_i2d, SUPPORT_DOUBLE && SUPPORT_IFCVT, true },
1188         { ICMD_L2F,    TYPE_LONG, TYPE_VOID, TYPE_FLOAT, ICMD_BUILTIN1,
1189           (functionptr) builtin_l2f, SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT, true },
1190         { ICMD_L2D,    TYPE_LONG, TYPE_VOID, TYPE_DOUBLE, ICMD_BUILTIN1, 
1191           (functionptr) builtin_l2d, SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT, true },
1192         { ICMD_F2L,    TYPE_FLOAT, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1193           (functionptr) builtin_f2l, SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1194         { ICMD_D2L,    TYPE_DOUBLE, TYPE_VOID, TYPE_LONG, ICMD_BUILTIN1,
1195           (functionptr) builtin_d2l, SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT, true },
1196         { ICMD_F2I,    TYPE_FLOAT, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1197           (functionptr) builtin_f2i, SUPPORT_FLOAT && SUPPORT_FICVT, true },
1198         { ICMD_D2I,    TYPE_DOUBLE, TYPE_VOID, TYPE_INT, ICMD_BUILTIN1,
1199           (functionptr) builtin_d2i, SUPPORT_DOUBLE && SUPPORT_FICVT, true },
1200         { 255, 0, 0, 0, 0, NULL, true, false },
1201 };
1202
1203 #endif
1204
1205 static int builtintablelen;
1206
1207 #endif /* USEBUILTINTABLE */
1208
1209
1210
1211 #define EXTABLEN
1212 /*      \
1213         { \
1214                 printf("PARSE method name ="); \
1215                 utf_display(m->class->name); \
1216                 printf("."); \
1217                 method_display(m); \
1218                 printf("        exceptiontablelength %d\n",m->exceptiontablelength);    \
1219                 fflush(stdout); \
1220         }
1221 */
1222
1223 /*****************************************************************************
1224                                                  TABLE OF BUILTIN FUNCTIONS
1225
1226     This table lists the builtin functions which are used inside
1227     BUILTIN* opcodes.
1228
1229     The first part of the table (up to the 255-marker) lists the
1230     opcodes which are automatically replaced in stack.c.
1231
1232     The second part lists the builtin functions which are "manually"
1233     used for BUILTIN* opcodes in parse.c and stack.c.
1234
1235 *****************************************************************************/
1236
1237 builtin_descriptor builtin_desc[] = {
1238 #if defined(USEBUILTINTABLE)
1239         {ICMD_LCMP , BUILTIN_lcmp ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID ,TYPE_INT   ,
1240                      SUPPORT_LONG && SUPPORT_LONG_CMP,false,"lcmp"},
1241         
1242         {ICMD_LAND , BUILTIN_land ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID ,TYPE_LONG  ,
1243                      SUPPORT_LONG && SUPPORT_LONG_LOG,false,"land"},
1244         {ICMD_LOR  , BUILTIN_lor  ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID ,TYPE_LONG  ,
1245                      SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lor"},
1246         {ICMD_LXOR , BUILTIN_lxor ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID ,TYPE_LONG  ,
1247                      SUPPORT_LONG && SUPPORT_LONG_LOG,false,"lxor"},
1248         
1249         {ICMD_LSHL , BUILTIN_lshl ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_INT   ,TYPE_VOID ,TYPE_LONG  ,
1250                      SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshl"},
1251         {ICMD_LSHR , BUILTIN_lshr ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_INT   ,TYPE_VOID ,TYPE_LONG  ,
1252                      SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lshr"},
1253         {ICMD_LUSHR, BUILTIN_lushr,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_INT   ,TYPE_VOID ,TYPE_LONG  ,
1254                      SUPPORT_LONG && SUPPORT_LONG_SHIFT,false,"lushr"},
1255         
1256         {ICMD_LADD , BUILTIN_ladd ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID ,TYPE_LONG  ,
1257                      SUPPORT_LONG && SUPPORT_LONG_ADD,false,"ladd"},
1258         {ICMD_LSUB , BUILTIN_lsub ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID ,TYPE_LONG  ,
1259                      SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lsub"},
1260         {ICMD_LNEG , BUILTIN_lneg ,ICMD_BUILTIN1,TYPE_LONG  ,TYPE_VOID  ,TYPE_VOID ,TYPE_LONG  ,
1261                      SUPPORT_LONG && SUPPORT_LONG_ADD,false,"lneg"},
1262         {ICMD_LMUL , BUILTIN_lmul ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID ,TYPE_LONG  ,
1263                      SUPPORT_LONG && SUPPORT_LONG_MUL,false,"lmul"},
1264         
1265         {ICMD_I2F  , BUILTIN_i2f  ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID ,TYPE_FLOAT ,
1266                      SUPPORT_FLOAT && SUPPORT_IFCVT,true ,"i2f"},
1267         {ICMD_I2D  , BUILTIN_i2d  ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID ,TYPE_DOUBLE,
1268                      SUPPORT_DOUBLE && SUPPORT_IFCVT,true ,"i2d"},
1269         {ICMD_L2F  , BUILTIN_l2f  ,ICMD_BUILTIN1,TYPE_LONG  ,TYPE_VOID  ,TYPE_VOID ,TYPE_FLOAT ,
1270                      SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT,true ,"l2f"},
1271         {ICMD_L2D  , BUILTIN_l2d  ,ICMD_BUILTIN1,TYPE_LONG  ,TYPE_VOID  ,TYPE_VOID ,TYPE_DOUBLE,
1272                      SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT,true ,"l2d"},
1273         {ICMD_F2L  , BUILTIN_f2l  ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID  ,TYPE_VOID ,TYPE_LONG  ,
1274                      SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"f2l"},
1275         {ICMD_D2L  , BUILTIN_d2l  ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID  ,TYPE_VOID ,TYPE_LONG  ,
1276                      SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_ICVT,true ,"d2l"},
1277         {ICMD_F2I  , BUILTIN_f2i  ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID  ,TYPE_VOID ,TYPE_INT   ,
1278                      SUPPORT_FLOAT && SUPPORT_FICVT,true ,"f2i"},
1279         {ICMD_D2I  , BUILTIN_d2i  ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID  ,TYPE_VOID ,TYPE_INT   ,
1280                      SUPPORT_DOUBLE && SUPPORT_FICVT,true ,"d2i"},
1281
1282         { ICMD_FADD , BUILTIN_fadd  , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT  , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fadd"  },
1283         { ICMD_FSUB , BUILTIN_fsub  , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT  , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fsub"  },
1284         { ICMD_FMUL , BUILTIN_fmul  , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT  , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fmul"  },
1285         { ICMD_FDIV , BUILTIN_fdiv  , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT  , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fdiv"  },
1286         { ICMD_FNEG , BUILTIN_fneg  , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT, true, "fneg"  },
1287         { ICMD_FCMPL, BUILTIN_fcmpl , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT  , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpl" },
1288         { ICMD_FCMPG, BUILTIN_fcmpg , ICMD_BUILTIN2, TYPE_FLT, TYPE_FLT  , TYPE_VOID , TYPE_INT, SUPPORT_FLOAT, true, "fcmpg" },
1289
1290         { ICMD_DADD , BUILTIN_dadd  , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL  , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dadd"  },
1291         { ICMD_DSUB , BUILTIN_dsub  , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL  , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dsub"  },
1292         { ICMD_DMUL , BUILTIN_dmul  , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL  , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dmul"  },
1293         { ICMD_DDIV , BUILTIN_ddiv  , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL  , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "ddiv"  },
1294         { ICMD_DNEG , BUILTIN_dneg  , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_DOUBLE, true, "dneg"  },
1295         { ICMD_DCMPL, BUILTIN_dcmpl , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL  , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpl" },
1296         { ICMD_DCMPG, BUILTIN_dcmpg , ICMD_BUILTIN2, TYPE_DBL, TYPE_DBL  , TYPE_VOID , TYPE_INT, SUPPORT_DOUBLE, true, "dcmpg" },
1297
1298         { ICMD_F2D,  BUILTIN_f2d  , ICMD_BUILTIN1, TYPE_FLT, TYPE_VOID , TYPE_VOID , TYPE_DBL, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "f2d" },
1299         { ICMD_D2F,  BUILTIN_d2f  , ICMD_BUILTIN1, TYPE_DBL, TYPE_VOID , TYPE_VOID , TYPE_FLT, SUPPORT_FLOAT && SUPPORT_DOUBLE, true, "d2f" },
1300 #endif
1301
1302         /* this record marks the end of the automatically replaced opcodes */
1303         {255,NULL,0,0,0,0,0,0,0,"<INVALID>"},
1304
1305         /* the following functions are not replaced automatically */
1306         
1307 #if defined(__ALPHA__)
1308         {255, BUILTIN_f2l  ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID  ,TYPE_VOID ,TYPE_LONG  ,0,0,"f2l"},
1309         {255, BUILTIN_d2l  ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID  ,TYPE_VOID ,TYPE_LONG  ,0,0,"d2l"},
1310         {255, BUILTIN_f2i  ,ICMD_BUILTIN1,TYPE_FLOAT ,TYPE_VOID  ,TYPE_VOID ,TYPE_INT   ,0,0,"f2i"},
1311         {255, BUILTIN_d2i  ,ICMD_BUILTIN1,TYPE_DOUBLE,TYPE_VOID  ,TYPE_VOID ,TYPE_INT   ,0,0,"d2i"},
1312 #endif
1313
1314         {255,BUILTIN_instanceof      ,ICMD_BUILTIN2,TYPE_ADR   ,TYPE_ADR   ,TYPE_VOID  ,TYPE_INT   ,0,0,"instanceof"},
1315         {255,BUILTIN_arrayinstanceof ,ICMD_BUILTIN2,TYPE_ADR   ,TYPE_ADR   ,TYPE_VOID  ,TYPE_INT   ,0,0,"arrayinstanceof"},
1316         {255,BUILTIN_checkarraycast  ,ICMD_BUILTIN2,TYPE_ADR   ,TYPE_ADR   ,TYPE_VOID  ,TYPE_VOID  ,0,0,"checkarraycast"},
1317         {255,BUILTIN_aastore         ,ICMD_BUILTIN3,TYPE_ADR   ,TYPE_INT   ,TYPE_ADR   ,TYPE_VOID  ,0,0,"aastore"},
1318         {255,BUILTIN_new             ,ICMD_BUILTIN1,TYPE_ADR   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"new"},
1319         {255,BUILTIN_newarray        ,ICMD_BUILTIN2,TYPE_INT   ,TYPE_ADR   ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray"},
1320         {255,BUILTIN_newarray_boolean,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_boolean"},
1321         {255,BUILTIN_newarray_char   ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_char"},
1322         {255,BUILTIN_newarray_float  ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_float"},
1323         {255,BUILTIN_newarray_double ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_double"},
1324         {255,BUILTIN_newarray_byte   ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_byte"},
1325         {255,BUILTIN_newarray_short  ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_short"},
1326         {255,BUILTIN_newarray_int    ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_int"},
1327         {255,BUILTIN_newarray_long   ,ICMD_BUILTIN1,TYPE_INT   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_ADR   ,0,0,"newarray_long"},
1328 #if defined(USE_THREADS)
1329         {255,BUILTIN_monitorenter    ,ICMD_BUILTIN1,TYPE_ADR   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_VOID  ,0,0,"monitorenter"},
1330         {255,BUILTIN_monitorexit     ,ICMD_BUILTIN1,TYPE_ADR   ,TYPE_VOID  ,TYPE_VOID  ,TYPE_VOID  ,0,0,"monitorexit"},
1331 #endif
1332 #if !SUPPORT_DIVISION
1333         {255,BUILTIN_idiv            ,ICMD_BUILTIN2,TYPE_INT   ,TYPE_INT   ,TYPE_VOID  ,TYPE_INT   ,0,0,"idiv"},
1334         {255,BUILTIN_irem            ,ICMD_BUILTIN2,TYPE_INT   ,TYPE_INT   ,TYPE_VOID  ,TYPE_INT   ,0,0,"irem"},
1335 #endif
1336 #if !(SUPPORT_DIVISION && SUPPORT_LONG && SUPPORT_LONG_DIV)
1337         {255,BUILTIN_ldiv            ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID  ,TYPE_LONG  ,0,0,"ldiv"},
1338         {255,BUILTIN_lrem            ,ICMD_BUILTIN2,TYPE_LONG  ,TYPE_LONG  ,TYPE_VOID  ,TYPE_LONG  ,0,0,"lrem"},
1339 #endif
1340         {255,BUILTIN_frem            ,ICMD_BUILTIN2,TYPE_FLOAT ,TYPE_FLOAT ,TYPE_VOID  ,TYPE_FLOAT ,0,0,"frem"},
1341         {255,BUILTIN_drem            ,ICMD_BUILTIN2,TYPE_DOUBLE,TYPE_DOUBLE,TYPE_VOID  ,TYPE_DOUBLE,0,0,"drem"},
1342
1343         /* this record marks the end of the list */
1344         {  0,NULL,0,0,0,0,0,0,0,"<END>"}
1345 };
1346
1347
1348 /* include compiler subsystems ************************************************/
1349
1350 /* dummy function, used when there is no JavaVM code available                */
1351
1352 static functionptr do_nothing_function()
1353 {
1354         return NULL;
1355 }
1356
1357
1358 /* jit_compile *****************************************************************
1359
1360    jit_compile, new version of compiler, translates one method to machine code
1361
1362 *******************************************************************************/
1363
1364 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1365                                                                           registerdata *rd, loopdata *ld,
1366                                                                           t_inlining_globals *id);
1367
1368 functionptr jit_compile(methodinfo *m)
1369 {
1370         functionptr         r;
1371         codegendata        *cd;
1372         registerdata       *rd;
1373         loopdata           *ld;
1374         t_inlining_globals *id;
1375         s4                  dumpsize;
1376
1377         if (opt_stat)
1378                 count_jit_calls++;
1379
1380         /* this is the case if a native function is called by jni */
1381
1382         if (m->flags & ACC_NATIVE)
1383                 return (functionptr) m->stubroutine;
1384
1385 #if defined(USE_THREADS)
1386         /* enter a monitor on the method */
1387
1388         builtin_monitorenter((java_objectheader *) m);
1389 #endif
1390
1391         /* if method has been already compiled return immediately */
1392
1393         if (m->entrypoint) {
1394 #if defined(USE_THREADS)
1395                 builtin_monitorexit((java_objectheader *) m);
1396 #endif
1397
1398                 return m->entrypoint;
1399         }
1400
1401         if (opt_stat)
1402                 count_methods++;
1403
1404         /* if there is no javacode, print error message and return empty method   */
1405
1406         if (!m->jcode) {
1407                 if (compileverbose)
1408                         log_message_method("No code given for: ", m);
1409
1410                 m->entrypoint = (functionptr) do_nothing_function;
1411
1412                 return m->entrypoint;    /* return empty method     */
1413         }
1414
1415         /* measure time */
1416
1417         if (getcompilingtime)
1418                 compilingtime_start();
1419
1420         /* mark start of dump memory area */
1421
1422         dumpsize = dump_size();
1423
1424         /* allocate memory */
1425
1426         cd = DNEW(codegendata);
1427         rd = DNEW(registerdata);
1428         ld = DNEW(loopdata);
1429         id = DNEW(t_inlining_globals);
1430
1431         /* RTA static analysis must be called before inlining */
1432         if (opt_rt)
1433                 RT_jit_parse(m); /* will be called just once */
1434                              /* return value ignored for now */
1435         /* XTA static analysis must be called before inlining */
1436         if (opt_xta)
1437                 XTA_jit_parse(m); /* will be called just once */
1438                               /* return value ignored for now */
1439
1440
1441         /* must be called before reg_setup, because it can change maxlocals */
1442         /* init reqd to initialize for parse even in no inlining */
1443         inlining_setup(m, id);
1444
1445         /* initialize the register allocator */
1446         reg_setup(m, rd, id);
1447
1448         /* setup the codegendata memory */
1449         codegen_setup(m, cd, id);
1450
1451         /* now call internal compile function */
1452
1453         r = jit_compile_intern(m, cd, rd, ld, id);
1454
1455         /* free some memory */
1456
1457         reg_free(m, rd);
1458         codegen_free(m, cd);
1459
1460         /* clear pointers to dump memory area */
1461
1462         m->basicblocks = NULL;
1463         m->basicblockindex = NULL;
1464         m->instructions = NULL;
1465         m->stack = NULL;
1466         /* NO !!! m->exceptiontable = NULL; */
1467
1468         /* release dump area */
1469
1470         dump_release(dumpsize);
1471
1472         /* measure time */
1473
1474         if (getcompilingtime)
1475                 compilingtime_stop();
1476
1477         /* define in options.h; Used in main.c, jit.c & inline.c */
1478 #ifdef INAFTERMAIN
1479         if ((utf_new_char("main") == m->name) && (useinliningm))
1480                 useinlining = false;
1481 #endif
1482
1483 #if defined(USE_THREADS)
1484         /* leave the monitor */
1485
1486         builtin_monitorexit((java_objectheader *) m );
1487 #endif
1488
1489         if (r) {
1490                 if (compileverbose)
1491                         log_message_method("Running: ", m);
1492         }
1493
1494         /* return pointer to the methods entry point */
1495
1496         return r;
1497 }
1498
1499
1500 /* jit_compile_intern **********************************************************
1501
1502    Static internal function which does the actual compilation.
1503
1504 *******************************************************************************/
1505
1506 static functionptr jit_compile_intern(methodinfo *m, codegendata *cd,
1507                                                                           registerdata *rd, loopdata *ld,
1508                                                                           t_inlining_globals *id)
1509 {
1510 #ifdef LSRA
1511         bool old_opt_lsra;
1512 #endif
1513 #ifdef STATISTICS
1514         int i,type;
1515         s4 len;
1516         stackptr    src, src_old;
1517         stackptr    dst;
1518         instruction *iptr;
1519         basicblock  *bptr;
1520 #endif
1521
1522         /* print log message for compiled method */
1523
1524         if (compileverbose)
1525                 log_message_method("Compiling: ", m);
1526
1527         /* initialize the static function's class */
1528
1529         if (m->flags & ACC_STATIC && !m->class->initialized) {
1530                 if (initverbose)
1531                         log_message_class("Initialize class ", m->class);
1532
1533                 if (!class_init(m->class))
1534                         return NULL;
1535         }
1536
1537         /* initialisation of variables and subsystems */
1538
1539         m->isleafmethod = true;
1540
1541 #if defined(STATISTICS)
1542         if (opt_stat) {
1543                 count_tryblocks += m->exceptiontablelength;
1544                 count_javacodesize += m->jcodelength + 18;
1545                 count_javaexcsize += m->exceptiontablelength * POINTERSIZE;
1546         }
1547 #endif
1548
1549         /* initialise parameter type descriptor */
1550
1551         descriptor2types(m);
1552
1553         /* call the compiler passes ***********************************************/
1554
1555         if (compileverbose)
1556                 log_message_method("Parsing: ", m);
1557
1558         /* call parse pass */
1559         if (!parse(m, cd, id)) {
1560                 if (compileverbose)
1561                         log_message_method("Exception while parsing: ", m);
1562
1563                 return NULL;
1564         }
1565
1566         if (compileverbose) {
1567                 log_message_method("Parsing done: ", m);
1568                 log_message_method("Analysing: ", m);
1569         }
1570
1571         /* call stack analysis pass */
1572         if (!analyse_stack(m, cd, rd)) {
1573                 if (compileverbose)
1574                         log_message_method("Exception while analysing: ", m);
1575
1576                 return NULL;
1577         }
1578
1579         if (compileverbose)
1580                 log_message_method("Analysing done: ", m);
1581
1582 #ifdef CACAO_TYPECHECK
1583         if (opt_verify) {
1584                 if (compileverbose)
1585                         log_message_method("Typechecking: ", m);
1586
1587                 /* call typecheck pass */
1588                 if (!typecheck(m, cd, rd)) {
1589                         if (compileverbose)
1590                                 log_message_method("Exception while typechecking: ", m);
1591
1592                         return NULL;
1593                 }
1594
1595                 if (compileverbose)
1596                         log_message_method("Typechecking done: ", m);
1597         }
1598 #endif
1599
1600         if (opt_loops) {
1601                 depthFirst(m, ld);
1602                 analyseGraph(m, ld);
1603                 optimize_loops(m, cd, ld);
1604         }
1605    
1606 #ifdef SPECIALMEMUSE
1607         preregpass(m, rd);
1608 #endif
1609
1610         if (compileverbose)
1611                 log_message_method("Allocating registers: ", m);
1612
1613         /* allocate registers */
1614 #ifdef LSRA
1615         old_opt_lsra=opt_lsra;
1616         if (opt_lsra) {
1617                 if (!lsra(m, cd, rd, ld, id)) {
1618                         opt_lsra = false;
1619 /*                      log_message_method("Regalloc Fallback: ", m); */
1620                         regalloc( m, cd, rd );
1621                 } else {
1622 #ifdef STATISTICS
1623                         if (opt_stat) count_methods_allocated_by_lsra++;
1624 #endif
1625 /*                      log_message_method("Regalloc LSRA: ", m); */
1626                 }
1627         }
1628         else
1629 #endif
1630         {
1631 #ifdef STATISTICS
1632                 if (opt_stat)
1633 #ifdef LSRA
1634                         if (!opt_lsra)
1635 #endif          
1636                                 count_locals_conflicts += (cd->maxlocals-1)*(cd->maxlocals);
1637 #endif          
1638                 regalloc(m, cd, rd);
1639         }
1640
1641 #ifdef STATISTICS
1642         if (opt_stat) {
1643                 /* count how many local variables are held in memory or register */
1644                 for(i=0; i < cd->maxlocals; i++)
1645                         for (type=0; type <=4; type++)
1646                                 if (rd->locals[i][type].type != -1) { /* valid local */
1647                                         if (rd->locals[i][type].flags & INMEMORY)
1648                                                 count_locals_spilled++;
1649                                         else
1650                                                 count_locals_register++;
1651                                 }
1652                 /* count how many stack slots are held in memory or register */
1653
1654                 bptr = m->basicblocks;
1655                 while (bptr != NULL) {
1656                         if (bptr->flags >= BBREACHED) {
1657
1658 #ifdef LSRA
1659                         if (!opt_lsra) {
1660 #endif  
1661                                 /* check for memory moves from interface to BB instack */
1662                                 dst = bptr->instack;
1663                                 len = bptr->indepth;                    
1664                                 while (dst != NULL) {
1665                                         len--;
1666                                         if (dst->varkind != STACKVAR) {
1667                                                 if ( (dst->flags & INMEMORY) ||
1668                                                          (rd->interfaces[len][dst->type].flags & INMEMORY) || 
1669                                                          ( (dst->flags & INMEMORY) && 
1670                                                            (rd->interfaces[len][dst->type].flags & INMEMORY) && 
1671                                                            (dst->regoff != rd->interfaces[len][dst->type].regoff) ))
1672                                                 {
1673                                                         /* one in memory or both inmemory at different offsets */
1674                                                         count_mem_move_bb++;
1675                                                 }
1676                                         }
1677
1678                                         dst = dst->prev;
1679                                 }
1680
1681                                 /* check for memory moves from BB outstack to interface */
1682                                 dst = bptr->outstack;
1683                                 len = bptr->outdepth;
1684
1685                                 while (dst) {
1686                                         len--;
1687                                         if (dst->varkind != STACKVAR) {
1688                                                 if ( (dst->flags & INMEMORY) || \
1689                                                          (rd->interfaces[len][dst->type].flags & INMEMORY) || \
1690                                                          ( (dst->flags & INMEMORY) && \
1691                                                            (rd->interfaces[len][dst->type].flags & INMEMORY) && \
1692                                                            (dst->regoff != rd->interfaces[len][dst->type].regoff) ))
1693                                                 {
1694                                                         /* one in memory or both inmemory at different offsets */
1695                                                         count_mem_move_bb++;
1696                                                 }
1697                                         }
1698
1699                                         dst = dst->prev;
1700                                 }
1701 #ifdef LSRA
1702                         }
1703 #endif  
1704
1705
1706                                 dst = bptr->instack;
1707                                 iptr = bptr->iinstr;
1708                                 len = bptr->icount;
1709                                 src_old = NULL;
1710
1711                                 while (--len >= 0)  {
1712                                         src = dst;
1713                                         dst = iptr->dst;
1714
1715                                         if ((src!= NULL) && (src != src_old)) { /* new stackslot */
1716                                                 switch (src->varkind) {
1717                                                 case TEMPVAR:
1718                                                 case STACKVAR:
1719                                                         if (!(src->flags & INMEMORY)) 
1720                                                                 count_ss_register++;
1721                                                         else
1722                                                                 count_ss_spilled++;
1723                                                         break;
1724                                                         /*                                      case LOCALVAR: */
1725                                                         /*                                              if (!(rd->locals[src->varnum][src->type].flags & INMEMORY)) */
1726                                                         /*                                                      count_ss_register++; */
1727                                                         /*                                              else */
1728                                                         /*                                                      count_ss_spilled++; */
1729                                                         /*                                              break; */
1730                                                         /*                                      case ARGVAR: */
1731                                                         /*                                              if (IS_FLT_DBL_TYPE(src->type)) { */
1732                                                         /*                                                      if (src->varnum < FLT_ARG_CNT) { */
1733                                                         /*                                                              count_ss_register++; */
1734                                                         /*                                                              break; */
1735                                                         /*                                                      } */
1736                                                         /*                                              } else { */
1737                                                         /* #if defined(__POWERPC__) */
1738                                                         /*                                                      if (src->varnum < INT_ARG_CNT - (IS_2_WORD_TYPE(src->type) != 0)) { */
1739                                                         /* #else */
1740                                                         /*                                                      if (src->varnum < INT_ARG_CNT) { */
1741                                                         /* #endif */
1742                                                         /*                                                              count_ss_register++; */
1743                                                         /*                                                              break; */
1744                                                         /*                                                      } */
1745                                                         /*                                              } */
1746                                                         /*                                              count_ss_spilled++; */
1747                                                         /*                                              break; */
1748                                                 }
1749                                         }
1750                                         src_old = src;
1751                                         
1752                                         iptr++;
1753                                 } /* while instructions */
1754                         } /* if */
1755                         bptr = bptr->next;
1756                 } /* while blocks */
1757         }
1758 #endif
1759
1760         if (compileverbose) {
1761                 log_message_method("Allocating registers done: ", m);
1762                 log_message_method("Generating code: ", m);
1763         }
1764
1765         /* now generate the machine code */
1766         codegen(m, cd, rd);
1767
1768         if (compileverbose)
1769                 log_message_method("Generating code done: ", m);
1770
1771         /* intermediate and assembly code listings */
1772                 
1773         if (showintermediate) {
1774                 show_icmd_method(m, cd, rd);
1775
1776         } else if (showdisassemble) {
1777                 disassemble((void *) ((long) m->mcode + cd->dseglen), 
1778                                         m->mcodelength - cd->dseglen);
1779         }
1780
1781         if (showddatasegment)
1782                 dseg_display(m, cd);
1783
1784         if (compileverbose)
1785                 log_message_method("Compiling done: ", m);
1786
1787 #ifdef LSRA
1788         opt_lsra=old_opt_lsra;
1789 #endif
1790         /* return pointer to the methods entry point */
1791
1792         return m->entrypoint;
1793
1794
1795
1796 void compile_all_class_methods(classinfo *c)
1797 {
1798         s4 i;
1799
1800         for (i = 0; i < c->methodscount; i++) {
1801                 (void) jit_compile(&(c->methods[i]));
1802         }
1803 }
1804
1805
1806 /* functions for compiler initialisation and finalisation *********************/
1807
1808 #ifdef USEBUILTINTABLE
1809
1810 static int stdopcompare(const void *a, const void *b)
1811 {
1812         builtin_descriptor *o1 = (builtin_descriptor *) a;
1813         builtin_descriptor *o2 = (builtin_descriptor *) b;
1814         if (!o1->supported && o2->supported)
1815                 return -1;
1816         if (o1->supported && !o2->supported)
1817                 return 1;
1818         return (o1->opcode < o2->opcode) ? -1 : (o1->opcode > o2->opcode);
1819 }
1820
1821 static inline void sort_builtintable()
1822 {
1823         int len;
1824
1825         len = 0;
1826         while (builtin_desc[len].opcode != 255) len++;
1827         qsort(builtin_desc, len, sizeof(builtin_descriptor), stdopcompare);
1828
1829         for (--len; len>=0 && builtin_desc[len].supported; len--);
1830         builtintablelen = ++len;
1831 }
1832
1833
1834 builtin_descriptor *find_builtin(int icmd)
1835 {
1836         builtin_descriptor *first = builtin_desc;
1837         builtin_descriptor *last = builtin_desc + builtintablelen;
1838         int len = last - first;
1839         int half;
1840         builtin_descriptor *middle;
1841
1842         while (len > 0) {
1843                 half = len / 2;
1844                 middle = first + half;
1845                 if (middle->opcode < icmd) {
1846                         first = middle + 1;
1847                         len -= half + 1;
1848                 } else
1849                         len = half;
1850         }
1851         return first != last ? first : NULL;
1852 }
1853
1854 #endif
1855
1856
1857
1858 void jit_init()
1859 {
1860         s4 i;
1861
1862 #ifdef USEBUILTINTABLE
1863         sort_builtintable();
1864 #endif
1865
1866 #if defined(__ALPHA__)
1867         has_ext_instr_set = ! has_no_x_instr_set();
1868 #endif
1869
1870         for (i = 0; i < 256; i++)
1871                 stackreq[i] = 1;
1872
1873         stackreq[JAVA_NOP]          = 0;
1874         stackreq[JAVA_ISTORE]       = 0;
1875         stackreq[JAVA_LSTORE]       = 0;
1876         stackreq[JAVA_FSTORE]       = 0;
1877         stackreq[JAVA_DSTORE]       = 0;
1878         stackreq[JAVA_ASTORE]       = 0;
1879         stackreq[JAVA_ISTORE_0]     = 0;
1880         stackreq[JAVA_ISTORE_1]     = 0;
1881         stackreq[JAVA_ISTORE_2]     = 0;
1882         stackreq[JAVA_ISTORE_3]     = 0;
1883         stackreq[JAVA_LSTORE_0]     = 0;
1884         stackreq[JAVA_LSTORE_1]     = 0;
1885         stackreq[JAVA_LSTORE_2]     = 0;
1886         stackreq[JAVA_LSTORE_3]     = 0;
1887         stackreq[JAVA_FSTORE_0]     = 0;
1888         stackreq[JAVA_FSTORE_1]     = 0;
1889         stackreq[JAVA_FSTORE_2]     = 0;
1890         stackreq[JAVA_FSTORE_3]     = 0;
1891         stackreq[JAVA_DSTORE_0]     = 0;
1892         stackreq[JAVA_DSTORE_1]     = 0;
1893         stackreq[JAVA_DSTORE_2]     = 0;
1894         stackreq[JAVA_DSTORE_3]     = 0;
1895         stackreq[JAVA_ASTORE_0]     = 0;
1896         stackreq[JAVA_ASTORE_1]     = 0;
1897         stackreq[JAVA_ASTORE_2]     = 0;
1898         stackreq[JAVA_ASTORE_3]     = 0;
1899         stackreq[JAVA_IASTORE]      = 0;
1900         stackreq[JAVA_LASTORE]      = 0;
1901         stackreq[JAVA_FASTORE]      = 0;
1902         stackreq[JAVA_DASTORE]      = 0;
1903         stackreq[JAVA_AASTORE]      = 0;
1904         stackreq[JAVA_BASTORE]      = 0;
1905         stackreq[JAVA_CASTORE]      = 0;
1906         stackreq[JAVA_SASTORE]      = 0;
1907         stackreq[JAVA_POP]          = 0;
1908         stackreq[JAVA_POP2]         = 0;
1909         stackreq[JAVA_IINC]         = 0;
1910         stackreq[JAVA_IFEQ]         = 0;
1911         stackreq[JAVA_IFNE]         = 0;
1912         stackreq[JAVA_IFLT]         = 0;
1913         stackreq[JAVA_IFGE]         = 0;
1914         stackreq[JAVA_IFGT]         = 0;
1915         stackreq[JAVA_IFLE]         = 0;
1916         stackreq[JAVA_IF_ICMPEQ]    = 0;
1917         stackreq[JAVA_IF_ICMPNE]    = 0;
1918         stackreq[JAVA_IF_ICMPLT]    = 0;
1919         stackreq[JAVA_IF_ICMPGE]    = 0;
1920         stackreq[JAVA_IF_ICMPGT]    = 0;
1921         stackreq[JAVA_IF_ICMPLE]    = 0;
1922         stackreq[JAVA_IF_ACMPEQ]    = 0;
1923         stackreq[JAVA_IF_ACMPNE]    = 0;
1924         stackreq[JAVA_GOTO]         = 0;
1925         stackreq[JAVA_RET]          = 0;
1926         stackreq[JAVA_TABLESWITCH]  = 0;
1927         stackreq[JAVA_LOOKUPSWITCH] = 0;
1928         stackreq[JAVA_IRETURN]      = 0;
1929         stackreq[JAVA_LRETURN]      = 0;
1930         stackreq[JAVA_FRETURN]      = 0;
1931         stackreq[JAVA_DRETURN]      = 0;
1932         stackreq[JAVA_ARETURN]      = 0;
1933         stackreq[JAVA_RETURN]       = 0;
1934         stackreq[JAVA_PUTSTATIC]    = 0;
1935         stackreq[JAVA_PUTFIELD]     = 0;
1936         stackreq[JAVA_MONITORENTER] = 0;
1937         stackreq[JAVA_MONITOREXIT]  = 0;
1938         stackreq[JAVA_WIDE]         = 0;
1939         stackreq[JAVA_IFNULL]       = 0;
1940         stackreq[JAVA_IFNONNULL]    = 0;
1941         stackreq[JAVA_GOTO_W]       = 0;
1942         stackreq[JAVA_BREAKPOINT]   = 0;
1943
1944         stackreq[JAVA_SWAP] = 2;
1945         stackreq[JAVA_DUP2] = 2;
1946         stackreq[JAVA_DUP_X1] = 3;
1947         stackreq[JAVA_DUP_X2] = 4;
1948         stackreq[JAVA_DUP2_X1] = 3;
1949         stackreq[JAVA_DUP2_X2] = 4;
1950
1951         /* initialize the codegen stuff */
1952         codegen_init();
1953 }
1954
1955
1956 void jit_close()
1957 {
1958 }
1959
1960
1961 /*
1962  * These are local overrides for various environment variables in Emacs.
1963  * Please do not remove this and leave it at the end of the file, where
1964  * Emacs will automagically detect them.
1965  * ---------------------------------------------------------------------
1966  * Local variables:
1967  * mode: c
1968  * indent-tabs-mode: t
1969  * c-basic-offset: 4
1970  * tab-width: 4
1971  * End:
1972  */