home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / mitsch75.zip / scheme-7_5_17-src.zip / scheme-7.5.17 / src / microcode / cmpintmd / c.h < prev    next >
C/C++ Source or Header  |  1999-01-02  |  7KB  |  214 lines

  1. /* -*-C-*-
  2.  
  3. $Id: c.h,v 1.7 1999/01/02 06:11:34 cph Exp $
  4.  
  5. Copyright (c) 1992-1999 Massachusetts Institute of Technology
  6.  
  7. This program is free software; you can redistribute it and/or modify
  8. it under the terms of the GNU General Public License as published by
  9. the Free Software Foundation; either version 2 of the License, or (at
  10. your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful, but
  13. WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15. General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21.  
  22. #ifndef CMPINTMD_H_INCLUDED
  23. #define CMPINTMD_H_INCLUDED
  24.  
  25. #include "limits.h"
  26. #include "cmptype.h"
  27.  
  28. #define COMPILER_PROCESSOR_TYPE            COMPILER_LOSING_C_TYPE
  29.  
  30. #define WRITE_LABEL_DESCRIPTOR(entry,kind,offset) do            \
  31. {                                    \
  32.   SCHEME_OBJECT * ent = ((SCHEME_OBJECT *) (entry));            \
  33.                                     \
  34.   COMPILED_ENTRY_FORMAT_WORD (entry) = (kind);                \
  35.   COMPILED_ENTRY_OFFSET_WORD (entry) =                    \
  36.     (WORD_OFFSET_TO_OFFSET_WORD (offset));                \
  37. } while (0)
  38.  
  39. #define CC_BLOCK_DISTANCE(block,entry)                    \
  40.   (((SCHEME_OBJECT *) (entry)) - ((SCHEME_OBJECT *) (block)))
  41.  
  42. typedef unsigned short format_word;
  43.  
  44. extern int pc_zero_bits;
  45.  
  46. #define PC_ZERO_BITS pc_zero_bits
  47.  
  48. /* arbitrary */
  49. #define ENTRY_PREFIX_LENGTH        2
  50.  
  51. #define ADJUST_CLOSURE_AT_CALL(entry_point, location) do { } while (0)
  52.  
  53. #define COMPILED_CLOSURE_ENTRY_SIZE    ((sizeof (SCHEME_OBJECT)) * 3)
  54.  
  55. #define EXTRACT_CLOSURE_ENTRY_ADDRESS(output,location) do        \
  56. {                                    \
  57.   (output) = (((SCHEME_OBJECT *) (location))[1]);            \
  58. } while (0)
  59.  
  60. #define STORE_CLOSURE_ENTRY_ADDRESS(input,location) do            \
  61. {                                    \
  62.   ((SCHEME_OBJECT *) (location))[1] = ((SCHEME_OBJECT) (input));    \
  63. } while (0)
  64.  
  65. #define MANIFEST_CLOSURE_COUNT(scan)                    \
  66. (((COMPILED_ENTRY_OFFSET_WORD (((SCHEME_OBJECT *) (scan)) + 1)) == 0)    \
  67.  ? (COMPILED_ENTRY_FORMAT_WORD (((SCHEME_OBJECT *) (scan)) + 1))    \
  68.  : 1)
  69.  
  70. #define FIRST_MANIFEST_CLOSURE_ENTRY(scan)                \
  71. (((COMPILED_ENTRY_OFFSET_WORD (((SCHEME_OBJECT *) (scan)) + 1)) == 0)    \
  72.  ? ((char *) (((SCHEME_OBJECT *) (scan)) + 2))                \
  73.  : ((char *) (((SCHEME_OBJECT *) (scan)) + 1)))
  74.  
  75. /* Trampolines are implemented as tiny compiled code blocks that
  76.    invoke the constant C procedure indexed by the number 0.
  77.  */
  78.  
  79. #define TRAMPOLINE_ENTRY_SIZE        2    /* Words */
  80.  
  81. #define TRAMPOLINE_BLOCK_TO_ENTRY    3
  82.  
  83. #define TRAMPOLINE_ENTRY_POINT(tramp_block)                \
  84.   (((SCHEME_OBJECT *) (tramp_block)) + TRAMPOLINE_BLOCK_TO_ENTRY)
  85.  
  86. #define TRAMPOLINE_STORAGE(tramp_entry)                    \
  87.   ((((SCHEME_OBJECT *) (tramp_entry)) - TRAMPOLINE_BLOCK_TO_ENTRY) +    \
  88.    (2 + TRAMPOLINE_ENTRY_SIZE)) 
  89.  
  90. /* This depends on knowledge that the trampoline block is the first
  91.    compiled code block.
  92.  */
  93.  
  94. #define STORE_TRAMPOLINE_ENTRY(entry_address, index) do            \
  95. {                                    \
  96.   ((SCHEME_OBJECT *) (entry_address))[0] = ((SCHEME_OBJECT) (index));    \
  97. } while (0)
  98.  
  99. /* An execute cache contains a compiled entry for the callee,
  100.    and a number of arguments (+ 1).
  101.  */
  102.  
  103. #define EXECUTE_CACHE_ENTRY_SIZE        2
  104.  
  105. #define EXTRACT_EXECUTE_CACHE_ARITY(target, address) do            \
  106. {                                    \
  107.   (target) = ((long) (((SCHEME_OBJECT *) (address))[1]));        \
  108. } while (0)
  109.  
  110. #define EXTRACT_EXECUTE_CACHE_SYMBOL(target, address) do        \
  111. {                                    \
  112.   (target) = (((SCHEME_OBJECT *) (address))[0]);            \
  113. } while (0)
  114.  
  115. #define EXTRACT_EXECUTE_CACHE_ADDRESS(target, address) do        \
  116. {                                    \
  117.   (target) = (((SCHEME_OBJECT *) (address)) [0]);            \
  118. } while (0)
  119.  
  120. #define STORE_EXECUTE_CACHE_ADDRESS(address, entry) do            \
  121. {                                    \
  122.   ((SCHEME_OBJECT *) (address))[0] = ((SCHEME_OBJECT) (entry));        \
  123. } while (0)
  124.  
  125. #define STORE_EXECUTE_CACHE_CODE(address) do { } while (0)
  126.  
  127. extern void EXFUN (interface_initialize, (void));
  128.  
  129. #define ASM_RESET_HOOK() interface_initialize ()
  130.  
  131. /* Derived parameters and macros.
  132.  
  133.    These macros expect the above definitions to be meaningful.
  134.    If they are not, the macros below may have to be changed as well.
  135.  */
  136.  
  137. #define COMPILED_ENTRY_OFFSET_WORD(entry) (((format_word *) (entry)) [-1])
  138. #define COMPILED_ENTRY_FORMAT_WORD(entry) (((format_word *) (entry)) [-2])
  139.  
  140. /* The next one assumes 2's complement integers....*/
  141. #define CLEAR_LOW_BIT(word)                     ((word) & ((unsigned long) -2))
  142. #define OFFSET_WORD_CONTINUATION_P(word)        (((word) & 1) != 0)
  143.  
  144. #define WORD_OFFSET_TO_OFFSET_WORD(words)    ((words) << 1)
  145.  
  146. #define BYTE_OFFSET_TO_OFFSET_WORD(bytes)                \
  147.   WORD_OFFSET_TO_OFFSET_WORD ((bytes) / (sizeof (SCHEME_OBJECT)))
  148.  
  149. #define OFFSET_WORD_TO_BYTE_OFFSET(offset_word)                \
  150.   ((sizeof (SCHEME_OBJECT)) * ((CLEAR_LOW_BIT (offset_word)) >> 1))
  151.  
  152. #define MAKE_OFFSET_WORD(entry, block, continue)                        \
  153.   ((BYTE_OFFSET_TO_OFFSET_WORD(((char *) (entry)) -                     \
  154.                                ((char *) (block)))) |                   \
  155.    ((continue) ? 1 : 0))
  156.  
  157. #define EXECUTE_CACHE_COUNT_TO_ENTRIES(count)                           \
  158.   ((count) >> 1)
  159. #define EXECUTE_CACHE_ENTRIES_TO_COUNT(entries)                \
  160.   ((entries) << 1)
  161.  
  162. /* The first entry in a cc block is preceeded by 2 headers (block and nmv),
  163.    a format word and a gc offset word.   See the early part of the
  164.    TRAMPOLINE picture, above.
  165.  */
  166.  
  167. #define CC_BLOCK_FIRST_ENTRY_OFFSET                                     \
  168.   (2 * ((sizeof(SCHEME_OBJECT)) + (sizeof(format_word))))
  169.  
  170. /* Format words */
  171.  
  172. #define FORMAT_BYTE_EXPR                0xFF
  173. #define FORMAT_BYTE_COMPLR              0xFE
  174. #define FORMAT_BYTE_CMPINT              0xFD
  175. #define FORMAT_BYTE_DLINK               0xFC
  176. #define FORMAT_BYTE_RETURN              0xFB
  177.  
  178. #define FORMAT_WORD_EXPR        (MAKE_FORMAT_WORD(0xFF, FORMAT_BYTE_EXPR))
  179. #define FORMAT_WORD_CMPINT      (MAKE_FORMAT_WORD(0xFF, FORMAT_BYTE_CMPINT))
  180. #define FORMAT_WORD_RETURN      (MAKE_FORMAT_WORD(0xFF, FORMAT_BYTE_RETURN))
  181.  
  182. /* This assumes that a format word is at least 16 bits,
  183.    and the low order field is always 8 bits.
  184.  */
  185.  
  186. #define MAKE_FORMAT_WORD(field1, field2)                                \
  187.   (((field1) << 8) | ((field2) & 0xff))
  188.  
  189. #define SIGN_EXTEND_FIELD(field, size)                                  \
  190.   (((field) & ((1 << (size)) - 1)) |                                    \
  191.    ((((field) & (1 << ((size) - 1))) == 0) ? 0 :                        \
  192.     ((-1) << (size))))
  193.  
  194. #define FORMAT_WORD_LOW_BYTE(word)                                      \
  195.   (SIGN_EXTEND_FIELD ((((unsigned long) (word)) & 0xff), 8))
  196.  
  197. #define FORMAT_WORD_HIGH_BYTE(word)                    \
  198.   (SIGN_EXTEND_FIELD                            \
  199.    ((((unsigned long) (word)) >> 8),                    \
  200.     (((sizeof (format_word)) * CHAR_BIT) - 8)))
  201.  
  202. #define COMPILED_ENTRY_FORMAT_HIGH(addr)                                \
  203.   (FORMAT_WORD_HIGH_BYTE (COMPILED_ENTRY_FORMAT_WORD (addr)))
  204.  
  205. #define COMPILED_ENTRY_FORMAT_LOW(addr)                                 \
  206.   (FORMAT_WORD_LOW_BYTE (COMPILED_ENTRY_FORMAT_WORD (addr)))
  207.  
  208. #define FORMAT_BYTE_FRAMEMAX            0x7f
  209.  
  210. #define COMPILED_ENTRY_MAXIMUM_ARITY    COMPILED_ENTRY_FORMAT_LOW
  211. #define COMPILED_ENTRY_MINIMUM_ARITY    COMPILED_ENTRY_FORMAT_HIGH
  212.  
  213. #endif /* CMPINTMD_H_INCLUDED */
  214.