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