array commands without check added
[cacao.git] / jit / jitdef.h
1 /******************************* ncomp/compdef.h *******************************
2
3         Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
4
5         See file COPYRIGHT for information on usage and disclaimer of warranties
6
7         defines all the constants and data structures of the compiler 
8         
9         Authors: Andreas  Krall      EMAIL: cacao@complang.tuwien.ac.at
10                   
11         Last Change: 1998/11/03
12
13 *******************************************************************************/
14
15 #include "../sysdep/types.h"
16
17 /**************************** resolve typedef-cycles **************************/
18
19 typedef struct stackelement stackelement;
20 typedef stackelement *stackptr;
21 typedef struct basicblock basicblock;
22 typedef struct instruction instruction;
23 typedef struct subroutineinfo subroutineinfo;
24 typedef struct varinfo varinfo;
25 typedef struct branchref branchref;
26 typedef struct jumpref jumpref;
27 typedef varinfo *varinfoptr;
28
29
30 /************************** stack element structure ***************************/
31
32 /*                    slot types                                              */
33
34 #define TYPE_INT   0            /* the stack slot types must numbered in the  */
35 #define TYPE_LNG   1            /* same order as the ICMD_Ixxx to ICMD_Axxx   */
36 #define TYPE_FLT   2            /* instructions (LOAD and STORE)              */
37 #define TYPE_DBL   3            /* integer, long, float, double, address      */
38 #define TYPE_ADR   4
39
40 #define IS_INT_LNG_TYPE(a)      (!((a)&TYPE_FLT))
41 #define IS_FLT_DBL_TYPE(a)      ((a)&TYPE_FLT)
42 #define IS_2_WORD_TYPE(a)       ((a)&TYPE_LNG)
43
44
45 /*                    flags                                                   */
46
47 #define SAVEDVAR   1            /* variable has to survive method invocations */
48 #define INMEMORY   2            /* variable stored in memory                  */
49
50 /*                    variable types                                          */
51
52 #define UNDEFVAR   0            /* stack slot will become temp during regalloc*/
53 #define TEMPVAR    1            /* stack slot is temp register                */
54 #define STACKVAR   2            /* stack slot is numbered stack slot          */
55 #define LOCALVAR   3            /* stack slot is local variable               */
56 #define ARGVAR     4            /* stack slot is argument variable            */
57
58 struct stackelement {
59         stackptr prev;              /* pointer to next element towards bottom     */
60         int type;                   /* data type of stack element                 */
61         int flags;                  /* flags (SAVED, INMEMORY)                    */
62         int varkind;                /* kind of variable or register               */
63         int varnum;                 /* number of variable                         */
64         int regoff;                 /* register number or memory offset           */
65         };
66
67
68 /**************************** instruction structure ***************************/
69
70 struct instruction {
71         stackptr dst;               /* stack index of destination operand stack   */
72         u2  opc;                    /* opcode of intermediate code command        */
73         s4  op1;                    /* first operand, usually variable number     */
74
75         union {
76                 s4 i;                   /* integer operand    */
77                 s8 l;                   /* long operand       */
78                 float f;                /* float operand      */
79                 double d;               /* double operand     */
80                 void *a;                /* address operand    */
81                 } val;                  /* immediate constant */
82         };
83
84
85 /**************************** basic block structure ***************************/
86  
87 /*                    flags                                                   */
88
89 #define BBDELETED  -2
90 #define BBUNDEF    -1
91 #define BBREACHED  0
92 #define BBFINISHED 1
93
94 #define BBTYPE_STD 0            /* standard basic block type                  */
95 #define BBTYPE_EXH 1            /* exception handler basic block type         */
96 #define BBTYPE_SBR 2            /* subroutine basic block type                */
97
98 struct basicblock { 
99         int          flags;         /* used during stack analysis, init with -1   */
100         int          type;          /* basic block type (std, xhandler, subroutine*/
101         instruction *iinstr;        /* pointer to intermediate code instructions  */
102         int          icount;        /* number of intermediate code instructions   */
103         int          mpc;           /* machine code pc at start of block          */
104         stackptr     instack;       /* stack at begin of basic block              */
105         stackptr     outstack;      /* stack at end of basic block                */
106         int          indepth;       /* stack depth at begin of basic block        */
107         int          outdepth;      /* stack depth end of basic block             */
108         int          pre_count;     /* count of predecessor basic blocks          */
109         branchref   *branchrefs;    /* list of branches to be patched             */
110         };
111
112
113 /************************* pseudo variable structure **************************/
114
115 struct varinfo {
116         int type;                   /* basic type of variable                     */
117         int flags;                  /* flags (SAVED, INMEMORY)                    */
118         int regoff;                 /* register number or memory offset           */
119         };
120
121 typedef varinfo varinfo5[5];
122
123
124 /***************** forward references in branch instructions ******************/
125
126 struct branchref {
127         s4 branchpos;               /* patching position in code segment          */
128         branchref *next;            /* next element in branchref list             */
129         };
130
131
132 /******************** forward references in tables  ***************************/
133
134 struct jumpref {
135         s4 tablepos;                /* patching position in data segment          */
136         basicblock *target;         /* target basic block                         */
137         jumpref *next;              /* next element in jumpref list               */
138         };
139
140
141 /********** JavaVM operation codes (sorted) and instruction lengths ***********/
142
143 static int stackreq[256];
144
145 static int jcommandsize[256] = {
146
147 #define JAVA_NOP               0
148 #define ICMD_NOP               0
149         1,
150 #define JAVA_ACONST_NULL       1
151 #define ICMD_ACONST            1        /* val.a = constant                   */
152         1,
153 #define JAVA_ICONST_M1         2
154 #define ICMD_NULLCHECKPOP      2
155         1,
156 #define JAVA_ICONST_0          3
157 #define ICMD_ICONST            3        /* val.i = constant                   */
158         1,
159 #define JAVA_ICONST_1          4
160 #define ICMD_IREM0X10001       4
161         1,
162 #define JAVA_ICONST_2          5
163 #define ICMD_IDIVPOW2          5        /* val.i = constant                   */
164         1,
165 #define JAVA_ICONST_3          6
166 #define ICMD_LDIVPOW2          6        /* val.l = constant                   */
167         1,
168 #define JAVA_ICONST_4          7
169         1,
170 #define JAVA_ICONST_5          8
171 #define ICMD_LREM0X10001       8
172         1,
173 #define JAVA_LCONST_0          9
174 #define ICMD_LCONST            9        /* val.l = constant                   */
175         1,
176 #define JAVA_LCONST_1         10
177 #define ICMD_LCMPCONST        10        /* val.l = constant                   */
178         1,
179 #define JAVA_FCONST_0         11
180 #define ICMD_FCONST           11        /* val.f = constant                   */
181         1,
182 #define JAVA_FCONST_1         12
183         1,
184 #define JAVA_FCONST_2         13
185 #define ICMD_ELSE_ICONST      13
186         1,
187 #define JAVA_DCONST_0         14
188 #define ICMD_DCONST           14        /* val.d = constant                   */
189         1,
190 #define JAVA_DCONST_1         15
191 #define ICMD_IFEQ_ICONST      15
192         1,
193 #define JAVA_BIPUSH           16
194 #define ICMD_IFNE_ICONST      16
195         2,
196 #define JAVA_SIPUSH           17
197 #define ICMD_IFLT_ICONST      17
198         3,
199 #define JAVA_LDC1             18
200 #define ICMD_IFGE_ICONST      18
201         2,
202 #define JAVA_LDC2             19
203 #define ICMD_IFGT_ICONST      19
204         3,
205 #define JAVA_LDC2W            20
206 #define ICMD_IFLE_ICONST      20
207         3,
208                                         /* order of LOAD instructions must be */
209                                         /* equal to order of TYPE_XXX defines */
210 #define JAVA_ILOAD            21
211 #define ICMD_ILOAD            21        /* op1 = local variable               */
212         2,                      
213 #define JAVA_LLOAD            22
214 #define ICMD_LLOAD            22        /* op1 = local variable               */
215         2,
216 #define JAVA_FLOAD            23
217 #define ICMD_FLOAD            23        /* op1 = local variable               */
218         2,
219 #define JAVA_DLOAD            24
220 #define ICMD_DLOAD            24        /* op1 = local variable               */
221         2,
222 #define JAVA_ALOAD            25
223 #define ICMD_ALOAD            25        /* op1 = local variable               */
224         2,
225 #define JAVA_ILOAD_0          26
226 #define ICMD_IADDCONST        26        /* val.i = constant                   */
227         1,
228 #define JAVA_ILOAD_1          27
229 #define ICMD_ISUBCONST        27        /* val.i = constant                   */
230         1,
231 #define JAVA_ILOAD_2          28
232 #define ICMD_IMULCONST        28        /* val.i = constant                   */
233         1,
234 #define JAVA_ILOAD_3          29
235 #define ICMD_IANDCONST        29        /* val.i = constant                   */
236         1,
237 #define JAVA_LLOAD_0          30
238 #define ICMD_IORCONST         30        /* val.i = constant                   */
239         1,
240 #define JAVA_LLOAD_1          31
241 #define ICMD_IXORCONST        31        /* val.i = constant                   */
242         1,
243 #define JAVA_LLOAD_2          32
244 #define ICMD_ISHLCONST        32        /* val.i = constant                   */
245         1,
246 #define JAVA_LLOAD_3          33
247 #define ICMD_ISHRCONST        33        /* val.i = constant                   */
248         1,
249 #define JAVA_FLOAD_0          34
250 #define ICMD_IUSHRCONST       34        /* val.i = constant                   */
251         1,
252 #define JAVA_FLOAD_1          35
253 #define ICMD_IREMPOW2         35        /* val.i = constant                   */
254         1,
255 #define JAVA_FLOAD_2          36
256 #define ICMD_LADDCONST        36        /* val.l = constant                   */
257         1,
258 #define JAVA_FLOAD_3          37
259 #define ICMD_LSUBCONST        37        /* val.l = constant                   */
260         1,
261 #define JAVA_DLOAD_0          38
262 #define ICMD_LMULCONST        38        /* val.l = constant                   */
263         1,
264 #define JAVA_DLOAD_1          39
265 #define ICMD_LANDCONST        39        /* val.l = constant                   */
266         1,
267 #define JAVA_DLOAD_2          40
268 #define ICMD_LORCONST         40        /* val.l = constant                   */
269         1,
270 #define JAVA_DLOAD_3          41
271 #define ICMD_LXORCONST        41        /* val.l = constant                   */
272         1,
273 #define JAVA_ALOAD_0          42
274 #define ICMD_LSHLCONST        42        /* val.l = constant                   */
275         1,
276 #define JAVA_ALOAD_1          43
277 #define ICMD_LSHRCONST        43        /* val.l = constant                   */
278         1,
279 #define JAVA_ALOAD_2          44
280 #define ICMD_LUSHRCONST       44        /* val.l = constant                   */
281         1,
282 #define JAVA_ALOAD_3          45
283 #define ICMD_LREMPOW2         45        /* val.l = constant                   */
284         1,
285 #define JAVA_IALOAD           46
286 #define ICMD_IALOAD           46
287         1,
288 #define JAVA_LALOAD           47
289 #define ICMD_LALOAD           47
290         1,
291 #define JAVA_FALOAD           48
292 #define ICMD_FALOAD           48
293         1,
294 #define JAVA_DALOAD           49
295 #define ICMD_DALOAD           49
296         1,
297 #define JAVA_AALOAD           50
298 #define ICMD_AALOAD           50
299         1,
300 #define JAVA_BALOAD           51
301 #define ICMD_BALOAD           51
302         1,
303 #define JAVA_CALOAD           52
304 #define ICMD_CALOAD           52
305         1,
306 #define JAVA_SALOAD           53
307 #define ICMD_SALOAD           53
308         1,
309                                         /* order of STORE instructions must be*/
310                                         /* equal to order of TYPE_XXX defines */
311 #define JAVA_ISTORE           54
312 #define ICMD_ISTORE           54        /* op1 = local variable               */
313         2,
314 #define JAVA_LSTORE           55
315 #define ICMD_LSTORE           55        /* op1 = local variable               */
316         2,
317 #define JAVA_FSTORE           56
318 #define ICMD_FSTORE           56        /* op1 = local variable               */
319         2,
320 #define JAVA_DSTORE           57
321 #define ICMD_DSTORE           57        /* op1 = local variable               */
322         2,
323 #define JAVA_ASTORE           58
324 #define ICMD_ASTORE           58        /* op1 = local variable               */
325         2,
326 #define JAVA_ISTORE_0         59
327 #define ICMD_IF_LEQ           59        /* op1 = target JavaVM pc, val.l      */
328         1,
329 #define JAVA_ISTORE_1         60
330 #define ICMD_IF_LNE           60        /* op1 = target JavaVM pc, val.l      */
331         1,
332 #define JAVA_ISTORE_2         61
333 #define ICMD_IF_LLT           61        /* op1 = target JavaVM pc, val.l      */
334         1,
335 #define JAVA_ISTORE_3         62
336 #define ICMD_IF_LGE           62        /* op1 = target JavaVM pc, val.l      */
337         1,
338 #define JAVA_LSTORE_0         63
339 #define ICMD_IF_LGT           63        /* op1 = target JavaVM pc, val.l      */
340         1,
341 #define JAVA_LSTORE_1         64
342 #define ICMD_IF_LLE           64        /* op1 = target JavaVM pc, val.l      */
343         1,
344 #define JAVA_LSTORE_2         65
345 #define ICMD_IF_LCMPEQ        65        /* op1 = target JavaVM pc             */
346         1,
347 #define JAVA_LSTORE_3         66
348 #define ICMD_IF_LCMPNE        66        /* op1 = target JavaVM pc             */
349         1,
350 #define JAVA_FSTORE_0         67
351 #define ICMD_IF_LCMPLT        67        /* op1 = target JavaVM pc             */
352         1,
353 #define JAVA_FSTORE_1         68
354 #define ICMD_IF_LCMPGE        68        /* op1 = target JavaVM pc             */
355         1,
356 #define JAVA_FSTORE_2         69
357 #define ICMD_IF_LCMPGT        69        /* op1 = target JavaVM pc             */
358         1,
359 #define JAVA_FSTORE_3         70
360 #define ICMD_IF_LCMPLE        70        /* op1 = target JavaVM pc             */
361         1,
362 #define JAVA_DSTORE_0         71
363         1,
364 #define JAVA_DSTORE_1         72
365         1,
366 #define JAVA_DSTORE_2         73
367         1,
368 #define JAVA_DSTORE_3         74
369         1,
370 #define JAVA_ASTORE_0         75
371         1,
372 #define JAVA_ASTORE_1         76
373         1,
374 #define JAVA_ASTORE_2         77
375         1,
376 #define JAVA_ASTORE_3         78
377         1,
378 #define JAVA_IASTORE          79
379 #define ICMD_IASTORE          79
380         1,
381 #define JAVA_LASTORE          80
382 #define ICMD_LASTORE          80
383         1,
384 #define JAVA_FASTORE          81
385 #define ICMD_FASTORE          81
386         1,
387 #define JAVA_DASTORE          82
388 #define ICMD_DASTORE          82
389         1,
390 #define JAVA_AASTORE          83
391 #define ICMD_AASTORE          83
392         1,
393 #define JAVA_BASTORE          84
394 #define ICMD_BASTORE          84
395         1,
396 #define JAVA_CASTORE          85
397 #define ICMD_CASTORE          85
398         1,
399 #define JAVA_SASTORE          86
400 #define ICMD_SASTORE          86
401         1,
402 #define JAVA_POP              87
403 #define ICMD_POP              87
404         1,
405 #define JAVA_POP2             88
406 #define ICMD_POP2             88
407         1,
408 #define JAVA_DUP              89
409 #define ICMD_DUP              89
410         1,
411 #define JAVA_DUP_X1           90
412 #define ICMD_DUP_X1           90
413         1,
414 #define JAVA_DUP_X2           91
415 #define ICMD_DUP_X2           91
416         1,
417 #define JAVA_DUP2             92
418 #define ICMD_DUP2             92
419         1,
420 #define JAVA_DUP2_X1          93
421 #define ICMD_DUP2_X1          93
422         1,
423 #define JAVA_DUP2_X2          94
424 #define ICMD_DUP2_X2          94
425         1,
426 #define JAVA_SWAP             95
427 #define ICMD_SWAP             95
428         1,
429 #define JAVA_IADD             96
430 #define ICMD_IADD             96
431         1,
432 #define JAVA_LADD             97
433 #define ICMD_LADD             97
434         1,
435 #define JAVA_FADD             98
436 #define ICMD_FADD             98
437         1,
438 #define JAVA_DADD             99
439 #define ICMD_DADD             99
440         1,
441 #define JAVA_ISUB             100
442 #define ICMD_ISUB             100
443         1,
444 #define JAVA_LSUB             101
445 #define ICMD_LSUB             101
446         1,
447 #define JAVA_FSUB             102
448 #define ICMD_FSUB             102
449         1,
450 #define JAVA_DSUB             103
451 #define ICMD_DSUB             103
452         1,
453 #define JAVA_IMUL             104
454 #define ICMD_IMUL             104
455         1,
456 #define JAVA_LMUL             105
457 #define ICMD_LMUL             105
458         1,
459 #define JAVA_FMUL             106
460 #define ICMD_FMUL             106
461         1,
462 #define JAVA_DMUL             107
463 #define ICMD_DMUL             107
464         1,
465 #define JAVA_IDIV             108
466 #define ICMD_IDIV             108
467         1,
468 #define JAVA_LDIV             109
469 #define ICMD_LDIV             109
470         1,
471 #define JAVA_FDIV             110
472 #define ICMD_FDIV             110
473         1,
474 #define JAVA_DDIV             111
475 #define ICMD_DDIV             111
476         1,
477 #define JAVA_IREM             112
478 #define ICMD_IREM             112
479         1,
480 #define JAVA_LREM             113
481 #define ICMD_LREM             113
482         1,
483 #define JAVA_FREM             114
484 #define ICMD_FREM             114
485         1,
486 #define JAVA_DREM             115
487 #define ICMD_DREM             115
488         1,
489 #define JAVA_INEG             116
490 #define ICMD_INEG             116
491         1,
492 #define JAVA_LNEG             117
493 #define ICMD_LNEG             117
494         1,
495 #define JAVA_FNEG             118
496 #define ICMD_FNEG             118
497         1,
498 #define JAVA_DNEG             119
499 #define ICMD_DNEG             119
500         1,
501 #define JAVA_ISHL             120
502 #define ICMD_ISHL             120
503         1,
504 #define JAVA_LSHL             121
505 #define ICMD_LSHL             121
506         1,
507 #define JAVA_ISHR             122
508 #define ICMD_ISHR             122
509         1,
510 #define JAVA_LSHR             123
511 #define ICMD_LSHR             123
512         1,
513 #define JAVA_IUSHR            124
514 #define ICMD_IUSHR            124
515         1,
516 #define JAVA_LUSHR            125
517 #define ICMD_LUSHR            125
518         1,
519 #define JAVA_IAND             126
520 #define ICMD_IAND             126
521         1,
522 #define JAVA_LAND             127
523 #define ICMD_LAND             127
524         1,
525 #define JAVA_IOR              128
526 #define ICMD_IOR              128
527         1,
528 #define JAVA_LOR              129
529 #define ICMD_LOR              129
530         1,
531 #define JAVA_IXOR             130
532 #define ICMD_IXOR             130
533         1,
534 #define JAVA_LXOR             131
535 #define ICMD_LXOR             131
536         1,
537 #define JAVA_IINC             132
538 #define ICMD_IINC             132   /* op1 = local variable, val.i = constant */
539         3,
540 #define JAVA_I2L              133
541 #define ICMD_I2L              133
542         1,
543 #define JAVA_I2F              134
544 #define ICMD_I2F              134
545         1,
546 #define JAVA_I2D              135
547 #define ICMD_I2D              135
548         1,
549 #define JAVA_L2I              136
550 #define ICMD_L2I              136
551         1,
552 #define JAVA_L2F              137
553 #define ICMD_L2F              137
554         1,
555 #define JAVA_L2D              138
556 #define ICMD_L2D              138
557         1,
558 #define JAVA_F2I              139
559 #define ICMD_F2I              139
560         1,
561 #define JAVA_F2L              140
562 #define ICMD_F2L              140
563         1,
564 #define JAVA_F2D              141
565 #define ICMD_F2D              141
566         1,
567 #define JAVA_D2I              142
568 #define ICMD_D2I              142
569         1,
570 #define JAVA_D2L              143
571 #define ICMD_D2L              143
572         1,
573 #define JAVA_D2F              144
574 #define ICMD_D2F              144
575         1,
576 #define JAVA_INT2BYTE         145
577 #define ICMD_INT2BYTE         145
578         1,
579 #define JAVA_INT2CHAR         146
580 #define ICMD_INT2CHAR         146
581         1,
582 #define JAVA_INT2SHORT        147
583 #define ICMD_INT2SHORT        147
584         1,
585 #define JAVA_LCMP             148
586 #define ICMD_LCMP             148
587         1,
588 #define JAVA_FCMPL            149
589 #define ICMD_FCMPL            149
590         1,
591 #define JAVA_FCMPG            150
592 #define ICMD_FCMPG            150
593         1,
594 #define JAVA_DCMPL            151
595 #define ICMD_DCMPL            151
596         1,
597 #define JAVA_DCMPG            152
598 #define ICMD_DCMPG            152
599         1,
600 #define JAVA_IFEQ             153
601 #define ICMD_IFEQ             153       /* op1 = target JavaVM pc, val.i      */
602         3,
603 #define JAVA_IFNE             154
604 #define ICMD_IFNE             154       /* op1 = target JavaVM pc, val.i      */
605         3,
606 #define JAVA_IFLT             155
607 #define ICMD_IFLT             155       /* op1 = target JavaVM pc, val.i      */
608         3,
609 #define JAVA_IFGE             156
610 #define ICMD_IFGE             156       /* op1 = target JavaVM pc, val.i      */
611         3,
612 #define JAVA_IFGT             157
613 #define ICMD_IFGT             157       /* op1 = target JavaVM pc, val.i      */
614         3,
615 #define JAVA_IFLE             158
616 #define ICMD_IFLE             158       /* op1 = target JavaVM pc, val.i      */
617         3,
618 #define JAVA_IF_ICMPEQ        159
619 #define ICMD_IF_ICMPEQ        159       /* op1 = target JavaVM pc             */
620         3,
621 #define JAVA_IF_ICMPNE        160
622 #define ICMD_IF_ICMPNE        160       /* op1 = target JavaVM pc             */
623         3,
624 #define JAVA_IF_ICMPLT        161
625 #define ICMD_IF_ICMPLT        161       /* op1 = target JavaVM pc             */
626         3,
627 #define JAVA_IF_ICMPGE        162
628 #define ICMD_IF_ICMPGE        162       /* op1 = target JavaVM pc             */
629         3,
630 #define JAVA_IF_ICMPGT        163
631 #define ICMD_IF_ICMPGT        163       /* op1 = target JavaVM pc             */
632         3,
633 #define JAVA_IF_ICMPLE        164
634 #define ICMD_IF_ICMPLE        164       /* op1 = target JavaVM pc             */
635         3,
636 #define JAVA_IF_ACMPEQ        165
637 #define ICMD_IF_ACMPEQ        165       /* op1 = target JavaVM pc             */
638         3,
639 #define JAVA_IF_ACMPNE        166
640 #define ICMD_IF_ACMPNE        166       /* op1 = target JavaVM pc             */
641         3,
642 #define JAVA_GOTO             167
643 #define ICMD_GOTO             167       /* op1 = target JavaVM pc             */
644         3,
645 #define JAVA_JSR              168
646 #define ICMD_JSR              168       /* op1 = target JavaVM pc             */
647         3,
648 #define JAVA_RET              169
649 #define ICMD_RET              169       /* op1 = local variable               */
650         2,
651 #define JAVA_TABLESWITCH      170
652 #define ICMD_TABLESWITCH      170       /* val.a = pointer to s4 table        */
653         0,                              /* length must be computed            */
654 #define JAVA_LOOKUPSWITCH     171
655 #define ICMD_LOOKUPSWITCH     171       /* val.a = pointer to s4 table        */
656         0,                              /* length must be computed            */
657 #define JAVA_IRETURN          172
658 #define ICMD_IRETURN          172
659         1,
660 #define JAVA_LRETURN          173
661 #define ICMD_LRETURN          173
662         1,
663 #define JAVA_FRETURN          174
664 #define ICMD_FRETURN          174
665         1,
666 #define JAVA_DRETURN          175
667 #define ICMD_DRETURN          175
668         1,
669 #define JAVA_ARETURN          176
670 #define ICMD_ARETURN          176
671         1,
672 #define JAVA_RETURN           177
673 #define ICMD_RETURN           177
674         1,
675 #define JAVA_GETSTATIC        178
676 #define ICMD_GETSTATIC        178       /* op1 = type, val.a = field address  */
677         3,
678 #define JAVA_PUTSTATIC        179
679 #define ICMD_PUTSTATIC        179       /* op1 = type, val.a = field address  */
680         3,
681 #define JAVA_GETFIELD         180
682 #define ICMD_GETFIELD         180       /* op1 = type, val.i = field offset   */
683         3,
684 #define JAVA_PUTFIELD         181
685 #define ICMD_PUTFIELD         181       /* op1 = type, val.i = field offset   */
686         3,
687 #define JAVA_INVOKEVIRTUAL    182
688 #define ICMD_INVOKEVIRTUAL    182       /* val.a = method info pointer        */
689         3,
690 #define JAVA_INVOKESPECIAL    183
691 #define ICMD_INVOKESPECIAL    183       /* val.a = method info pointer        */
692         3,
693 #define JAVA_INVOKESTATIC     184
694 #define ICMD_INVOKESTATIC     184       /* val.a = method info pointer        */
695         3,
696 #define JAVA_INVOKEINTERFACE  185
697 #define ICMD_INVOKEINTERFACE  185       /* val.a = method info pointer        */
698         5,
699 #define ICMD_CHECKASIZE       186       /*                                    */
700         1, /* unused */
701 #define JAVA_NEW              187
702 #define ICMD_NEW              187       /* op1 = 1, val.a = class pointer     */
703         3,
704 #define JAVA_NEWARRAY         188
705 #define ICMD_NEWARRAY         188       /* op1 = basic type                   */
706         2,
707 #define JAVA_ANEWARRAY        189
708 #define ICMD_ANEWARRAY        189       /* op1 = 0, val.a = array pointer     */
709         3,                              /* op1 = 1, val.a = class pointer     */
710 #define JAVA_ARRAYLENGTH      190
711 #define ICMD_ARRAYLENGTH      190
712         1,
713 #define JAVA_ATHROW           191
714 #define ICMD_ATHROW           191
715         1,
716 #define JAVA_CHECKCAST        192
717 #define ICMD_CHECKCAST        192       /* op1 = 0, val.a = array pointer     */
718         3,                              /* op1 = 1, val.a = class pointer     */
719 #define JAVA_INSTANCEOF       193
720 #define ICMD_INSTANCEOF       193       /* op1 = 0, val.a = array pointer     */
721         3,                              /* op1 = 1, val.a = class pointer     */
722 #define JAVA_MONITORENTER     194
723 #define ICMD_MONITORENTER     194
724         1,
725 #define JAVA_MONITOREXIT      195
726 #define ICMD_MONITOREXIT      195
727         1,
728 #define JAVA_WIDE             196
729         0,       /* length must be computed */
730 #define JAVA_MULTIANEWARRAY   197
731 #define ICMD_MULTIANEWARRAY   197       /* op1 = dimension, val.a = array     */
732         4,                              /* pointer                            */
733 #define JAVA_IFNULL           198
734 #define ICMD_IFNULL           198       /* op1 = target JavaVM pc             */
735         3,
736 #define JAVA_IFNONNULL        199
737 #define ICMD_IFNONNULL        199       /* op1 = target JavaVM pc             */
738         3,
739 #define JAVA_GOTO_W           200
740         5,
741 #define JAVA_JSR_W            201
742         5,
743 #define JAVA_BREAKPOINT       202
744         1,
745
746 #define ICMD_OPT_IALOAD       203
747         1,
748 #define ICMD_OPT_LALOAD       204
749         1,
750 #define ICMD_OPT_FALOAD       205
751         1,
752 #define ICMD_OPT_DALOAD       206
753         1,
754 #define ICMD_OPT_AALOAD       207
755         1,
756 #define ICMD_OPT_BALOAD       208
757         1,
758 #define ICMD_OPT_CALOAD       209
759         1,
760 #define ICMD_OPT_SALOAD       210
761         1,
762
763 #define ICMD_OPT_IASTORE      211
764         1,
765 #define ICMD_OPT_LASTORE      212
766         1,
767 #define ICMD_OPT_FASTORE      213
768         1,
769 #define ICMD_OPT_DASTORE      214
770         1,
771 #define ICMD_OPT_AASTORE      215
772         1,
773 #define ICMD_OPT_BASTORE      216
774         1,
775 #define ICMD_OPT_CASTORE      217
776         1,
777 #define ICMD_OPT_SASTORE      218
778         1,
779                         1,1,            /* unused */
780         1,1,1,1,1,1,1,1,1,1,
781         1,1,1,1,1,1,1,1,1,1,
782         1,1,1,1,1,1,1,1,1,1,
783         1,1,1,1,1
784     };
785
786 #define ICMD_BUILTIN3         253       /* internal opcode */
787 #define ICMD_BUILTIN2         254       /* internal opcode */
788 #define ICMD_BUILTIN1         255       /* internal opcode */
789
790
791 /******************* description of JavaVM instructions ***********************/
792
793 typedef struct {
794         u1 opcode;
795         u1 type_s1;
796         u1 type_s2;
797         u1 type_d;      
798         functionptr builtin;
799         bool supported;
800         bool isfloat;
801 } stdopdescriptor;
802
803 static stdopdescriptor *stdopdescriptors[256];
804
805 static stdopdescriptor stdopdescriptortable[] = {
806         { JAVA_IADD,   TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
807         { JAVA_ISUB,   TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
808         { JAVA_IMUL,   TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
809         { JAVA_ISHL,   TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
810         { JAVA_ISHR,   TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
811         { JAVA_IUSHR,  TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
812         { JAVA_IAND,   TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
813         { JAVA_IOR,    TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
814         { JAVA_IXOR,   TYPE_INT, TYPE_INT, TYPE_INT, NULL, true, false },
815         { JAVA_INEG,   TYPE_INT, TYPE_VOID,TYPE_INT, NULL, true, false },
816
817         { JAVA_LADD,   TYPE_LONG, TYPE_LONG, TYPE_LONG, 
818                (functionptr) builtin_ladd , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
819         { JAVA_LSUB,   TYPE_LONG, TYPE_LONG, TYPE_LONG,
820                (functionptr) builtin_lsub , SUPPORT_LONG && SUPPORT_LONG_ADD, false },
821         { JAVA_LMUL,   TYPE_LONG, TYPE_LONG, TYPE_LONG,
822                (functionptr) builtin_lmul , SUPPORT_LONG && SUPPORT_LONG_MULDIV, false },
823         { JAVA_LSHL,   TYPE_LONG, TYPE_INT,  TYPE_LONG,
824                (functionptr) builtin_lshl , SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
825         { JAVA_LSHR,   TYPE_LONG, TYPE_INT,  TYPE_LONG,
826                (functionptr) builtin_lshr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
827         { JAVA_LUSHR,  TYPE_LONG, TYPE_INT,  TYPE_LONG,
828                (functionptr) builtin_lushr, SUPPORT_LONG && SUPPORT_LONG_SHIFT, false },
829         { JAVA_LAND,   TYPE_LONG, TYPE_LONG, TYPE_LONG,
830                (functionptr) builtin_land, SUPPORT_LONG && SUPPORT_LONG_LOG, false },
831         { JAVA_LOR,    TYPE_LONG, TYPE_LONG, TYPE_LONG,
832                (functionptr) builtin_lor , SUPPORT_LONG && SUPPORT_LONG_LOG, false },
833         { JAVA_LXOR,   TYPE_LONG, TYPE_LONG, TYPE_LONG,
834                (functionptr) builtin_lxor, SUPPORT_LONG && SUPPORT_LONG_LOG, false },
835         { JAVA_LNEG,   TYPE_LONG, TYPE_VOID, TYPE_LONG,
836                (functionptr) builtin_lneg, SUPPORT_LONG && SUPPORT_LONG_ADD, false },
837         { JAVA_LCMP,   TYPE_LONG, TYPE_LONG, TYPE_INT,
838                (functionptr) builtin_lcmp, SUPPORT_LONG && SUPPORT_LONG_CMP, false },
839
840         { JAVA_FADD,   TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, 
841                (functionptr) builtin_fadd, SUPPORT_FLOAT, true },
842         { JAVA_FSUB,   TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, 
843                (functionptr) builtin_fsub, SUPPORT_FLOAT, true },
844         { JAVA_FMUL,   TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, 
845                (functionptr) builtin_fmul, SUPPORT_FLOAT, true },
846         { JAVA_FDIV,   TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, 
847                (functionptr) builtin_fdiv, SUPPORT_FLOAT, true },
848         { JAVA_FREM,   TYPE_FLOAT, TYPE_FLOAT, TYPE_FLOAT, 
849                (functionptr) builtin_frem, SUPPORT_FLOAT, true },
850         { JAVA_FNEG,   TYPE_FLOAT, TYPE_VOID,  TYPE_FLOAT, 
851                (functionptr) builtin_fneg, SUPPORT_FLOAT, true },
852         { JAVA_FCMPL,  TYPE_FLOAT, TYPE_FLOAT, TYPE_INT,   
853                (functionptr) builtin_fcmpl, SUPPORT_FLOAT, true },
854         { JAVA_FCMPG,  TYPE_FLOAT, TYPE_FLOAT, TYPE_INT,   
855                (functionptr) builtin_fcmpg, SUPPORT_FLOAT, true },
856
857         { JAVA_DADD,   TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE, 
858                (functionptr) builtin_dadd, SUPPORT_DOUBLE, true },
859         { JAVA_DSUB,   TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE, 
860                (functionptr) builtin_dsub, SUPPORT_DOUBLE, true },
861         { JAVA_DMUL,   TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE, 
862                (functionptr) builtin_dmul, SUPPORT_DOUBLE, true },
863         { JAVA_DDIV,   TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE, 
864                (functionptr) builtin_ddiv, SUPPORT_DOUBLE, true },
865         { JAVA_DREM,   TYPE_DOUBLE, TYPE_DOUBLE, TYPE_DOUBLE, 
866                (functionptr) builtin_drem, SUPPORT_DOUBLE, true },
867         { JAVA_DNEG,   TYPE_DOUBLE, TYPE_VOID,  TYPE_DOUBLE, 
868                (functionptr) builtin_dneg, SUPPORT_DOUBLE, true },
869         { JAVA_DCMPL,  TYPE_DOUBLE, TYPE_DOUBLE, TYPE_INT, 
870                (functionptr) builtin_dcmpl, SUPPORT_DOUBLE, true },
871         { JAVA_DCMPG,  TYPE_DOUBLE, TYPE_DOUBLE, TYPE_INT, 
872                (functionptr) builtin_dcmpg, SUPPORT_DOUBLE, true },
873
874         { JAVA_INT2BYTE, TYPE_INT, TYPE_VOID, TYPE_INT, NULL, true,false },
875         { JAVA_INT2CHAR, TYPE_INT, TYPE_VOID, TYPE_INT, NULL, true,false },
876         { JAVA_INT2SHORT, TYPE_INT, TYPE_VOID, TYPE_INT, NULL, true,false },
877         { JAVA_I2L,    TYPE_INT,  TYPE_VOID, TYPE_LONG,   
878            (functionptr) builtin_i2l, SUPPORT_LONG && SUPPORT_LONG_ICVT, false },
879         { JAVA_I2F,    TYPE_INT,  TYPE_VOID, TYPE_FLOAT,  
880                (functionptr) builtin_i2f, SUPPORT_FLOAT, true },
881         { JAVA_I2D,    TYPE_INT,  TYPE_VOID, TYPE_DOUBLE, 
882                (functionptr) builtin_i2d, SUPPORT_DOUBLE, true },
883         { JAVA_L2I,    TYPE_LONG, TYPE_VOID, TYPE_INT,    
884                (functionptr) builtin_l2i, SUPPORT_LONG && SUPPORT_LONG_ICVT, false },
885         { JAVA_L2F,    TYPE_LONG, TYPE_VOID, TYPE_FLOAT,  
886                (functionptr) builtin_l2f, SUPPORT_LONG && SUPPORT_FLOAT && SUPPORT_LONG_FCVT, true },
887         { JAVA_L2D,    TYPE_LONG, TYPE_VOID, TYPE_DOUBLE, 
888                (functionptr) builtin_l2d, SUPPORT_LONG && SUPPORT_DOUBLE && SUPPORT_LONG_FCVT, true },
889         { JAVA_F2I,    TYPE_FLOAT, TYPE_VOID, TYPE_INT,   
890                (functionptr) builtin_f2i, SUPPORT_FLOAT, true },
891         { JAVA_F2L,    TYPE_FLOAT, TYPE_VOID, TYPE_LONG,   
892                (functionptr) builtin_f2l, SUPPORT_FLOAT && SUPPORT_LONG && SUPPORT_LONG_FCVT, true },
893         { JAVA_F2D,    TYPE_FLOAT, TYPE_VOID, TYPE_DOUBLE, 
894                (functionptr) builtin_f2d, SUPPORT_FLOAT && SUPPORT_DOUBLE, true },
895         { JAVA_D2I,    TYPE_DOUBLE, TYPE_VOID, TYPE_INT,   
896                (functionptr) builtin_d2i, SUPPORT_DOUBLE, true },
897         { JAVA_D2L,    TYPE_DOUBLE, TYPE_VOID, TYPE_LONG,   
898                (functionptr) builtin_d2l, SUPPORT_DOUBLE && SUPPORT_LONG && SUPPORT_LONG_FCVT, true },
899         { JAVA_D2F,    TYPE_DOUBLE, TYPE_VOID, TYPE_FLOAT, 
900                (functionptr) builtin_d2f, SUPPORT_DOUBLE && SUPPORT_FLOAT, true },
901         
902 };
903
904 static char *icmd_names[256] = {
905         "NOP          ", /*               0 */
906         "ACONST       ", /*               1 */
907         "NULLCHECKPOP ", /* ICONST_M1     2 */
908         "ICONST       ", /*               3 */
909         "IREM0X10001  ", /* ICONST_1      4 */
910         "IDIVPOW2     ", /* ICONST_2      5 */
911         "LDIVPOW2     ", /* ICONST_3      6 */
912         "UNDEF__7     ", /* ICONST_4      7 */
913         "LREM0X10001  ", /* ICONST_5      8 */
914         "LCONST       ", /*               9 */
915         "LCMPCONST    ", /* LCONST_1     10 */
916         "FCONST       ", /*              11 */
917         "UNDEF_12     ", /* FCONST_1     12 */
918         "ELSE_ICONST  ", /* FCONST_2     13 */
919         "DCONST       ", /*              14 */
920         "IFEQ_ICONST  ", /* DCONST_1     15 */
921         "IFNE_ICONST  ", /* BIPUSH       16 */
922         "IFLT_ICONST  ", /* SIPUSH       17 */
923         "IFGE_ICONST  ", /* LDC1         18 */
924         "IFGT_ICONST  ", /* LDC2         19 */
925         "IFLE_ICONST  ", /* LDC2W        20 */
926         "ILOAD        ", /*              21 */
927         "LLOAD        ", /*              22 */
928         "FLOAD        ", /*              23 */
929         "DLOAD        ", /*              24 */
930         "ALOAD        ", /*              25 */
931         "IADDCONST    ", /* ILOAD_0      26 */
932         "ISUBCONST    ", /* ILOAD_1      27 */
933         "IMULCONST    ", /* ILOAD_2      28 */
934         "IANDCONST    ", /* ILOAD_3      29 */
935         "IORCONST     ", /* LLOAD_0      30 */
936         "IXORCONST    ", /* LLOAD_1      31 */
937         "ISHLCONST    ", /* LLOAD_2      32 */
938         "ISHRCONST    ", /* LLOAD_3      33 */
939         "IUSHRCONST   ", /* FLOAD_0      34 */
940         "IREMPOW2     ", /* FLOAD_1      35 */
941         "LADDCONST    ", /* FLOAD_2      36 */
942         "LSUBCONST    ", /* FLOAD_3      37 */
943         "LMULCONST    ", /* DLOAD_0      38 */
944         "LANDCONST    ", /* DLOAD_1      39 */
945         "LORCONST     ", /* DLOAD_2      40 */
946         "LXORCONST    ", /* DLOAD_3      41 */
947         "LSHLCONST    ", /* ALOAD_0      42 */
948         "LSHRCONST    ", /* ALOAD_1      43 */
949         "LUSHRCONST   ", /* ALOAD_2      44 */
950         "LREMPOW2     ", /* ALOAD_3      45 */
951         "IALOAD       ", /*              46 */
952         "LALOAD       ", /*              47 */
953         "FALOAD       ", /*              48 */
954         "DALOAD       ", /*              49 */
955         "AALOAD       ", /*              50 */
956         "BALOAD       ", /*              51 */
957         "CALOAD       ", /*              52 */
958         "SALOAD       ", /*              53 */
959         "ISTORE       ", /*              54 */
960         "LSTORE       ", /*              55 */
961         "FSTORE       ", /*              56 */
962         "DSTORE       ", /*              57 */
963         "ASTORE       ", /*              58 */
964         "IF_LEQ       ", /* ISTORE_0     59 */
965         "IF_LNE       ", /* ISTORE_1     60 */
966         "IF_LLT       ", /* ISTORE_2     61 */
967         "IF_LGE       ", /* ISTORE_3     62 */
968         "IF_LGT       ", /* LSTORE_0     63 */
969         "IF_LLE       ", /* LSTORE_1     64 */
970         "IF_LCMPEQ    ", /* LSTORE_2     65 */
971         "IF_LCMPNE    ", /* LSTORE_3     66 */
972         "IF_LCMPLT    ", /* FSTORE_0     67 */
973         "IF_LCMPGE    ", /* FSTORE_1     68 */
974         "IF_LCMPGT    ", /* FSTORE_2     69 */
975         "IF_LCMPLE    ", /* FSTORE_3     70 */
976         "UNDEF_71     ", /* DSTORE_0     71 */
977         "UNDEF_72     ", /* DSTORE_1     72 */
978         "UNDEF_73     ", /* DSTORE_2     73 */
979         "UNDEF_74     ", /* DSTORE_3     74 */
980         "UNDEF_75     ", /* ASTORE_0     75 */
981         "UNDEF_76     ", /* ASTORE_1     76 */
982         "UNDEF_77     ", /* ASTORE_2     77 */
983         "UNDEF_78     ", /* ASTORE_3     78 */
984         "IASTORE      ", /*              79 */
985         "LASTORE      ", /*              80 */
986         "FASTORE      ", /*              81 */
987         "DASTORE      ", /*              82 */
988         "AASTORE      ", /*              83 */
989         "BASTORE      ", /*              84 */
990         "CASTORE      ", /*              85 */
991         "SASTORE      ", /*              86 */
992         "POP          ", /*              87 */
993         "POP2         ", /*              88 */
994         "DUP          ", /*              89 */
995         "DUP_X1       ", /*              90 */
996         "DUP_X2       ", /*              91 */
997         "DUP2         ", /*              92 */
998         "DUP2_X1      ", /*              93 */
999         "DUP2_X2      ", /*              94 */
1000         "SWAP         ", /*              95 */
1001         "IADD         ", /*              96 */
1002         "LADD         ", /*              97 */
1003         "FADD         ", /*              98 */
1004         "DADD         ", /*              99 */
1005         "ISUB         ", /*             100 */
1006         "LSUB         ", /*             101 */
1007         "FSUB         ", /*             102 */
1008         "DSUB         ", /*             103 */
1009         "IMUL         ", /*             104 */
1010         "LMUL         ", /*             105 */
1011         "FMUL         ", /*             106 */
1012         "DMUL         ", /*             107 */
1013         "IDIV         ", /*             108 */
1014         "LDIV         ", /*             109 */
1015         "FDIV         ", /*             110 */
1016         "DDIV         ", /*             111 */
1017         "IREM         ", /*             112 */
1018         "LREM         ", /*             113 */
1019         "FREM         ", /*             114 */
1020         "DREM         ", /*             115 */
1021         "INEG         ", /*             116 */
1022         "LNEG         ", /*             117 */
1023         "FNEG         ", /*             118 */
1024         "DNEG         ", /*             119 */
1025         "ISHL         ", /*             120 */
1026         "LSHL         ", /*             121 */
1027         "ISHR         ", /*             122 */
1028         "LSHR         ", /*             123 */
1029         "IUSHR        ", /*             124 */
1030         "LUSHR        ", /*             125 */
1031         "IAND         ", /*             126 */
1032         "LAND         ", /*             127 */
1033         "IOR          ", /*             128 */
1034         "LOR          ", /*             129 */
1035         "IXOR         ", /*             130 */
1036         "LXOR         ", /*             131 */
1037         "IINC         ", /*             132 */
1038         "I2L          ", /*             133 */
1039         "I2F          ", /*             134 */
1040         "I2D          ", /*             135 */
1041         "L2I          ", /*             136 */
1042         "L2F          ", /*             137 */
1043         "L2D          ", /*             138 */
1044         "F2I          ", /*             139 */
1045         "F2L          ", /*             140 */
1046         "F2D          ", /*             141 */
1047         "D2I          ", /*             142 */
1048         "D2L          ", /*             143 */
1049         "D2F          ", /*             144 */
1050         "INT2BYTE     ", /*             145 */
1051         "INT2CHAR     ", /*             146 */
1052         "INT2SHORT    ", /*             147 */
1053         "LCMP         ", /*             148 */
1054         "FCMPL        ", /*             149 */
1055         "FCMPG        ", /*             150 */
1056         "DCMPL        ", /*             151 */
1057         "DCMPG        ", /*             152 */
1058         "IFEQ         ", /*             153 */
1059         "IFNE         ", /*             154 */
1060         "IFLT         ", /*             155 */
1061         "IFGE         ", /*             156 */
1062         "IFGT         ", /*             157 */
1063         "IFLE         ", /*             158 */
1064         "IF_ICMPEQ    ", /*             159 */
1065         "IF_ICMPNE    ", /*             160 */
1066         "IF_ICMPLT    ", /*             161 */
1067         "IF_ICMPGE    ", /*             162 */
1068         "IF_ICMPGT    ", /*             163 */
1069         "IF_ICMPLE    ", /*             164 */
1070         "IF_ACMPEQ    ", /*             165 */
1071         "IF_ACMPNE    ", /*             166 */
1072         "GOTO         ", /*             167 */
1073         "JSR          ", /*             168 */
1074         "RET          ", /*             169 */
1075         "TABLESWITCH  ", /*             170 */
1076         "LOOKUPSWITCH ", /*             171 */
1077         "IRETURN      ", /*             172 */
1078         "LRETURN      ", /*             173 */
1079         "FRETURN      ", /*             174 */
1080         "DRETURN      ", /*             175 */
1081         "ARETURN      ", /*             176 */
1082         "RETURN       ", /*             177 */
1083         "GETSTATIC    ", /*             178 */
1084         "PUTSTATIC    ", /*             179 */
1085         "GETFIELD     ", /*             180 */
1086         "PUTFIELD     ", /*             181 */
1087         "INVOKEVIRTUAL", /*             182 */
1088         "INVOKESPECIAL", /*             183 */
1089         "INVOKESTATIC ", /*             184 */
1090         "INVOKEINTERFACE",/*            185 */
1091         "CHECKASIZE   ", /* UNDEF186    186 */
1092         "NEW          ", /*             187 */
1093         "NEWARRAY     ", /*             188 */
1094         "ANEWARRAY    ", /*             189 */
1095         "ARRAYLENGTH  ", /*             190 */
1096         "ATHROW       ", /*             191 */
1097         "CHECKCAST    ", /*             192 */
1098         "INSTANCEOF   ", /*             193 */
1099         "MONITORENTER ", /*             194 */
1100         "MONITOREXIT  ", /*             195 */
1101         "UNDEF196     ", /* WIDE        196 */
1102         "MULTIANEWARRAY",/*             197 */
1103         "IFNULL       ", /*             198 */
1104         "IFNONNULL    ", /*             199 */
1105         "UNDEF200     ", /* GOTO_W      200 */
1106         "UNDEF201     ", /* JSR_W       201 */
1107         "UNDEF202     ", /* BREAKPOINT  202 */
1108
1109         "OPT_IALOAD   ", /*             203 */
1110         "OPT_LALOAD   ", /*             204 */
1111         "OPT_FALOAD   ", /*             205 */
1112         "OPT_DALOAD   ", /*             206 */
1113         "OPT_AALOAD   ", /*             207 */
1114         "OPT_BALOAD   ", /*             208 */
1115         "OPT_CALOAD   ", /*             209 */
1116         "OPT_SALOAD   ", /*             210 */
1117         "OPT_IASTORE  ", /*             211 */
1118         "OPT_LASTORE  ", /*             212 */
1119         "OPT_FASTORE  ", /*             213 */
1120         "OPT_DASTORE  ", /*             214 */
1121         "OPT_AASTORE  ", /*             215 */
1122         "OPT_BASTORE  ", /*             216 */
1123         "OPT_CASTORE  ", /*             217 */
1124         "OPT_SASTORE  ", /*             218 */
1125
1126                              "UNDEF219","UNDEF220",
1127         "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
1128         "UNDEF226","UNDEF227","UNDEF228","UNDEF229","UNDEF230",
1129         "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
1130         "UNDEF236","UNDEF237","UNDEF238","UNDEF239","UNDEF240",
1131         "UNDEF","UNDEF","UNDEF","UNDEF","UNDEF",
1132         "UNDEF246","UNDEF247","UNDEF248","UNDEF249","UNDEF250",
1133         "UNDEF251","UNDEF252",
1134         "BUILTIN3     ", /*             253 */
1135         "BUILTIN2     ", /*             254 */
1136         "BUILTIN1     "  /*             255 */
1137     };
1138
1139
1140
1141 /***************************** register types *********************************/
1142
1143 #define REG_RES   0         /* reserved register for OS or code generator     */
1144 #define REG_RET   1         /* return value register                          */
1145 #define REG_EXC   2         /* exception value register                       */
1146 #define REG_SAV   3         /* (callee) saved register                        */
1147 #define REG_TMP   4         /* scratch temporary register (caller saved)      */
1148 #define REG_ARG   5         /* argument register (caller saved)               */
1149
1150 #define REG_END   -1        /* last entry in tables                           */
1151  
1152 #define PARAMMODE_NUMBERED  0 
1153 #define PARAMMODE_STUFFED   1
1154
1155 /***************************** register info block ****************************/
1156
1157 extern int nregdescint[];   /* description of integer registers               */
1158 extern int nregdescfloat[]; /* description of floating point registers        */
1159
1160 extern int nreg_parammode;
1161
1162 void asm_handle_exception();
1163 void asm_handle_nat_exception();
1164
1165 static void disassinstr (int c, int pos);       /* disassemble an instruction */
1166 static void disassemble (int *code, int len);   /* disassemble a code block   */