From 94313f351a9d53ae192d425c82b023b895827009 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Mon, 16 Sep 2002 19:02:08 -0700 Subject: real.c (do_fix_trunc): New. * real.c (do_fix_trunc): New. (real_arithmetic): Call it. * simplify-rtx.c (simplify_unary_operation): Handle FIX with a floating-point result mode. From-SVN: r57223 --- gcc/real.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'gcc/real.c') diff --git a/gcc/real.c b/gcc/real.c index 5859f0ff878..dd9f9be4f98 100644 --- a/gcc/real.c +++ b/gcc/real.c @@ -174,6 +174,8 @@ static void do_divide PARAMS ((struct real_value *, const struct real_value *, const struct real_value *)); static int do_compare PARAMS ((const struct real_value *, const struct real_value *, int)); +static void do_fix_trunc PARAMS ((struct real_value *, + const struct real_value *)); static const struct real_value * ten_to_ptwo PARAMS ((int)); static const struct real_value * real_digit PARAMS ((int)); @@ -1013,6 +1015,34 @@ do_compare (a, b, nan_result) return (a->sign ? -ret : ret); } +/* Return A truncated to an integral value toward zero. */ + +void +do_fix_trunc (r, a) + struct real_value *r; + const struct real_value *a; +{ + *r = *a; + + switch (a->class) + { + case rvc_zero: + case rvc_inf: + case rvc_nan: + break; + + case rvc_normal: + if (r->exp <= 0) + get_zero (r, r->sign); + else if (r->exp < SIGNIFICAND_BITS) + clear_significand_below (r, SIGNIFICAND_BITS - r->exp); + break; + + default: + abort (); + } +} + /* Perform the binary or unary operation described by CODE. For a unary operation, leave OP1 NULL. */ @@ -1073,6 +1103,10 @@ real_arithmetic (tr, icode, top0, top1) r->sign = 0; break; + case FIX_TRUNC_EXPR: + do_fix_trunc (r, op0); + break; + default: abort (); } -- cgit v1.2.1