1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2003 Mike Barcroft <mike@FreeBSD.org> 5 * Copyright (c) 2002 David Schultz <das@FreeBSD.ORG> 6 * All rights reserved. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #ifndef _FPMATH_H_ 31 #define _FPMATH_H_ 32 33 #include <endian.h> 34 #ifndef LD128_ENABLE 35 #include "_fpmath.h" 36 #endif 37 38 #ifndef _IEEE_WORD_ORDER 39 #define _IEEE_WORD_ORDER __BYTE_ORDER 40 #endif 41 42 #ifdef LD128_ENABLE 43 union IEEEl2bits { 44 long double e; 45 struct { 46 unsigned long manl : 64; 47 unsigned long manh : 48; 48 unsigned int exp : 15; 49 unsigned int sign : 1; 50 } bits; 51 struct { 52 unsigned long manl : 64; 53 unsigned long manh : 48; 54 unsigned int expsign : 16; 55 } xbits; 56 }; 57 58 #define LDBL_NBIT 0 59 #define LDBL_IMPLICIT_NBIT 60 #define mask_nbit_l(u) ((void)0) 61 62 #define LDBL_MANH_SIZE 48 63 #define LDBL_MANL_SIZE 64 64 65 #define LDBL_TO_ARRAY32(u, a) do { \ 66 (a)[0] = (uint32_t)(u).bits.manl; \ 67 (a)[1] = (uint32_t)((u).bits.manl >> 32); \ 68 (a)[2] = (uint32_t)(u).bits.manh; \ 69 (a)[3] = (uint32_t)((u).bits.manh >> 32); \ 70 } while (0) 71 #else 72 union IEEEf2bits { 73 float f; 74 struct { 75 #if __BYTE_ORDER == __LITTLE_ENDIAN 76 unsigned int man : 23; 77 unsigned int exp : 8; 78 unsigned int sign : 1; 79 #else /* __BIG_ENDIAN */ 80 unsigned int sign : 1; 81 unsigned int exp : 8; 82 unsigned int man : 23; 83 #endif 84 } bits; 85 }; 86 87 #define DBL_MANH_SIZE 20 88 #define DBL_MANL_SIZE 32 89 90 union IEEEd2bits { 91 double d; 92 struct { 93 #if __BYTE_ORDER == __LITTLE_ENDIAN 94 #if _IEEE_WORD_ORDER == __LITTLE_ENDIAN 95 unsigned int manl : 32; 96 #endif 97 unsigned int manh : 20; 98 unsigned int exp : 11; 99 unsigned int sign : 1; 100 #if _IEEE_WORD_ORDER == __BIG_ENDIAN 101 unsigned int manl : 32; 102 #endif 103 #else /* __BIG_ENDIAN */ 104 unsigned int sign : 1; 105 unsigned int exp : 11; 106 unsigned int manh : 20; 107 unsigned int manl : 32; 108 #endif 109 } bits; 110 }; 111 #endif 112 #endif /* !_FPMATH_H */ 113