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
This commit is contained in:
Richard Henderson 2002-09-16 19:02:08 -07:00 committed by Richard Henderson
parent ad17a52a21
commit 94313f351a
3 changed files with 57 additions and 4 deletions

View File

@ -1,3 +1,10 @@
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.

View File

@ -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 ();
}

View File

@ -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 ();
}