From owner-freebsd-sparc64@FreeBSD.ORG Wed Aug 20 02:42:18 2003 Return-Path: Delivered-To: freebsd-sparc64@hub.freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 23CEB16A4C1 for ; Wed, 20 Aug 2003 02:42:18 -0700 (PDT) Received: from freefall.freebsd.org (freefall.freebsd.org [216.136.204.21]) by mx1.FreeBSD.org (Postfix) with ESMTP id 43F8643F93 for ; Wed, 20 Aug 2003 02:41:53 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.12.9/8.12.9) with ESMTP id h7K9fqUp090747 for ; Wed, 20 Aug 2003 02:41:52 -0700 (PDT) (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.12.9/8.12.9/Submit) id h7K9fqFE090746; Wed, 20 Aug 2003 02:41:52 -0700 (PDT) Resent-Date: Wed, 20 Aug 2003 02:41:52 -0700 (PDT) Resent-Message-Id: <200308200941.h7K9fqFE090746@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-sparc64@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Mark Kettenis Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 08F2316A4C0 for ; Tue, 19 Aug 2003 14:24:50 -0700 (PDT) Received: from walton.kettenis.dyndns.org (e115144.upc-e.chello.nl [213.93.115.144]) by mx1.FreeBSD.org (Postfix) with ESMTP id 5DC6943FBF for ; Tue, 19 Aug 2003 14:24:48 -0700 (PDT) (envelope-from kettenis@elgar.kettenis.dyndns.org) Received: from elgar.kettenis.dyndns.org (elgar.kettenis.dyndns.org [192.168.0.2])h7JLOkko001324 for ; Tue, 19 Aug 2003 23:24:46 +0200 (CEST) (envelope-from kettenis@elgar.kettenis.dyndns.org) Received: from elgar.kettenis.dyndns.org (localhost [127.0.0.1]) h7JLOkUJ002340 for ; Tue, 19 Aug 2003 23:24:46 +0200 (CEST) (envelope-from kettenis@elgar.kettenis.dyndns.org) Received: (from kettenis@localhost)h7JLOknL002339; Tue, 19 Aug 2003 23:24:46 +0200 (CEST) Message-Id: <200308192124.h7JLOknL002339@elgar.kettenis.dyndns.org> Date: Tue, 19 Aug 2003 23:24:46 +0200 (CEST) From: Mark Kettenis To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Subject: sparc64/55773: Conversion from long to long double is broken X-BeenThere: freebsd-sparc64@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list Reply-To: Mark Kettenis List-Id: Porting FreeBSD to the Sparc List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 20 Aug 2003 09:42:18 -0000 >Number: 55773 >Category: sparc64 >Synopsis: Conversion from long to long double is broken >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-sparc64 >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Wed Aug 20 02:41:50 PDT 2003 >Closed-Date: >Last-Modified: >Originator: Mark Kettenis >Release: FreeBSD 5.1-CURRENT sparc64 >Organization: >Environment: System: FreeBSD panther.freebsd.org 5.1-CURRENT FreeBSD 5.1-CURRENT #166: Fri Aug 15 11:44:38 PDT 2003 root@panther.freebsd.org:/s/src/sys/sparc64/compile/PANTHER sparc64 >Description: Conversion of `long' and `unsigned long' to `long double' are broken on FreeBSD/sparc64. GCC generates the right code AFAICT, but the implementation of _Qp_xtoq() and _Qp_uxtoq() in /src/lib/libc/sparc64/fpu/fpu_qp.c seem to be broken. Every value that has bit 32 set will be negative when converted to a `long double'. >How-To-Repeat: The following test program exhibits the behaviour: #include unsigned long mant_long = 0x80000000; int main (void) { long double mant = mant_long; printf ("%lu\n", mant_long); printf ("%Lf\n", mant); return 0; } which should print 2147483648 2147483648.000000 but will print 2147483648 -2147483648.000000 >Fix: Looking at the code in /usr/src/lib/libc/sparc64/fpu/fpu_qp.c (I'm looking at revision 1.3), it seems that the _QP_TTOQ() macro only handles 32-bit signed integers since on line 63 of that file we have: fe.fe_f1.fp_sign = a[0] >> 31; I think that this line should be fe.fe_f1.fp_sign = a[0] >> 63; for `long' (_Qp_xtoq) and that the line should be completely absent for `unsigned' (_Qp_uitoq) and `unsigned long' (_Qp_uxtoq). Some not-too-thorough testing seems to indicate that's right. >Release-Note: >Audit-Trail: >Unformatted: