]> git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - ir.c
Don't generate IF/IFNOT with +1 offsets
[xonotic/gmqcc.git] / ir.c
diff --git a/ir.c b/ir.c
index b31c0629b25f25e8cb3756a6b969cee69cd69f08..f5ad97e3cd2b7aea35da25f7743e5f0e082066c2 100644 (file)
--- a/ir.c
+++ b/ir.c
@@ -2712,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) {
@@ -2741,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;
@@ -3147,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;
@@ -3198,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 */
@@ -3253,6 +3309,8 @@ static bool ir_builder_gen_global(ir_builder *self, ir_value *global, bool isloc
             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:
@@ -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;
 }