mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-06-01 17:12:15 +00:00
lables are working, but immediates and function return values are borked
This commit is contained in:
parent
5785b93107
commit
ce2f26f0b9
1 changed files with 21 additions and 1 deletions
|
@ -659,9 +659,9 @@ emit_branch (opcode_t *op, expr_t *e, expr_t *l)
|
||||||
statref_t *ref;
|
statref_t *ref;
|
||||||
def_t *def = 0;
|
def_t *def = 0;
|
||||||
|
|
||||||
st = &statements[numstatements];
|
|
||||||
if (e)
|
if (e)
|
||||||
def = emit_sub_expr (e, 0);
|
def = emit_sub_expr (e, 0);
|
||||||
|
st = &statements[numstatements];
|
||||||
emit_statement (op, def, 0, 0);
|
emit_statement (op, def, 0, 0);
|
||||||
if (l->e.label.statement) {
|
if (l->e.label.statement) {
|
||||||
if (op == op_goto)
|
if (op == op_goto)
|
||||||
|
@ -842,10 +842,30 @@ emit_expr (expr_t *e)
|
||||||
def_t *def;
|
def_t *def;
|
||||||
def_t *def_a;
|
def_t *def_a;
|
||||||
def_t *def_b;
|
def_t *def_b;
|
||||||
|
statref_t *ref;
|
||||||
|
label_t *label;
|
||||||
//opcode_t *op;
|
//opcode_t *op;
|
||||||
|
|
||||||
switch (e->type) {
|
switch (e->type) {
|
||||||
case ex_label:
|
case ex_label:
|
||||||
|
label = &e->e.label;
|
||||||
|
label->statement = &statements[numstatements];
|
||||||
|
for (ref = label->refs; ref; ref = ref->next) {
|
||||||
|
printf ("%d\n", ref->statement->op);
|
||||||
|
switch (ref->field) {
|
||||||
|
case 0:
|
||||||
|
ref->statement->a = label->statement - ref->statement;
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
ref->statement->b = label->statement - ref->statement;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
ref->statement->c = label->statement - ref->statement;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
abort();
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case ex_block:
|
case ex_block:
|
||||||
for (e = e->e.block.head; e; e = e->next)
|
for (e = e->e.block.head; e; e = e->next)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue