From f077d16c20c524d7db8cb38a9193242eeade343d Mon Sep 17 00:00:00 2001 From: grischka Date: Fri, 14 Oct 2016 10:44:57 +0200 Subject: [PATCH] tccgen: gen_cast: cast FLOAT to DOUBLE ... to avoid precision loss when casting to int, also when saving FLOATs to stack --- tccgen.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/tccgen.c b/tccgen.c index 70e6fb6..2804539 100644 --- a/tccgen.c +++ b/tccgen.c @@ -811,6 +811,10 @@ ST_FUNC void save_reg_upstack(int r, int n) #else type = &int_type; #endif + if ((type->t & VT_BTYPE) == VT_FLOAT) { + /* cast to DOUBLE to avoid precision loss */ + type->t = (type->t & ~VT_BTYPE) | VT_DOUBLE; + } size = type_size(type, &align); loc = (loc - size) & -align; sv.type.t = type->t; @@ -2349,6 +2353,11 @@ static void gen_cast(CType *type) vpushi(0); gen_op(TOK_NE); } else { + if (sbt == VT_FLOAT) { + /* cast to DOUBLE to avoid precision loss */ + gen_cvt_ftof(VT_DOUBLE); + vtop->type.t = (vtop->type.t & ~VT_BTYPE) | VT_DOUBLE; + } /* we handle char/short/etc... with generic code */ if (dbt != (VT_INT | VT_UNSIGNED) && dbt != (VT_LLONG | VT_UNSIGNED) &&