mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-23 20:33:05 +00:00
Merge branch 'blub/ast-and-ir-merging' of github.com:graphitemaster/gmqcc into ast-and-ir
This commit is contained in:
commit
434bf4b5b2
5 changed files with 58 additions and 68 deletions
2
ast.c
2
ast.c
|
@ -89,7 +89,7 @@ void ast_value_delete(ast_value* self)
|
|||
if (self->isconst) {
|
||||
switch (self->vtype)
|
||||
{
|
||||
case qc_string:
|
||||
case TYPE_STRING:
|
||||
mem_d((void*)self->constval.vstring);
|
||||
break;
|
||||
/* NOTE: delete function? currently collected in
|
||||
|
|
16
astir.h
16
astir.h
|
@ -134,22 +134,6 @@ MEM_VEC_FUNCTIONS(Tself, Twhat, mem) \
|
|||
_MEM_VEC_FUN_CLEAR(Tself, mem) \
|
||||
_MEM_VEC_FUN_FIND(Tself, Twhat, mem)
|
||||
|
||||
enum qc_types {
|
||||
/* Main QC types */
|
||||
qc_void,
|
||||
qc_float,
|
||||
qc_vector,
|
||||
qc_entity,
|
||||
qc_string,
|
||||
|
||||
qc_int,
|
||||
|
||||
/* "virtual" and internal types */
|
||||
qc_pointer,
|
||||
qc_variant, /* eg. OFS_RETURN/PARAM... */
|
||||
qc_function,
|
||||
};
|
||||
|
||||
enum store_types {
|
||||
store_global,
|
||||
store_local, /* local, assignable for now, should get promoted later */
|
||||
|
|
4
gmqcc.h
4
gmqcc.h
|
@ -276,7 +276,9 @@ enum {
|
|||
TYPE_ENTITY ,
|
||||
TYPE_FIELD ,
|
||||
TYPE_FUNCTION ,
|
||||
TYPE_POINTER
|
||||
TYPE_POINTER ,
|
||||
/* TYPE_INTEGER , */
|
||||
TYPE_VARIANT ,
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
102
ir.c
102
ir.c
|
@ -45,7 +45,7 @@ ir_builder* ir_builder_new(const char *modulename)
|
|||
/* globals which always exist */
|
||||
|
||||
/* for now we give it a vector size */
|
||||
ir_builder_create_global(self, "OFS_RETURN", qc_variant);
|
||||
ir_builder_create_global(self, "OFS_RETURN", TYPE_VARIANT);
|
||||
|
||||
return self;
|
||||
}
|
||||
|
@ -147,7 +147,7 @@ ir_function* ir_function_new(ir_builder* owner)
|
|||
self->owner = owner;
|
||||
self->context.file = "<@no context>";
|
||||
self->context.line = 0;
|
||||
self->retype = qc_void;
|
||||
self->retype = TYPE_VOID;
|
||||
MEM_VECTOR_INIT(self, params);
|
||||
MEM_VECTOR_INIT(self, blocks);
|
||||
MEM_VECTOR_INIT(self, values);
|
||||
|
@ -414,7 +414,7 @@ void ir_value_delete(ir_value* self)
|
|||
mem_d((void*)self->name);
|
||||
if (self->isconst)
|
||||
{
|
||||
if (self->vtype == qc_string)
|
||||
if (self->vtype == TYPE_STRING)
|
||||
mem_d((void*)self->constval.vstring);
|
||||
}
|
||||
MEM_VECTOR_CLEAR(self, reads);
|
||||
|
@ -432,7 +432,7 @@ void ir_value_set_name(ir_value *self, const char *name)
|
|||
|
||||
bool ir_value_set_float(ir_value *self, float f)
|
||||
{
|
||||
if (self->vtype != qc_float)
|
||||
if (self->vtype != TYPE_FLOAT)
|
||||
return false;
|
||||
self->constval.vfloat = f;
|
||||
self->isconst = true;
|
||||
|
@ -441,7 +441,7 @@ bool ir_value_set_float(ir_value *self, float f)
|
|||
|
||||
bool ir_value_set_vector(ir_value *self, vector_t v)
|
||||
{
|
||||
if (self->vtype != qc_vector)
|
||||
if (self->vtype != TYPE_VECTOR)
|
||||
return false;
|
||||
self->constval.vvec = v;
|
||||
self->isconst = true;
|
||||
|
@ -450,21 +450,23 @@ bool ir_value_set_vector(ir_value *self, vector_t v)
|
|||
|
||||
bool ir_value_set_string(ir_value *self, const char *str)
|
||||
{
|
||||
if (self->vtype != qc_string)
|
||||
if (self->vtype != TYPE_STRING)
|
||||
return false;
|
||||
self->constval.vstring = util_strdup(str);
|
||||
self->isconst = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
#if 0
|
||||
bool ir_value_set_int(ir_value *self, int i)
|
||||
{
|
||||
if (self->vtype != qc_int)
|
||||
if (self->vtype != TYPE_INTEGER)
|
||||
return false;
|
||||
self->constval.vint = i;
|
||||
self->isconst = true;
|
||||
return true;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool ir_value_lives(ir_value *self, size_t at)
|
||||
{
|
||||
|
@ -582,38 +584,38 @@ bool ir_block_create_store(ir_block *self, ir_value *target, ir_value *what)
|
|||
{
|
||||
int op = 0;
|
||||
int vtype;
|
||||
if (target->vtype == qc_variant)
|
||||
if (target->vtype == TYPE_VARIANT)
|
||||
vtype = what->vtype;
|
||||
else
|
||||
vtype = target->vtype;
|
||||
|
||||
switch (vtype) {
|
||||
case qc_float:
|
||||
case TYPE_FLOAT:
|
||||
#if 0
|
||||
if (what->vtype == qc_int)
|
||||
if (what->vtype == TYPE_INTEGER)
|
||||
op = INSTR_CONV_ITOF;
|
||||
else
|
||||
#endif
|
||||
op = INSTR_STORE_F;
|
||||
break;
|
||||
case qc_vector:
|
||||
case TYPE_VECTOR:
|
||||
op = INSTR_STORE_V;
|
||||
break;
|
||||
case qc_entity:
|
||||
case TYPE_ENTITY:
|
||||
op = INSTR_STORE_ENT;
|
||||
break;
|
||||
case qc_string:
|
||||
case TYPE_STRING:
|
||||
op = INSTR_STORE_S;
|
||||
break;
|
||||
#if 0
|
||||
case qc_int:
|
||||
if (what->vtype == qc_int)
|
||||
case TYPE_INTEGER:
|
||||
if (what->vtype == TYPE_INTEGER)
|
||||
op = INSTR_CONV_FTOI;
|
||||
else
|
||||
op = INSTR_STORE_I;
|
||||
break;
|
||||
#endif
|
||||
case qc_pointer:
|
||||
case TYPE_POINTER:
|
||||
#if 0
|
||||
op = INSTR_STORE_I;
|
||||
#else
|
||||
|
@ -654,7 +656,7 @@ bool ir_block_create_if(ir_block *self, ir_value *v,
|
|||
return false;
|
||||
}
|
||||
self->final = true;
|
||||
//in = ir_instr_new(self, (v->vtype == qc_string ? INSTR_IF_S : INSTR_IF_F));
|
||||
//in = ir_instr_new(self, (v->vtype == TYPE_STRING ? INSTR_IF_S : INSTR_IF_F));
|
||||
in = ir_instr_new(self, VINSTR_COND);
|
||||
if (!in)
|
||||
return false;
|
||||
|
@ -783,7 +785,7 @@ ir_value* ir_block_create_binop(ir_block *self,
|
|||
const char *label, int opcode,
|
||||
ir_value *left, ir_value *right)
|
||||
{
|
||||
int ot = qc_void;
|
||||
int ot = TYPE_VOID;
|
||||
switch (opcode) {
|
||||
case INSTR_ADD_F:
|
||||
case INSTR_SUB_F:
|
||||
|
@ -815,7 +817,7 @@ ir_value* ir_block_create_binop(ir_block *self,
|
|||
case INSTR_EQ_I:
|
||||
case INSTR_NE_I:
|
||||
#endif
|
||||
ot = qc_float;
|
||||
ot = TYPE_FLOAT;
|
||||
break;
|
||||
#if 0
|
||||
case INSTR_ADD_I:
|
||||
|
@ -831,7 +833,7 @@ ir_value* ir_block_create_binop(ir_block *self,
|
|||
case INSTR_XOR_I:
|
||||
case INSTR_RSHIFT_I:
|
||||
case INSTR_LSHIFT_I:
|
||||
ot = qc_int;
|
||||
ot = TYPE_INTEGER;
|
||||
break;
|
||||
#endif
|
||||
case INSTR_ADD_V:
|
||||
|
@ -843,27 +845,27 @@ ir_value* ir_block_create_binop(ir_block *self,
|
|||
case INSTR_MUL_IV:
|
||||
case INSTR_MUL_VI:
|
||||
#endif
|
||||
ot = qc_vector;
|
||||
ot = TYPE_VECTOR;
|
||||
break;
|
||||
#if 0
|
||||
case INSTR_ADD_SF:
|
||||
ot = qc_pointer;
|
||||
ot = TYPE_POINTER;
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
// ranges:
|
||||
/* boolean operations result in floats */
|
||||
if (opcode >= INSTR_EQ_F && opcode <= INSTR_GT)
|
||||
ot = qc_float;
|
||||
ot = TYPE_FLOAT;
|
||||
else if (opcode >= INSTR_LE && opcode <= INSTR_GT)
|
||||
ot = qc_float;
|
||||
ot = TYPE_FLOAT;
|
||||
#if 0
|
||||
else if (opcode >= INSTR_LE_I && opcode <= INSTR_EQ_FI)
|
||||
ot = qc_float;
|
||||
ot = TYPE_FLOAT;
|
||||
#endif
|
||||
break;
|
||||
};
|
||||
if (ot == qc_void) {
|
||||
if (ot == TYPE_VOID) {
|
||||
/* The AST or parser were supposed to check this! */
|
||||
return NULL;
|
||||
}
|
||||
|
@ -906,23 +908,23 @@ ir_value* ir_block_create_add(ir_block *self,
|
|||
switch (l) {
|
||||
default:
|
||||
return NULL;
|
||||
case qc_float:
|
||||
case TYPE_FLOAT:
|
||||
op = INSTR_ADD_F;
|
||||
break;
|
||||
#if 0
|
||||
case qc_int:
|
||||
case TYPE_INTEGER:
|
||||
op = INSTR_ADD_I;
|
||||
break;
|
||||
#endif
|
||||
case qc_vector:
|
||||
case TYPE_VECTOR:
|
||||
op = INSTR_ADD_V;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
#if 0
|
||||
if ( (l == qc_float && r == qc_int) )
|
||||
if ( (l == TYPE_FLOAT && r == TYPE_INTEGER) )
|
||||
op = INSTR_ADD_FI;
|
||||
else if ( (l == qc_int && r == qc_float) )
|
||||
else if ( (l == TYPE_INTEGER && r == TYPE_FLOAT) )
|
||||
op = INSTR_ADD_IF;
|
||||
else
|
||||
#endif
|
||||
|
@ -943,23 +945,23 @@ ir_value* ir_block_create_sub(ir_block *self,
|
|||
switch (l) {
|
||||
default:
|
||||
return NULL;
|
||||
case qc_float:
|
||||
case TYPE_FLOAT:
|
||||
op = INSTR_SUB_F;
|
||||
break;
|
||||
#if 0
|
||||
case qc_int:
|
||||
case TYPE_INTEGER:
|
||||
op = INSTR_SUB_I;
|
||||
break;
|
||||
#endif
|
||||
case qc_vector:
|
||||
case TYPE_VECTOR:
|
||||
op = INSTR_SUB_V;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
#if 0
|
||||
if ( (l == qc_float && r == qc_int) )
|
||||
if ( (l == TYPE_FLOAT && r == TYPE_INTEGER) )
|
||||
op = INSTR_SUB_FI;
|
||||
else if ( (l == qc_int && r == qc_float) )
|
||||
else if ( (l == TYPE_INTEGER && r == TYPE_FLOAT) )
|
||||
op = INSTR_SUB_IF;
|
||||
else
|
||||
#endif
|
||||
|
@ -980,31 +982,31 @@ ir_value* ir_block_create_mul(ir_block *self,
|
|||
switch (l) {
|
||||
default:
|
||||
return NULL;
|
||||
case qc_float:
|
||||
case TYPE_FLOAT:
|
||||
op = INSTR_MUL_F;
|
||||
break;
|
||||
#if 0
|
||||
case qc_int:
|
||||
case TYPE_INTEGER:
|
||||
op = INSTR_MUL_I;
|
||||
break;
|
||||
#endif
|
||||
case qc_vector:
|
||||
case TYPE_VECTOR:
|
||||
op = INSTR_MUL_V;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
if ( (l == qc_vector && r == qc_float) )
|
||||
if ( (l == TYPE_VECTOR && r == TYPE_FLOAT) )
|
||||
op = INSTR_MUL_VF;
|
||||
else if ( (l == qc_float && r == qc_vector) )
|
||||
else if ( (l == TYPE_FLOAT && r == TYPE_VECTOR) )
|
||||
op = INSTR_MUL_FV;
|
||||
#if 0
|
||||
else if ( (l == qc_vector && r == qc_int) )
|
||||
else if ( (l == TYPE_VECTOR && r == TYPE_INTEGER) )
|
||||
op = INSTR_MUL_VI;
|
||||
else if ( (l == qc_int && r == qc_vector) )
|
||||
else if ( (l == TYPE_INTEGER && r == TYPE_VECTOR) )
|
||||
op = INSTR_MUL_IV;
|
||||
else if ( (l == qc_float && r == qc_int) )
|
||||
else if ( (l == TYPE_FLOAT && r == TYPE_INTEGER) )
|
||||
op = INSTR_MUL_FI;
|
||||
else if ( (l == qc_int && r == qc_float) )
|
||||
else if ( (l == TYPE_INTEGER && r == TYPE_FLOAT) )
|
||||
op = INSTR_MUL_IF;
|
||||
#endif
|
||||
else
|
||||
|
@ -1025,22 +1027,22 @@ ir_value* ir_block_create_div(ir_block *self,
|
|||
switch (l) {
|
||||
default:
|
||||
return NULL;
|
||||
case qc_float:
|
||||
case TYPE_FLOAT:
|
||||
op = INSTR_DIV_F;
|
||||
break;
|
||||
#if 0
|
||||
case qc_int:
|
||||
case TYPE_INTEGER:
|
||||
op = INSTR_DIV_I;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
#if 0
|
||||
if ( (l == qc_vector && r == qc_float) )
|
||||
if ( (l == TYPE_VECTOR && r == TYPE_FLOAT) )
|
||||
op = INSTR_DIV_VF;
|
||||
else if ( (l == qc_float && r == qc_int) )
|
||||
else if ( (l == TYPE_FLOAT && r == TYPE_INTEGER) )
|
||||
op = INSTR_DIV_FI;
|
||||
else if ( (l == qc_int && r == qc_float) )
|
||||
else if ( (l == TYPE_INTEGER && r == TYPE_FLOAT) )
|
||||
op = INSTR_DIV_IF;
|
||||
else
|
||||
#endif
|
||||
|
|
2
ir.h
2
ir.h
|
@ -71,7 +71,9 @@ MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, reads)
|
|||
MEM_VECTOR_PROTO_ALL(ir_value, struct ir_instr_s*, writes)
|
||||
|
||||
bool GMQCC_WARN ir_value_set_float(ir_value*, float f);
|
||||
#if 0
|
||||
bool GMQCC_WARN ir_value_set_int(ir_value*, int i);
|
||||
#endif
|
||||
bool GMQCC_WARN ir_value_set_string(ir_value*, const char *s);
|
||||
bool GMQCC_WARN ir_value_set_vector(ir_value*, vector_t v);
|
||||
/*bool ir_value_set_pointer_v(ir_value*, ir_value* p); */
|
||||
|
|
Loading…
Reference in a new issue