diff --git a/gmqcc.h b/gmqcc.h index 38db700..99c12f5 100644 --- a/gmqcc.h +++ b/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 diff --git a/ir.c b/ir.c index e35a7d0..1bf5513 100644 --- a/ir.c +++ b/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) - op = INSTR_CONV_ITOF; - else + if (vtype == TYPE_FLOAT && what->vtype == TYPE_INTEGER) + op = INSTR_CONV_ITOF; + else if (vtype == TYPE_INTEGER && what->vtype == TYPE_FLOAT) + op = INSTR_CONV_FTOI; #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) - 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;