* 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
+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.
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));
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. */
r->sign = 0;
break;
+ case FIX_TRUNC_EXPR:
+ do_fix_trunc (r, op0);
+ break;
+
default:
abort ();
}
/* 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 ();
}