2008-09-28 Eric Botcazou <ebotcazou@adacore.com>
+ PR middle-end/36575
+ * fold-const (div_and_round_double) <ROUND_DIV_EXPR>: Fix typo.
+
+2008-09-28 Eric Botcazou <ebotcazou@adacore.com>
+
* expmed.c (store_fixed_bit_field): Always use convert_to_mode in
order to convert between modes.
(extract_bit_field_1): Test TRULY_NOOP_TRUNCATION on the right mode.
if (hden < 0)
neg_double (lden, hden, &labs_den, &habs_den);
- /* If (2 * abs (lrem) >= abs (lden)) */
+ /* If (2 * abs (lrem) >= abs (lden)), adjust the quotient. */
mul_double ((HOST_WIDE_INT) 2, (HOST_WIDE_INT) 0,
labs_rem, habs_rem, <wice, &htwice);
< (unsigned HOST_WIDE_INT) htwice)
|| (((unsigned HOST_WIDE_INT) habs_den
== (unsigned HOST_WIDE_INT) htwice)
- && (labs_den < ltwice)))
+ && (labs_den <= ltwice)))
{
if (*hquo < 0)
/* quo = quo - 1; */
+2008-09-28 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/conv_decimal.adb: New test.
+
2008-09-26 Jakub Jelinek <jakub@redhat.com>
PR middle-end/37275
--- /dev/null
+-- PR middle-end/36575
+-- reporter: Laurent Guerby <laurent@guerby.net>
+-- { dg-do run }
+
+procedure Conv_Decimal is
+
+ type Unsigned_Over_8 is mod 2**8+2;
+ type Signed_Over_8 is range -200 .. 200;
+
+ procedure Assert(Truth: Boolean) is
+ begin
+ if not Truth then
+ raise Program_Error;
+ end if;
+ end;
+
+ type Decim is delta 0.1 digits 5;
+
+ Halfway : Decim := 2.5;
+ Neg_Half : Decim := -2.5;
+
+ Big : Unsigned_Over_8;
+ Also_Big : Signed_Over_8;
+
+begin
+ Big := Unsigned_Over_8 (Halfway); -- Rounds up by 4.6(33).
+ Assert(Big = 3);
+
+ Also_Big := Signed_Over_8 (Halfway); -- Rounds up by 4.6(33).
+ Assert(Also_Big = 3);
+
+ Also_Big := Signed_Over_8 (Neg_Half); -- Rounds down by 4.6(33).
+ Assert(Also_Big = -3);
+end;