Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/lib/libc/arch/sparc64/softfloat Add softfloat and quad softf...



details:   https://anonhg.NetBSD.org/src/rev/6ad948444a79
branches:  trunk
changeset: 521771:6ad948444a79
user:      jmc <jmc%NetBSD.org@localhost>
date:      Tue Feb 05 07:53:05 2002 +0000

description:
Add softfloat and quad softfloat setup for sparc64 (thanks to Andrey Petrov
for most of this. I just integrated the build).

This adds proper functions for the _Qp* parts of the sparc64 ABI (which
handle quad softfloat). The routines work but need additional testing.
However if the compiler calls these currently bad things (core dumps)
will happen as gcc 2.95.3 generates bad calls for these.

Until that problem is fixed in the toolchain -msoft-quad-float cannot be
enabled as the default option for all builds (but the routines need to be
in libc as libgcc contains some references to these and anything including
it via --whole-archive will need the symbols to at least resolve).

diffstat:

 lib/libc/arch/sparc64/softfloat/milieu.h             |   48 +
 lib/libc/arch/sparc64/softfloat/qp.c                 |  253 ++++++++++
 lib/libc/arch/sparc64/softfloat/softfloat-specialize |  473 +++++++++++++++++++
 lib/libc/arch/sparc64/softfloat/softfloat-wrapper.c  |    1 +
 lib/libc/arch/sparc64/softfloat/softfloat.h          |  294 +++++++++++
 lib/libc/arch/sparc64/softfloat/sparc64-gcc.h        |   89 +++
 6 files changed, 1158 insertions(+), 0 deletions(-)

diffs (truncated from 1182 to 300 lines):

