home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / kaffe-0.5p4-src.tgz / tar.out / contrib / kaffe / config / i386 / jit.h < prev    next >
C/C++ Source or Header  |  1996-09-28  |  3KB  |  120 lines

  1. /*
  2.  * i386/jit.h
  3.  * Common i386 JIT configuration information.
  4.  *
  5.  * Copyright (c) 1996 Systems Architecture Research Centre,
  6.  *           City University, London, UK.
  7.  *
  8.  * See the file "license.terms" for information on usage and redistribution
  9.  * of this file, and for a DISCLAIMER OF ALL WARRANTIES.
  10.  *
  11.  * Written by Tim Wilkinson <tim@sarc.city.ac.uk>, June 1996.
  12.  */
  13.  
  14. #ifndef __i386_jit_h
  15. #define __i386_jit_h
  16.  
  17. /**/
  18. /* Native function invocation. */
  19. /**/
  20. #define    CALL_KAFFE_FUNCTION_VARARGS(meth, obj, nargs, argptr)        \
  21.     asm("    pushal                            \n\
  22.         movl %%esp,%%ebp                    \n\
  23. 1:        cmpl $0,%2                        \n\
  24.         je 2f                            \n\
  25.         decl %2                            \n\
  26.         pushl (%3,%2,4)                        \n\
  27.         jmp 1b                            \n\
  28. 2:                                    \n\
  29.         pushl %1                        \n\
  30.         call *%0                        \n\
  31.         movl %%ebp,%%esp                    \n\
  32.         popal" : : "r" (meth->ncode), "r" (obj), "r" (nargs), "r" (argptr))
  33.  
  34. /**/
  35. /* Exception handling information. */
  36. /**/
  37.  
  38. extern struct _thread* currentThread;
  39.  
  40. /* Structure of exception frame on stack */
  41. typedef struct _exceptionFrame {
  42.         uintp    retbp;
  43.         uintp    retpc;
  44. } exceptionFrame;
  45.  
  46. /* Is this frame valid (ie. is it on the current stack) ? */
  47. #define    FRAMEOKAY(f)                            \
  48.     ((f)->retbp >= (int)currentThread->PrivateInfo->stackBase &&    \
  49.      (f)->retbp < (int)currentThread->PrivateInfo->stackEnd)
  50.  
  51. /* Get the next frame in the chain */
  52. #define    NEXTFRAME(f)                            \
  53.     ((exceptionFrame*)(f)->retbp)
  54.  
  55. /* Extract the PC from the given frame */
  56. #define    PCFRAME(f)                            \
  57.     ((f)->retpc-1)
  58.  
  59. /* Get the first exception frame from a subroutine call */
  60. #define    FIRSTFRAME(f, o)                        \
  61.     (f) = *((exceptionFrame*)(((uintp)&(o))-8))
  62.  
  63. /* Call the relevant exception handler (rewinding the stack as
  64.    necessary). */
  65. #define CALL_KAFFE_EXCEPTION(frame, info, obj)                \
  66.         asm("   movl %2,%%eax                        \n\
  67.         movl %0,%%ebp                        \n\
  68.         jmp *%1                            \n\
  69.         " : : "g" (frame->retbp), "r" (info.handler), "g" (obj) : "eax")
  70.  
  71. /**/
  72. /* Register management information. */
  73. /**/
  74.  
  75. /* Define the register set */
  76. #define    REGISTER_SET                            \
  77.     { /* eax */    0, 0, Rint|Rref,    0, 0    },        \
  78.     { /* ecx */    0, 0, Rint|Rref,    0, 0    },        \
  79.     { /* edx */    0, 0, Rint|Rref,    0, 0    },        \
  80.     { /* ebx */    0, 0, Rint|Rref,    0, 0    },        \
  81.     { /* esp */    0, 0, Reserved,        0, 0    },        \
  82.     { /* ebp */    0, 0, Reserved,        0, 0    },        \
  83.     { /* esi */    0, 0, Reserved,        0, 0    },        \
  84.     { /* edi */    0, 0, Reserved,        0, 0    },        \
  85.     { /* f0  */    0, 0, Rfloat|Rdouble,    1, 0    },
  86.  
  87. /* Number of registers in the register set */
  88. #define    NR_REGISTERS    9
  89.  
  90. /* Define which registers are used for which return values */
  91. #define    RETURN_INT        0    /* eax */
  92. #define    RETURN_REF        0    /* eax */
  93. #define    RETURN_LONG_LOW        0    /* eax */
  94. #define    RETURN_LONG_HIGH    2    /* edx */
  95. #define    RETURN_FLOAT        8    /* f0 */
  96. #define    RETURN_DOUBLE_LOW    8    /* f0 */
  97. #define    RETURN_DOUBLE_HIGH    0    /* Not used in this configuration */
  98.  
  99. /**/
  100. /* Opcode generation. */
  101. /**/
  102.  
  103. /* Define if generated code uses two operands rather than one */
  104. #define    TWO_OPERAND
  105.  
  106. /**/
  107. /* Slot management information. */
  108. /**/
  109.  
  110. /* Size of each slot */
  111. #define    SLOTSIZE    4
  112.  
  113. /* Generate slot offset for an argument */
  114. #define SLOT2ARGOFFSET(_n)    (8 + SLOTSIZE * (_n))
  115.  
  116. /* Generate slot offset for a local (non-argument) */
  117. #define SLOT2LOCALOFFSET(_n)    (-SLOTSIZE * (maxTemp+maxLocal+maxStack - (_n)))
  118.  
  119. #endif
  120.