File:  [gforth] / gforth / vmgen-ex / engine.c
Revision 1.1: download - view: text, annotated - select for diffs
Sun Apr 29 11:28:23 2001 UTC (23 years ago) by anton
Branches: MAIN
CVS tags: HEAD
added vmgen-ex

/* vm interpreter wrapper

  Copyright (C) 2001 Free Software Foundation, Inc.

  This file is part of Gforth.

  Gforth is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
*/

#include "mini.h"

/* type change macros; these are specific to the types you use, so you
   have to change this part */
#define vm_Cell2i(x) ((Cell)(x))
#define vm_i2Cell(x) (x)
#define vm_Cell2target(x) ((Inst *)(x))
#define vm_target2Cell(x) ((Cell)(x))
#define vm_Cell2a(x) ((char *)(x))
#define vm_a2Cell(x) ((Cell)(x))

#ifdef USE_spTOS
#define IF_spTOS(x) x
#else
#define IF_spTOS(x)
#endif

#ifdef VM_DEBUG
#define NAME(_x) if (vm_debug) {fprintf(vm_out, "%lx: %-20s, ", (long)(ip-1), _x); fprintf(vm_out,"fp=%p, sp=%p", fp, sp);}
#else
#define NAME(_x)
#endif

/* different threading schemes for different architectures; for more,
   look in ../engine/threaded.h, and 
   look for THREADING_SCHEME in ../arch/.../machine.h */

#ifdef i386
#define THREADING_SCHEME 8
#else
#define THREADING_SCHEME 5
#endif

#if THREADING_SCHEME==5
/* direct threading scheme 5: early fetching */
#  define CFA_NEXT
#  define NEXT_P0	({cfa=*ip;})
#  define IP		((Cell *)ip)
#  define SET_IP(p)	({ip=(Inst *)(p); NEXT_P0;})
#  define NEXT_INST	((Cell)cfa)
#  define INC_IP(const_inc)	({cfa=ip[const_inc]; ip+=(const_inc);})
#  define DEF_CA
#  define NEXT_P1	(ip++)
#  define NEXT_P2	({goto *cfa;})
#endif

#if THREADING_SCHEME==8
/* direct threading scheme 8: i386 hack */
#  define NEXT_P0
#  define IP		(ip)
#  define SET_IP(p)	({ip=(p); NEXT_P0;})
#  define NEXT_INST	(*IP)
#  define INC_IP(const_inc)	({ ip+=(const_inc);})
#  define DEF_CA
#  define NEXT_P1	(ip++)
#  define NEXT_P2	({goto **(ip-1);})
#endif

#define NEXT ({DEF_CA NEXT_P1; NEXT_P2;})
#define IPTOS NEXT_INST

#ifdef VM_PROFILING
#define SUPER_END  vm_count_block(IP)
#else
#define SUPER_END
#endif

/* the return type can be anything you want it to */
Cell engine(Inst *ip0, Cell *sp, char *fp)
{
  /* VM registers */
  Inst * ip;
  Inst * cfa;
#ifdef USE_spTOS
  Cell   spTOS;
#else
#define spTOS (sp[0])
#endif
  static Inst   labels[] = {
#include "mini-labels.i"
  };

  if (vm_debug)
      fprintf(vm_out,"entering engine(%p,%p,%p)\n",ip0,sp,fp);
  if (ip0 == NULL) {
    vm_prim = labels;
    return 0;
  }

  /* I don't have a clue where these things come from,
     but I've put them in macros.h for the moment */
  IF_spTOS(spTOS = sp[0]);

  SET_IP(ip0);
  NEXT;

#include "mini-vm.i"
}

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>