From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1HTP8y-0002eW-NB for qemu-devel@nongnu.org; Mon, 19 Mar 2007 17:11:52 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1HTP8y-0002eA-3E for qemu-devel@nongnu.org; Mon, 19 Mar 2007 17:11:52 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1HTP8x-0002e7-UQ for qemu-devel@nongnu.org; Mon, 19 Mar 2007 16:11:51 -0500 Received: from bangui.magic.fr ([195.154.194.245]) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1HTP7S-00076T-Sj for qemu-devel@nongnu.org; Mon, 19 Mar 2007 17:10:19 -0400 Subject: Re: [Qemu-devel] [PATCH] softfloat missing functions From: "J. Mayer" In-Reply-To: <200703192037.55757.jseward@acm.org> References: <1174291106.24702.9.camel@rapid> <200703192037.55757.jseward@acm.org> Content-Type: text/plain Date: Mon, 19 Mar 2007 22:10:13 +0100 Message-Id: <1174338614.24702.23.camel@rapid> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Julian Seward Cc: qemu-devel@nongnu.org On Mon, 2007-03-19 at 20:37 +0000, Julian Seward wrote: > > Note that float64_to_uint64 functions are not correct, as they won't > > return results between INT64_MAX and UINT64_MAX. Hope someone may know > > the proper solution for this. > > How about this? Yes, it seems to be the correct way, but thinking more about the problem, it appeared to me that the implementation could be even easier than yours. It seems to me that this may be sufficient: uint64_t float64_to_uint64 (float64 a STATUS_PARAM) { int64_t v; v = llrint(a + (float64)INT64_MIN); return v - INT64_MIN; } uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) { int64_t v; v = (int64_t)(a + (float64)INT64_MIN); return v - INT64_MIN; } For "not-native" softfloat, this gives: uint64_t float64_to_uint64 (float64 a STATUS_PARAM) { int64_t v; v = int64_to_float64(INT64_MIN STATUS_VAR); v = float64_to_int64((a + v) STATUS_VAR); return v - INT64_MIN; } uint64_t float64_to_uint64_round_to_zero (float64 a STATUS_PARAM) { int64_t v; v = int64_to_float64(INT64_MIN STATUS_VAR); v = float64_to_int64_round_to_zero((a + v) STATUS_VAR); return v - INT64_MIN; } This should also give the correct result for NaN and overflows, if we rely to the fact float64_to_int64 is correct. Please tell me if I'm wrong ! -- J. Mayer Never organized