mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2024-11-23 20:33:05 +00:00
Merging master
This commit is contained in:
commit
49f3980360
2 changed files with 32 additions and 83 deletions
6
gmqcc.h
6
gmqcc.h
|
@ -374,6 +374,12 @@ enum {
|
|||
|
||||
extern size_t type_sizeof[TYPE_COUNT];
|
||||
extern uint16_t type_store_instr[TYPE_COUNT];
|
||||
/* could use type_store_instr + INSTR_STOREP_F - INSTR_STORE_F
|
||||
* but this breaks when TYPE_INTEGER is added, since with the enhanced
|
||||
* instruction set, the old ones are left untouched, thus the _I instructions
|
||||
* are at a seperate place.
|
||||
*/
|
||||
extern uint16_t type_storep_instr[TYPE_COUNT];
|
||||
|
||||
/*
|
||||
* Each paramater incerements by 3 since vector types hold
|
||||
|
|
105
ir.c
105
ir.c
|
@ -64,6 +64,24 @@ uint16_t type_store_instr[TYPE_COUNT] = {
|
|||
INSTR_STORE_M, /* variant, should never be accessed */
|
||||
};
|
||||
|
||||
uint16_t type_store_instr[TYPE_COUNT] = {
|
||||
INSTR_STOREP_F, /* should use I when having integer support */
|
||||
INSTR_STOREP_S,
|
||||
INSTR_STOREP_F,
|
||||
INSTR_STOREP_V,
|
||||
INSTR_STOREP_ENT,
|
||||
INSTR_STOREP_FLD,
|
||||
INSTR_STOREP_FNC,
|
||||
INSTR_STOREP_ENT, /* should use I */
|
||||
#if 0
|
||||
INSTR_STOREP_ENT, /* integer type */
|
||||
#endif
|
||||
INSTR_STOREP_Q,
|
||||
INSTR_STOREP_M,
|
||||
|
||||
INSTR_STOREP_M, /* variant, should never be accessed */
|
||||
};
|
||||
|
||||
MEM_VEC_FUNCTIONS(ir_value_vector, ir_value*, v)
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -853,52 +871,14 @@ bool ir_block_create_store(ir_block *self, ir_value *target, ir_value *what)
|
|||
else
|
||||
vtype = target->vtype;
|
||||
|
||||
switch (vtype) {
|
||||
case TYPE_FLOAT:
|
||||
#if 0
|
||||
if (what->vtype == TYPE_INTEGER)
|
||||
if (vtype == TYPE_FLOAT && what->vtype == TYPE_INTEGER)
|
||||
op = INSTR_CONV_ITOF;
|
||||
else
|
||||
#endif
|
||||
op = INSTR_STORE_F;
|
||||
break;
|
||||
case TYPE_VECTOR:
|
||||
op = INSTR_STORE_V;
|
||||
break;
|
||||
case TYPE_ENTITY:
|
||||
op = INSTR_STORE_ENT;
|
||||
break;
|
||||
case TYPE_STRING:
|
||||
op = INSTR_STORE_S;
|
||||
break;
|
||||
case TYPE_FIELD:
|
||||
op = INSTR_STORE_FLD;
|
||||
break;
|
||||
#if 0
|
||||
case TYPE_INTEGER:
|
||||
if (what->vtype == TYPE_INTEGER)
|
||||
else if (vtype == TYPE_INTEGER && what->vtype == TYPE_FLOAT)
|
||||
op = INSTR_CONV_FTOI;
|
||||
else
|
||||
op = INSTR_STORE_I;
|
||||
break;
|
||||
#endif
|
||||
case TYPE_POINTER:
|
||||
#if 0
|
||||
op = INSTR_STORE_I;
|
||||
#else
|
||||
op = INSTR_STORE_ENT;
|
||||
#endif
|
||||
break;
|
||||
case TYPE_QUATERNION:
|
||||
op = INSTR_STORE_Q;
|
||||
break;
|
||||
case TYPE_MATRIX:
|
||||
op = INSTR_STORE_M;
|
||||
break;
|
||||
default:
|
||||
/* Unknown type */
|
||||
return false;
|
||||
}
|
||||
op = type_store_instr[vtype];
|
||||
|
||||
return ir_block_create_store_op(self, op, target, what);
|
||||
}
|
||||
|
||||
|
@ -915,44 +895,7 @@ bool ir_block_create_storep(ir_block *self, ir_value *target, ir_value *what)
|
|||
*/
|
||||
vtype = what->vtype;
|
||||
|
||||
switch (vtype) {
|
||||
case TYPE_FLOAT:
|
||||
op = INSTR_STOREP_F;
|
||||
break;
|
||||
case TYPE_VECTOR:
|
||||
op = INSTR_STOREP_V;
|
||||
break;
|
||||
case TYPE_ENTITY:
|
||||
op = INSTR_STOREP_ENT;
|
||||
break;
|
||||
case TYPE_STRING:
|
||||
op = INSTR_STOREP_S;
|
||||
break;
|
||||
case TYPE_FIELD:
|
||||
op = INSTR_STOREP_FLD;
|
||||
break;
|
||||
#if 0
|
||||
case TYPE_INTEGER:
|
||||
op = INSTR_STOREP_I;
|
||||
break;
|
||||
#endif
|
||||
case TYPE_POINTER:
|
||||
#if 0
|
||||
op = INSTR_STOREP_I;
|
||||
#else
|
||||
op = INSTR_STOREP_ENT;
|
||||
#endif
|
||||
break;
|
||||
case TYPE_QUATERNION:
|
||||
op = INSTR_STOREP_Q;
|
||||
break;
|
||||
case TYPE_MATRIX:
|
||||
op = INSTR_STOREP_M;
|
||||
break;
|
||||
default:
|
||||
/* Unknown type */
|
||||
return false;
|
||||
}
|
||||
op = type_storep_instr[vtype];
|
||||
return ir_block_create_store_op(self, op, target, what);
|
||||
}
|
||||
|
||||
|
@ -2509,7 +2452,7 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global)
|
|||
global->code.globaladdr = code_globals_add(iptr[0]);
|
||||
if (global->code.globaladdr < 0)
|
||||
return false;
|
||||
for (d = 1; d < jype_sizeof[global->vtype]; ++d)
|
||||
for (d = 1; d < type_sizeof[global->vtype]; ++d)
|
||||
{
|
||||
if (code_globals_add(iptr[d]) < 0)
|
||||
return false;
|
||||
|
|
Loading…
Reference in a new issue