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