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:
parent
ad17a52a21
commit
94313f351a
|
@ -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.
|
||||
|
|
34
gcc/real.c
34
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 ();
|
||||
}
|
||||
|
|
|
@ -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 ();
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue