160727d8bSWarner Losh /*- 2*51369649SPedro F. Giffuni * SPDX-License-Identifier: BSD-3-Clause 3*51369649SPedro F. Giffuni * 44e84a94dSPeter Grehan * Copyright (c) 1992, 1993 54e84a94dSPeter Grehan * The Regents of the University of California. All rights reserved. 64e84a94dSPeter Grehan * 74e84a94dSPeter Grehan * This software was developed by the Computer Systems Engineering group 84e84a94dSPeter Grehan * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and 94e84a94dSPeter Grehan * contributed to Berkeley. 104e84a94dSPeter Grehan * 114e84a94dSPeter Grehan * All advertising materials mentioning features or use of this software 124e84a94dSPeter Grehan * must display the following acknowledgement: 134e84a94dSPeter Grehan * This product includes software developed by the University of 144e84a94dSPeter Grehan * California, Lawrence Berkeley Laboratory. 154e84a94dSPeter Grehan * 164e84a94dSPeter Grehan * Redistribution and use in source and binary forms, with or without 174e84a94dSPeter Grehan * modification, are permitted provided that the following conditions 184e84a94dSPeter Grehan * are met: 194e84a94dSPeter Grehan * 1. Redistributions of source code must retain the above copyright 204e84a94dSPeter Grehan * notice, this list of conditions and the following disclaimer. 214e84a94dSPeter Grehan * 2. Redistributions in binary form must reproduce the above copyright 224e84a94dSPeter Grehan * notice, this list of conditions and the following disclaimer in the 234e84a94dSPeter Grehan * documentation and/or other materials provided with the distribution. 24fbbd9655SWarner Losh * 3. Neither the name of the University nor the names of its contributors 254e84a94dSPeter Grehan * may be used to endorse or promote products derived from this software 264e84a94dSPeter Grehan * without specific prior written permission. 274e84a94dSPeter Grehan * 284e84a94dSPeter Grehan * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 294e84a94dSPeter Grehan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 304e84a94dSPeter Grehan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 314e84a94dSPeter Grehan * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 324e84a94dSPeter Grehan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 334e84a94dSPeter Grehan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 344e84a94dSPeter Grehan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 354e84a94dSPeter Grehan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 364e84a94dSPeter Grehan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 374e84a94dSPeter Grehan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 384e84a94dSPeter Grehan * SUCH DAMAGE. 394e84a94dSPeter Grehan * from: NetBSD: ieee.h,v 1.1.1.1 1998/06/20 04:58:51 eeh Exp 404e84a94dSPeter Grehan */ 414e84a94dSPeter Grehan 424e84a94dSPeter Grehan #ifndef _MACHINE_IEEE_H_ 434e84a94dSPeter Grehan #define _MACHINE_IEEE_H_ 444e84a94dSPeter Grehan 454e84a94dSPeter Grehan /* 464e84a94dSPeter Grehan * ieee.h defines the machine-dependent layout of the machine's IEEE 474e84a94dSPeter Grehan * floating point. It does *not* define (yet?) any of the rounding 484e84a94dSPeter Grehan * mode bits, exceptions, and so forth. 494e84a94dSPeter Grehan */ 504e84a94dSPeter Grehan 514e84a94dSPeter Grehan /* 524e84a94dSPeter Grehan * Define the number of bits in each fraction and exponent. 534e84a94dSPeter Grehan * 544e84a94dSPeter Grehan * k k+1 554e84a94dSPeter Grehan * Note that 1.0 x 2 == 0.1 x 2 and that denorms are represented 564e84a94dSPeter Grehan * 574e84a94dSPeter Grehan * (-exp_bias+1) 584e84a94dSPeter Grehan * as fractions that look like 0.fffff x 2 . This means that 594e84a94dSPeter Grehan * 604e84a94dSPeter Grehan * -126 614e84a94dSPeter Grehan * the number 0.10000 x 2 , for instance, is the same as the normalized 624e84a94dSPeter Grehan * 634e84a94dSPeter Grehan * -127 -128 644e84a94dSPeter Grehan * float 1.0 x 2 . Thus, to represent 2 , we need one leading zero 654e84a94dSPeter Grehan * 664e84a94dSPeter Grehan * -129 674e84a94dSPeter Grehan * in the fraction; to represent 2 , we need two, and so on. This 684e84a94dSPeter Grehan * 694e84a94dSPeter Grehan * (-exp_bias-fracbits+1) 704e84a94dSPeter Grehan * implies that the smallest denormalized number is 2 714e84a94dSPeter Grehan * 724e84a94dSPeter Grehan * for whichever format we are talking about: for single precision, for 734e84a94dSPeter Grehan * 744e84a94dSPeter Grehan * -126 -149 754e84a94dSPeter Grehan * instance, we get .00000000000000000000001 x 2 , or 1.0 x 2 , and 764e84a94dSPeter Grehan * 774e84a94dSPeter Grehan * -149 == -127 - 23 + 1. 784e84a94dSPeter Grehan */ 794e84a94dSPeter Grehan #define SNG_EXPBITS 8 804e84a94dSPeter Grehan #define SNG_FRACBITS 23 814e84a94dSPeter Grehan 824e84a94dSPeter Grehan #define DBL_EXPBITS 11 834e84a94dSPeter Grehan #define DBL_FRACBITS 52 844e84a94dSPeter Grehan 854e84a94dSPeter Grehan #ifdef notyet 864e84a94dSPeter Grehan #define E80_EXPBITS 15 874e84a94dSPeter Grehan #define E80_FRACBITS 64 884e84a94dSPeter Grehan #endif 894e84a94dSPeter Grehan 904e84a94dSPeter Grehan #define EXT_EXPBITS 15 914e84a94dSPeter Grehan #define EXT_FRACBITS 112 924e84a94dSPeter Grehan 934e84a94dSPeter Grehan struct ieee_single { 944e84a94dSPeter Grehan u_int sng_sign:1; 954e84a94dSPeter Grehan u_int sng_exp:8; 964e84a94dSPeter Grehan u_int sng_frac:23; 974e84a94dSPeter Grehan }; 984e84a94dSPeter Grehan 994e84a94dSPeter Grehan struct ieee_double { 1004e84a94dSPeter Grehan u_int dbl_sign:1; 1014e84a94dSPeter Grehan u_int dbl_exp:11; 1024e84a94dSPeter Grehan u_int dbl_frach:20; 1034e84a94dSPeter Grehan u_int dbl_fracl; 1044e84a94dSPeter Grehan }; 1054e84a94dSPeter Grehan 1064e84a94dSPeter Grehan struct ieee_ext { 1074e84a94dSPeter Grehan u_int ext_sign:1; 1084e84a94dSPeter Grehan u_int ext_exp:15; 1094e84a94dSPeter Grehan u_int ext_frach:16; 1104e84a94dSPeter Grehan u_int ext_frachm; 1114e84a94dSPeter Grehan u_int ext_fraclm; 1124e84a94dSPeter Grehan u_int ext_fracl; 1134e84a94dSPeter Grehan }; 1144e84a94dSPeter Grehan 1154e84a94dSPeter Grehan /* 1164e84a94dSPeter Grehan * Floats whose exponent is in [1..INFNAN) (of whatever type) are 1174e84a94dSPeter Grehan * `normal'. Floats whose exponent is INFNAN are either Inf or NaN. 1184e84a94dSPeter Grehan * Floats whose exponent is zero are either zero (iff all fraction 1194e84a94dSPeter Grehan * bits are zero) or subnormal values. 1204e84a94dSPeter Grehan * 1214e84a94dSPeter Grehan * A NaN is a `signalling NaN' if its QUIETNAN bit is clear in its 1224e84a94dSPeter Grehan * high fraction; if the bit is set, it is a `quiet NaN'. 1234e84a94dSPeter Grehan */ 1244e84a94dSPeter Grehan #define SNG_EXP_INFNAN 255 1254e84a94dSPeter Grehan #define DBL_EXP_INFNAN 2047 1264e84a94dSPeter Grehan #define EXT_EXP_INFNAN 32767 1274e84a94dSPeter Grehan 1284e84a94dSPeter Grehan #if 0 1294e84a94dSPeter Grehan #define SNG_QUIETNAN (1 << 22) 1304e84a94dSPeter Grehan #define DBL_QUIETNAN (1 << 19) 1314e84a94dSPeter Grehan #define EXT_QUIETNAN (1 << 15) 1324e84a94dSPeter Grehan #endif 1334e84a94dSPeter Grehan 1344e84a94dSPeter Grehan /* 1354e84a94dSPeter Grehan * Exponent biases. 1364e84a94dSPeter Grehan */ 1374e84a94dSPeter Grehan #define SNG_EXP_BIAS 127 1384e84a94dSPeter Grehan #define DBL_EXP_BIAS 1023 1394e84a94dSPeter Grehan #define EXT_EXP_BIAS 16383 1404e84a94dSPeter Grehan 1414e84a94dSPeter Grehan #endif 142