X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ir.c;h=7f9cdb1e4d7a57359fb3dc14d2fdba8ad6bce021;hb=2bfd27271444c99d02ac8de3135c6a7981b18286;hp=0c0517a54d791cfdd248efcd98d8b4433fa8e9f4;hpb=a4617d0e610380f9048499114b3fc086876bb7eb;p=xonotic%2Fgmqcc.git diff --git a/ir.c b/ir.c index 0c0517a..7f9cdb1 100644 --- a/ir.c +++ b/ir.c @@ -29,6 +29,23 @@ * Type sizes used at multiple points in the IR codegen */ +const char *type_name[TYPE_COUNT] = { + "void", + "string", + "float", + "vector", + "entity", + "field", + "function", + "pointer", +#if 0 + "integer", +#endif + "quaternion", + "matrix", + "variant" +}; + size_t type_sizeof[TYPE_COUNT] = { 1, /* TYPE_VOID */ 1, /* TYPE_STRING */ @@ -41,7 +58,9 @@ size_t type_sizeof[TYPE_COUNT] = { #if 0 1, /* TYPE_INTEGER */ #endif - 3, /* TYPE_VARIANT */ + 4, /* TYPE_QUATERNION */ + 16, /* TYPE_MATRIX */ + 16, /* TYPE_VARIANT */ }; uint16_t type_store_instr[TYPE_COUNT] = { @@ -54,9 +73,12 @@ uint16_t type_store_instr[TYPE_COUNT] = { INSTR_STORE_FNC, INSTR_STORE_ENT, /* should use I */ #if 0 - INSTR_STORE_ENT, /* integer type */ + INSTR_STORE_I, /* integer type */ #endif - INSTR_STORE_V, /* variant, should never be accessed */ + INSTR_STORE_Q, + INSTR_STORE_M, + + INSTR_STORE_M, /* variant, should never be accessed */ }; uint16_t type_storep_instr[TYPE_COUNT] = { @@ -71,7 +93,10 @@ uint16_t type_storep_instr[TYPE_COUNT] = { #if 0 INSTR_STOREP_ENT, /* integer type */ #endif - INSTR_STOREP_V, /* variant, should never be accessed */ + INSTR_STOREP_Q, + INSTR_STOREP_M, + + INSTR_STOREP_M, /* variant, should never be accessed */ }; MEM_VEC_FUNCTIONS(ir_value_vector, ir_value*, v) @@ -181,9 +206,14 @@ ir_value* ir_builder_get_global(ir_builder *self, const char *name) ir_value* ir_builder_create_global(ir_builder *self, const char *name, int vtype) { - ir_value *ve = ir_builder_get_global(self, name); - if (ve) { - return NULL; + ir_value *ve; + + if (name && name[0] != '#') + { + ve = ir_builder_get_global(self, name); + if (ve) { + return NULL; + } } ve = ir_value_var(name, store_global, vtype); @@ -574,6 +604,24 @@ bool ir_value_set_vector(ir_value *self, vector v) return true; } +bool ir_value_set_quaternion(ir_value *self, quaternion v) +{ + if (self->vtype != TYPE_QUATERNION) + return false; + memcpy(&self->constval.vquat, v, sizeof(self->constval.vquat)); + self->isconst = true; + return true; +} + +bool ir_value_set_matrix(ir_value *self, matrix v) +{ + if (self->vtype != TYPE_MATRIX) + return false; + memcpy(&self->constval.vmat, v, sizeof(self->constval.vmat)); + self->isconst = true; + return true; +} + bool ir_value_set_string(ir_value *self, const char *str) { if (self->vtype != TYPE_STRING) @@ -877,7 +925,6 @@ bool ir_block_create_storep(ir_block *self, ir_value *target, ir_value *what) vtype = what->vtype; op = type_storep_instr[vtype]; - return ir_block_create_store_op(self, op, target, what); } @@ -1235,6 +1282,8 @@ ir_value* ir_block_create_load_from_ent(ir_block *self, const char *label, ir_va case TYPE_POINTER: op = INSTR_LOAD_I; break; case TYPE_INTEGER: op = INSTR_LOAD_I; break; #endif + case TYPE_QUATERNION: op = INSTR_LOAD_Q; break; + case TYPE_MATRIX: op = INSTR_LOAD_M; break; default: return NULL; } @@ -1338,12 +1387,22 @@ ir_value* ir_block_create_mul(ir_block *self, case TYPE_VECTOR: op = INSTR_MUL_V; break; + case TYPE_QUATERNION: + op = INSTR_MUL_Q; + break; + case TYPE_MATRIX: + op = INSTR_MUL_M; + break; } } else { if ( (l == TYPE_VECTOR && r == TYPE_FLOAT) ) op = INSTR_MUL_VF; else if ( (l == TYPE_FLOAT && r == TYPE_VECTOR) ) op = INSTR_MUL_FV; + else if ( (l == TYPE_QUATERNION && r == TYPE_FLOAT) ) + op = INSTR_MUL_QF; + else if ( (l == TYPE_MATRIX && r == TYPE_FLOAT) ) + op = INSTR_MUL_MF; #if 0 else if ( (l == TYPE_VECTOR && r == TYPE_INTEGER) ) op = INSTR_MUL_VI; @@ -2371,6 +2430,7 @@ static bool gen_global_function(ir_builder *ir, ir_value *global) static bool ir_builder_gen_global(ir_builder *self, ir_value *global) { + size_t i; int32_t *iptr; prog_section_def def; @@ -2414,6 +2474,8 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global) return global->code.globaladdr >= 0; } case TYPE_VECTOR: + case TYPE_QUATERNION: + case TYPE_MATRIX: { size_t d; if (code_defs_add(def) < 0) @@ -2450,8 +2512,8 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global) case TYPE_VARIANT: /* assume biggest type */ global->code.globaladdr = code_globals_add(0); - code_globals_add(0); - code_globals_add(0); + for (i = 1; i < type_sizeof[TYPE_VARIANT]; ++i) + code_globals_add(0); return true; default: /* refuse to create 'void' type or any other fancy business. */ @@ -2628,6 +2690,7 @@ void ir_value_dump(ir_value* v, int (*oprintf)(const char*, ...)) { if (v->isconst) { switch (v->vtype) { + default: case TYPE_VOID: oprintf("(void)"); break;