X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;f=ir.c;h=f5ad97e3cd2b7aea35da25f7743e5f0e082066c2;hb=d9cca87aff2b4f0def2c852e92edde49cf58999f;hp=9f6abb2ef18cc5303ec111386a022f00708163c3;hpb=83a41d13c07c21371a5205c8b0f9e5d4878d0dc7;p=xonotic%2Fgmqcc.git diff --git a/ir.c b/ir.c index 9f6abb2..f5ad97e 100644 --- a/ir.c +++ b/ir.c @@ -2691,7 +2691,8 @@ tailcall: stmt.o1.s1 = (target->code_start) - vec_size(code_statements); stmt.o2.s1 = 0; stmt.o3.s1 = 0; - code_push_statement(&stmt, instr->context.line); + if (stmt.o1.s1 != 1) + code_push_statement(&stmt, instr->context.line); /* no further instructions can be in this block */ return true; @@ -2711,12 +2712,14 @@ tailcall: if (ontrue->generated) { stmt.opcode = INSTR_IF; stmt.o2.s1 = (ontrue->code_start) - vec_size(code_statements); - code_push_statement(&stmt, instr->context.line); + if (stmt.o2.s1 != 1) + code_push_statement(&stmt, instr->context.line); } if (onfalse->generated) { stmt.opcode = INSTR_IFNOT; stmt.o2.s1 = (onfalse->code_start) - vec_size(code_statements); - code_push_statement(&stmt, instr->context.line); + if (stmt.o2.s1 != 1) + code_push_statement(&stmt, instr->context.line); } if (!ontrue->generated) { if (onfalse->generated) { @@ -2740,7 +2743,8 @@ tailcall: ontrue = tmp; } stidx = vec_size(code_statements); - code_push_statement(&stmt, instr->context.line); + if (stmt.o2.s1 != 1) + code_push_statement(&stmt, instr->context.line); /* on false we jump, so add ontrue-path */ if (!gen_blocks_recursive(func, ontrue)) return false; @@ -2765,7 +2769,8 @@ tailcall: stmt.o1.s1 = (onfalse->code_start) - vec_size(code_statements); stmt.o2.s1 = 0; stmt.o3.s1 = 0; - code_push_statement(&stmt, instr->context.line); + if (stmt.o1.s1 != 1) + code_push_statement(&stmt, instr->context.line); return true; } /* if not, generate now */ @@ -3145,6 +3150,58 @@ static bool gen_global_function_code(ir_builder *ir, ir_value *global) return true; } +static void gen_vector_defs(prog_section_def def, const char *name) +{ + char *component; + size_t len, i; + + if (!name || OPTS_FLAG(SINGLE_VECTOR_DEFS)) + return; + + len = strlen(name); + + component = (char*)mem_a(len+3); + memcpy(component, name, len); + len += 2; + component[len-0] = 0; + component[len-2] = '_'; + + component[len-1] = 'x'; + + for (i = 0; i < 3; ++i) { + def.name = code_genstring(component); + vec_push(code_defs, def); + def.offset++; + component[len-1]++; + } +} + +static void gen_vector_fields(prog_section_field fld, const char *name) +{ + char *component; + size_t len, i; + + if (!name || OPTS_FLAG(SINGLE_VECTOR_DEFS)) + return; + + len = strlen(name); + + component = (char*)mem_a(len+3); + memcpy(component, name, len); + len += 2; + component[len-0] = 0; + component[len-2] = '_'; + + component[len-1] = 'x'; + + for (i = 0; i < 3; ++i) { + fld.name = code_genstring(component); + vec_push(code_fields, fld); + fld.offset++; + component[len-1]++; + } +} + static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool islocal) { size_t i; @@ -3196,6 +3253,7 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool isloc return gen_global_pointer(global); case TYPE_FIELD: vec_push(code_defs, def); + gen_vector_defs(def, global->name); return gen_global_field(global); case TYPE_ENTITY: /* fall through */ @@ -3207,9 +3265,9 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool isloc vec_push(code_globals, *iptr); } else { vec_push(code_globals, 0); - if (!islocal) - def.type |= DEF_SAVEGLOBAL; } + if (!islocal && global->cvq != CV_CONST) + def.type |= DEF_SAVEGLOBAL; vec_push(code_defs, def); return global->code.globaladdr >= 0; @@ -3221,9 +3279,9 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool isloc vec_push(code_globals, code_genstring(global->constval.vstring)); } else { vec_push(code_globals, 0); - if (!islocal) - def.type |= DEF_SAVEGLOBAL; } + if (!islocal && global->cvq != CV_CONST) + def.type |= DEF_SAVEGLOBAL; vec_push(code_defs, def); return global->code.globaladdr >= 0; } @@ -3236,23 +3294,23 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool isloc vec_push(code_globals, iptr[0]); if (global->code.globaladdr < 0) return false; - for (d = 1; d < type_sizeof[global->vtype]; ++d) - { + for (d = 1; d < type_sizeof[global->vtype]; ++d) { vec_push(code_globals, iptr[d]); } } else { vec_push(code_globals, 0); if (global->code.globaladdr < 0) return false; - for (d = 1; d < type_sizeof[global->vtype]; ++d) - { + for (d = 1; d < type_sizeof[global->vtype]; ++d) { vec_push(code_globals, 0); } - if (!islocal) - def.type |= DEF_SAVEGLOBAL; } + if (!islocal && global->cvq != CV_CONST) + def.type |= DEF_SAVEGLOBAL; vec_push(code_defs, def); + def.type &= ~DEF_SAVEGLOBAL; + gen_vector_defs(def, global->name); return global->code.globaladdr >= 0; } case TYPE_FUNCTION: @@ -3265,9 +3323,9 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool isloc vec_push(code_globals, vec_size(code_functions)); if (!gen_global_function(self, global)) return false; - if (!islocal) - def.type |= DEF_SAVEGLOBAL; } + if (!islocal && global->cvq != CV_CONST) + def.type |= DEF_SAVEGLOBAL; vec_push(code_defs, def); return true; case TYPE_VARIANT: @@ -3352,6 +3410,11 @@ static bool ir_builder_gen_field(ir_builder *self, ir_value *field) vec_push(code_globals, fld.offset+2); } + if (field->fieldtype == TYPE_VECTOR) { + gen_vector_defs(def, field->name); + gen_vector_fields(fld, field->name); + } + return field->code.globaladdr >= 0; }