mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-01-18 14:21:36 +00:00
type_storep_instr: in theory we could use type_store_instr + INSTR_STOREP_F - INSTR_STORE_F, however, this won't work later when TYPE_INTEGER comes in since the _I instructions are at a seperate place
This commit is contained in:
parent
db62b7b3bc
commit
478d5ef5ad
2 changed files with 22 additions and 36 deletions
6
gmqcc.h
6
gmqcc.h
|
@ -372,6 +372,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
|
||||
|
|
52
ir.c
52
ir.c
|
@ -59,6 +59,21 @@ uint16_t type_store_instr[TYPE_COUNT] = {
|
|||
INSTR_STORE_V, /* 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_V, /* variant, should never be accessed */
|
||||
};
|
||||
|
||||
MEM_VEC_FUNCTIONS(ir_value_vector, ir_value*, v)
|
||||
|
||||
/***********************************************************************
|
||||
|
@ -835,7 +850,6 @@ bool ir_block_create_store(ir_block *self, ir_value *target, ir_value *what)
|
|||
op = INSTR_CONV_ITOF;
|
||||
else if (vtype == TYPE_INTEGER && what->vtype == TYPE_FLOAT)
|
||||
op = INSTR_CONV_FTOI;
|
||||
else
|
||||
#endif
|
||||
op = type_store_instr[vtype];
|
||||
|
||||
|
@ -855,41 +869,7 @@ bool ir_block_create_storep(ir_block *self, ir_value *target, ir_value *what)
|
|||
*/
|
||||
vtype = what->vtype;
|
||||
|
||||
op = type_store_instr[vtype] + (INSTR_STOREP_F - INSTR_STORE_F);
|
||||
#if 0
|
||||
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;
|
||||
default:
|
||||
/* Unknown type */
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
op = type_storep_instr[vtype];
|
||||
|
||||
return ir_block_create_store_op(self, op, target, what);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue