]> git.xonotic.org Git - xonotic/gmqcc.git/commitdiff
Merge branch 'master' into blub/bc3
authorWolfgang (Blub) Bumiller <blub@speed.at>
Sat, 11 Aug 2012 09:46:59 +0000 (11:46 +0200)
committerWolfgang (Blub) Bumiller <blub@speed.at>
Sat, 11 Aug 2012 09:46:59 +0000 (11:46 +0200)
1  2 
ir.c

diff --combined ir.c
index f31c224343ccf09d9c721c0b6b1b5d89d3245e1b,05a46d4736cc4c9f171988a5ccb5f3b016450015..f34cc911a3242b7100e7f1153203367ae1003392
--- 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);
@@@ -549,6 -519,14 +549,14 @@@ bool ir_instr_op(ir_instr *self, int op
   *IR Value
   */
  
+ void ir_value_code_setaddr(ir_value *self, int32_t gaddr)
+ {
+     self->code.globaladdr = gaddr;
+     if (self->members[0]) self->members[0]->code.globaladdr = gaddr;
+     if (self->members[1]) self->members[1]->code.globaladdr = gaddr;
+     if (self->members[2]) self->members[2]->code.globaladdr = gaddr;
+ }
  int32_t ir_value_code_addr(const ir_value *self)
  {
      return self->code.globaladdr + self->code.addroffset;
@@@ -668,24 -646,6 +676,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_string(ir_value *self, const char *str)
  {
      if (self->vtype != TYPE_STRING)
@@@ -989,6 -949,7 +997,6 @@@ bool ir_block_create_storep(ir_block *s
      vtype = what->vtype;
  
      op = type_storep_instr[vtype];
 -
      return ir_block_create_store_op(self, op, target, what);
  }
  
@@@ -1383,8 -1344,6 +1391,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;
      }
@@@ -1488,22 -1447,12 +1496,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;
@@@ -2169,11 -2118,11 +2177,11 @@@ static bool gen_global_field(ir_value *
          }
  
          /* copy the field's value */
-         global->code.globaladdr = code_globals_add(code_globals_data[fld->code.globaladdr]);
+         ir_value_code_setaddr(global, code_globals_add(code_globals_data[fld->code.globaladdr]));
      }
      else
      {
-         global->code.globaladdr = code_globals_add(0);
+         ir_value_code_setaddr(global, code_globals_add(0));
      }
      if (global->code.globaladdr < 0)
          return false;
@@@ -2206,11 -2155,11 +2214,11 @@@ static bool gen_global_pointer(ir_valu
              return false;
          }
  
-         global->code.globaladdr = code_globals_add(target->code.globaladdr);
+         ir_value_code_setaddr(global, code_globals_add(target->code.globaladdr));
      }
      else
      {
-         global->code.globaladdr = code_globals_add(0);
+         ir_value_code_setaddr(global, code_globals_add(0));
      }
      if (global->code.globaladdr < 0)
          return false;
@@@ -2493,7 -2442,7 +2501,7 @@@ static bool gen_global_function(ir_buil
      {
          /* generate code.globaladdr for ssa values */
          ir_value *v = irfun->values[i];
-         v->code.globaladdr = local_var_end + v->code.local;
+         ir_value_code_setaddr(v, local_var_end + v->code.local);
      }
      for (i = 0; i < irfun->locals_count; ++i) {
          /* fill the locals with zeros */
@@@ -2542,9 -2491,9 +2550,9 @@@ static bool ir_builder_gen_global(ir_bu
  
          if (global->isconst) {
              iptr = (int32_t*)&global->constval.vfloat;
-             global->code.globaladdr = code_globals_add(*iptr);
+             ir_value_code_setaddr(global, code_globals_add(*iptr));
          } else
-             global->code.globaladdr = code_globals_add(0);
+             ir_value_code_setaddr(global, code_globals_add(0));
  
          return global->code.globaladdr >= 0;
      }
          if (code_defs_add(def) < 0)
              return false;
          if (global->isconst)
-             global->code.globaladdr = code_globals_add(code_cachedstring(global->constval.vstring));
+             ir_value_code_setaddr(global, code_globals_add(code_cachedstring(global->constval.vstring)));
          else
-             global->code.globaladdr = code_globals_add(0);
+             ir_value_code_setaddr(global, code_globals_add(0));
          return global->code.globaladdr >= 0;
      }
      case TYPE_VECTOR:
 +    case TYPE_QUATERNION:
 +    case TYPE_MATRIX:
      {
          size_t d;
          if (code_defs_add(def) < 0)
  
          if (global->isconst) {
              iptr = (int32_t*)&global->constval.vvec;
-             global->code.globaladdr = code_globals_add(iptr[0]);
+             ir_value_code_setaddr(global, code_globals_add(iptr[0]));
              if (global->code.globaladdr < 0)
                  return false;
              for (d = 1; d < type_sizeof[global->vtype]; ++d)
                      return false;
              }
          } else {
-             global->code.globaladdr = code_globals_add(0);
+             ir_value_code_setaddr(global, code_globals_add(0));
              if (global->code.globaladdr < 0)
                  return false;
              for (d = 1; d < type_sizeof[global->vtype]; ++d)
      case TYPE_FUNCTION:
          if (code_defs_add(def) < 0)
              return false;
-         global->code.globaladdr = code_globals_elements;
+         ir_value_code_setaddr(global, code_globals_elements);
          code_globals_add(code_functions_elements);
          return gen_global_function(self, global);
      case TYPE_VARIANT:
          /* assume biggest type */
-             global->code.globaladdr = code_globals_add(0);
+             ir_value_code_setaddr(global, code_globals_add(0));
              for (i = 1; i < type_sizeof[TYPE_VARIANT]; ++i)
                  code_globals_add(0);
              return true;
@@@ -2634,7 -2581,7 +2642,7 @@@ static bool ir_builder_gen_field(ir_bui
      if (!code_globals_add(code_alloc_field(type_sizeof[field->fieldtype])))
          return false;
  
-     field->code.globaladdr = code_globals_add(fld.offset);
+     ir_value_code_setaddr(field, code_globals_add(fld.offset));
      return field->code.globaladdr >= 0;
  }
  
@@@ -2813,7 -2760,6 +2821,7 @@@ void ir_value_dump(ir_value* v, int (*o
  {
        if (v->isconst) {
                switch (v->vtype) {
 +                  default:
                        case TYPE_VOID:
                                oprintf("(void)");
                                break;