mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-03-22 18:31:27 +00:00
use the new immediate indeces to make small array indeces not use a global
This commit is contained in:
parent
028f8a116d
commit
1767ad435f
6 changed files with 44 additions and 5 deletions
|
@ -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;
|
||||
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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];
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue