#if 0
"integer",
#endif
- "quaternion",
- "matrix",
"variant"
};
#if 0
1, /* TYPE_INTEGER */
#endif
- 4, /* TYPE_QUATERNION */
- 16, /* TYPE_MATRIX */
- 16, /* TYPE_VARIANT */
+ 3, /* TYPE_VARIANT */
};
uint16_t type_store_instr[TYPE_COUNT] = {
#if 0
INSTR_STORE_I, /* integer type */
#endif
- INSTR_STORE_Q,
- INSTR_STORE_M,
- INSTR_STORE_M, /* variant, should never be accessed */
+ INSTR_STORE_V, /* variant, should never be accessed */
};
uint16_t type_storep_instr[TYPE_COUNT] = {
#if 0
INSTR_STOREP_ENT, /* integer type */
#endif
- INSTR_STOREP_Q,
- INSTR_STOREP_M,
- INSTR_STOREP_M, /* variant, should never be accessed */
+ INSTR_STOREP_V, /* variant, should never be accessed */
};
MEM_VEC_FUNCTIONS(ir_value_vector, ir_value*, v)
self->members[member] = m;
m->code.addroffset = member;
}
+ else
+ {
+ printf("invalid member access on %s\n", self->name);
+ return NULL;
+ }
return m;
}
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)
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;
}
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;
return global->code.globaladdr >= 0;
}
case TYPE_VECTOR:
- case TYPE_QUATERNION:
- case TYPE_MATRIX:
{
size_t d;
if (code_defs_add(def) < 0)
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);
+ }
}