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