diff options
author | Richard Henderson <rth@redhat.com> | 2002-09-16 19:02:08 -0700 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 2002-09-16 19:02:08 -0700 |
commit | 94313f351a9d53ae192d425c82b023b895827009 (patch) | |
tree | df5b1eab0ed6952e5bf3b44a3f604f1b97de876f /gcc | |
parent | ad17a52a21392e7832aa96b950b02e970b6a390e (diff) | |
download | gcc-94313f351a9d53ae192d425c82b023b895827009.zip gcc-94313f351a9d53ae192d425c82b023b895827009.tar.gz gcc-94313f351a9d53ae192d425c82b023b895827009.tar.bz2 |
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/real.c | 34 | ||||
-rw-r--r-- | gcc/simplify-rtx.c | 20 |
3 files changed, 57 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 85a32f9..06a2ff9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2002-09-16 Richard Henderson <rth@redhat.com> + * real.c (do_fix_trunc): New. + (real_arithmetic): Call it. + * simplify-rtx.c (simplify_unary_operation): Handle FIX + with a floating-point result mode. + +2002-09-16 Richard Henderson <rth@redhat.com> + * builtin-types.def (BT_FN_FLOAT_CONST_STRING): New. (BT_FN_DOUBLE_CONST_STRING, BT_FN_LONG_DOUBLE_CONST_STRING): New. * builtins.def (__builtin_nan, __builtin_nanf, __builtin_nanl): New. @@ -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 (); } diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 555646c..3566d10 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -599,10 +599,22 @@ simplify_unary_operation (code, mode, op, op_mode) /* We don't attempt to optimize this. */ return 0; - case ABS: d = REAL_VALUE_ABS (d); break; - case NEG: d = REAL_VALUE_NEGATE (d); break; - case FLOAT_TRUNCATE: d = real_value_truncate (mode, d); break; - case FLOAT_EXTEND: /* All this does is change the mode. */ break; + case ABS: + d = REAL_VALUE_ABS (d); + break; + case NEG: + d = REAL_VALUE_NEGATE (d); + break; + case FLOAT_TRUNCATE: + d = real_value_truncate (mode, d); + break; + case FLOAT_EXTEND: + /* All this does is change the mode. */ + break; + case FIX: + real_arithmetic (&d, FIX_TRUNC_EXPR, &d, NULL); + break; + default: abort (); } |