* src/vm/string.c (javastring_toutf): Check for NULL and return
[cacao.git] / src / vm / jit / jit.h
1 /* src/vm/jit/jit.h - code generation header
2
3    Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6    J. Wenninger, Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23    02110-1301, USA.
24
25    Contact: cacao@cacaojvm.org
26
27    Authors: Andreas Krall
28             Reinhard Grafl
29
30    Changes: Christian Thalinger
31                         Edwin Steiner
32
33    $Id: jit.h 5049 2006-06-23 12:07:26Z twisti $
34
35 */
36
37
38 #ifndef _JIT_H
39 #define _JIT_H
40
41 /* forward typedefs ***********************************************************/
42
43 typedef struct jitdata jitdata;
44 typedef struct stackelement stackelement;
45 typedef stackelement *stackptr;
46 typedef struct basicblock basicblock;
47 typedef struct branchref branchref;
48 typedef struct instruction instruction;
49 typedef struct new_instruction new_instruction;
50 typedef struct insinfo_inline insinfo_inline;
51
52
53 #include "config.h"
54 #include "vm/types.h"
55
56 #include "toolbox/chain.h"
57 #include "vm/global.h"
58 #include "vm/method.h"
59 #include "vm/references.h"
60 #include "vm/resolve.h"
61 #include "vm/statistics.h"
62 #include "vm/jit/codegen-common.h"
63 #include "vm/jit/reg.h"
64 #include "vm/jit/stacktrace.h"
65
66 #if defined(ENABLE_INLINING)
67 # include "vm/jit/inline/inline.h"
68 #endif
69
70 #if defined(ENABLE_LOOP)
71 # include "vm/jit/loop/loop.h"
72 #endif
73
74 #include "vm/jit/verify/typeinfo.h"
75
76
77 /* common jit/codegen macros **************************************************/
78
79 #if defined(ENABLE_STATISTICS)
80 # define COUNT(x)        (x)++
81 # define COUNT_SPILLS    count_spills++
82 #else
83 # define COUNT(x)        /* nothing */
84 # define COUNT_SPILLS    /* nothing */
85 #endif
86
87
88 /* jitdata ********************************************************************/
89
90 #define JITDATA_FLAG_PARSE               0x00000001
91 #define JITDATA_FLAG_VERIFY              0x00000002
92
93 #define JITDATA_FLAG_IFCONV              0x00000004
94
95 #define JITDATA_FLAG_SHOWINTERMEDIATE    0x20000000
96 #define JITDATA_FLAG_SHOWDISASSEMBLE     0x40000000
97 #define JITDATA_FLAG_VERBOSECALL         0x80000000
98
99
100 #define JITDATA_HAS_FLAG_PARSE(jd) \
101     ((jd)->flags & JITDATA_FLAG_PARSE)
102
103 #define JITDATA_HAS_FLAG_VERIFY(jd) \
104     ((jd)->flags & JITDATA_FLAG_VERIFY)
105
106 #define JITDATA_HAS_FLAG_IFCONV(jd) \
107     ((jd)->flags & JITDATA_FLAG_IFCONV)
108
109 #define JITDATA_HAS_FLAG_SHOWINTERMEDIATE(jd) \
110     ((jd)->flags & JITDATA_FLAG_SHOWINTERMEDIATE)
111
112 #define JITDATA_HAS_FLAG_SHOWDISASSEMBLE(jd) \
113     ((jd)->flags & JITDATA_FLAG_SHOWDISASSEMBLE)
114
115 #define JITDATA_HAS_FLAG_VERBOSECALL(jd) \
116     ((jd)->flags & JITDATA_FLAG_VERBOSECALL)
117
118
119 struct jitdata {
120         methodinfo      *m;                 /* methodinfo of the method compiled  */
121         codeinfo        *code;
122         codegendata     *cd;
123         registerdata    *rd;
124 #if defined(ENABLE_LOOP)
125         loopdata        *ld;
126 #endif
127         u4               flags;             /* contains JIT compiler flags        */
128
129         new_instruction *new_instructions;
130         basicblock      *new_basicblocks;
131         s4              *new_basicblockindex;
132         stackelement    *new_stack;
133         s4               new_instructioncount;
134         s4               new_basicblockcount;
135         s4               new_stackcount;
136         s4               new_c_debug_nr;
137         registerdata    *new_rd;
138 };
139
140
141 /************************** stack element structure ***************************/
142
143 /* slot types */
144
145 /* Unified these with longer names. Maybe someday use only
146  * one set of names? -Edwin
147  */
148 /*#define TYPE_INT   0*/               /* the stack slot types must numbered in the  */
149 #define TYPE_LNG   TYPE_LONG    /*1*/  /* same order as the ICMD_Ixxx to ICMD_Axxx   */
150 #define TYPE_FLT   TYPE_FLOAT   /*2*/  /* instructions (LOAD and STORE)              */
151 #define TYPE_DBL   TYPE_DOUBLE  /*3*/  /* integer, long, float, double, address      */
152 #define TYPE_ADR   TYPE_ADDRESS /*4*/
153
154 #define IS_INT_LNG_TYPE(a)      (!((a) & TYPE_FLT))
155 #define IS_FLT_DBL_TYPE(a)      ((a) & TYPE_FLT)
156 #define IS_2_WORD_TYPE(a)       ((a) & TYPE_LNG)
157
158 #define IS_INT_TYPE(a)          ((a) == TYPE_INT)
159 #define IS_LNG_TYPE(a)          ((a) == TYPE_LNG)
160 #define IS_ADR_TYPE(a)          ((a) == TYPE_ADR)
161
162
163 /* flags */
164
165 #define SAVEDVAR   1            /* variable has to survive method invocations */
166 #define INMEMORY   2            /* variable stored in memory                  */
167 #define SAVEDTMP   4            /* temporary variable using a saved register  */
168 #define TMPARG     8            /* temporary variable using a arg register    */
169 #define STCOPY    16            /* there is another stackslot alive "below"   */
170                                 /* using the same register/memory location    */
171 #define STKEEP    32            /* to prevent reg_mark_copy to free this      */
172                                 /* stackslot */
173
174 /* variable kinds */
175
176 #define UNDEFVAR   0            /* stack slot will become temp during regalloc*/
177 #define TEMPVAR    1            /* stack slot is temp register                */
178 #define STACKVAR   2            /* stack slot is numbered stack slot          */
179 #define LOCALVAR   3            /* stack slot is local variable               */
180 #define ARGVAR     4            /* stack slot is argument variable            */
181
182
183 struct stackelement {
184         stackptr prev;              /* pointer to next element towards bottom     */
185         s4       type;              /* slot type of stack element                 */
186 #ifdef ENABLE_VERIFIER
187         typeinfo typeinfo;          /* info on reference types                    */
188 #endif
189         s4       flags;             /* flags (SAVED, INMEMORY)                    */
190         s4       varkind;           /* kind of variable or register               */
191         s4       varnum;            /* number of variable                         */
192         s4       regoff;            /* register number or memory offset           */
193 };
194
195
196 /**************************** instruction structure ***************************/
197
198 /* branch_target_t: used in TABLESWITCH tables */
199
200 typedef union {
201     s4                         insindex; /* used between parse and stack      */
202     basicblock                *block;    /* used from stack analysis onwards  */
203 } branch_target_t;
204
205 /* lookup_target_t: used in LOOKUPSWITCH tables */
206
207 typedef struct {
208     s4                         value;    /* case value                        */
209     branch_target_t            target;   /* branch target, see above          */
210 } lookup_target_t;
211
212 /*** s1 operand ***/
213
214 typedef union {
215     stackptr                   var;
216     s4                         localindex;
217     s4                         argcount;
218 } s1_operand_t;
219
220 /*** s2 operand ***/
221
222 typedef union {
223     stackptr                   var;
224     stackptr                  *args;
225     classref_or_classinfo      c;
226     unresolved_class          *uc;
227     ptrint                     constval;         /* for PUT*CONST             */
228     s4                         tablelow;         /* for TABLESWITCH           */
229     u4                         lookupcount;      /* for LOOKUPSWITCH          */
230 } s2_operand_t;
231
232 /*** s3 operand ***/
233
234 typedef union {
235     stackptr                   var;
236     ptrint                     constval;
237     classref_or_classinfo      c;
238     constant_FMIref           *fmiref;
239     unresolved_method         *um;
240     unresolved_field          *uf;
241     insinfo_inline            *inlineinfo;       /* for INLINE_START/END      */
242     s4                         tablehigh;        /* for TABLESWITCH           */
243     branch_target_t            lookupdefault;    /* for LOOKUPSWITCH          */
244     branch_target_t            jsrtarget;        /* for JSR                   */
245     struct builtintable_entry *bte;
246 } s3_operand_t;
247
248 /*** val operand ***/
249
250 typedef union {
251     s4                        i;
252     s8                        l;
253     float                     f;
254     double                    d;
255     void                     *anyptr;
256     java_objectheader        *stringconst;       /* for ACONST with string    */
257     classref_or_classinfo     c;                 /* for ACONST with class     */
258 } val_operand_t;
259
260 /*** dst operand ***/
261
262 typedef union {
263     stackptr                   var;
264     s4                         localindex;
265     basicblock                *block;       /* valid after stack analysis     */
266     branch_target_t           *table;       /* for TABLESWITCH                */
267     lookup_target_t           *lookup;      /* for LOOKUPSWITCH               */
268     s4                         insindex;    /* used between parse and stack   */
269         stackptr                  *dupslots;    /* for SWAP, DUP* except DUP      */
270 } dst_operand_t;
271
272 /*** flags (32 bits) ***/
273
274 #define INS_FLAG_UNRESOLVED    0x01    /* contains unresolved field/meth/class*/
275 #define INS_FLAG_CLASS         0x02    /* for ACONST with class               */
276 #define INS_FLAG_ARRAY         0x04    /* for CHECKCAST/INSTANCEOF with array */
277 #define INS_FLAG_NOCHECK       0x08
278
279 typedef union {
280     u4                  bits;
281     struct {         /* fields: */
282
283         union {
284             u1              type;         /* TYPE_* constant for fields       */
285             u1              argcount;     /* XXX does u1 suffice?             */
286                                           /* for MULTIANEWARRAY and           */
287                                           /* INVOKE*                          */
288         } f; /* XXX these could be made smaller */
289         /* only MULTIANEWARRAY needs the argcount */
290
291         bool                predicated:1;
292         int                 condition :3;
293         bool                unresolved:1; /* field/method is unresolved       */
294         bool                nocheck   :1; /* don't check array access         */
295         bool                branch    :1; /* branch to dst.target             */
296
297         int                 tmpreg1   :5;
298         int                 tmpreg2   :5;
299         int                 tmpreg3   :5;
300
301         int                 unused    :2;
302
303     } fields;
304 } flags_operand_t;
305
306 /*** instruction ***/
307
308 /* The new instruction format for the intermediate representation: */
309
310 struct new_instruction {
311     u2                      opc;    /* opcode       */
312     u2                      line;   /* line number  */
313 #if SIZEOF_VOID_P == 8
314     flags_operand_t         flags;  /* 4 bytes      */
315 #endif
316     s1_operand_t            s1;     /* pointer-size */
317     union {
318         struct {
319             s2_operand_t    s2;     /* pointer-size */
320             s3_operand_t    s3;     /* pointer-size */
321         } s23;                      /*     XOR      */
322         val_operand_t       val;    /*  long-size   */
323     } sx;
324     dst_operand_t           dst;    /* pointer-size */
325 #if SIZEOF_VOID_P == 4
326     flags_operand_t         flags;  /* 4 bytes      */
327 #endif
328 };
329
330 /* XXX This instruction format will become obsolete. */
331
332 struct instruction {
333         stackptr    dst;            /* stack index of destination operand stack   */
334         u2          opc;            /* opcode of intermediate code command        */
335         s4          op1;            /* first operand, usually variable number     */
336         imm_union   val;            /* immediate constant                         */
337         void       *target;         /* used for targets of branches and jumps     */
338                                     /* and as address for list of targets for     */
339                                     /* statements                                 */
340         u2          line;           /* line number in source file                 */
341 };
342
343 #define INSTRUCTION_IS_RESOLVED(iptr) \
344         (!((ptrint)(iptr)->target & 0x01)) /* XXX target used temporarily as flag */
345
346 #define INSTRUCTION_IS_UNRESOLVED(iptr) \
347         ((ptrint)(iptr)->target & 0x01) /* XXX target used temporarily as flag */
348
349 #define NEW_INSTRUCTION_GET_FIELDREF(iptr,fref) \
350         do { \
351                 if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
352                         fref = iptr->sx.s23.s3.uf->fieldref; \
353                 else \
354                         fref = iptr->sx.s23.s3.fmiref; \
355         } while (0)
356
357 #define INSTRUCTION_GET_FIELDREF(iptr,fref) \
358         do { \
359                 if (INSTRUCTION_IS_UNRESOLVED(iptr)) \
360                         fref = ((unresolved_field *) (iptr)->val.a)->fieldref; \
361                 else \
362                         fref = ((constant_FMIref *)(iptr)->val.a); \
363         } while (0)
364
365 #define NEW_INSTRUCTION_GET_METHODREF(iptr,mref) \
366         do { \
367                 if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
368                         mref = iptr->sx.s23.s3.um->methodref; \
369                 else \
370                         mref = iptr->sx.s23.s3.fmiref; \
371         } while (0)
372
373 #define INSTRUCTION_GET_METHODREF(iptr,mref) \
374         do { \
375                 if (INSTRUCTION_IS_UNRESOLVED(iptr)) \
376                         mref = ((unresolved_method *) (iptr)->val.a)->methodref; \
377                 else \
378                         mref = ((constant_FMIref *)(iptr)->val.a); \
379         } while (0)
380
381 #define INSTRUCTION_GET_FIELDDESC(iptr,fd) \
382         do { \
383                 if (INSTRUCTION_IS_UNRESOLVED(iptr)) \
384                         fd = ((unresolved_field *)(iptr)->val.a)->fieldref->parseddesc.fd; \
385                 else \
386                         fd = ((constant_FMIref *)(iptr)->val.a)->parseddesc.fd; \
387         } while (0)
388
389 #define NEW_INSTRUCTION_GET_METHODDESC(iptr, md) \
390         do { \
391                 if (iptr->flags.bits & INS_FLAG_UNRESOLVED) \
392                         md = iptr->sx.s23.s3.um->methodref->parseddesc.md; \
393                 else \
394                         md = iptr->sx.s23.s3.fmiref->parseddesc.md; \
395         } while (0)
396
397 #define INSTRUCTION_GET_METHODDESC(iptr,md) \
398         do { \
399                 if (INSTRUCTION_IS_UNRESOLVED(iptr)) \
400                         md = ((unresolved_method *) (iptr)->val.a)->methodref->parseddesc.md; \
401                 else \
402                         md = ((constant_FMIref *)(iptr)->val.a)->parseddesc.md; \
403         } while (0)
404
405 #define INSTRUCTION_UNRESOLVED_METHOD(iptr) \
406         ((unresolved_method *) (iptr)->val.a)
407
408 #define INSTRUCTION_UNRESOLVED_FIELD(iptr) \
409         ((unresolved_field *) (iptr)->val.a)
410
411 #define INSTRUCTION_RESOLVED_FMIREF(iptr) \
412     ((constant_FMIref *)(iptr)->val.a)
413
414 #define INSTRUCTION_RESOLVED_FIELDINFO(iptr) \
415     (INSTRUCTION_RESOLVED_FMIREF(iptr)->p.field)
416
417 #define INSTRUCTION_RESOLVED_METHODINFO(iptr) \
418     (INSTRUCTION_RESOLVED_FMIREF(iptr)->p.method)
419
420 #define INSTRUCTION_PUTCONST_TYPE(iptr) \
421         ((iptr)[0].op1)
422
423 #define INSTRUCTION_PUTCONST_VALUE_ADR(iptr) \
424         ((iptr)[0].val.a)
425
426 #define INSTRUCTION_PUTCONST_FIELDINFO(iptr) \
427         ((fieldinfo *)((iptr)[1].val.a))
428
429 #define INSTRUCTION_PUTCONST_FIELDINFO_PTR(iptr) \
430         ((fieldinfo **) &((iptr)[1].val.a))
431
432 #define INSTRUCTION_PUTCONST_FIELDREF(iptr) \
433         ((unresolved_field *)((iptr)[1].target))
434
435 /* for ICMD_ACONST */
436
437 #define ICMD_ACONST_IS_CLASS(iptr) \
438         ((ptrint)(iptr)->target & 0x02) /* XXX target used temporarily as flag */
439
440 #define ICMD_ACONST_CLASSREF_OR_CLASSINFO(iptr) \
441 (CLASSREF_OR_CLASSINFO((iptr)->val.a))
442
443 #define ICMD_ACONST_RESOLVED_CLASSINFO(iptr) \
444         ((classinfo *) (iptr)->val.a)
445
446 #define ICMD_ACONST_UNRESOLVED_CLASSREF(iptr) \
447         ((constant_classref *) (iptr)->val.a)
448
449
450 /* additional info structs for special instructions ***************************/
451
452 /* for ICMD_INLINE_START and ICMD_INLINE_END */
453
454 struct insinfo_inline {
455         methodinfo *method;         /* the inlined method starting/ending here    */
456         methodinfo *outer;          /* the outer method suspended/resumed here    */
457         s4          startmpc;       /* machine code offset of start of inlining   */          
458         s4          synclocal;      /* local index used for synchronization       */
459         bool        synchronize;    /* true if synchronization is needed          */
460 };
461
462 /* basicblock *****************************************************************/
463  
464 /* flags */
465
466 #define BBDELETED            -2
467 #define BBUNDEF              -1
468 #define BBREACHED            0
469 #define BBFINISHED           1
470
471 #define BBTYPECHECK_UNDEF    2
472 #define BBTYPECHECK_REACHED  3
473
474 #define BBTYPE_STD           0  /* standard basic block type                  */
475 #define BBTYPE_EXH           1  /* exception handler basic block type         */
476 #define BBTYPE_SBR           2  /* subroutine basic block type                */
477
478 #define BBFLAG_REPLACEMENT   0x01  /* put a replacement point at the start    */
479
480 /* XXX basicblock wastes quite a lot of memory by having four flag fields     */
481 /* (flags, bitflags, type and lflags). Probably the last three could be       */
482 /* combined without loss of efficiency. The first one could be combined with  */
483 /* the others by using bitfields.                                             */
484
485 struct basicblock {
486         s4           debug_nr;      /* basic block number                         */
487         s4           flags;         /* used during stack analysis, init with -1   */
488         s4           bitflags;      /* OR of BBFLAG_... constants, init with 0    */
489         s4           type;          /* basic block type (std, xhandler, subroutine*/
490         instruction *iinstr;        /* pointer to intermediate code instructions  */
491         s4           icount;        /* number of intermediate code instructions   */
492         s4           mpc;           /* machine code pc at start of block          */
493         stackptr     instack;       /* stack at begin of basic block              */
494         stackptr     outstack;      /* stack at end of basic block                */
495         s4           indepth;       /* stack depth at begin of basic block        */
496         s4           outdepth;      /* stack depth end of basic block             */
497         s4           pre_count;     /* count of predecessor basic blocks          */
498         branchref   *branchrefs;    /* list of branches to be patched             */
499
500         basicblock  *next;          /* used to build a BB list (instead of array) */
501         s4           lflags;        /* used during loop copying, init with 0      */
502         basicblock  *copied_to;     /* points to the copy of this basic block     */
503                                 /* when loop nodes are copied                 */
504         stackptr     stack;         /* start of stack array for this block        */
505                                     /* (see doc/stack.txt)                        */
506         methodinfo  *method;        /* method this block belongs to               */
507 };
508
509 /* macro for initializing newly allocated basicblock:s                        */
510
511 #define BASICBLOCK_INIT(bptr,m)                            \
512                 do {                                               \
513                         bptr->mpc = -1;                                \
514                         bptr->flags = -1;                              \
515                         bptr->bitflags = 0;                            \
516                         bptr->lflags = 0;                              \
517                         bptr->type = BBTYPE_STD;                       \
518                         bptr->branchrefs = NULL;                       \
519                         bptr->pre_count = 0;                           \
520                         bptr->method = (m);                            \
521                         bptr->debug_nr = (m)->c_debug_nr++;            \
522                 } while (0)
523                         
524
525 /* branchref *****************************************************************/
526
527 struct branchref {
528         s4         branchpos;       /* patching position in code segment          */
529         branchref *next;            /* next element in branchref list             */
530 };
531
532
533 /********** op1 values for ACONST instructions ********************************/
534
535 #define ACONST_LOAD     0  /* ACONST_NULL or LDC instruction                  */
536 #define ACONST_BUILTIN  1  /* constant argument for a builtin function call   */
537
538
539 /********** JavaVM operation codes (sorted) and instruction lengths ***********/
540
541 extern char *icmd_names[256];
542 extern char *opcode_names[256];
543 extern int jcommandsize[256];
544
545 #define JAVA_NOP               0
546 #define ICMD_NOP               0
547
548 #define JAVA_ACONST_NULL       1
549 #define ICMD_ACONST            1        /* val.a = constant                   */
550
551 #define JAVA_ICONST_M1         2
552 #define ICMD_CHECKNULL         2
553
554 #define JAVA_ICONST_0          3
555 #define ICMD_ICONST            3        /* val.i = constant                   */
556
557 #define JAVA_ICONST_1          4
558 #define ICMD_CHECKNULL_POP     4
559
560 #define JAVA_ICONST_2          5
561 #define ICMD_IDIVPOW2          5        /* val.i = constant                   */
562
563 #define JAVA_ICONST_3          6
564 #define ICMD_LDIVPOW2          6        /* val.l = constant                   */
565
566 #define JAVA_ICONST_4          7
567
568 #define JAVA_ICONST_5          8
569
570 #define JAVA_LCONST_0          9
571 #define ICMD_LCONST            9        /* val.l = constant                   */
572
573 #define JAVA_LCONST_1         10
574 #define ICMD_LCMPCONST        10        /* val.l = constant                   */
575
576 #define JAVA_FCONST_0         11
577 #define ICMD_FCONST           11        /* val.f = constant                   */
578
579 #define JAVA_FCONST_1         12
580
581 #define JAVA_FCONST_2         13
582 #define ICMD_ELSE_ICONST      13
583
584 #define JAVA_DCONST_0         14
585 #define ICMD_DCONST           14        /* val.d = constant                   */
586
587 #define JAVA_DCONST_1         15
588 #define ICMD_IFEQ_ICONST      15
589
590 #define JAVA_BIPUSH           16
591 #define ICMD_IFNE_ICONST      16
592
593 #define JAVA_SIPUSH           17
594 #define ICMD_IFLT_ICONST      17
595
596 #define JAVA_LDC1             18
597 #define ICMD_IFGE_ICONST      18
598
599 #define JAVA_LDC2             19
600 #define ICMD_IFGT_ICONST      19
601
602 #define JAVA_LDC2W            20
603 #define ICMD_IFLE_ICONST      20
604
605                                             /* order of LOAD instructions must be */
606                                             /* equal to order of TYPE_* defines   */
607 #define JAVA_ILOAD            21
608 #define ICMD_ILOAD            21        /* op1 = local variable               */
609
610 #define JAVA_LLOAD            22
611 #define ICMD_LLOAD            22        /* op1 = local variable               */
612
613 #define JAVA_FLOAD            23
614 #define ICMD_FLOAD            23        /* op1 = local variable               */
615
616 #define JAVA_DLOAD            24
617 #define ICMD_DLOAD            24        /* op1 = local variable               */
618
619 #define JAVA_ALOAD            25
620 #define ICMD_ALOAD            25        /* op1 = local variable               */
621
622 #define JAVA_ILOAD_0          26
623 #define ICMD_IADDCONST        26        /* val.i = constant                   */
624
625 #define JAVA_ILOAD_1          27
626 #define ICMD_ISUBCONST        27        /* val.i = constant                   */
627
628 #define JAVA_ILOAD_2          28
629 #define ICMD_IMULCONST        28        /* val.i = constant                   */
630
631 #define JAVA_ILOAD_3          29
632 #define ICMD_IANDCONST        29        /* val.i = constant                   */
633
634 #define JAVA_LLOAD_0          30
635 #define ICMD_IORCONST         30        /* val.i = constant                   */
636
637 #define JAVA_LLOAD_1          31
638 #define ICMD_IXORCONST        31        /* val.i = constant                   */
639
640 #define JAVA_LLOAD_2          32
641 #define ICMD_ISHLCONST        32        /* val.i = constant                   */
642
643 #define JAVA_LLOAD_3          33
644 #define ICMD_ISHRCONST        33        /* val.i = constant                   */
645
646 #define JAVA_FLOAD_0          34
647 #define ICMD_IUSHRCONST       34        /* val.i = constant                   */
648
649 #define JAVA_FLOAD_1          35
650 #define ICMD_IREMPOW2         35        /* val.i = constant                   */
651
652 #define JAVA_FLOAD_2          36
653 #define ICMD_LADDCONST        36        /* val.l = constant                   */
654
655 #define JAVA_FLOAD_3          37
656 #define ICMD_LSUBCONST        37        /* val.l = constant                   */
657
658 #define JAVA_DLOAD_0          38
659 #define ICMD_LMULCONST        38        /* val.l = constant                   */
660
661 #define JAVA_DLOAD_1          39
662 #define ICMD_LANDCONST        39        /* val.l = constant                   */
663
664 #define JAVA_DLOAD_2          40
665 #define ICMD_LORCONST         40        /* val.l = constant                   */
666
667 #define JAVA_DLOAD_3          41
668 #define ICMD_LXORCONST        41        /* val.l = constant                   */
669
670 #define JAVA_ALOAD_0          42
671 #define ICMD_LSHLCONST        42        /* val.l = constant                   */
672
673 #define JAVA_ALOAD_1          43
674 #define ICMD_LSHRCONST        43        /* val.l = constant                   */
675
676 #define JAVA_ALOAD_2          44
677 #define ICMD_LUSHRCONST       44        /* val.l = constant                   */
678
679 #define JAVA_ALOAD_3          45
680 #define ICMD_LREMPOW2         45        /* val.l = constant                   */
681
682 #define JAVA_IALOAD           46
683 #define ICMD_IALOAD           46
684
685 #define JAVA_LALOAD           47
686 #define ICMD_LALOAD           47
687
688 #define JAVA_FALOAD           48
689 #define ICMD_FALOAD           48
690
691 #define JAVA_DALOAD           49
692 #define ICMD_DALOAD           49
693
694 #define JAVA_AALOAD           50
695 #define ICMD_AALOAD           50
696
697 #define JAVA_BALOAD           51
698 #define ICMD_BALOAD           51
699
700 #define JAVA_CALOAD           52
701 #define ICMD_CALOAD           52
702
703 #define JAVA_SALOAD           53
704 #define ICMD_SALOAD           53
705
706                                             /* order of STORE instructions must be*/
707                                             /* equal to order of TYPE_* defines   */
708 #define JAVA_ISTORE           54
709 #define ICMD_ISTORE           54        /* op1 = local variable               */
710
711 #define JAVA_LSTORE           55
712 #define ICMD_LSTORE           55        /* op1 = local variable               */
713
714 #define JAVA_FSTORE           56
715 #define ICMD_FSTORE           56        /* op1 = local variable               */
716
717 #define JAVA_DSTORE           57
718 #define ICMD_DSTORE           57        /* op1 = local variable               */
719
720 #define JAVA_ASTORE           58
721 #define ICMD_ASTORE           58        /* op1 = local variable               */
722
723 #define JAVA_ISTORE_0         59
724 #define ICMD_IF_LEQ           59        /* op1 = target JavaVM pc, val.l      */
725
726 #define JAVA_ISTORE_1         60
727 #define ICMD_IF_LNE           60        /* op1 = target JavaVM pc, val.l      */
728
729 #define JAVA_ISTORE_2         61
730 #define ICMD_IF_LLT           61        /* op1 = target JavaVM pc, val.l      */
731
732 #define JAVA_ISTORE_3         62
733 #define ICMD_IF_LGE           62        /* op1 = target JavaVM pc, val.l      */
734
735 #define JAVA_LSTORE_0         63
736 #define ICMD_IF_LGT           63        /* op1 = target JavaVM pc, val.l      */
737
738 #define JAVA_LSTORE_1         64
739 #define ICMD_IF_LLE           64        /* op1 = target JavaVM pc, val.l      */
740
741 #define JAVA_LSTORE_2         65
742 #define ICMD_IF_LCMPEQ        65        /* op1 = target JavaVM pc             */
743
744 #define JAVA_LSTORE_3         66
745 #define ICMD_IF_LCMPNE        66        /* op1 = target JavaVM pc             */
746
747 #define JAVA_FSTORE_0         67
748 #define ICMD_IF_LCMPLT        67        /* op1 = target JavaVM pc             */
749
750 #define JAVA_FSTORE_1         68
751 #define ICMD_IF_LCMPGE        68        /* op1 = target JavaVM pc             */
752
753 #define JAVA_FSTORE_2         69
754 #define ICMD_IF_LCMPGT        69        /* op1 = target JavaVM pc             */
755
756 #define JAVA_FSTORE_3         70
757 #define ICMD_IF_LCMPLE        70        /* op1 = target JavaVM pc             */
758
759 #define JAVA_DSTORE_0         71
760
761 #define JAVA_DSTORE_1         72
762
763 #define JAVA_DSTORE_2         73
764
765 #define JAVA_DSTORE_3         74
766
767 #define JAVA_ASTORE_0         75
768
769 #define JAVA_ASTORE_1         76
770
771 #define JAVA_ASTORE_2         77
772
773 #define JAVA_ASTORE_3         78
774
775 #define JAVA_IASTORE          79
776 #define ICMD_IASTORE          79
777
778 #define JAVA_LASTORE          80
779 #define ICMD_LASTORE          80
780
781 #define JAVA_FASTORE          81
782 #define ICMD_FASTORE          81
783
784 #define JAVA_DASTORE          82
785 #define ICMD_DASTORE          82
786
787 #define JAVA_AASTORE          83
788 #define ICMD_AASTORE          83
789
790 #define JAVA_BASTORE          84
791 #define ICMD_BASTORE          84
792
793 #define JAVA_CASTORE          85
794 #define ICMD_CASTORE          85
795
796 #define JAVA_SASTORE          86
797 #define ICMD_SASTORE          86
798
799 #define JAVA_POP              87
800 #define ICMD_POP              87
801
802 #define JAVA_POP2             88
803 #define ICMD_POP2             88
804
805 #define JAVA_DUP              89
806 #define ICMD_DUP              89
807
808 #define JAVA_DUP_X1           90
809 #define ICMD_DUP_X1           90
810
811 #define JAVA_DUP_X2           91
812 #define ICMD_DUP_X2           91
813
814 #define JAVA_DUP2             92
815 #define ICMD_DUP2             92
816
817 #define JAVA_DUP2_X1          93
818 #define ICMD_DUP2_X1          93
819
820 #define JAVA_DUP2_X2          94
821 #define ICMD_DUP2_X2          94
822
823 #define JAVA_SWAP             95
824 #define ICMD_SWAP             95
825
826 #define JAVA_IADD             96
827 #define ICMD_IADD             96
828
829 #define JAVA_LADD             97
830 #define ICMD_LADD             97
831
832 #define JAVA_FADD             98
833 #define ICMD_FADD             98
834
835 #define JAVA_DADD             99
836 #define ICMD_DADD             99
837
838 #define JAVA_ISUB             100
839 #define ICMD_ISUB             100
840
841 #define JAVA_LSUB             101
842 #define ICMD_LSUB             101
843
844 #define JAVA_FSUB             102
845 #define ICMD_FSUB             102
846
847 #define JAVA_DSUB             103
848 #define ICMD_DSUB             103
849
850 #define JAVA_IMUL             104
851 #define ICMD_IMUL             104
852
853 #define JAVA_LMUL             105
854 #define ICMD_LMUL             105
855
856 #define JAVA_FMUL             106
857 #define ICMD_FMUL             106
858
859 #define JAVA_DMUL             107
860 #define ICMD_DMUL             107
861
862 #define JAVA_IDIV             108
863 #define ICMD_IDIV             108
864
865 #define JAVA_LDIV             109
866 #define ICMD_LDIV             109
867
868 #define JAVA_FDIV             110
869 #define ICMD_FDIV             110
870
871 #define JAVA_DDIV             111
872 #define ICMD_DDIV             111
873
874 #define JAVA_IREM             112
875 #define ICMD_IREM             112
876
877 #define JAVA_LREM             113
878 #define ICMD_LREM             113
879
880 #define JAVA_FREM             114
881 #define ICMD_FREM             114
882
883 #define JAVA_DREM             115
884 #define ICMD_DREM             115
885
886 #define JAVA_INEG             116
887 #define ICMD_INEG             116
888
889 #define JAVA_LNEG             117
890 #define ICMD_LNEG             117
891
892 #define JAVA_FNEG             118
893 #define ICMD_FNEG             118
894
895 #define JAVA_DNEG             119
896 #define ICMD_DNEG             119
897
898 #define JAVA_ISHL             120
899 #define ICMD_ISHL             120
900
901 #define JAVA_LSHL             121
902 #define ICMD_LSHL             121
903
904 #define JAVA_ISHR             122
905 #define ICMD_ISHR             122
906
907 #define JAVA_LSHR             123
908 #define ICMD_LSHR             123
909
910 #define JAVA_IUSHR            124
911 #define ICMD_IUSHR            124
912
913 #define JAVA_LUSHR            125
914 #define ICMD_LUSHR            125
915
916 #define JAVA_IAND             126
917 #define ICMD_IAND             126
918
919 #define JAVA_LAND             127
920 #define ICMD_LAND             127
921
922 #define JAVA_IOR              128
923 #define ICMD_IOR              128
924
925 #define JAVA_LOR              129
926 #define ICMD_LOR              129
927
928 #define JAVA_IXOR             130
929 #define ICMD_IXOR             130
930
931 #define JAVA_LXOR             131
932 #define ICMD_LXOR             131
933
934 #define JAVA_IINC             132
935 #define ICMD_IINC             132   /* op1 = local variable, val.i = constant */
936
937 #define JAVA_I2L              133
938 #define ICMD_I2L              133
939
940 #define JAVA_I2F              134
941 #define ICMD_I2F              134
942
943 #define JAVA_I2D              135
944 #define ICMD_I2D              135
945
946 #define JAVA_L2I              136
947 #define ICMD_L2I              136
948
949 #define JAVA_L2F              137
950 #define ICMD_L2F              137
951
952 #define JAVA_L2D              138
953 #define ICMD_L2D              138
954
955 #define JAVA_F2I              139
956 #define ICMD_F2I              139
957
958 #define JAVA_F2L              140
959 #define ICMD_F2L              140
960
961 #define JAVA_F2D              141
962 #define ICMD_F2D              141
963
964 #define JAVA_D2I              142
965 #define ICMD_D2I              142
966
967 #define JAVA_D2L              143
968 #define ICMD_D2L              143
969
970 #define JAVA_D2F              144
971 #define ICMD_D2F              144
972
973 #define JAVA_INT2BYTE         145
974 #define ICMD_INT2BYTE         145
975
976 #define JAVA_INT2CHAR         146
977 #define ICMD_INT2CHAR         146
978
979 #define JAVA_INT2SHORT        147
980 #define ICMD_INT2SHORT        147
981
982 #define JAVA_LCMP             148
983 #define ICMD_LCMP             148
984
985 #define JAVA_FCMPL            149
986 #define ICMD_FCMPL            149
987
988 #define JAVA_FCMPG            150
989 #define ICMD_FCMPG            150
990
991 #define JAVA_DCMPL            151
992 #define ICMD_DCMPL            151
993
994 #define JAVA_DCMPG            152
995 #define ICMD_DCMPG            152
996
997 #define JAVA_IFEQ             153
998 #define ICMD_IFEQ             153       /* op1 = target JavaVM pc, val.i      */
999
1000 #define JAVA_IFNE             154
1001 #define ICMD_IFNE             154       /* op1 = target JavaVM pc, val.i      */
1002
1003 #define JAVA_IFLT             155
1004 #define ICMD_IFLT             155       /* op1 = target JavaVM pc, val.i      */
1005
1006 #define JAVA_IFGE             156
1007 #define ICMD_IFGE             156       /* op1 = target JavaVM pc, val.i      */
1008
1009 #define JAVA_IFGT             157
1010 #define ICMD_IFGT             157       /* op1 = target JavaVM pc, val.i      */
1011
1012 #define JAVA_IFLE             158
1013 #define ICMD_IFLE             158       /* op1 = target JavaVM pc, val.i      */
1014
1015 #define JAVA_IF_ICMPEQ        159
1016 #define ICMD_IF_ICMPEQ        159       /* op1 = target JavaVM pc             */
1017
1018 #define JAVA_IF_ICMPNE        160
1019 #define ICMD_IF_ICMPNE        160       /* op1 = target JavaVM pc             */
1020
1021 #define JAVA_IF_ICMPLT        161
1022 #define ICMD_IF_ICMPLT        161       /* op1 = target JavaVM pc             */
1023
1024 #define JAVA_IF_ICMPGE        162
1025 #define ICMD_IF_ICMPGE        162       /* op1 = target JavaVM pc             */
1026
1027 #define JAVA_IF_ICMPGT        163
1028 #define ICMD_IF_ICMPGT        163       /* op1 = target JavaVM pc             */
1029
1030 #define JAVA_IF_ICMPLE        164
1031 #define ICMD_IF_ICMPLE        164       /* op1 = target JavaVM pc             */
1032
1033 #define JAVA_IF_ACMPEQ        165
1034 #define ICMD_IF_ACMPEQ        165       /* op1 = target JavaVM pc             */
1035
1036 #define JAVA_IF_ACMPNE        166
1037 #define ICMD_IF_ACMPNE        166       /* op1 = target JavaVM pc             */
1038
1039 #define JAVA_GOTO             167
1040 #define ICMD_GOTO             167       /* op1 = target JavaVM pc             */
1041
1042 #define JAVA_JSR              168
1043 #define ICMD_JSR              168       /* op1 = target JavaVM pc             */
1044
1045 #define JAVA_RET              169
1046 #define ICMD_RET              169       /* op1 = local variable               */
1047
1048 #define JAVA_TABLESWITCH      170
1049 #define ICMD_TABLESWITCH      170       /* val.a = pointer to s4 table        */
1050                                         /* length must be computed            */
1051 #define JAVA_LOOKUPSWITCH     171
1052 #define ICMD_LOOKUPSWITCH     171       /* val.a = pointer to s4 table        */
1053                                         /* length must be computed            */
1054 #define JAVA_IRETURN          172
1055 #define ICMD_IRETURN          172
1056
1057 #define JAVA_LRETURN          173
1058 #define ICMD_LRETURN          173
1059
1060 #define JAVA_FRETURN          174
1061 #define ICMD_FRETURN          174
1062
1063 #define JAVA_DRETURN          175
1064 #define ICMD_DRETURN          175
1065
1066 #define JAVA_ARETURN          176
1067 #define ICMD_ARETURN          176
1068
1069 #define JAVA_RETURN           177
1070 #define ICMD_RETURN           177
1071
1072 #define JAVA_GETSTATIC        178
1073 #define ICMD_GETSTATIC        178       /* op1 = type, val.a = field address  */
1074
1075 #define JAVA_PUTSTATIC        179
1076 #define ICMD_PUTSTATIC        179       /* op1 = type, val.a = field address  */
1077
1078 #define JAVA_GETFIELD         180
1079 #define ICMD_GETFIELD         180       /* op1 = type, val.i = field offset   */
1080
1081 #define JAVA_PUTFIELD         181
1082 #define ICMD_PUTFIELD         181       /* op1 = type, val.i = field offset   */
1083
1084 #define JAVA_INVOKEVIRTUAL    182
1085 #define ICMD_INVOKEVIRTUAL    182       /* val.a = method info pointer        */
1086
1087 #define JAVA_INVOKESPECIAL    183
1088 #define ICMD_INVOKESPECIAL    183       /* val.a = method info pointer        */
1089
1090 #define JAVA_INVOKESTATIC     184
1091 #define ICMD_INVOKESTATIC     184       /* val.a = method info pointer        */
1092
1093 #define JAVA_INVOKEINTERFACE  185
1094 #define ICMD_INVOKEINTERFACE  185       /* val.a = method info pointer        */
1095
1096 /* UNDEF186 */
1097
1098 #define JAVA_NEW              187
1099 #define ICMD_NEW              187       /* op1 = 1, val.a = class pointer     */
1100
1101 #define JAVA_NEWARRAY         188
1102 #define ICMD_NEWARRAY         188       /* op1 = basic type                   */
1103
1104 #define JAVA_ANEWARRAY        189
1105 #define ICMD_ANEWARRAY        189       /* op1 = 0, val.a = array pointer     */
1106                                         /* op1 = 1, val.a = class pointer     */
1107 #define JAVA_ARRAYLENGTH      190
1108 #define ICMD_ARRAYLENGTH      190
1109
1110 #define JAVA_ATHROW           191
1111 #define ICMD_ATHROW           191
1112
1113 #define JAVA_CHECKCAST        192
1114 #define ICMD_CHECKCAST        192       /* op1 = 0, val.a = array pointer     */
1115                                         /* op1 = 1, val.a = class pointer     */
1116 #define JAVA_INSTANCEOF       193
1117 #define ICMD_INSTANCEOF       193       /* op1 = 0, val.a = array pointer     */
1118                                         /* op1 = 1, val.a = class pointer     */
1119 #define JAVA_MONITORENTER     194
1120 #define ICMD_MONITORENTER     194
1121
1122 #define JAVA_MONITOREXIT      195
1123 #define ICMD_MONITOREXIT      195
1124
1125 #define JAVA_WIDE             196
1126
1127 #define JAVA_MULTIANEWARRAY   197
1128 #define ICMD_MULTIANEWARRAY   197       /* op1 = dimension, val.a = array     */
1129                                         /* pointer                            */
1130 #define JAVA_IFNULL           198
1131 #define ICMD_IFNULL           198       /* op1 = target JavaVM pc             */
1132
1133 #define JAVA_IFNONNULL        199
1134 #define ICMD_IFNONNULL        199       /* op1 = target JavaVM pc             */
1135
1136 #define JAVA_GOTO_W           200
1137
1138 #define JAVA_JSR_W            201
1139
1140 #define JAVA_BREAKPOINT       202
1141
1142 /* UNDEF203 */
1143
1144 #define ICMD_IASTORECONST     204
1145 #define ICMD_LASTORECONST     205
1146 #define ICMD_FASTORECONST     206
1147 #define ICMD_DASTORECONST     207
1148 #define ICMD_AASTORECONST     208
1149 #define ICMD_BASTORECONST     209
1150 #define ICMD_CASTORECONST     210
1151 #define ICMD_SASTORECONST     211
1152
1153 #define ICMD_PUTSTATICCONST   212
1154 #define ICMD_PUTFIELDCONST    213
1155
1156 #define ICMD_IMULPOW2         214
1157 #define ICMD_LMULPOW2         215
1158
1159 #define ICMD_IF_FCMPEQ        216
1160 #define ICMD_IF_FCMPNE        217
1161
1162 #define ICMD_IF_FCMPL_LT      218
1163 #define ICMD_IF_FCMPL_GE      219
1164 #define ICMD_IF_FCMPL_GT      220
1165 #define ICMD_IF_FCMPL_LE      221
1166
1167 #define ICMD_IF_FCMPG_LT      222
1168 #define ICMD_IF_FCMPG_GE      223
1169 #define ICMD_IF_FCMPG_GT      224
1170 #define ICMD_IF_FCMPG_LE      225
1171
1172 #define ICMD_IF_DCMPEQ        226
1173 #define ICMD_IF_DCMPNE        227
1174
1175 #define ICMD_IF_DCMPL_LT      228
1176 #define ICMD_IF_DCMPL_GE      229
1177 #define ICMD_IF_DCMPL_GT      230
1178 #define ICMD_IF_DCMPL_LE      231
1179
1180 #define ICMD_IF_DCMPG_LT      232
1181 #define ICMD_IF_DCMPG_GE      233
1182 #define ICMD_IF_DCMPG_GT      234
1183 #define ICMD_IF_DCMPG_LE      235
1184
1185 #define ICMD_INLINE_START     251       /* instruction before inlined method  */
1186 #define ICMD_INLINE_END       252       /* instruction after inlined method   */
1187 #define ICMD_INLINE_GOTO      253       /* jump to caller of inlined method   */
1188
1189 #define ICMD_BUILTIN          255       /* internal opcode                    */
1190
1191 /* define some ICMD masks *****************************************************/
1192
1193 #define ICMD_OPCODE_MASK      0x00ff    /* mask to get the opcode             */
1194 #define ICMD_CONDITION_MASK   0xff00    /* mask to get the condition          */
1195
1196
1197 /******************* description of JavaVM instructions ***********************/
1198
1199
1200
1201 /***************************** register types *********************************/
1202
1203 #define REG_RES   0         /* reserved register for OS or code generator     */
1204 #define REG_RET   1         /* return value register                          */
1205 #define REG_EXC   2         /* exception value register                       */
1206 #define REG_SAV   3         /* (callee) saved register                        */
1207 #define REG_TMP   4         /* scratch temporary register (caller saved)      */
1208 #define REG_ARG   5         /* argument register (caller saved)               */
1209
1210 #define REG_END   -1        /* last entry in tables                           */
1211  
1212 #define PARAMMODE_NUMBERED  0 
1213 #define PARAMMODE_STUFFED   1
1214
1215
1216 /***************************** register info block ****************************/
1217
1218 extern int stackreq[256];
1219
1220
1221 /* function prototypes ********************************************************/
1222
1223 /* compiler initialisation */
1224 void jit_init(void);
1225
1226 /* compiler finalisation */
1227 void jit_close(void);
1228
1229 /* compile a method with jit compiler */
1230 u1 *jit_compile(methodinfo *m);
1231 u1 *jit_recompile(methodinfo *m);
1232
1233 /* patch the method entrypoint */
1234 u1 *jit_asm_compile(methodinfo *m, u1 *mptr, u1 *sp, u1 *ra);
1235
1236 /* machine dependent functions */
1237 #if defined(ENABLE_JIT)
1238 void md_init(void);
1239
1240 u1  *md_get_method_patch_address(u1 *ra, stackframeinfo *sfi, u1 *mptr);
1241
1242 void md_cacheflush(u1 *addr, s4 nbytes);
1243 void md_icacheflush(u1 *addr, s4 nbytes);
1244 void md_dcacheflush(u1 *addr, s4 nbytes);
1245 #endif
1246
1247 #if defined(ENABLE_INTRP)
1248 void intrp_md_init(void);
1249 #endif
1250
1251 #endif /* _JIT_H */
1252
1253
1254 /*
1255  * These are local overrides for various environment variables in Emacs.
1256  * Please do not remove this and leave it at the end of the file, where
1257  * Emacs will automagically detect them.
1258  * ---------------------------------------------------------------------
1259  * Local variables:
1260  * mode: c
1261  * indent-tabs-mode: t
1262  * c-basic-offset: 4
1263  * tab-width: 4
1264  * End:
1265  * vim:noexpandtab:sw=4:ts=4:
1266  */