Annotation of GNUtools/cc/bi-run.h, revision 1.1.1.1

1.1       root        1: /* Definitions for Bytecode Interpreter.
                      2:    Copyright (C) 1993 Free Software Foundation, Inc.
                      3: 
                      4: This file is part of GNU CC.
                      5: 
                      6: GNU CC is free software; you can redistribute it and/or modify
                      7: it under the terms of the GNU General Public License as published by
                      8: the Free Software Foundation; either version 2, or (at your option)
                      9: any later version.
                     10: 
                     11: GNU CC is distributed in the hope that it will be useful,
                     12: but WITHOUT ANY WARRANTY; without even the implied warranty of
                     13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     14: GNU General Public License for more details.
                     15: 
                     16: You should have received a copy of the GNU General Public License
                     17: along with GNU CC; see the file COPYING.  If not, write to
                     18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
                     19: 
                     20: #define MAXLITERALS 5
                     21: 
                     22: struct arityvec
                     23: {
                     24:   char ninputs;
                     25:   char noutputs;
                     26:   char nliterals;
                     27:   char literals[MAXLITERALS];
                     28: };
                     29: 
                     30: struct argtype
                     31: {
                     32:   int modealign;               /* Argument mode:alignment */
                     33:   int size;                    /* Argument size, in bytes */
                     34: };
                     35: 
                     36: struct callinfo
                     37: {
                     38:   int nargs;                   /* Number of arguments in call */
                     39:   struct argtype retvaltype;   /* Type of return value */
                     40:   struct argtype argtypes[1];  /* Argument types */
                     41: };
                     42:   
                     43: /* Structure describing a bytecode function.  If this changes, we also
                     44:    need to change expand_function_end () in bc-trans.c  */
                     45: struct bytecode
                     46: {
                     47:   int stacksize;               /* Depth required of evaluation stack.  */
                     48:   int localsize;               /* Size in bytes of local variables.  */
                     49:   unsigned char *pc0;          /* Initial program counter. */
                     50:   void **ptrlit;               /* Vector of (relocatable) pointer literals. */
                     51:   struct callinfo *callinfo;   /* Vector of procedure call type info. */
                     52: };
                     53: 
                     54: 
                     55: #define INTERP_BPC 8           /* Bits per char */
                     56: #define INTERP_BPI \
                     57:   (sizeof (int) * INTERP_BPC)  /* Bits per int */
                     58: 
                     59: 
                     60: #ifndef min
                     61: #define min(L, R)  ((L) < (R) ? (L) : (R))
                     62: #endif
                     63: 
                     64: 
                     65: /* bit field operations. */
                     66: 
                     67: /* Low (high) mask: int with low (high) N bits set */
                     68: 
                     69: #define LM(N)   ((1 << (N)) - 1)
                     70: #define HM(N)  ((~LM (INTERP_BPI - (N))))
                     71: 
                     72: 
                     73: /* Sign-extend SIZE low bits of VALUE to integer (typeof VALUE)
                     74:    Signed bitfields are loaded from memory by the sxloadBI instruction,
                     75:    which first retrieves the bitfield with XFIELD and then sign extends
                     76:    it to an SItype. */
                     77: 
                     78: #define EXTEND(SIZE, VALUE)                                                  \
                     79:   ({ SUtype value = (SUtype) (VALUE);                                        \
                     80:     (value & (1 << ((SIZE) - 1)) ? value | ~LM (SIZE) : value); })
                     81: 
                     82: 
                     83: /* Given OFFSET:SIZE for  a bitfield, calculate:
                     84: 
                     85:    [1] BYTE_OFFSET  = the byte offset of the bit field.
                     86:    [2] BIT_OFFSET   = the bit offset of the bit field (less than INTERP_BPC).
                     87:    [3] NBYTES       = the number of integral bytes in the bit field.
                     88:    [4] TRAILING_BITS= the number of trailing bits (less than INTERP_BPC).
                     89: 
                     90: 
                     91:    ,        ,        ,        ,        ,    (memory bytes)
                     92:                     ----------------        (bitfield)
                     93:    |        |       ||        |    |        (divisions)
                     94:         ^         ^       ^      ^
                     95:         |         |       |      |__ [4]  (bits)
                     96:         |         |       |_________ [3]  (bytes)
                     97:         |         |_________________ [2]  (bits)
                     98:         |___________________________ [1]  (bytes)
                     99: 
                    100: 
                    101:    The above applies to BYTE_LOW_ENDIAN machines. In BYTE_BIG_ENDIAN machines, the
                    102:    bit numbering is reversed (i.e. bit 0 is the sign bit).
                    103: 
                    104:    (Alright, so I drew this to keep my tongue in cheek while writing the code below,
                    105:     not because I'm into ASCII art.) */
                    106: 
                    107: 
                    108: #define BI_PARAMS(OFFSET, SIZE, BYTE_OFFSET, BIT_OFFSET, NBYTES, TRAILING_BITS)                \
                    109:   { BYTE_OFFSET = (OFFSET) / (INTERP_BPC);                             \
                    110:     BIT_OFFSET = (OFFSET) % (INTERP_BPC);                              \
                    111:     NBYTES = ((SIZE) - (INTERP_BPC - (BIT_OFFSET))) / INTERP_BPC;      \
                    112:     if ((NBYTES) < 0 || ((NBYTES) > 64))                               \
                    113:       NBYTES = 0;                                                      \
                    114:     if ((SIZE) + (BIT_OFFSET) <= INTERP_BPC)                           \
                    115:       TRAILING_BITS = 0;                                               \
                    116:     else                                                               \
                    117:       TRAILING_BITS = ((SIZE) - (INTERP_BPC - (BIT_OFFSET))) % INTERP_BPC; }
                    118: 
                    119: 
                    120: /* SHIFT_IN_BITS retrieves NBITS bits from SOURCE and shifts into
                    121:    DEST. The bit field starts OFFSET bits into SOURCE.
                    122: 
                    123:    OR_IN_BITS copies the NBITS low bits from VALUE into a the bitfield in
                    124:    DEST offset by OFFSET bits. */
                    125: 
                    126: 
                    127: #ifdef BYTES_BIG_ENDIAN
                    128: 
                    129: #define SHIFT_IN_BITS(DEST, SOURCE, OFFSET, NBITS)             \
                    130:   (DEST = ((DEST) << (NBITS))                                  \
                    131:    | (LM ((NBITS))                                             \
                    132:       & ((SOURCE) >> (INTERP_BPC - (OFFSET) - (NBITS)))))
                    133: 
                    134: #define OR_IN_BITS(DEST, VALUE, OFFSET, NBITS)                 \
                    135:   (DEST = ((DEST) & ~(LM ((NBITS)) << (INTERP_BPC - (OFFSET) - (NBITS))))      \
                    136:    | (((VALUE) & LM ((NBITS))) << (INTERP_BPC - (OFFSET) - (NBITS))))
                    137: 
                    138: #else
                    139: 
                    140: #define SHIFT_IN_BITS(DEST, SOURCE, OFFSET, NBITS)             \
                    141:   (DEST = ((DEST) << (NBITS))                                  \
                    142:    | (LM ((NBITS))                                             \
                    143:       & ((SOURCE) >> (OFFSET))))
                    144: 
                    145: #define OR_IN_BITS(DEST, VALUE, OFFSET, NBITS)                 \
                    146:   (DEST = ((DEST) & ~(LM ((NBITS)) << (OFFSET)))               \
                    147:    | (((VALUE) & LM ((NBITS))) << (OFFSET)))
                    148: 
                    149: #endif
                    150: 
                    151: 
                    152: /* Procedure call; arguments are a pointer to the function to be called,
                    153:    a pointer to a place to store the return value, a pointer to a vector
                    154:    describing the type of procedure call, and the interpreter's stack pointer,
                    155:    which will point to the first of the arguments at this point.  */
                    156: 
                    157: #define CALL(FUNC, CALLDESC, RETVAL, SP) __call(FUNC, CALLDESC, RETVAL, SP)
                    158: 
                    159: 
                    160: /* Procedure return; arguments are a pointer to the calldesc for this
                    161:    function, and a pointer to the place where the value to be returned
                    162:    may be found.  Generally the MACHARGS above contain a machine dependent
                    163:    cookie that is used to determine where to jump to.  */
                    164: 
                    165: #define PROCRET(CALLDESC, RETVAL) return

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.