From 1767ad435fdc3083d3ff9115388d092e5bdca3fe Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 7 Dec 2001 20:10:30 +0000 Subject: [PATCH] use the new immediate indeces to make small array indeces not use a global --- tools/qfcc/include/expr.h | 2 ++ tools/qfcc/include/qfcc.h | 9 ++++++--- tools/qfcc/source/emit.c | 6 ++++++ tools/qfcc/source/expr.c | 26 +++++++++++++++++++++++++- tools/qfcc/source/pr_lex.c | 2 ++ tools/qfcc/source/qfcc.c | 4 +++- 6 files changed, 44 insertions(+), 5 deletions(-) diff --git a/tools/qfcc/include/expr.h b/tools/qfcc/include/expr.h index 30431ff3f..74e0b6910 100644 --- a/tools/qfcc/include/expr.h +++ b/tools/qfcc/include/expr.h @@ -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; diff --git a/tools/qfcc/include/qfcc.h b/tools/qfcc/include/qfcc.h index dfb00fbb2..794b0dee5 100644 --- a/tools/qfcc/include/qfcc.h +++ b/tools/qfcc/include/qfcc.h @@ -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 { diff --git a/tools/qfcc/source/emit.c b/tools/qfcc/source/emit.c index c6af3c8dd..3eea295c9 100644 --- a/tools/qfcc/source/emit.c +++ b/tools/qfcc/source/emit.c @@ -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: diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index bafcab592..9908be90b 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -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); } diff --git a/tools/qfcc/source/pr_lex.c b/tools/qfcc/source/pr_lex.c index 8a658c381..671f590c4 100644 --- a/tools/qfcc/source/pr_lex.c +++ b/tools/qfcc/source/pr_lex.c @@ -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]; diff --git a/tools/qfcc/source/qfcc.c b/tools/qfcc/source/qfcc.c index 6dba8a5dc..b7470e89c 100644 --- a/tools/qfcc/source/qfcc.c +++ b/tools/qfcc/source/qfcc.c @@ -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); }