diff -r 193b931036fb -r 6ad948444a79 lib/libc/arch/sparc64/softfloat/milieu.h
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/arch/sparc64/softfloat/milieu.h  Tue Feb 05 07:53:05 2002 +0000
@@ -0,0 +1,48 @@
+/*     $NetBSD: milieu.h,v 1.1 2002/02/05 07:53:05 jmc Exp $   */
+
+/*
+===============================================================================
+
+This C header file is part of the SoftFloat IEC/IEEE Floating-point
+Arithmetic Package, Release 2a.
+
+Written by John R. Hauser.  This work was made possible in part by the
+International Computer Science Institute, located at Suite 600, 1947 Center
+Street, Berkeley, California 94704.  Funding was partially provided by the
+National Science Foundation under grant MIP-9311980.  The original version
+of this code was written as part of a project to build a fixed-point vector
+processor in collaboration with the University of California at Berkeley,
+overseen by Profs. Nelson Morgan and John Wawrzynek.  More information
+is available through the Web page `http://HTTP.CS.Berkeley.EDU/~jhauser/
+arithmetic/SoftFloat.html'.
+
+THIS SOFTWARE IS DISTRIBUTED AS IS, FOR FREE.  Although reasonable effort
+has been made to avoid it, THIS SOFTWARE MAY CONTAIN FAULTS THAT WILL AT
+TIMES RESULT IN INCORRECT BEHAVIOR.  USE OF THIS SOFTWARE IS RESTRICTED TO
+PERSONS AND ORGANIZATIONS WHO CAN AND WILL TAKE FULL RESPONSIBILITY FOR ANY
+AND ALL LOSSES, COSTS, OR OTHER PROBLEMS ARISING FROM ITS USE.
+
+Derivative works are acceptable, even for commercial purposes, so long as
+(1) they include prominent notice that the work is derivative, and (2) they
+include prominent notice akin to these four paragraphs for those parts of
+this code that are retained.
+
+===============================================================================
+*/
+
+/*
+-------------------------------------------------------------------------------
+Include common integer types and flags.
+-------------------------------------------------------------------------------
+*/
+#include "sparc64-gcc.h"
+
+/*
+-------------------------------------------------------------------------------
+Symbolic Boolean literals.
+-------------------------------------------------------------------------------
+*/
+enum {
+    FALSE = 0,
+    TRUE  = 1
+};
diff -r 193b931036fb -r 6ad948444a79 lib/libc/arch/sparc64/softfloat/qp.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/lib/libc/arch/sparc64/softfloat/qp.c      Tue Feb 05 07:53:05 2002 +0000
@@ -0,0 +1,253 @@
+/* $NetBSD: qp.c,v 1.1 2002/02/05 07:53:05 jmc Exp $ */
+
+#include <sys/cdefs.h>
+#include <memory.h>
+
+#include "milieu.h"
+#include "softfloat.h"
+
+
+void _Qp_add(float128 *c, float128 *a, float128 *b);
+
+void _Qp_add(float128 *c, float128 *a, float128 *b)
+{
+        *c =  float128_add(*a, *b);
+}
+
+
+int _Qp_cmp(float128 *a, float128 *b);
+
+int _Qp_cmp(float128 *a, float128 *b)
+{
+
+       if (float128_eq(*a, *b))
+               return 0;
+
+       if (float128_le(*a, *b))
+               return 1;
+
+       return 2;
+}
+
+
+/*
+ * XXX 
+ */
+int _Qp_cmpe(float128 *a, float128 *b);
+
+int _Qp_cmpe(float128 *a, float128 *b)
+{
+       return _Qp_cmp(a, b);
+}
+
+
+void _Qp_div(float128 *c, float128 *a, float128 *b);
+
+void _Qp_div(float128 *c, float128 *a, float128 *b)
+{
+       *c = float128_div(*a, *b);
+}
+
+
+void _Qp_dtoq(float128 *c, float64 *a);
+
+void _Qp_dtoq(float128 *c, float64 *a)
+{
+       *c = float64_to_float128(*a);
+}
+
+
+
+int _Qp_feq(float128 *a, float128 *b);
+
+int _Qp_feq(float128 *a, float128 *b)
+{
+       return float128_eq(*a, *b);
+}
+
+
+int _Qp_fge(float128 *a, float128 *b);
+
+int _Qp_fge(float128 *a, float128 *b)
+{
+       return float128_le(*b, *a);
+}
+
+
+int _Qp_fgt(float128 *a, float128 *b);
+
+int _Qp_fgt(float128 *a, float128 *b)
+{
+       return float128_lt(*b, *a);
+}
+
+
+int _Qp_fle(float128 *a, float128 *b);
+
+int _Qp_fle(float128 *a, float128 *b)
+{
+       return float128_le(*a, *b);
+}
+
+
+int _Qp_flt(float128 *a, float128 *b);
+
+int _Qp_flt(float128 *a, float128 *b)
+{
+       return float128_lt(*a, *b);
+}
+
+
+int _Qp_fne(float128 *a, float128 *b);
+
+int _Qp_fne(float128 *a, float128 *b)
+{
+       return !float128_eq(*a, *b);
+}
+
+
+void _Qp_itoq(float128 *c, int a);
+
+void _Qp_itoq(float128 *c, int a)
+{
+       *c = int32_to_float128(a);
+}
+
+
+
+void _Qp_mul(float128 *c, float128 *a, float128 *b);
+
+void _Qp_mul(float128 *c, float128 *a, float128 *b)
+{
+       *c = float128_mul(*a, *b);
+}
+
+
+/*
+ * XXX easy way to do this, softfloat function
+ */
+void _Qp_neg(float128 *c, float128 *a);
+
+static float128 __zero = {0x4034000000000000, 0x00000000};
+
+void _Qp_neg(float128 *c, float128 *a)
+{
+       *c = float128_sub(__zero, *a);
+}
+
+
+
+double _Qp_qtod(float128 *a);
+
+double _Qp_qtod(float128 *a)
+{
+       float64 _c;
+       double c;
+
+       _c = float128_to_float64(*a);
+
+       memcpy(&c, &_c, sizeof(double));
+
+       return c;
+}
+
+
+int _Qp_qtoi(float128 *a);
+
+int _Qp_qtoi(float128 *a)
+{
+       return float128_to_int32(*a);
+}
+
+
+float _Qp_qtos(float128 *a);
+
+float _Qp_qtos(float128 *a)
+{
+       float c;
+       float32 _c;
+
+       _c = float128_to_float32(*a);
+
+       memcpy(&c, &_c, sizeof(_c));
+
+       return c; 
+}
+
+
+unsigned int _Qp_qtoui(float128 *a);
+
+unsigned int _Qp_qtoui(float128 *a)
+{
+       return (unsigned int)float128_to_int32(*a);
+}
+
+
+
+unsigned long _Qp_qtoux(float128 *a);
+
+unsigned long _Qp_qtoux(float128 *a)
+{
+       return (unsigned long)float128_to_int64(*a);
+}
+
+
+
+long _Qp_qtox(float128 *a);
+
+long _Qp_qtox(float128 *a)
+{
+       return (long)float128_to_int64(*a);
+}
+
+
+void _Qp_sqrt(float128 *c, float128 *a);
+
+void _Qp_sqrt(float128 *c, float128 *a)
+{
+       *c = float128_sqrt(*a);
+}
+
+
+void _Qp_stoq(float128 *c, float a);
+
+void _Qp_stoq(float128 *c, float a)
+{
+       float32 _a;
+
+       memcpy(&_a, &a, sizeof(a));
+
+       *c = float32_to_float128(_a);
+}
+
+
+void _Qp_sub(float128 *c, float128 *a, float128 *b);
+
+void _Qp_sub(float128 *c, float128 *a, float128 *b)
+{
+       *c = float128_sub(*a, *b);
+}
+
+
+void _Qp_uitoq(float128 *c, unsigned int a);
+
+void _Qp_uitoq(float128 *c, unsigned int a)
+{
+       *c = int32_to_float128(a);
+}
+
+
+void _Qp_uxtoq(float128 *c, unsigned long a);
+
+void _Qp_uxtoq(float128 *c, unsigned long a)
+{
+       *c = int64_to_float128(a);



Home | Main Index | Thread Index | Old Index