Annotation of gforth/engine.c, revision 1.1
1.1 ! anton 1: /*
! 2: $Id: engine.c,v 1.17 1993/11/09 15:08:25 anton Exp $
! 3: Copyright 1992 by the ANSI figForth Development Group
! 4: */
! 5:
! 6: #include <ctype.h>
! 7: #include <stdio.h>
! 8: #include <string.h>
! 9: #include <math.h>
! 10: #include <sys/types.h>
! 11: #include <sys/stat.h>
! 12: #include <fcntl.h>
! 13: #include <assert.h>
! 14: #include <stdlib.h>
! 15: #include "forth.h"
! 16: #include "io.h"
! 17:
! 18: extern unlink(char *);
! 19: extern ftruncate(int, int);
! 20:
! 21: typedef union {
! 22: struct {
! 23: #ifdef BIG_ENDIAN
! 24: Cell high;
! 25: Cell low;
! 26: #else
! 27: Cell low;
! 28: Cell high;
! 29: #endif;
! 30: } cells;
! 31: DCell dcell;
! 32: } Double_Store;
! 33:
! 34: typedef struct F83Name {
! 35: struct F83Name *next; /* the link field for old hands */
! 36: char countetc;
! 37: Char name[0];
! 38: } F83Name;
! 39:
! 40: /* are macros for setting necessary? */
! 41: #define F83NAME_COUNT(np) ((np)->countetc & 0x1f)
! 42: #define F83NAME_SMUDGE(np) (((np)->countetc & 0x40) != 0)
! 43: #define F83NAME_IMMEDIATE(np) (((np)->countetc & 0x20) != 0)
! 44:
! 45: /* NEXT and NEXT1 are split into several parts to help scheduling */
! 46: #ifdef DIRECT_THREADED
! 47: #define NEXT1_P1
! 48: #define NEXT1_P2 ({goto *cfa;})
! 49: #else
! 50: #define NEXT1_P1 ({ca = *cfa;})
! 51: #define NEXT1_P2 ({goto *ca;})
! 52: #endif
! 53: #define NEXT_P1 ({cfa = *ip++; NEXT1_P1;})
! 54:
! 55: #define NEXT1 ({NEXT1_P1; NEXT1_P2;})
! 56: #define NEXT ({NEXT_P1; NEXT1_P2;})
! 57:
! 58: #ifdef USE_TOS
! 59: #define IF_TOS(x) x
! 60: #else
! 61: #define IF_TOS(x)
! 62: #define TOS (sp[0])
! 63: #endif
! 64:
! 65: #ifdef USE_FTOS
! 66: #define IF_FTOS(x) x
! 67: #else
! 68: #define IF_FTOS(x)
! 69: #define FTOS (fp[0])
! 70: #endif
! 71:
! 72: #define DODOES (symbols[3])
! 73:
! 74: int emitcounter;
! 75: #define NULLC '\0'
! 76:
! 77: #define cstr(to, from, size)\
! 78: { memcpy(to, from, size);\
! 79: to[size]=NULLC;}
! 80: #define NEWLINE '\n'
! 81:
! 82: static char* fileattr[6]={"r","rb","r+","r+b","w+","w+b"};
! 83:
! 84: Label *engine(Xt *ip, Cell *sp, Cell *rp, Float *fp)
! 85: /* executes code at ip, if ip!=NULL
! 86: returns array of machine code labels (for use in a loader), if ip==NULL
! 87: This is very preliminary, as the bootstrap architecture is not yet decided
! 88: */
! 89: {
! 90: Xt cfa;
! 91: Address lp=NULL;
! 92: static Label symbols[]= {
! 93: &&docol,
! 94: &&docon,
! 95: &&dovar,
! 96: &&dodoes,
! 97: #include "prim_labels.i"
! 98: };
! 99: #ifndef DIRECT_THREADED
! 100: Label ca;
! 101: #endif
! 102: IF_TOS(register Cell TOS;)
! 103: IF_FTOS(Float FTOS;)
! 104: #ifdef CPU_DEP
! 105: CPU_DEP;
! 106: #endif
! 107:
! 108: if (ip == NULL)
! 109: return symbols;
! 110:
! 111: IF_TOS(TOS = sp[0]);
! 112: IF_FTOS(FTOS = fp[0]);
! 113: prep_terminal();
! 114: NEXT;
! 115:
! 116: docol:
! 117: #ifdef DEBUG
! 118: printf("col: %x\n",(Cell)PFA1(cfa));
! 119: #endif
! 120: #ifdef undefined
! 121: /* this is the simple version */
! 122: *--rp = (Cell)ip;
! 123: ip = (Xt *)PFA1(cfa);
! 124: NEXT;
! 125: #endif
! 126: /* this one is important, so we help the compiler optimizing
! 127: The following version may be better (for scheduling), but probably has
! 128: problems with code fields employing calls and delay slots
! 129: */
! 130: {
! 131: Xt *current_ip = (Xt *)PFA1(cfa);
! 132: cfa = *current_ip;
! 133: NEXT1_P1;
! 134: *--rp = (Cell)ip;
! 135: ip = current_ip+1;
! 136: }
! 137: NEXT1_P2;
! 138:
! 139: docon:
! 140: #ifdef DEBUG
! 141: printf("con: %x\n",*(Cell*)PFA1(cfa));
! 142: #endif
! 143: #ifdef USE_TOS
! 144: *sp-- = TOS;
! 145: TOS = *(Cell *)PFA1(cfa);
! 146: #else
! 147: *--sp = *(Cell *)PFA1(cfa);
! 148: #endif
! 149: NEXT;
! 150:
! 151: dovar:
! 152: #ifdef DEBUG
! 153: printf("var: %x\n",(Cell)PFA1(cfa));
! 154: #endif
! 155: #ifdef USE_TOS
! 156: *sp-- = TOS;
! 157: TOS = (Cell)PFA1(cfa);
! 158: #else
! 159: *--sp = (Cell)PFA1(cfa);
! 160: #endif
! 161: NEXT;
! 162:
! 163: /* !! user? */
! 164:
! 165: dodoes:
! 166: /* this assumes the following structure:
! 167: defining-word:
! 168:
! 169: ...
! 170: DOES>
! 171: (possible padding)
! 172: possibly handler: jmp dodoes
! 173: (possible branch delay slot(s))
! 174: Forth code after DOES>
! 175:
! 176: defined word:
! 177:
! 178: cfa: address of or jump to handler OR
! 179: address of or jump to dodoes, address of DOES-code
! 180: pfa:
! 181:
! 182: */
! 183: #ifdef DEBUG
! 184: printf("does: %x\n",(Cell)PFA(cfa));
! 185: #endif
! 186: *--rp = (Cell)ip;
! 187: /* PFA1 might collide with DOES_CODE1 here, so we use PFA */
! 188: #ifdef USE_TOS
! 189: *sp-- = TOS;
! 190: TOS = (Cell)PFA(cfa);
! 191: #else
! 192: *--sp = (Cell)PFA(cfa);
! 193: #endif
! 194: ip = DOES_CODE1(cfa);
! 195: NEXT;
! 196:
! 197: #include "primitives.i"
! 198: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>