mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2025-02-22 11:41:38 +00:00
Support move statements (structure copy).
This commit is contained in:
parent
e19f7e3521
commit
179c1f7058
1 changed files with 34 additions and 0 deletions
|
@ -325,6 +325,34 @@ expr_assign (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
return sblock;
|
return sblock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static sblock_t *
|
||||||
|
expr_move (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
|
{
|
||||||
|
statement_t *s;
|
||||||
|
type_t *type = e->e.expr.type;
|
||||||
|
expr_t *dst_expr = e->e.expr.e1;
|
||||||
|
expr_t *src_expr = e->e.expr.e2;
|
||||||
|
expr_t *size_expr;
|
||||||
|
operand_t *dst = 0;
|
||||||
|
operand_t *src = 0;
|
||||||
|
operand_t *size = 0;
|
||||||
|
|
||||||
|
if (!op)
|
||||||
|
op = &dst;
|
||||||
|
size_expr = new_short_expr (type_size (type));
|
||||||
|
sblock = statement_subexpr (sblock, dst_expr, op);
|
||||||
|
dst = *op;
|
||||||
|
sblock = statement_subexpr (sblock, src_expr, &src);
|
||||||
|
sblock = statement_subexpr (sblock, size_expr, &size);
|
||||||
|
s = new_statement ("<MOVE>", e);
|
||||||
|
s->opa = src;
|
||||||
|
s->opb = size;
|
||||||
|
s->opc = dst;
|
||||||
|
sblock_add_statement (sblock, s);
|
||||||
|
|
||||||
|
return sblock;
|
||||||
|
}
|
||||||
|
|
||||||
static sblock_t *
|
static sblock_t *
|
||||||
vector_call (sblock_t *sblock, expr_t *earg, expr_t *param, int ind,
|
vector_call (sblock_t *sblock, expr_t *earg, expr_t *param, int ind,
|
||||||
operand_t **op)
|
operand_t **op)
|
||||||
|
@ -476,6 +504,9 @@ expr_expr (sblock_t *sblock, expr_t *e, operand_t **op)
|
||||||
case PAS:
|
case PAS:
|
||||||
sblock = expr_assign (sblock, e, op);
|
sblock = expr_assign (sblock, e, op);
|
||||||
break;
|
break;
|
||||||
|
case 'M':
|
||||||
|
sblock = expr_move (sblock, e, op);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
opcode = convert_op (e->e.expr.op);
|
opcode = convert_op (e->e.expr.op);
|
||||||
if (!opcode)
|
if (!opcode)
|
||||||
|
@ -777,6 +808,9 @@ statement_expr (sblock_t *sblock, expr_t *e)
|
||||||
case PAS:
|
case PAS:
|
||||||
sblock = expr_assign (sblock, e, 0);
|
sblock = expr_assign (sblock, e, 0);
|
||||||
break;
|
break;
|
||||||
|
case 'M':
|
||||||
|
sblock = expr_move (sblock, e, 0);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
if (e->e.expr.op < 256)
|
if (e->e.expr.op < 256)
|
||||||
debug (e, "e %c", e->e.expr.op);
|
debug (e, "e %c", e->e.expr.op);
|
||||||
|
|
Loading…
Reference in a new issue