6811333 Remove prom_printf() message in emlxs driver
[opensolaris.git] / usr / src / lib / libc / port / fp / fpparts.h
blob169e0244db78511e2553293d4e07f7e16d5474b4
1 /*
2 * CDDL HEADER START
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License, Version 1.0 only
6 * (the "License"). You may not use this file except in compliance
7 * with the License.
9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10 * or http://www.opensolaris.org/os/licensing.
11 * See the License for the specific language governing permissions
12 * and limitations under the License.
14 * When distributing Covered Code, include this CDDL HEADER in each
15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16 * If applicable, add the following below this CDDL HEADER, with the
17 * fields enclosed by brackets "[]" replaced with your own identifying
18 * information: Portions Copyright [yyyy] [name of copyright owner]
20 * CDDL HEADER END
23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24 * Use is subject to license terms.
27 /* Copyright (c) 1988 AT&T */
28 /* All Rights Reserved */
31 #pragma ident "%Z%%M% %I% %E% SMI"
34 * Macros to pull apart parts of single and double precision
35 * floating point numbers in IEEE format
36 * Be sure to include /usr/include/values.h before including
37 * this file to get the required definition of _IEEE
40 #if _IEEE
41 #if defined(__sparc)
42 /* byte order with high order bits at lowest address */
44 /* double precision */
45 typedef union {
46 struct {
47 unsigned sign :1;
48 unsigned exp :11;
49 unsigned hi :20;
50 unsigned lo :32;
51 } fparts;
52 struct {
53 unsigned sign :1;
54 unsigned exp :11;
55 unsigned qnan_bit :1;
56 unsigned hi :19;
57 unsigned lo :32;
58 } nparts;
59 struct {
60 unsigned hi;
61 unsigned lo;
62 } fwords;
63 double d;
64 } _dval;
66 /* single precision */
67 typedef union {
68 struct {
69 unsigned sign :1;
70 unsigned exp :8;
71 unsigned fract :23;
72 } fparts;
73 struct {
74 unsigned sign :1;
75 unsigned exp :8;
76 unsigned qnan_bit :1;
77 unsigned fract :22;
78 } nparts;
79 unsigned long fword;
80 float f;
81 } _fval;
84 #elif defined(__i386) || defined(__amd64)
85 /* byte order with low order bits at lowest address */
87 /* double precision */
88 typedef union {
89 struct {
90 unsigned lo :32;
91 unsigned hi :20;
92 unsigned exp :11;
93 unsigned sign :1;
94 } fparts;
95 struct {
96 unsigned lo :32;
97 unsigned hi :19;
98 unsigned qnan_bit :1;
99 unsigned exp :11;
100 unsigned sign :1;
101 } nparts;
102 struct {
103 unsigned lo :32;
104 unsigned hi :32;
105 } fwords;
106 double d;
107 } _dval;
109 /* single precision */
110 typedef union {
111 struct {
112 unsigned fract :23;
113 unsigned exp :8;
114 unsigned sign :1;
115 } fparts;
116 struct {
117 unsigned fract :22;
118 unsigned qnan_bit :1;
119 unsigned exp :8;
120 unsigned sign :1;
121 } nparts;
122 unsigned long fword;
123 float f;
124 } _fval;
125 #endif
127 /* parts of a double precision floating point number */
128 #define SIGNBIT(X) (((_dval *)&(X))->fparts.sign)
129 #define EXPONENT(X) (((_dval *)&(X))->fparts.exp)
131 #define HIFRACTION(X) (((_dval *)&(X))->fparts.hi)
132 #define LOFRACTION(X) (((_dval *)&(X))->fparts.lo)
133 #define QNANBIT(X) (((_dval *)&(X))->nparts.qnan_bit)
134 #define HIWORD(X) (((_dval *)&(X))->fwords.hi)
135 #define LOWORD(X) (((_dval *)&(X))->fwords.lo)
137 #define MAXEXP 0x7ff /* maximum exponent of double */
138 #define ISMAXEXP(X) ((EXPONENT(X)) == MAXEXP)
140 /* macros used to create quiet NaNs as return values */
141 #define SETQNAN(X) ((((_dval *)&(X))->nparts.qnan_bit) = 0x1)
142 #define HIQNAN(X) ((HIWORD(X)) = 0x7ff80000)
143 #define LOQNAN(X) ((((_dval *)&(X))->fwords.lo) = 0x0)
145 /* macros used to extract parts of single precision values */
146 #define FSIGNBIT(X) (((_fval *)&(X))->fparts.sign)
147 #define FEXPONENT(X) (((_fval *)&(X))->fparts.exp)
148 #define FFRACTION(X) (((_fval *)&(X))->fparts.fract)
150 #define FWORD(X) (((_fval *)&(X))->fword)
151 #define FQNANBIT(X) (((_fval *)&(X))->nparts.qnan_bit)
152 #define MAXEXPF 255 /* maximum exponent of single */
153 #define FISMAXEXP(X) ((FEXPONENT(X)) == MAXEXPF)
155 #endif /* _IEEE */