diff options
author | bosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-31 00:07:54 +0000 |
---|---|---|
committer | bosch <bosch@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-10-31 00:07:54 +0000 |
commit | 784b5d91dba7b668588fa608f5670a561fc3d553 (patch) | |
tree | 9028e96337de515589d9449ff638ba6ba68a0a47 | |
parent | 7ae0fe4438059aa4269cdaa14cf0e5d8b3600280 (diff) | |
download | ppe42-gcc-784b5d91dba7b668588fa608f5670a561fc3d553.tar.gz ppe42-gcc-784b5d91dba7b668588fa608f5670a561fc3d553.zip |
* a-reatim.ads: Makes Seconds_Count into a 64-bit integer,
to accommodate all its possible values.
* a-reatim.adb (Split): Special-case handling of Time_Span_First
and of small absolute values of T.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46660 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ada/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/ada/a-reatim.adb | 30 | ||||
-rw-r--r-- | gcc/ada/a-reatim.ads | 10 |
3 files changed, 38 insertions, 10 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 153cc63dd15..4ac4137820f 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2001-10-30 Ed Schonberg <schonber@gnat.com> + + * a-reatim.ads: Makes Seconds_Count into a 64-bit integer, + to accommodate all its possible values. + + * a-reatim.adb (Split): Special-case handling of Time_Span_First + and of small absolute values of T. + 2001-10-30 Richard Kenner <kenner@gnat.com> * misc.c (gnat_expand_expr, case NULL_EXPR): Remove call to diff --git a/gcc/ada/a-reatim.adb b/gcc/ada/a-reatim.adb index 8854922d200..4ed7ce7791b 100644 --- a/gcc/ada/a-reatim.adb +++ b/gcc/ada/a-reatim.adb @@ -6,7 +6,7 @@ -- -- -- B o d y -- -- -- --- $Revision: 1.34 $ +-- $Revision$ -- -- -- Copyright (C) 1991-2001, Florida State University -- -- -- @@ -159,17 +159,33 @@ package body Ada.Real_Time is ----------- procedure Split (T : Time; SC : out Seconds_Count; TS : out Time_Span) is + T_Val : Time; + begin - -- Extract the integer part of T + -- Special-case for Time_First, whose absolute value is anomalous, + -- courtesy of two's complement. + + if T = Time_First then + T_Val := abs (Time_Last); + else + T_Val := abs (T); + end if; + + -- Extract the integer part of T, truncating towards zero. + + if T_Val < 0.5 then + SC := 0; - if T = 0.0 then - SC := 0; else - SC := Seconds_Count (Time_Span'(T - 0.5)); + SC := Seconds_Count (Time_Span' (T_Val - 0.5)); + end if; + + if T < 0.0 then + SC := -SC; end if; - -- Since we loose precision when converting a time value to float, - -- we need to add this check + -- If original time is negative, need to truncate towards negative + -- infinity, to make TS non-negative, as per ARM. if Time (SC) > T then SC := SC - 1; diff --git a/gcc/ada/a-reatim.ads b/gcc/ada/a-reatim.ads index 9fe47621998..563565bc663 100644 --- a/gcc/ada/a-reatim.ads +++ b/gcc/ada/a-reatim.ads @@ -6,9 +6,9 @@ -- -- -- S p e c -- -- -- --- $Revision: 1.24 $ -- +-- $Revision$ -- -- --- Copyright (C) 1992-1998 Free Software Foundation, Inc. -- +-- Copyright (C) 1992-2001 Free Software Foundation, Inc. -- -- -- -- This specification is derived from the Ada Reference Manual for use with -- -- GNAT. The copyright notice above, and the license provisions that follow -- @@ -88,7 +88,11 @@ package Ada.Real_Time is function Microseconds (US : Integer) return Time_Span; function Milliseconds (MS : Integer) return Time_Span; - type Seconds_Count is new Integer range -Integer'Last .. Integer'Last; + -- With duration represented as a 64-bit number with a delta of + -- 10 ** (-9), the number of seconds in Duration'Last does not fit + -- in 32 bits. + + type Seconds_Count is range -2 ** 63 .. 2 ** 63 - 1; procedure Split (T : Time; SC : out Seconds_Count; TS : out Time_Span); function Time_Of (SC : Seconds_Count; TS : Time_Span) return Time; |