1
/* @(#)xdr_float.c 2.1 88/07/29 4.0 RPCSRC */
3
* Sun RPC is a product of Sun Microsystems, Inc. and is provided for
4
* unrestricted use provided that this legend is included on all tape
5
* media and as a part of the software program in whole or part. Users
6
* may copy or modify Sun RPC without charge, but are not authorized
7
* to license or distribute it to anyone else except as part of a product or
8
* program developed by the user.
10
* SUN RPC IS PROVIDED AS IS WITH NO WARRANTIES OF ANY KIND INCLUDING THE
11
* WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
12
* PURPOSE, OR ARISING FROM A COURSE OF DEALING, USAGE OR TRADE PRACTICE.
14
* Sun RPC is provided with no support and without any obligation on the
15
* part of Sun Microsystems, Inc. to assist in its use, correction,
16
* modification or enhancement.
18
* SUN MICROSYSTEMS, INC. SHALL HAVE NO LIABILITY WITH RESPECT TO THE
19
* INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY SUN RPC
20
* OR ANY PART THEREOF.
22
* In no event will Sun Microsystems, Inc. be liable for any lost revenue
23
* or profits or other special, indirect and consequential damages, even if
24
* Sun has been advised of the possibility of such damages.
26
* Sun Microsystems, Inc.
28
* Mountain View, California 94043
30
#if !defined(lint) && defined(SCCSIDS)
31
static char sccsid[] = "@(#)xdr_float.c 1.12 87/08/11 Copyr 1984 Sun Micro";
35
* xdr_float.c, Generic XDR routines impelmentation.
37
* Copyright (C) 1984, Sun Microsystems, Inc.
39
* These are the "floating point" xdr routines used to (de)serialize
40
* most common data items. See xdr.h for more info on the interface to
46
#include <sys/types.h>
53
#if !(defined __MSC__) && !(defined __ABSC__)
54
#include <sys/param.h>
55
#include <rpc/types.h>
58
#include "rpc/types.h"
65
* This routine works on Suns (Sky / 68000's) and Vaxen.
68
#if defined(vax) || defined(WIN32)
70
/* What IEEE single precision floating point looks like on a Vax */
72
unsigned int mantissa: 23;
74
unsigned int sign : 1;
77
/* Vax single precision floating point */
79
unsigned int mantissa1 : 7;
81
unsigned int sign : 1;
82
unsigned int mantissa2 : 16;
85
#define VAX_SNG_BIAS 0x81
86
#define IEEE_SNG_BIAS 0x7f
88
static struct sgl_limits {
90
struct ieee_single ieee;
92
{{ 0x7f, 0xff, 0x0, 0xffff }, /* Max Vax */
93
{ 0x0, 0xff, 0x0 }}, /* Max IEEE */
94
{{ 0x0, 0x0, 0x0, 0x0 }, /* Min Vax */
95
{ 0x0, 0x0, 0x0 }} /* Min IEEE */
105
#if !defined(mc68000) && !defined(sparc) && !defined(mips) && !defined(mmax) && !defined(_X86_)
106
struct ieee_single is;
107
struct vax_single vs, *vsp;
108
struct sgl_limits *lim;
111
switch (xdrs->x_op) {
114
#if defined(WIN32) || defined(mc68000) || defined(sparc) || defined(mips) || defined(mmax) || defined(_X86_)
115
return (XDR_PUTLONG(xdrs, (long *)fp));
117
vs = *((struct vax_single *)fp);
118
for (i = 0, lim = sgl_limits;
119
i < sizeof(sgl_limits)/sizeof(struct sgl_limits);
121
if ((vs.mantissa2 == lim->s.mantissa2) &&
122
(vs.exp == lim->s.exp) &&
123
(vs.mantissa1 == lim->s.mantissa1)) {
128
is.exp = vs.exp - VAX_SNG_BIAS + IEEE_SNG_BIAS;
129
is.mantissa = (vs.mantissa1 << 16) | vs.mantissa2;
132
return (XDR_PUTLONG(xdrs, (long *)&is));
136
#if defined(WIN32) || defined(mc68000) || defined(sparc) || defined(mips) || defined(mmax) || defined(_X86_)
137
return (XDR_GETLONG(xdrs, (long *)fp));
139
vsp = (struct vax_single *)fp;
140
if (!XDR_GETLONG(xdrs, (long *)&is))
142
for (i = 0, lim = sgl_limits;
143
i < sizeof(sgl_limits)/sizeof(struct sgl_limits);
145
if ((is.exp == lim->ieee.exp) &&
146
(is.mantissa == lim->ieee.mantissa)) {
151
vsp->exp = is.exp - IEEE_SNG_BIAS + VAX_SNG_BIAS;
152
vsp->mantissa2 = is.mantissa;
153
vsp->mantissa1 = (is.mantissa >> 16);
166
* This routine works on Suns (Sky / 68000's) and Vaxen.
170
/* What IEEE double precision floating point looks like on a Vax */
172
unsigned int mantissa1 : 20;
173
unsigned int exp : 11;
174
unsigned int sign : 1;
175
unsigned int mantissa2 : 32;
178
/* Vax double precision floating point */
180
unsigned int mantissa1 : 7;
181
unsigned int exp : 8;
182
unsigned int sign : 1;
183
unsigned int mantissa2 : 16;
184
unsigned int mantissa3 : 16;
185
unsigned int mantissa4 : 16;
188
#define VAX_DBL_BIAS 0x81
189
#define IEEE_DBL_BIAS 0x3ff
190
#define MASK(nbits) ((1 << nbits) - 1)
192
static struct dbl_limits {
194
struct ieee_double ieee;
196
{{ 0x7f, 0xff, 0x0, 0xffff, 0xffff, 0xffff }, /* Max Vax */
197
{ 0x0, 0x7ff, 0x0, 0x0 }}, /* Max IEEE */
198
{{ 0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, /* Min Vax */
199
{ 0x0, 0x0, 0x0, 0x0 }} /* Min IEEE */
211
#if !defined(WIN32) && !defined(mc68000) && !defined(sparc) && !defined(mips) && !defined(mmax) && !defined(_X86_)
212
struct ieee_double id;
213
struct vax_double vd;
214
register struct dbl_limits *lim;
218
switch (xdrs->x_op) {
221
#if defined(WIN32) || defined(mc68000) || defined(sparc) || defined(mips) || defined(mmax) || defined(_X86_)
224
vd = *((struct vax_double *)dp);
225
for (i = 0, lim = dbl_limits;
226
i < sizeof(dbl_limits)/sizeof(struct dbl_limits);
228
if ((vd.mantissa4 == lim->d.mantissa4) &&
229
(vd.mantissa3 == lim->d.mantissa3) &&
230
(vd.mantissa2 == lim->d.mantissa2) &&
231
(vd.mantissa1 == lim->d.mantissa1) &&
232
(vd.exp == lim->d.exp)) {
237
id.exp = vd.exp - VAX_DBL_BIAS + IEEE_DBL_BIAS;
238
id.mantissa1 = (vd.mantissa1 << 13) | (vd.mantissa2 >> 3);
239
id.mantissa2 = ((vd.mantissa2 & MASK(3)) << 29) |
240
(vd.mantissa3 << 13) |
241
((vd.mantissa4 >> 3) & MASK(13));
246
#if defined(WIN32) || defined(_X86_)
247
return (XDR_PUTLONG(xdrs, lp+1) && XDR_PUTLONG(xdrs, lp));
249
return (XDR_PUTLONG(xdrs, lp++) && XDR_PUTLONG(xdrs, lp));
252
#if defined(WIN32) || defined(mc68000) || defined(sparc) || defined(mips) || defined(mmax) || defined(_X86_)
254
#if defined(WIN32) || defined(_X86_)
255
return (XDR_GETLONG(xdrs, lp+1) && XDR_GETLONG(xdrs, lp));
257
return (XDR_GETLONG(xdrs, lp++) && XDR_GETLONG(xdrs, lp));
261
if (!XDR_GETLONG(xdrs, lp++) || !XDR_GETLONG(xdrs, lp))
263
for (i = 0, lim = dbl_limits;
264
i < sizeof(dbl_limits)/sizeof(struct dbl_limits);
266
if ((id.mantissa2 == lim->ieee.mantissa2) &&
267
(id.mantissa1 == lim->ieee.mantissa1) &&
268
(id.exp == lim->ieee.exp)) {
273
vd.exp = id.exp - IEEE_DBL_BIAS + VAX_DBL_BIAS;
274
vd.mantissa1 = (id.mantissa1 >> 13);
275
vd.mantissa2 = ((id.mantissa1 & MASK(13)) << 3) |
276
(id.mantissa2 >> 29);
277
vd.mantissa3 = (id.mantissa2 >> 13);
278
vd.mantissa4 = (id.mantissa2 << 3);
281
*dp = *((double *)&vd);