use the new immediate indeces to make small array indeces not use a global

This commit is contained in:
Bill Currie 2001-12-07 20:10:30 +00:00
parent 028f8a116d
commit 1767ad435f
6 changed files with 44 additions and 5 deletions

View file

@ -17,6 +17,7 @@ typedef enum {
ex_quaternion,
ex_integer,
ex_uinteger,
ex_short,
} expr_type;
typedef struct {
@ -67,6 +68,7 @@ typedef struct expr_s {
float quaternion_val[4];
int integer_val;
unsigned int uinteger_val;
short short_val;
} e;
} expr_t;

View file

@ -305,9 +305,10 @@ typedef struct def_s {
int constant; // 1 when a declaration included "= immediate"
statref_t *refs; // for relocations
int freed; // already freed from the scope
int removed; // already removed from the symbol table
int used; // unused local detection
unsigned freed:1; // already freed from the scope
unsigned removed:1; // already removed from the symbol table
unsigned used:1; // unused local detection
unsigned absolute:1; // don't relocate (for temps for shorts)
string_t file; // source file
int line; // source line
@ -357,6 +358,7 @@ extern type_t type_floatfield;
extern type_t type_quaternion;
extern type_t type_integer;
extern type_t type_uinteger;
extern type_t type_short;
extern def_t def_void;
extern def_t def_string;
@ -369,6 +371,7 @@ extern def_t def_pointer;
extern def_t def_quaternion;
extern def_t def_integer;
extern def_t def_uinteger;
extern def_t def_short;
struct function_s
{

View file

@ -331,6 +331,11 @@ emit_sub_expr (expr_t *e, def_t *dest)
case ex_uinteger:
d = PR_ReuseConstant (e, 0);
break;
case ex_short:
d = PR_NewDef (&type_short, 0, pr_scope);
d->ofs = e->e.short_val;
d->absolute = 1;
break;
}
PR_FreeTempDefs ();
return d;
@ -445,6 +450,7 @@ emit_expr (expr_t *e)
case ex_quaternion:
case ex_integer:
case ex_uinteger:
case ex_short:
warning (e, "Ignoring useless expression");
break;
case ex_nil:

View file

@ -62,6 +62,7 @@ etype_t qc_types[] = {
ev_quaternion, // ex_quaternion
ev_integer, // ex_integer
ev_uinteger, // ex_uinteger
ev_short, // ex_short
};
type_t *types[] = {
@ -76,6 +77,7 @@ type_t *types[] = {
&type_quaternion,
&type_integer,
&type_uinteger,
&type_short,
};
expr_type expr_types[] = {
@ -90,6 +92,7 @@ expr_type expr_types[] = {
ex_quaternion, // ev_quaternion
ex_integer, // ev_integer
ex_uinteger, // ev_uinteger
ex_short, // ev_short
};
type_t *
@ -126,6 +129,7 @@ get_type (expr_t *e)
case ex_pointer:
case ex_quaternion:
case ex_uinteger:
case ex_short:
return types[qc_types[e->type]];
}
return 0;
@ -509,6 +513,9 @@ print_expr (expr_t *e)
case ex_uinteger:
printf ("%d", e->e.uinteger_val);
break;
case ex_short:
printf ("%d", e->e.short_val);
break;
}
}
@ -796,7 +803,8 @@ field_expr (expr_t *e1, expr_t *e2)
t2 = extract_type (e2);
if ((t1 != ev_entity || t2 != ev_field)
&& (t1 != ev_pointer || (t2 != ev_integer && t2 != ev_uinteger))) {
&& (t1 != ev_pointer
|| (t2 != ev_integer && t2 != ev_uinteger && t2 != ev_short))) {
return error (e1, "type missmatch for .");
}
@ -831,6 +839,7 @@ test_expr (expr_t *e, int test)
break;
case ev_uinteger:
case ev_integer:
case ev_short:
return e;
case ev_float:
if (options.code.progsversion == PROG_ID_VERSION)
@ -1042,6 +1051,9 @@ unary_expr (int op, expr_t *e)
? e->e.def->type : e->e.expr.type;
return n;
}
case ex_short:
e->e.short_val *= -1;
return e;
case ex_integer:
case ex_uinteger:
e->e.integer_val *= -1;
@ -1091,6 +1103,9 @@ unary_expr (int op, expr_t *e)
}
case ex_nil:
return error (e, "invalid type for unary !");
case ex_short:
e->e.short_val = !e->e.short_val;
return e;
case ex_integer:
case ex_uinteger:
e->e.integer_val = !e->e.integer_val;
@ -1146,6 +1161,9 @@ unary_expr (int op, expr_t *e)
n->e.expr.type = t;
return n;
}
case ex_short:
e->e.short_val = ~e->e.short_val;
return e;
case ex_integer:
case ex_uinteger:
e->e.integer_val = ~e->e.integer_val;
@ -1411,5 +1429,11 @@ array_expr (expr_t *array, expr_t *index)
scale->e.integer_val = size;
index = binary_expr ('*', index, scale);
}
if ((index->type == ex_integer
&& index->e.integer_val < 32768 && index->e.integer_val >= -32768)
|| (index->type == ex_uinteger
&& index->e.uinteger_val < 32768)) {
index->type = ex_short;
}
return binary_expr ('.', array, index);
}

View file

@ -67,6 +67,7 @@ type_t type_pointer = { ev_pointer, &def_pointer };
type_t type_quaternion = { ev_quaternion, &def_quaternion };
type_t type_integer = { ev_integer, &def_integer };
type_t type_uinteger = { ev_uinteger, &def_uinteger };
type_t type_short = { ev_short, &def_short };
type_t type_floatfield = { ev_field, &def_field, NULL, &type_float };
@ -81,6 +82,7 @@ def_t def_pointer = { &type_pointer, "temp" };
def_t def_quaternion = { &type_quaternion, "temp" };
def_t def_integer = { &type_integer, "temp" };
def_t def_uinteger = { &type_uinteger, "temp" };
def_t def_short = { &type_short, "temp" };
def_t def_ret, def_parms[MAX_PARMS];

View file

@ -531,7 +531,7 @@ qboolean PR_FinishCompilation (void)
}
for (def = pr.def_head.def_next; def; def = def->def_next) {
if (def->scope)
if (def->scope || def->absolute)
continue;
PR_RelocateRefs (def);
}
@ -545,6 +545,8 @@ qboolean PR_FinishCompilation (void)
}
f->dfunc->parm_start = numpr_globals;
for (def = f->def->scope_next; def; def = def->scope_next) {
if (def->absolute)
continue;
def->ofs += numpr_globals;
PR_RelocateRefs (def);
}