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