From d93d8d7d4609eca211da90f80c885834ac03dabe Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Fri, 11 Feb 2011 14:00:36 +0900 Subject: [PATCH] Remove the dirty hack used for accessing params and the return value. Instead of using the equivalent of *(float*)&.return, now use the equivalent of (float).return. No conversion is done in the "cast". NOTE: this sort of cast should be separated from normal casts. --- tools/qfcc/source/expr.c | 5 ++++- tools/qfcc/source/statements.c | 22 +++++++++++++++++----- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/tools/qfcc/source/expr.c b/tools/qfcc/source/expr.c index 01a6010e2..ca5433f44 100644 --- a/tools/qfcc/source/expr.c +++ b/tools/qfcc/source/expr.c @@ -777,10 +777,13 @@ param_expr (const char *name, type_t *type) { symbol_t *sym; expr_t *sym_expr; + expr_t *cast; sym = make_symbol (name, &type_param, 0, st_extern); sym_expr = new_symbol_expr (sym); - return unary_expr ('.', address_expr (sym_expr, 0, type)); + cast = new_unary_expr ('C', sym_expr); + cast->e.expr.type = type; + return cast; } expr_t * diff --git a/tools/qfcc/source/statements.c b/tools/qfcc/source/statements.c index d6d6b1523..016e12e40 100644 --- a/tools/qfcc/source/statements.c +++ b/tools/qfcc/source/statements.c @@ -494,12 +494,24 @@ expr_expr (sblock_t *sblock, expr_t *e, operand_t **op) static sblock_t * expr_cast (sblock_t *sblock, expr_t *e, operand_t **op) { - // FIXME int<->float - if (!*op) { - (*op) = new_operand (op_temp); - (*op)->type = low_level_type (e->e.expr.type); + operand_t *src = 0; + type_t *type = e->e.expr.type; + statement_t *s; + + sblock = statement_subexpr (sblock, e->e.expr.e1, &src); + if ((src->type == ev_integer && type->type == ev_float) + || (src->type == ev_float && type->type == ev_integer)) { + if (!*op) { + (*op) = new_operand (op_temp); + (*op)->type = low_level_type (e->e.expr.type); + } + s = new_statement ("=", e); + s->opa = src; + s->opc = *op; + } else { + src->type = low_level_type (e->e.expr.type); + *op = src; } - sblock = statement_subexpr (sblock, e->e.expr.e1, op); return sblock; }