shithub: apl10

ref: 7b65afc1ad13f3859eca6eadaa2c45d864320304
dir: /dat.h/

View raw version
#define BC_EXT "aplbc"
#define OC_EXT "aploc"

enum {
	Onop,
	Oexit,
	Ocall,
	Oreturn,
	Omov,
	Olocals,
	Oscalnum,
	Odisplay,

	O_max,
	O_maxargs = 2,
};

enum {
	OAinvalid,

	OAlabel, /* 8 byte unsigned offset */
	OAreg, /* 1 byte unsigned register number */
	OAlocal1, /* 1 byte unsigned local number */
	OAlocal2, /* 2 byte unsigned local number */
	OAlocal4, /* 4 byte unsigned local number */
	OAlocal8, /* 8 byte unsigned local number */
	OAnum1, /* 1 signed byte */
	OAnum2, /* 2 signed byte */
	OAnum4, /* 4 signed byte */
	OAnum8, /* 8 signed byte */

	OA_maxbytes = 8,
};

enum {
	ObjHeader,
	ObjConsts,
	ObjCode,

	Obj_max
};

enum {
	RegIp, /* instruction pointer */
	RegMod, /* current module */
	RegFunc, /* current function (so we know the names of variables) */
	RegSp, /* top of stack */
	RegFp, /* start of current stack frame */
	RegX, /* left argument */
	RegY, /* right argument */
	RegF, /* left operand function */
	RegG, /* right operand function */
	RegR, /* result value */
	RegT, /* bool result of test (cmp* instruction) */

	Reg_max,
	Reg_save = RegX /* all regs below are pushed */
};
char *regnames[Reg_max];

typedef struct Label Label;
typedef struct Module Module;
typedef struct ObjpartSpec ObjpartSpec;
typedef struct OpArg OpArg;
typedef struct OpcodeSpec OpcodeSpec;
typedef struct ParsedInstr ParsedInstr;
typedef struct VM VM;
typedef union  Word Word;

union Word
{
	/* Add cases as they are needed */
	void *vp;
	char *cp;
	u64int u64;
	s64int s64;

	s16int s16v[4];
	s8int s8v[8];
};

struct Label
{
	char *name;
	uvlong ioffset;
	uvlong coffset;
	uvlong nameoffset;
};

struct Module
{
	uvlong codesize;
	u8int *code;

	uvlong constsize;
	u8int *consts;

	/* stuff used for parsing */
	uvlong nlabels;
	uvlong ninstrs;
	Label *labels;
	ParsedInstr *instrs;
};

struct ObjpartSpec
{
	char *name;
	void (*read)(Module *, Biobuf *, int);
	void (*write)(Module *, Biobuf *, int);
};
extern ObjpartSpec objparts[Obj_max];

struct OpArg
{
	int tag;
	Word;
};

struct OpcodeSpec
{
	char *name;
	int args;
};
extern OpcodeSpec optab[O_max];

struct ParsedInstr
{
	int opcode;
	OpArg args[O_maxargs];

	uvlong len;
	u8int buf[1 + 1 + (O_maxargs * OA_maxbytes)];
};

struct VM
{
	Word regs[Reg_max];

	uvlong nmods;
	Module **mods;

	Word stack[1024]; /* FIXME: grow stack as needed */
};