]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
merging master
authorWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 12 Aug 2012 09:28:52 +0000 (11:28 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Sun, 12 Aug 2012 09:28:52 +0000 (11:28 +0200)
1  2 
ir.c

diff --combined ir.c
index 78c97c7058e6230e397c4ec8a9da343555a0589c,3ead45edb10093a551bd10184d3d045899dec0b1..81830bebad9e37da56fe26f2b729482c49094646
--- 1/ir.c
--- 2/ir.c
+++ b/ir.c
   * 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   */
@@@ -58,9 -41,7 +58,9 @@@
  #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] = {
      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] = {
  #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)
@@@ -212,14 -187,9 +212,14 @@@ ir_value* ir_builder_get_global(ir_buil
  
  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);
@@@ -694,24 -664,6 +694,24 @@@ bool ir_value_set_vector(ir_value *self
      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_field(ir_value *self, ir_value *fld)
  {
      if (self->vtype != TYPE_FIELD)
@@@ -1432,8 -1384,6 +1432,8 @@@ ir_value* ir_block_create_load_from_ent
          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;
      }
@@@ -1537,22 -1487,12 +1537,22 @@@ ir_value* ir_block_create_mul(ir_block 
              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;
@@@ -2618,8 -2558,6 +2618,8 @@@ static bool ir_builder_gen_global(ir_bu
          return global->code.globaladdr >= 0;
      }
      case TYPE_VECTOR:
 +    case TYPE_QUATERNION:
 +    case TYPE_MATRIX:
      {
          size_t d;
          if (code_defs_add(def) < 0)
@@@ -2779,176 -2717,183 +2779,183 @@@ const char *qc_opname(int op
  
  void ir_builder_dump(ir_builder *b, int (*oprintf)(const char*, ...))
  {
-       size_t i;
-       char indent[IND_BUFSZ];
-       indent[0] = '\t';
-       indent[1] = 0;
-       oprintf("module %s\n", b->name);
-       for (i = 0; i < b->globals_count; ++i)
-       {
-               oprintf("global ");
-               if (b->globals[i]->isconst)
-                       oprintf("%s = ", b->globals[i]->name);
-               ir_value_dump(b->globals[i], oprintf);
-               oprintf("\n");
-       }
-       for (i = 0; i < b->functions_count; ++i)
-               ir_function_dump(b->functions[i], indent, oprintf);
-       oprintf("endmodule %s\n", b->name);
+     size_t i;
+     char indent[IND_BUFSZ];
+     indent[0] = '\t';
+     indent[1] = 0;
+     oprintf("module %s\n", b->name);
+     for (i = 0; i < b->globals_count; ++i)
+     {
+         oprintf("global ");
+         if (b->globals[i]->isconst)
+             oprintf("%s = ", b->globals[i]->name);
+         ir_value_dump(b->globals[i], oprintf);
+         oprintf("\n");
+     }
+     for (i = 0; i < b->functions_count; ++i)
+         ir_function_dump(b->functions[i], indent, oprintf);
+     oprintf("endmodule %s\n", b->name);
  }
  
  void ir_function_dump(ir_function *f, char *ind,
                        int (*oprintf)(const char*, ...))
  {
-       size_t i;
-       if (f->builtin != 0) {
-           oprintf("%sfunction %s = builtin %i\n", ind, f->name, -f->builtin);
-           return;
-       }
-       oprintf("%sfunction %s\n", ind, f->name);
-       strncat(ind, "\t", IND_BUFSZ);
-       if (f->locals_count)
-       {
-               oprintf("%s%i locals:\n", ind, (int)f->locals_count);
-               for (i = 0; i < f->locals_count; ++i) {
-                       oprintf("%s\t", ind);
-                       ir_value_dump(f->locals[i], oprintf);
-                       oprintf("\n");
-               }
-       }
-       if (f->blocks_count)
-       {
-               oprintf("%slife passes (check): %i\n", ind, (int)f->run_id);
-               for (i = 0; i < f->blocks_count; ++i) {
-                   if (f->blocks[i]->run_id != f->run_id) {
-                       oprintf("%slife pass check fail! %i != %i\n", ind, (int)f->blocks[i]->run_id, (int)f->run_id);
-                   }
-                       ir_block_dump(f->blocks[i], ind, oprintf);
-               }
-       }
-       ind[strlen(ind)-1] = 0;
-       oprintf("%sendfunction %s\n", ind, f->name);
+     size_t i;
+     if (f->builtin != 0) {
+         oprintf("%sfunction %s = builtin %i\n", ind, f->name, -f->builtin);
+         return;
+     }
+     oprintf("%sfunction %s\n", ind, f->name);
+     strncat(ind, "\t", IND_BUFSZ);
+     if (f->locals_count)
+     {
+         oprintf("%s%i locals:\n", ind, (int)f->locals_count);
+         for (i = 0; i < f->locals_count; ++i) {
+             oprintf("%s\t", ind);
+             ir_value_dump(f->locals[i], oprintf);
+             oprintf("\n");
+         }
+     }
+     if (f->blocks_count)
+     {
+         oprintf("%slife passes (check): %i\n", ind, (int)f->run_id);
+         for (i = 0; i < f->blocks_count; ++i) {
+             if (f->blocks[i]->run_id != f->run_id) {
+                 oprintf("%slife pass check fail! %i != %i\n", ind, (int)f->blocks[i]->run_id, (int)f->run_id);
+             }
+             ir_block_dump(f->blocks[i], ind, oprintf);
+         }
+     }
+     ind[strlen(ind)-1] = 0;
+     oprintf("%sendfunction %s\n", ind, f->name);
  }
  
  void ir_block_dump(ir_block* b, char *ind,
                     int (*oprintf)(const char*, ...))
  {
-       size_t i;
-       oprintf("%s:%s\n", ind, b->label);
-       strncat(ind, "\t", IND_BUFSZ);
+     size_t i;
+     oprintf("%s:%s\n", ind, b->label);
+     strncat(ind, "\t", IND_BUFSZ);
  
-       for (i = 0; i < b->instr_count; ++i)
-               ir_instr_dump(b->instr[i], ind, oprintf);
-       ind[strlen(ind)-1] = 0;
+     for (i = 0; i < b->instr_count; ++i)
+         ir_instr_dump(b->instr[i], ind, oprintf);
+     ind[strlen(ind)-1] = 0;
  }
  
  void dump_phi(ir_instr *in, char *ind,
                int (*oprintf)(const char*, ...))
  {
-       size_t i;
-       oprintf("%s <- phi ", in->_ops[0]->name);
-       for (i = 0; i < in->phi_count; ++i)
-       {
-               oprintf("([%s] : %s) ", in->phi[i].from->label,
-                                       in->phi[i].value->name);
-       }
-       oprintf("\n");
+     size_t i;
+     oprintf("%s <- phi ", in->_ops[0]->name);
+     for (i = 0; i < in->phi_count; ++i)
+     {
+         oprintf("([%s] : %s) ", in->phi[i].from->label,
+                                 in->phi[i].value->name);
+     }
+     oprintf("\n");
  }
  
  void ir_instr_dump(ir_instr *in, char *ind,
                         int (*oprintf)(const char*, ...))
  {
-       size_t i;
-       const char *comma = NULL;
-       oprintf("%s (%i) ", ind, (int)in->eid);
-       if (in->opcode == VINSTR_PHI) {
-               dump_phi(in, ind, oprintf);
-               return;
-       }
-       strncat(ind, "\t", IND_BUFSZ);
-       if (in->_ops[0] && (in->_ops[1] || in->_ops[2])) {
-               ir_value_dump(in->_ops[0], oprintf);
-               if (in->_ops[1] || in->_ops[2])
-                       oprintf(" <- ");
-       }
-       oprintf("%s\t", qc_opname(in->opcode));
-       if (in->_ops[0] && !(in->_ops[1] || in->_ops[2])) {
-               ir_value_dump(in->_ops[0], oprintf);
-               comma = ",\t";
-       }
-       else
-       {
-               for (i = 1; i != 3; ++i) {
-                       if (in->_ops[i]) {
-                               if (comma)
-                                       oprintf(comma);
-                               ir_value_dump(in->_ops[i], oprintf);
-                               comma = ",\t";
-                       }
-               }
-       }
-       if (in->bops[0]) {
-               if (comma)
-                       oprintf(comma);
-               oprintf("[%s]", in->bops[0]->label);
-               comma = ",\t";
-       }
-       if (in->bops[1])
-               oprintf("%s[%s]", comma, in->bops[1]->label);
-       oprintf("\n");
-       ind[strlen(ind)-1] = 0;
+     size_t i;
+     const char *comma = NULL;
+     oprintf("%s (%i) ", ind, (int)in->eid);
+     if (in->opcode == VINSTR_PHI) {
+         dump_phi(in, ind, oprintf);
+         return;
+     }
+     strncat(ind, "\t", IND_BUFSZ);
+     if (in->_ops[0] && (in->_ops[1] || in->_ops[2])) {
+         ir_value_dump(in->_ops[0], oprintf);
+         if (in->_ops[1] || in->_ops[2])
+             oprintf(" <- ");
+     }
+     if (in->opcode == INSTR_CALL0) {
+         oprintf("CALL%i\t", in->params_count);
+     } else
+         oprintf("%s\t", qc_opname(in->opcode));
+     if (in->_ops[0] && !(in->_ops[1] || in->_ops[2])) {
+         ir_value_dump(in->_ops[0], oprintf);
+         comma = ",\t";
+     }
+     else
+     {
+         for (i = 1; i != 3; ++i) {
+             if (in->_ops[i]) {
+                 if (comma)
+                     oprintf(comma);
+                 ir_value_dump(in->_ops[i], oprintf);
+                 comma = ",\t";
+             }
+         }
+     }
+     if (in->bops[0]) {
+         if (comma)
+             oprintf(comma);
+         oprintf("[%s]", in->bops[0]->label);
+         comma = ",\t";
+     }
+     if (in->bops[1])
+         oprintf("%s[%s]", comma, in->bops[1]->label);
+     oprintf("\n");
+     ind[strlen(ind)-1] = 0;
  }
  
  void ir_value_dump(ir_value* v, int (*oprintf)(const char*, ...))
  {
-       if (v->isconst) {
-               switch (v->vtype) {
-                   default:
-                       case TYPE_VOID:
-                               oprintf("(void)");
-                               break;
-                       case TYPE_FLOAT:
-                               oprintf("%g", v->constval.vfloat);
-                               break;
-                       case TYPE_VECTOR:
-                               oprintf("'%g %g %g'",
-                                       v->constval.vvec.x,
-                                       v->constval.vvec.y,
-                                       v->constval.vvec.z);
-                               break;
-                       case TYPE_ENTITY:
-                               oprintf("(entity)");
-                               break;
-                       case TYPE_STRING:
-                               oprintf("\"%s\"", v->constval.vstring);
-                               break;
+     if (v->isconst) {
+         switch (v->vtype) {
+             default:
+             case TYPE_VOID:
+                 oprintf("(void)");
+                 break;
+             case TYPE_FUNCTION:
+                 oprintf("(function)");
+                 break;
+             case TYPE_FLOAT:
+                 oprintf("%g", v->constval.vfloat);
+                 break;
+             case TYPE_VECTOR:
+                 oprintf("'%g %g %g'",
+                         v->constval.vvec.x,
+                         v->constval.vvec.y,
+                         v->constval.vvec.z);
+                 break;
+             case TYPE_ENTITY:
+                 oprintf("(entity)");
+                 break;
+             case TYPE_STRING:
+                 oprintf("\"%s\"", v->constval.vstring);
+                 break;
  #if 0
-                       case TYPE_INTEGER:
-                               oprintf("%i", v->constval.vint);
-                               break;
+             case TYPE_INTEGER:
+                 oprintf("%i", v->constval.vint);
+                 break;
  #endif
-                       case TYPE_POINTER:
-                               oprintf("&%s",
-                                       v->constval.vpointer->name);
-                               break;
-               }
-       } else {
-               oprintf("%s", v->name);
-       }
+             case TYPE_POINTER:
+                 oprintf("&%s",
+                     v->constval.vpointer->name);
+                 break;
+         }
+     } else {
+         oprintf("%s", v->name);
+     }
  }
  
  void ir_value_dump_life(ir_value *self, int (*oprintf)(const char*,...))
  {
-       size_t i;
-       oprintf("Life of %s:\n", self->name);
-       for (i = 0; i < self->life_count; ++i)
-       {
-               oprintf(" + [%i, %i]\n", self->life[i].start, self->life[i].end);
-       }
+     size_t i;
+     oprintf("Life of %s:\n", self->name);
+     for (i = 0; i < self->life_count; ++i)
+     {
+         oprintf(" + [%i, %i]\n", self->life[i].start, self->life[i].end);
+     }
  }