mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-01-30 20:50:42 +00:00
move the full info opcocde table from qfcc to gamecode (<KURGON>There can be
only one!</KURGON>:) and use the table in PR_PrintStatement. This means that qfcc now links against libQFgamecode as well as libQFutil
This commit is contained in:
parent
ae9ee57666
commit
2818d720c2
10 changed files with 193 additions and 229 deletions
|
@ -138,6 +138,20 @@ typedef enum {
|
||||||
OP_GT_S,
|
OP_GT_S,
|
||||||
} pr_opcode_e;
|
} pr_opcode_e;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
const char *name;
|
||||||
|
const char *opname;
|
||||||
|
pr_opcode_e opcode;
|
||||||
|
int priority;
|
||||||
|
qboolean right_associative;
|
||||||
|
etype_t type_a, type_b, type_c;
|
||||||
|
int min_version;
|
||||||
|
} opcode_t;
|
||||||
|
|
||||||
|
extern opcode_t pr_opcodes[];
|
||||||
|
opcode_t *PR_Opcode (short opcode);
|
||||||
|
void PR_Opcode_Init (void);
|
||||||
|
|
||||||
typedef struct statement_s
|
typedef struct statement_s
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,6 +3,6 @@ INCLUDES= -I$(top_srcdir)/include
|
||||||
lib_LTLIBRARIES = libQFgamecode.la
|
lib_LTLIBRARIES = libQFgamecode.la
|
||||||
|
|
||||||
libQFgamecode_la_LDFLAGS = -version-info 1:0:0
|
libQFgamecode_la_LDFLAGS = -version-info 1:0:0
|
||||||
libQFgamecode_la_SOURCES = pr_edict.c pr_exec.c pr_strings.c
|
libQFgamecode_la_SOURCES = pr_edict.c pr_exec.c pr_opcode.c pr_strings.c
|
||||||
|
|
||||||
LIBLIST = libQFgamecode.la @LIBRARY_SEARCH_PATH@
|
LIBLIST = libQFgamecode.la @LIBRARY_SEARCH_PATH@
|
||||||
|
|
|
@ -1285,6 +1285,7 @@ PR_Init_Cvars (void)
|
||||||
void
|
void
|
||||||
PR_Init (void)
|
PR_Init (void)
|
||||||
{
|
{
|
||||||
|
PR_Opcode_Init ();
|
||||||
}
|
}
|
||||||
|
|
||||||
edict_t *
|
edict_t *
|
||||||
|
|
|
@ -46,100 +46,6 @@
|
||||||
|
|
||||||
#include "compat.h"
|
#include "compat.h"
|
||||||
|
|
||||||
char *pr_opnames[] = {
|
|
||||||
"DONE",
|
|
||||||
|
|
||||||
"MUL_F",
|
|
||||||
"MUL_V",
|
|
||||||
"MUL_FV",
|
|
||||||
"MUL_VF",
|
|
||||||
|
|
||||||
"DIV",
|
|
||||||
|
|
||||||
"ADD_F",
|
|
||||||
"ADD_V",
|
|
||||||
|
|
||||||
"SUB_F",
|
|
||||||
"SUB_V",
|
|
||||||
|
|
||||||
"EQ_F",
|
|
||||||
"EQ_V",
|
|
||||||
"EQ_S",
|
|
||||||
"EQ_E",
|
|
||||||
"EQ_FNC",
|
|
||||||
|
|
||||||
"NE_F",
|
|
||||||
"NE_V",
|
|
||||||
"NE_S",
|
|
||||||
"NE_E",
|
|
||||||
"NE_FNC",
|
|
||||||
|
|
||||||
"LE",
|
|
||||||
"GE",
|
|
||||||
"LT",
|
|
||||||
"GT",
|
|
||||||
|
|
||||||
"INDIRECT",
|
|
||||||
"INDIRECT",
|
|
||||||
"INDIRECT",
|
|
||||||
"INDIRECT",
|
|
||||||
"INDIRECT",
|
|
||||||
"INDIRECT",
|
|
||||||
|
|
||||||
"ADDRESS",
|
|
||||||
|
|
||||||
"STORE_F",
|
|
||||||
"STORE_V",
|
|
||||||
"STORE_S",
|
|
||||||
"STORE_ENT",
|
|
||||||
"STORE_FLD",
|
|
||||||
"STORE_FNC",
|
|
||||||
|
|
||||||
"STOREP_F",
|
|
||||||
"STOREP_V",
|
|
||||||
"STOREP_S",
|
|
||||||
"STOREP_ENT",
|
|
||||||
"STOREP_FLD",
|
|
||||||
"STOREP_FNC",
|
|
||||||
|
|
||||||
"RETURN",
|
|
||||||
|
|
||||||
"NOT_F",
|
|
||||||
"NOT_V",
|
|
||||||
"NOT_S",
|
|
||||||
"NOT_ENT",
|
|
||||||
"NOT_FNC",
|
|
||||||
|
|
||||||
"IF",
|
|
||||||
"IFNOT",
|
|
||||||
|
|
||||||
"CALL0",
|
|
||||||
"CALL1",
|
|
||||||
"CALL2",
|
|
||||||
"CALL3",
|
|
||||||
"CALL4",
|
|
||||||
"CALL5",
|
|
||||||
"CALL6",
|
|
||||||
"CALL7",
|
|
||||||
"CALL8",
|
|
||||||
|
|
||||||
"STATE",
|
|
||||||
|
|
||||||
"GOTO",
|
|
||||||
|
|
||||||
"AND",
|
|
||||||
"OR",
|
|
||||||
|
|
||||||
"BITAND",
|
|
||||||
"BITOR",
|
|
||||||
|
|
||||||
"ADD_S",
|
|
||||||
"LE_S",
|
|
||||||
"GE_S",
|
|
||||||
"LT_S",
|
|
||||||
"GT_S",
|
|
||||||
};
|
|
||||||
|
|
||||||
//=============================================================================
|
//=============================================================================
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -150,11 +56,13 @@ PR_PrintStatement (progs_t * pr, dstatement_t *s)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int addr = s - pr->pr_statements;
|
int addr = s - pr->pr_statements;
|
||||||
|
opcode_t *op;
|
||||||
|
|
||||||
Con_Printf ("%-7d ", addr);
|
Con_Printf ("%-7d ", addr);
|
||||||
if ((unsigned int) s->op < sizeof (pr_opnames) / sizeof (pr_opnames[0])) {
|
op = PR_Opcode (s->op);
|
||||||
Con_Printf ("%s ", pr_opnames[s->op]);
|
if (op) {
|
||||||
i = strlen (pr_opnames[s->op]);
|
Con_Printf ("%s ", op->opname);
|
||||||
|
i = strlen (op->opname);
|
||||||
for (; i < 10; i++)
|
for (; i < 10; i++)
|
||||||
Con_Printf (" ");
|
Con_Printf (" ");
|
||||||
}
|
}
|
||||||
|
|
159
libs/gamecode/pr_opcode.c
Normal file
159
libs/gamecode/pr_opcode.c
Normal file
|
@ -0,0 +1,159 @@
|
||||||
|
/* Copyright (C) 1996-1997 Id Software, Inc.
|
||||||
|
|
||||||
|
This program 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-1307 USA
|
||||||
|
|
||||||
|
See file, 'COPYING', for details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
# include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "QF/hash.h"
|
||||||
|
#include "QF/pr_comp.h"
|
||||||
|
|
||||||
|
hashtab_t *opcode_table;
|
||||||
|
|
||||||
|
opcode_t pr_opcodes[] = {
|
||||||
|
{"<DONE>", "done", OP_DONE, -1, false, ev_entity, ev_field, ev_void, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"*", "mul.f", OP_MUL_F, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"*", "mul.v", OP_MUL_V, 2, false, ev_vector, ev_vector, ev_float, PROG_ID_VERSION},
|
||||||
|
{"*", "mul.fv", OP_MUL_FV, 2, false, ev_float, ev_vector, ev_vector, PROG_ID_VERSION},
|
||||||
|
{"*", "mul.vf", OP_MUL_VF, 2, false, ev_vector, ev_float, ev_vector, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"/", "div.f", OP_DIV_F, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"+", "add.f", OP_ADD_F, 3, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"+", "add.v", OP_ADD_V, 3, false, ev_vector, ev_vector, ev_vector, PROG_ID_VERSION},
|
||||||
|
{"+", "add.s", OP_ADD_S, 3, false, ev_string, ev_string, ev_string, PROG_VERSION},
|
||||||
|
|
||||||
|
{"-", "sub.f", OP_SUB_F, 3, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"-", "sub.v", OP_SUB_V, 3, false, ev_vector, ev_vector, ev_vector, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"==", "eq.f", OP_EQ_F, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"==", "eq.v", OP_EQ_V, 4, false, ev_vector, ev_vector, ev_float, PROG_ID_VERSION},
|
||||||
|
{"==", "eq.s", OP_EQ_S, 4, false, ev_string, ev_string, ev_float, PROG_ID_VERSION},
|
||||||
|
{"==", "eq.e", OP_EQ_E, 4, false, ev_entity, ev_entity, ev_float, PROG_ID_VERSION},
|
||||||
|
{"==", "eq.fnc", OP_EQ_FNC, 4, false, ev_func, ev_func, ev_float, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"!=", "ne.f", OP_NE_F, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!=", "ne.v", OP_NE_V, 4, false, ev_vector, ev_vector, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!=", "ne.s", OP_NE_S, 4, false, ev_string, ev_string, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!=", "ne.e", OP_NE_E, 4, false, ev_entity, ev_entity, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!=", "ne.fnc", OP_NE_FNC, 4, false, ev_func, ev_func, ev_float, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"<=", "le", OP_LE, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{">=", "ge", OP_GE, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"<=", "le.s", OP_LE_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
||||||
|
{">=", "ge.s", OP_GE_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
||||||
|
{"<", "lt", OP_LT, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{">", "gt", OP_GT, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"<", "lt.s", OP_LT_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
||||||
|
{">", "gt.s", OP_GT_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
||||||
|
|
||||||
|
{".", "load.f", OP_LOAD_F, 1, false, ev_entity, ev_field, ev_float, PROG_ID_VERSION},
|
||||||
|
{".", "load.v", OP_LOAD_V, 1, false, ev_entity, ev_field, ev_vector, PROG_ID_VERSION},
|
||||||
|
{".", "load.s", OP_LOAD_S, 1, false, ev_entity, ev_field, ev_string, PROG_ID_VERSION},
|
||||||
|
{".", "load.ent", OP_LOAD_ENT, 1, false, ev_entity, ev_field, ev_entity, PROG_ID_VERSION},
|
||||||
|
{".", "load.fld", OP_LOAD_FLD, 1, false, ev_entity, ev_field, ev_field, PROG_ID_VERSION},
|
||||||
|
{".", "load.fnc", OP_LOAD_FNC, 1, false, ev_entity, ev_field, ev_func, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{".", "address", OP_ADDRESS, 1, false, ev_entity, ev_field, ev_pointer, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"=", "store.f", OP_STORE_F, 5, true, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"=", "store.v", OP_STORE_V, 5, true, ev_vector, ev_vector, ev_vector, PROG_ID_VERSION},
|
||||||
|
{"=", "store.s", OP_STORE_S, 5, true, ev_string, ev_string, ev_string, PROG_ID_VERSION},
|
||||||
|
{"=", "store.ent", OP_STORE_ENT, 5, true, ev_entity, ev_entity, ev_entity, PROG_ID_VERSION},
|
||||||
|
{"=", "store.fld", OP_STORE_FLD, 5, true, ev_field, ev_field, ev_field, PROG_ID_VERSION},
|
||||||
|
{"=", "store.fnc", OP_STORE_FNC, 5, true, ev_func, ev_func, ev_func, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"=", "storep.f", OP_STOREP_F, 5, true, ev_pointer, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"=", "storep.v", OP_STOREP_V, 5, true, ev_pointer, ev_vector, ev_vector, PROG_ID_VERSION},
|
||||||
|
{"=", "storep.s", OP_STOREP_S, 5, true, ev_pointer, ev_string, ev_string, PROG_ID_VERSION},
|
||||||
|
{"=", "storep.ent", OP_STOREP_ENT, 5, true, ev_pointer, ev_entity, ev_entity, PROG_ID_VERSION},
|
||||||
|
{"=", "storep.fld", OP_STOREP_FLD, 5, true, ev_pointer, ev_field, ev_field, PROG_ID_VERSION},
|
||||||
|
{"=", "storep.fnc", OP_STOREP_FNC, 5, true, ev_pointer, ev_func, ev_func, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"<RETURN>", "return", OP_RETURN, -1, false, ev_void, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"!", "not.f", OP_NOT_F, -1, false, ev_float, ev_void, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!", "not.v", OP_NOT_V, -1, false, ev_vector, ev_void, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!", "not.s", OP_NOT_S, -1, false, ev_string, ev_void, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!", "not.ent", OP_NOT_ENT, -1, false, ev_entity, ev_void, ev_float, PROG_ID_VERSION},
|
||||||
|
{"!", "not.fnc", OP_NOT_FNC, -1, false, ev_func, ev_void, ev_float, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"<IF>", "if", OP_IF, -1, false, ev_float, ev_float, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<IFNOT>", "ifnot", OP_IFNOT, -1, false, ev_float, ev_float, ev_void, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
// calls returns REG_RETURN
|
||||||
|
{"<CALL0>", "call0", OP_CALL0, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL1>", "call1", OP_CALL1, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL2>", "call2", OP_CALL2, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL3>", "call3", OP_CALL3, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL4>", "call4", OP_CALL4, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL5>", "call5", OP_CALL5, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL6>", "call6", OP_CALL6, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL7>", "call7", OP_CALL7, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
{"<CALL8>", "call8", OP_CALL8, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"<STATE>", "state", OP_STATE, -1, false, ev_float, ev_float, ev_void, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"<GOTO>", "goto", OP_GOTO, -1, false, ev_float, ev_void, ev_void, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"&&", "and", OP_AND, 6, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"||", "or", OP_OR, 6, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
|
||||||
|
{"&", "bitand", OP_BITAND, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{"|", "bitor", OP_BITOR, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
||||||
|
{0},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const char *
|
||||||
|
get_key (void *_op, void *unused)
|
||||||
|
{
|
||||||
|
opcode_t *op = (opcode_t *)_op;
|
||||||
|
static char rep[4];
|
||||||
|
char *r = rep;
|
||||||
|
|
||||||
|
*r++ = (op->opcode & 0x7f) + 2;
|
||||||
|
*r++ = ((op->opcode >> 7) & 0x7f) + 2;
|
||||||
|
*r++ = ((op->opcode >> 14) & 0x3) + 2;
|
||||||
|
*r = 0;
|
||||||
|
return rep;
|
||||||
|
}
|
||||||
|
|
||||||
|
opcode_t *
|
||||||
|
PR_Opcode (short opcode)
|
||||||
|
{
|
||||||
|
opcode_t op;
|
||||||
|
char rep[100];
|
||||||
|
|
||||||
|
op.opcode = opcode;
|
||||||
|
strcpy (rep, get_key (&op, 0));
|
||||||
|
return Hash_Find (opcode_table, rep);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
PR_Opcode_Init (void)
|
||||||
|
{
|
||||||
|
opcode_t *op;
|
||||||
|
|
||||||
|
opcode_table = Hash_NewTable (1021, get_key, 0, 0);
|
||||||
|
|
||||||
|
for (op = pr_opcodes; op->name; op++) {
|
||||||
|
Hash_Add (opcode_table, op);
|
||||||
|
}
|
||||||
|
}
|
|
@ -80,6 +80,12 @@ if test "x$HAVE_QF" != xno; then
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
fi
|
fi
|
||||||
|
if test "x$HAVE_QF" != xno; then
|
||||||
|
AC_CHECK_LIB(QFgamecode, PR_Opcode,
|
||||||
|
:, HAVE_QF=no,
|
||||||
|
[-lQFutil]
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_ENABLE(new-parser,
|
AC_ARG_ENABLE(new-parser,
|
||||||
[ --disable-new-parser disable the new parser.])
|
[ --disable-new-parser disable the new parser.])
|
||||||
|
|
|
@ -376,17 +376,6 @@ typedef struct
|
||||||
|
|
||||||
extern pr_info_t pr;
|
extern pr_info_t pr;
|
||||||
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
const char *name;
|
|
||||||
const char *opname;
|
|
||||||
pr_opcode_e opcode;
|
|
||||||
int priority;
|
|
||||||
qboolean right_associative;
|
|
||||||
etype_t type_a, type_b, type_c;
|
|
||||||
int min_version;
|
|
||||||
} opcode_t;
|
|
||||||
|
|
||||||
extern opcode_t *op_done;
|
extern opcode_t *op_done;
|
||||||
extern opcode_t *op_return;
|
extern opcode_t *op_return;
|
||||||
extern opcode_t *op_if;
|
extern opcode_t *op_if;
|
||||||
|
@ -399,8 +388,7 @@ void PR_AddStatementRef (def_t *def, dstatement_t *st, int field);
|
||||||
def_t *PR_Statement (opcode_t *op, def_t *var_a, def_t *var_b);
|
def_t *PR_Statement (opcode_t *op, def_t *var_a, def_t *var_b);
|
||||||
opcode_t *PR_Opcode_Find (const char *name, int priority,
|
opcode_t *PR_Opcode_Find (const char *name, int priority,
|
||||||
def_t *var_a, def_t *var_b, def_t *var_c);
|
def_t *var_a, def_t *var_b, def_t *var_c);
|
||||||
opcode_t *PR_Opcode (short opcode);
|
void PR_Opcode_Init_Tables (void);
|
||||||
void PR_Opcode_Init (void);
|
|
||||||
|
|
||||||
//============================================================================
|
//============================================================================
|
||||||
|
|
||||||
|
|
|
@ -38,4 +38,4 @@ qfcc_SOURCES= cmdlib.c debug.c pr_comp.c pr_def.c pr_imm.c pr_lex.c pr_opcode.c
|
||||||
else
|
else
|
||||||
qfcc_SOURCES= cmdlib.c debug.c pr_comp.c pr_def.c pr_imm.c pr_lex.c pr_opcode.c qfcc.c
|
qfcc_SOURCES= cmdlib.c debug.c pr_comp.c pr_def.c pr_imm.c pr_lex.c pr_opcode.c qfcc.c
|
||||||
endif
|
endif
|
||||||
qfcc_LDADD= -lQFutil
|
qfcc_LDADD= -lQFgamecode -lQFutil
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
#include "qfcc.h"
|
#include "qfcc.h"
|
||||||
|
|
||||||
hashtab_t *opcode_table;
|
|
||||||
hashtab_t *opcode_priority_table;
|
hashtab_t *opcode_priority_table;
|
||||||
hashtab_t *opcode_priority_type_table_ab;
|
hashtab_t *opcode_priority_type_table_ab;
|
||||||
hashtab_t *opcode_priority_type_table_abc;
|
hashtab_t *opcode_priority_type_table_abc;
|
||||||
|
@ -37,100 +36,6 @@ opcode_t *op_ifnot;
|
||||||
opcode_t *op_state;
|
opcode_t *op_state;
|
||||||
opcode_t *op_goto;
|
opcode_t *op_goto;
|
||||||
|
|
||||||
opcode_t pr_opcodes[] = {
|
|
||||||
{"<DONE>", "done", OP_DONE, -1, false, ev_entity, ev_field, ev_void, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"*", "mul.f", OP_MUL_F, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"*", "mul.v", OP_MUL_V, 2, false, ev_vector, ev_vector, ev_float, PROG_ID_VERSION},
|
|
||||||
{"*", "mul.fv", OP_MUL_FV, 2, false, ev_float, ev_vector, ev_vector, PROG_ID_VERSION},
|
|
||||||
{"*", "mul.vf", OP_MUL_VF, 2, false, ev_vector, ev_float, ev_vector, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"/", "div.f", OP_DIV_F, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"+", "add.f", OP_ADD_F, 3, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"+", "add.v", OP_ADD_V, 3, false, ev_vector, ev_vector, ev_vector, PROG_ID_VERSION},
|
|
||||||
{"+", "add.s", OP_ADD_S, 3, false, ev_string, ev_string, ev_string, PROG_VERSION},
|
|
||||||
|
|
||||||
{"-", "sub.f", OP_SUB_F, 3, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"-", "sub.v", OP_SUB_V, 3, false, ev_vector, ev_vector, ev_vector, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"==", "eq.f", OP_EQ_F, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"==", "eq.v", OP_EQ_V, 4, false, ev_vector, ev_vector, ev_float, PROG_ID_VERSION},
|
|
||||||
{"==", "eq.s", OP_EQ_S, 4, false, ev_string, ev_string, ev_float, PROG_ID_VERSION},
|
|
||||||
{"==", "eq.e", OP_EQ_E, 4, false, ev_entity, ev_entity, ev_float, PROG_ID_VERSION},
|
|
||||||
{"==", "eq.fnc", OP_EQ_FNC, 4, false, ev_func, ev_func, ev_float, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"!=", "ne.f", OP_NE_F, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!=", "ne.v", OP_NE_V, 4, false, ev_vector, ev_vector, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!=", "ne.s", OP_NE_S, 4, false, ev_string, ev_string, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!=", "ne.e", OP_NE_E, 4, false, ev_entity, ev_entity, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!=", "ne.fnc", OP_NE_FNC, 4, false, ev_func, ev_func, ev_float, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"<=", "le", OP_LE, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{">=", "ge", OP_GE, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"<=", "le.s", OP_LE_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
|
||||||
{">=", "ge.s", OP_GE_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
|
||||||
{"<", "lt", OP_LT, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{">", "gt", OP_GT, 4, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"<", "lt.s", OP_LT_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
|
||||||
{">", "gt.s", OP_GT_S, 4, false, ev_string, ev_string, ev_float, PROG_VERSION},
|
|
||||||
|
|
||||||
{".", "load.f", OP_LOAD_F, 1, false, ev_entity, ev_field, ev_float, PROG_ID_VERSION},
|
|
||||||
{".", "load.v", OP_LOAD_V, 1, false, ev_entity, ev_field, ev_vector, PROG_ID_VERSION},
|
|
||||||
{".", "load.s", OP_LOAD_S, 1, false, ev_entity, ev_field, ev_string, PROG_ID_VERSION},
|
|
||||||
{".", "load.ent", OP_LOAD_ENT, 1, false, ev_entity, ev_field, ev_entity, PROG_ID_VERSION},
|
|
||||||
{".", "load.fld", OP_LOAD_FLD, 1, false, ev_entity, ev_field, ev_field, PROG_ID_VERSION},
|
|
||||||
{".", "load.fnc", OP_LOAD_FNC, 1, false, ev_entity, ev_field, ev_func, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{".", "address", OP_ADDRESS, 1, false, ev_entity, ev_field, ev_pointer, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"=", "store.f", OP_STORE_F, 5, true, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"=", "store.v", OP_STORE_V, 5, true, ev_vector, ev_vector, ev_vector, PROG_ID_VERSION},
|
|
||||||
{"=", "store.s", OP_STORE_S, 5, true, ev_string, ev_string, ev_string, PROG_ID_VERSION},
|
|
||||||
{"=", "store.ent", OP_STORE_ENT, 5, true, ev_entity, ev_entity, ev_entity, PROG_ID_VERSION},
|
|
||||||
{"=", "store.fld", OP_STORE_FLD, 5, true, ev_field, ev_field, ev_field, PROG_ID_VERSION},
|
|
||||||
{"=", "store.fnc", OP_STORE_FNC, 5, true, ev_func, ev_func, ev_func, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"=", "storep.f", OP_STOREP_F, 5, true, ev_pointer, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"=", "storep.v", OP_STOREP_V, 5, true, ev_pointer, ev_vector, ev_vector, PROG_ID_VERSION},
|
|
||||||
{"=", "storep.s", OP_STOREP_S, 5, true, ev_pointer, ev_string, ev_string, PROG_ID_VERSION},
|
|
||||||
{"=", "storep.ent", OP_STOREP_ENT, 5, true, ev_pointer, ev_entity, ev_entity, PROG_ID_VERSION},
|
|
||||||
{"=", "storep.fld", OP_STOREP_FLD, 5, true, ev_pointer, ev_field, ev_field, PROG_ID_VERSION},
|
|
||||||
{"=", "storep.fnc", OP_STOREP_FNC, 5, true, ev_pointer, ev_func, ev_func, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"<RETURN>", "return", OP_RETURN, -1, false, ev_void, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"!", "not.f", OP_NOT_F, -1, false, ev_float, ev_void, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!", "not.v", OP_NOT_V, -1, false, ev_vector, ev_void, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!", "not.s", OP_NOT_S, -1, false, ev_string, ev_void, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!", "not.ent", OP_NOT_ENT, -1, false, ev_entity, ev_void, ev_float, PROG_ID_VERSION},
|
|
||||||
{"!", "not.fnc", OP_NOT_FNC, -1, false, ev_func, ev_void, ev_float, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"<IF>", "if", OP_IF, -1, false, ev_float, ev_float, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<IFNOT>", "ifnot", OP_IFNOT, -1, false, ev_float, ev_float, ev_void, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
// calls returns REG_RETURN
|
|
||||||
{"<CALL0>", "call0", OP_CALL0, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL1>", "call1", OP_CALL1, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL2>", "call2", OP_CALL2, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL3>", "call3", OP_CALL3, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL4>", "call4", OP_CALL4, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL5>", "call5", OP_CALL5, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL6>", "call6", OP_CALL6, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL7>", "call7", OP_CALL7, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
{"<CALL8>", "call8", OP_CALL8, -1, false, ev_func, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"<STATE>", "state", OP_STATE, -1, false, ev_float, ev_float, ev_void, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"<GOTO>", "goto", OP_GOTO, -1, false, ev_float, ev_void, ev_void, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"&&", "and", OP_AND, 6, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"||", "or", OP_OR, 6, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
|
|
||||||
{"&", "bitand", OP_BITAND, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
{"|", "bitor", OP_BITOR, 2, false, ev_float, ev_float, ev_float, PROG_ID_VERSION},
|
|
||||||
};
|
|
||||||
|
|
||||||
static type_t *types[] = {
|
static type_t *types[] = {
|
||||||
&type_void,
|
&type_void,
|
||||||
&type_string,
|
&type_string,
|
||||||
|
@ -226,10 +131,6 @@ get_key (void *_op, void *_tab)
|
||||||
*r++ = op->type_b + 2;
|
*r++ = op->type_b + 2;
|
||||||
*r++ = op->type_c + 2;
|
*r++ = op->type_c + 2;
|
||||||
*r = 0;
|
*r = 0;
|
||||||
} else if (tab == &opcode_table) {
|
|
||||||
*r++ = (op->opcode & 0xff) + 2;
|
|
||||||
*r++ = ((op->opcode >> 8) & 0xff) + 2;
|
|
||||||
*r = 0;
|
|
||||||
} else {
|
} else {
|
||||||
abort ();
|
abort ();
|
||||||
}
|
}
|
||||||
|
@ -262,34 +163,21 @@ PR_Opcode_Find (const char *name, int priority, def_t *var_a, def_t *var_b, def_
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
opcode_t *
|
|
||||||
PR_Opcode (short opcode)
|
|
||||||
{
|
|
||||||
opcode_t op;
|
|
||||||
char rep[100];
|
|
||||||
|
|
||||||
op.opcode = opcode;
|
|
||||||
strcpy (rep, get_key (&op, &opcode_table));
|
|
||||||
return Hash_Find (opcode_table, rep);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
PR_Opcode_Init (void)
|
PR_Opcode_Init_Tables (void)
|
||||||
{
|
{
|
||||||
int i;
|
opcode_t *op;
|
||||||
|
|
||||||
opcode_table = Hash_NewTable (1021, get_key, 0, &opcode_table);
|
PR_Opcode_Init ();
|
||||||
opcode_priority_table = Hash_NewTable (1021, get_key, 0,
|
opcode_priority_table = Hash_NewTable (1021, get_key, 0,
|
||||||
&opcode_priority_table);
|
&opcode_priority_table);
|
||||||
opcode_priority_type_table_ab = Hash_NewTable (1021, get_key, 0,
|
opcode_priority_type_table_ab = Hash_NewTable (1021, get_key, 0,
|
||||||
&opcode_priority_type_table_ab);
|
&opcode_priority_type_table_ab);
|
||||||
opcode_priority_type_table_abc = Hash_NewTable (1021, get_key, 0,
|
opcode_priority_type_table_abc = Hash_NewTable (1021, get_key, 0,
|
||||||
&opcode_priority_type_table_abc);
|
&opcode_priority_type_table_abc);
|
||||||
for (i = 0; i < sizeof (pr_opcodes) / sizeof (pr_opcodes[0]); i++) {
|
for (op = pr_opcodes; op->name; op++) {
|
||||||
opcode_t *op = &pr_opcodes[i];
|
|
||||||
if (op->min_version > options.version)
|
if (op->min_version > options.version)
|
||||||
continue;
|
continue;
|
||||||
Hash_Add (opcode_table, op);
|
|
||||||
Hash_Add (opcode_priority_table, op);
|
Hash_Add (opcode_priority_table, op);
|
||||||
Hash_Add (opcode_priority_type_table_ab, op);
|
Hash_Add (opcode_priority_type_table_ab, op);
|
||||||
Hash_Add (opcode_priority_type_table_abc, op);
|
Hash_Add (opcode_priority_type_table_abc, op);
|
||||||
|
|
|
@ -963,7 +963,7 @@ Options: \n\
|
||||||
printf ("Source directory: %s\n", sourcedir);
|
printf ("Source directory: %s\n", sourcedir);
|
||||||
}
|
}
|
||||||
|
|
||||||
PR_Opcode_Init ();
|
PR_Opcode_Init_Tables ();
|
||||||
|
|
||||||
InitData ();
|
InitData ();
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue