Ignore:
Timestamp:
Jun 12, 2000, 3:00:15 PM (21 years ago)
Author:
Joel Sherrill <joel.sherrill@…>
Branches:
4.10, 4.11, 4.8, 4.9, 5, master
Children:
edeed26
Parents:
0ab65474
Message:

Merged from 4.5.0-beta3a

File:
1 edited

Legend:

Unmodified
Added
Removed
  • cpukit/librpc/src/xdr/xdr_float.c

    r0ab65474 rdf49c60  
     1/*
     2 * Sun RPC is a product of Sun Microsystems, Inc. and is provided for
     3 * unrestricted use provided that this legend is included on all tape
     4 * media and as a part of the software program in whole or part.  Users
     5 * may copy or modify Sun RPC without charge, but are not authorized
     6 * to license or distribute it to anyone else except as part of a product or
     7 * program developed by the user.
     8 *
     9 * SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
     10 * WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
     11 * PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
     12 *
     13 * Sun RPC is provided with no support and without any obligation on the
     14 * part of Sun Microsystems, Inc. to assist in its use, correction,
     15 * modification or enhancement.
     16 *
     17 * SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
     18 * INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
     19 * OR ANY PART THEREOF.
     20 *
     21 * In no event will Sun Microsystems, Inc. be liable for any lost revenue
     22 * or profits or other special, indirect and consequential damages, even if
     23 * Sun has been advised of the possibility of such damages.
     24 *
     25 * Sun Microsystems, Inc.
     26 * 2550 Garcia Avenue
     27 * Mountain View, California  94043
     28 */
     29
     30#if defined(LIBC_SCCS) && !defined(lint)
     31/*static char *sccsid = "from: @(#)xdr_float.c 1.12 87/08/11 Copyr 1984 Sun Micro";*/
     32/*static char *sccsid = "from: @(#)xdr_float.c  2.1 88/07/29 4.0 RPCSRC";*/
     33static char *rcsid = "$FreeBSD: src/lib/libc/xdr/xdr_float.c,v 1.7 1999/08/28 00:02:55 peter Exp $";
     34#endif
     35
     36/*
     37 * xdr_float.c, Generic XDR routines impelmentation.
     38 *
     39 * Copyright (C) 1984, Sun Microsystems, Inc.
     40 *
     41 * These are the "floating point" xdr routines used to (de)serialize
     42 * most common data items.  See xdr.h for more info on the interface to
     43 * xdr.
     44 */
     45
     46#include <stdio.h>
     47#include <sys/types.h>
     48#include <sys/param.h>
     49#include <rpc/types.h>
     50#include <rpc/xdr.h>
     51
     52/*
     53 * NB: Not portable.
     54 * This routine works on machines with IEEE754 FP and Vaxen.
     55 */
     56
     57#if defined(__alpha__) || \
     58    defined(__arm32__) || \
     59    defined(__hppa__) || \
     60    defined(__i386__) || \
     61    defined(__i960__) || \
     62    defined(__m68k__) || defined(__mc68000__) || \
     63    defined(__mips__) || \
     64    defined(__ns32k__) || \
     65    defined(__sparc__) || \
     66    defined(__ppc__) || defined(__PPC__) || \
     67    defined(__sh__)
     68
     69#include <machine/endian.h>
     70#if !defined(IEEEFP)
     71#define IEEEFP
     72#endif
     73
     74#elif defined(_TMS320C3x) || defined(_TMS320C4x)
     75#error "Texas Instruments C3x/C4x Not supported."
     76
     77#elif defined(vax)
     78
     79/* What IEEE single precision floating point looks like on a Vax */
     80struct  ieee_single {
     81        unsigned int    mantissa: 23;
     82        unsigned int    exp     : 8;
     83        unsigned int    sign    : 1;
     84};
     85
     86/* Vax single precision floating point */
     87struct  vax_single {
     88        unsigned int    mantissa1 : 7;
     89        unsigned int    exp       : 8;
     90        unsigned int    sign      : 1;
     91        unsigned int    mantissa2 : 16;
     92};
     93
     94#define VAX_SNG_BIAS    0x81
     95#define IEEE_SNG_BIAS   0x7f
     96
     97static struct sgl_limits {
     98        struct vax_single s;
     99        struct ieee_single ieee;
     100} sgl_limits[2] = {
     101        {{ 0x7f, 0xff, 0x0, 0xffff },   /* Max Vax */
     102        { 0x0, 0xff, 0x0 }},            /* Max IEEE */
     103        {{ 0x0, 0x0, 0x0, 0x0 },        /* Min Vax */
     104        { 0x0, 0x0, 0x0 }}              /* Min IEEE */
     105};
     106/* end of vax */
     107#else
     108#error "xdr_float.c: unknown CPU"
     109#endif
     110
     111
     112bool_t
     113xdr_float(xdrs, fp)
     114        register XDR *xdrs;
     115        register float *fp;
     116{
     117#ifdef IEEEFP
     118        bool_t rv;
     119        long tmpl;
     120#else
     121        struct ieee_single is;
     122        struct vax_single vs, *vsp;
     123        struct sgl_limits *lim;
     124        int i;
     125#endif
     126        switch (xdrs->x_op) {
     127
     128        case XDR_ENCODE:
     129#ifdef IEEEFP
     130                tmpl = *(int32_t *)fp;
     131                return (XDR_PUTLONG(xdrs, &tmpl));
     132#else
     133                vs = *((struct vax_single *)fp);
     134                for (i = 0, lim = sgl_limits;
     135                        i < sizeof(sgl_limits)/sizeof(struct sgl_limits);
     136                        i++, lim++) {
     137                        if ((vs.mantissa2 == lim->s.mantissa2) &&
     138                                (vs.exp == lim->s.exp) &&
     139                                (vs.mantissa1 == lim->s.mantissa1)) {
     140                                is = lim->ieee;
     141                                goto shipit;
     142                        }
     143                }
     144                is.exp = vs.exp - VAX_SNG_BIAS + IEEE_SNG_BIAS;
     145                is.mantissa = (vs.mantissa1 << 16) | vs.mantissa2;
     146        shipit:
     147                is.sign = vs.sign;
     148                return (XDR_PUTLONG(xdrs, (long *)&is));
     149#endif
     150
     151        case XDR_DECODE:
     152#ifdef IEEEFP
     153                rv = XDR_GETLONG(xdrs, &tmpl);
     154                *(int32_t *)fp = tmpl;
     155                return (rv);
     156#else
     157                vsp = (struct vax_single *)fp;
     158                if (!XDR_GETLONG(xdrs, (long *)&is))
     159                        return (FALSE);
     160                for (i = 0, lim = sgl_limits;
     161                        i < sizeof(sgl_limits)/sizeof(struct sgl_limits);
     162                        i++, lim++) {
     163                        if ((is.exp == lim->ieee.exp) &&
     164                                (is.mantissa == lim->ieee.mantissa)) {
     165                                *vsp = lim->s;
     166                                goto doneit;
     167                        }
     168                }
     169                vsp->exp = is.exp - IEEE_SNG_BIAS + VAX_SNG_BIAS;
     170                vsp->mantissa2 = is.mantissa;
     171                vsp->mantissa1 = (is.mantissa >> 16);
     172        doneit:
     173                vsp->sign = is.sign;
     174                return (TRUE);
     175#endif
     176
     177        case XDR_FREE:
     178                return (TRUE);
     179        }
     180        return (FALSE);
     181}
     182
     183#ifdef vax
     184/* What IEEE double precision floating point looks like on a Vax */
     185struct  ieee_double {
     186        unsigned int    mantissa1 : 20;
     187        unsigned int    exp       : 11;
     188        unsigned int    sign      : 1;
     189        unsigned int    mantissa2 : 32;
     190};
     191
     192/* Vax double precision floating point */
     193struct  vax_double {
     194        unsigned int    mantissa1 : 7;
     195        unsigned int    exp       : 8;
     196        unsigned int    sign      : 1;
     197        unsigned int    mantissa2 : 16;
     198        unsigned int    mantissa3 : 16;
     199        unsigned int    mantissa4 : 16;
     200};
     201
     202#define VAX_DBL_BIAS    0x81
     203#define IEEE_DBL_BIAS   0x3ff
     204#define MASK(nbits)     ((1 << nbits) - 1)
     205
     206static struct dbl_limits {
     207        struct  vax_double d;
     208        struct  ieee_double ieee;
     209} dbl_limits[2] = {
     210        {{ 0x7f, 0xff, 0x0, 0xffff, 0xffff, 0xffff },   /* Max Vax */
     211        { 0x0, 0x7ff, 0x0, 0x0 }},                      /* Max IEEE */
     212        {{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0},               /* Min Vax */
     213        { 0x0, 0x0, 0x0, 0x0 }}                         /* Min IEEE */
     214};
     215
     216#endif /* vax */
     217
     218
     219bool_t
     220xdr_double(xdrs, dp)
     221        register XDR *xdrs;
     222        double *dp;
     223{
     224#ifdef IEEEFP
     225        register int32_t *i32p;
     226        bool_t rv;
     227        long tmpl;
     228#else
     229        register long *lp;
     230        struct  ieee_double id;
     231        struct  vax_double vd;
     232        register struct dbl_limits *lim;
     233        int i;
     234#endif
     235
     236        switch (xdrs->x_op) {
     237
     238        case XDR_ENCODE:
     239#ifdef IEEEFP
     240                i32p = (int32_t *)dp;
     241#if BYTE_ORDER == BIG_ENDIAN
     242                tmpl = *i32p++;
     243                rv = XDR_PUTLONG(xdrs, &tmpl);
     244                if (!rv)
     245                        return (rv);
     246                tmpl = *i32p;
     247                rv = XDR_PUTLONG(xdrs, &tmpl);
     248#else
     249                tmpl = *(i32p+1);
     250                rv = XDR_PUTLONG(xdrs, &tmpl);
     251                if (!rv)
     252                        return (rv);
     253                tmpl = *i32p;
     254                rv = XDR_PUTLONG(xdrs, &tmpl);
     255#endif
     256                return (rv);
     257#else
     258                vd = *((struct vax_double *)dp);
     259                for (i = 0, lim = dbl_limits;
     260                        i < sizeof(dbl_limits)/sizeof(struct dbl_limits);
     261                        i++, lim++) {
     262                        if ((vd.mantissa4 == lim->d.mantissa4) &&
     263                                (vd.mantissa3 == lim->d.mantissa3) &&
     264                                (vd.mantissa2 == lim->d.mantissa2) &&
     265                                (vd.mantissa1 == lim->d.mantissa1) &&
     266                                (vd.exp == lim->d.exp)) {
     267                                id = lim->ieee;
     268                                goto shipit;
     269                        }
     270                }
     271                id.exp = vd.exp - VAX_DBL_BIAS + IEEE_DBL_BIAS;
     272                id.mantissa1 = (vd.mantissa1 << 13) | (vd.mantissa2 >> 3);
     273                id.mantissa2 = ((vd.mantissa2 & MASK(3)) << 29) |
     274                                (vd.mantissa3 << 13) |
     275                                ((vd.mantissa4 >> 3) & MASK(13));
     276        shipit:
     277                id.sign = vd.sign;
     278                lp = (long *)&id;
     279                return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp));
     280#endif
     281
     282        case XDR_DECODE:
     283#ifdef IEEEFP
     284                i32p = (int32_t *)dp;
     285#if BYTE_ORDER == BIG_ENDIAN
     286                rv = XDR_GETLONG(xdrs, &tmpl);
     287                *i32p++ = tmpl;
     288                if (!rv)
     289                        return (rv);
     290                rv = XDR_GETLONG(xdrs, &tmpl);
     291                *i32p = tmpl;
     292#else
     293                rv = XDR_GETLONG(xdrs, &tmpl);
     294                *(i32p+1) = tmpl;
     295                if (!rv)
     296                        return (rv);
     297                rv = XDR_GETLONG(xdrs, &tmpl);
     298                *i32p = tmpl;
     299#endif
     300                return (rv);
     301#else
     302                lp = (long *)&id;
     303                if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp))
     304                        return (FALSE);
     305                for (i = 0, lim = dbl_limits;
     306                        i < sizeof(dbl_limits)/sizeof(struct dbl_limits);
     307                        i++, lim++) {
     308                        if ((id.mantissa2 == lim->ieee.mantissa2) &&
     309                                (id.mantissa1 == lim->ieee.mantissa1) &&
     310                                (id.exp == lim->ieee.exp)) {
     311                                vd = lim->d;
     312                                goto doneit;
     313                        }
     314                }
     315                vd.exp = id.exp - IEEE_DBL_BIAS + VAX_DBL_BIAS;
     316                vd.mantissa1 = (id.mantissa1 >> 13);
     317                vd.mantissa2 = ((id.mantissa1 & MASK(13)) << 3) |
     318                                (id.mantissa2 >> 29);
     319                vd.mantissa3 = (id.mantissa2 >> 13);
     320                vd.mantissa4 = (id.mantissa2 << 3);
     321        doneit:
     322                vd.sign = id.sign;
     323                *dp = *((double *)&vd);
     324                return (TRUE);
     325#endif
     326
     327        case XDR_FREE:
     328                return (TRUE);
     329        }
     330        return (FALSE);
     331}
Note: See TracChangeset for help on using the changeset viewer.