version 1.1, 2002/06/02 15:46:17
|
version 1.9, 2007/12/31 19:02:25
|
Line 1
|
Line 1
|
/* support functions for vmgen example |
/* support functions for vmgen example |
|
|
Copyright (C) 2001 Free Software Foundation, Inc. |
Copyright (C) 2001,2002,2003,2007 Free Software Foundation, Inc. |
|
|
This file is part of Gforth. |
This file is part of Gforth. |
|
|
Gforth is free software; you can redistribute it and/or |
Gforth is free software; you can redistribute it and/or |
modify it under the terms of the GNU General Public License |
modify it under the terms of the GNU General Public License |
as published by the Free Software Foundation; either version 2 |
as published by the Free Software Foundation, either version 3 |
of the License, or (at your option) any later version. |
of the License, or (at your option) any later version. |
|
|
This program is distributed in the hope that it will be useful, |
This program is distributed in the hope that it will be useful, |
Line 15
|
Line 15
|
GNU General Public License for more details. |
GNU General Public License for more details. |
|
|
You should have received a copy of the GNU General Public License |
You should have received a copy of the GNU General Public License |
along with this program; if not, write to the Free Software |
along with this program; if not, see http://www.gnu.org/licenses/. |
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. |
|
*/ |
*/ |
|
|
#include <stdio.h> |
#include <stdio.h> |
|
|
|
#ifdef __GNUC__ |
typedef void *Label; |
typedef void *Label; |
|
|
#ifdef USE_CASTS |
|
typedef long Cell; |
|
Typedef Cell Inst; |
|
|
|
/* type change macros; these are specific to the types you use, so you |
|
have to change this part */ |
|
#define vm_Cell2i(_cell,x) ((x)=(long)(_cell)) |
|
#define vm_i2Cell(_cell,x) ((x)=(Cell)(_cell)) |
|
#define vm_Cell2target(_cell,x) ((x)=(Inst *)(_cell)) |
|
#define vm_target2Cell(_cell,x) ((x)=(Cell)(_cell)) |
|
#define vm_Cell2a(_cell,x) ((x)=(char *)(_cell)) |
|
#define vm_a2Cell(_cell,x) ((x)=(Cell)(_cell)) |
|
#else |
#else |
|
typedef long Label; |
|
#endif |
|
|
typedef union Cell { |
typedef union Cell { |
long i; |
long i; |
union Cell *target; |
union Cell *target; |
Line 49 typedef union Cell {
|
Line 39 typedef union Cell {
|
#define vm_target2Cell(_x,_cell) ((_cell).target=(_x)) |
#define vm_target2Cell(_x,_cell) ((_cell).target=(_x)) |
#define vm_Cell2a(_cell,_x) ((_x)=(_cell).a) |
#define vm_Cell2a(_cell,_x) ((_x)=(_cell).a) |
#define vm_a2Cell(_x,_cell) ((_cell).a=(_x)) |
#define vm_a2Cell(_x,_cell) ((_cell).a=(_x)) |
#endif |
#define vm_Cell2Cell(_x,_y) ((_y)=(_x)) |
|
|
|
/* for future extensions */ |
|
#define IMM_ARG(access,value) (access) |
|
|
#define VM_IS_INST(_inst, n) ((_inst).inst == vm_prim[n]) |
#define VM_IS_INST(_inst, n) ((_inst).inst == vm_prim[n]) |
|
|
Line 64 extern FILE *vm_out;
|
Line 57 extern FILE *vm_out;
|
extern Inst *vmcodep; |
extern Inst *vmcodep; |
extern Inst *last_compiled; |
extern Inst *last_compiled; |
extern Inst *vmcode_end; |
extern Inst *vmcode_end; |
|
extern int use_super; |
|
|
/* generic vmgen support functions (e.g., wrappers) */ |
/* generic vmgen support functions (e.g., wrappers) */ |
void gen_inst(Inst **vmcodepp, Label i); |
void gen_inst(Inst **vmcodepp, Label i); |