1*8d67ca89SAndroid Build Coastguard Worker /*- 2*8d67ca89SAndroid Build Coastguard Worker * Copyright (c) 2003 Mike Barcroft <[email protected]> 3*8d67ca89SAndroid Build Coastguard Worker * Copyright (c) 2002 David Schultz <[email protected]> 4*8d67ca89SAndroid Build Coastguard Worker * All rights reserved. 5*8d67ca89SAndroid Build Coastguard Worker * 6*8d67ca89SAndroid Build Coastguard Worker * Redistribution and use in source and binary forms, with or without 7*8d67ca89SAndroid Build Coastguard Worker * modification, are permitted provided that the following conditions 8*8d67ca89SAndroid Build Coastguard Worker * are met: 9*8d67ca89SAndroid Build Coastguard Worker * 1. Redistributions of source code must retain the above copyright 10*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer. 11*8d67ca89SAndroid Build Coastguard Worker * 2. Redistributions in binary form must reproduce the above copyright 12*8d67ca89SAndroid Build Coastguard Worker * notice, this list of conditions and the following disclaimer in the 13*8d67ca89SAndroid Build Coastguard Worker * documentation and/or other materials provided with the distribution. 14*8d67ca89SAndroid Build Coastguard Worker * 15*8d67ca89SAndroid Build Coastguard Worker * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16*8d67ca89SAndroid Build Coastguard Worker * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17*8d67ca89SAndroid Build Coastguard Worker * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18*8d67ca89SAndroid Build Coastguard Worker * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19*8d67ca89SAndroid Build Coastguard Worker * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20*8d67ca89SAndroid Build Coastguard Worker * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21*8d67ca89SAndroid Build Coastguard Worker * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22*8d67ca89SAndroid Build Coastguard Worker * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23*8d67ca89SAndroid Build Coastguard Worker * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24*8d67ca89SAndroid Build Coastguard Worker * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25*8d67ca89SAndroid Build Coastguard Worker * SUCH DAMAGE. 26*8d67ca89SAndroid Build Coastguard Worker * 27*8d67ca89SAndroid Build Coastguard Worker * $FreeBSD$ 28*8d67ca89SAndroid Build Coastguard Worker */ 29*8d67ca89SAndroid Build Coastguard Worker 30*8d67ca89SAndroid Build Coastguard Worker // ANDROID changed: 31*8d67ca89SAndroid Build Coastguard Worker // - keep only little endian variants as they're the only one supported. 32*8d67ca89SAndroid Build Coastguard Worker // - add long double structures here instead of _fpmath.h. 33*8d67ca89SAndroid Build Coastguard Worker // - android uses 128 bits long doubles for LP64, so the structure and macros 34*8d67ca89SAndroid Build Coastguard Worker // were reworked for the quad precision ieee representation. 35*8d67ca89SAndroid Build Coastguard Worker 36*8d67ca89SAndroid Build Coastguard Worker #pragma once 37*8d67ca89SAndroid Build Coastguard Worker 38*8d67ca89SAndroid Build Coastguard Worker #include <endian.h> 39*8d67ca89SAndroid Build Coastguard Worker 40*8d67ca89SAndroid Build Coastguard Worker union IEEEf2bits { 41*8d67ca89SAndroid Build Coastguard Worker float f; 42*8d67ca89SAndroid Build Coastguard Worker struct { 43*8d67ca89SAndroid Build Coastguard Worker unsigned int man :23; 44*8d67ca89SAndroid Build Coastguard Worker unsigned int exp :8; 45*8d67ca89SAndroid Build Coastguard Worker unsigned int sign :1; 46*8d67ca89SAndroid Build Coastguard Worker } bits; 47*8d67ca89SAndroid Build Coastguard Worker }; 48*8d67ca89SAndroid Build Coastguard Worker 49*8d67ca89SAndroid Build Coastguard Worker #define DBL_MANH_SIZE 20 50*8d67ca89SAndroid Build Coastguard Worker #define DBL_MANL_SIZE 32 51*8d67ca89SAndroid Build Coastguard Worker 52*8d67ca89SAndroid Build Coastguard Worker union IEEEd2bits { 53*8d67ca89SAndroid Build Coastguard Worker double d; 54*8d67ca89SAndroid Build Coastguard Worker struct { 55*8d67ca89SAndroid Build Coastguard Worker unsigned int manl :32; 56*8d67ca89SAndroid Build Coastguard Worker unsigned int manh :20; 57*8d67ca89SAndroid Build Coastguard Worker unsigned int exp :11; 58*8d67ca89SAndroid Build Coastguard Worker unsigned int sign :1; 59*8d67ca89SAndroid Build Coastguard Worker } bits; 60*8d67ca89SAndroid Build Coastguard Worker }; 61*8d67ca89SAndroid Build Coastguard Worker 62*8d67ca89SAndroid Build Coastguard Worker #ifdef __LP64__ 63*8d67ca89SAndroid Build Coastguard Worker 64*8d67ca89SAndroid Build Coastguard Worker union IEEEl2bits { 65*8d67ca89SAndroid Build Coastguard Worker long double e; 66*8d67ca89SAndroid Build Coastguard Worker struct { 67*8d67ca89SAndroid Build Coastguard Worker unsigned long manl :64; 68*8d67ca89SAndroid Build Coastguard Worker unsigned long manh :48; 69*8d67ca89SAndroid Build Coastguard Worker unsigned int exp :15; 70*8d67ca89SAndroid Build Coastguard Worker unsigned int sign :1; 71*8d67ca89SAndroid Build Coastguard Worker } bits; 72*8d67ca89SAndroid Build Coastguard Worker struct { 73*8d67ca89SAndroid Build Coastguard Worker unsigned long manl :64; 74*8d67ca89SAndroid Build Coastguard Worker unsigned long manh :48; 75*8d67ca89SAndroid Build Coastguard Worker unsigned int expsign :16; 76*8d67ca89SAndroid Build Coastguard Worker } xbits; 77*8d67ca89SAndroid Build Coastguard Worker }; 78*8d67ca89SAndroid Build Coastguard Worker 79*8d67ca89SAndroid Build Coastguard Worker #define LDBL_NBIT 0 80*8d67ca89SAndroid Build Coastguard Worker #define LDBL_IMPLICIT_NBIT 81*8d67ca89SAndroid Build Coastguard Worker #define mask_nbit_l(u) ((void)0) 82*8d67ca89SAndroid Build Coastguard Worker 83*8d67ca89SAndroid Build Coastguard Worker #define LDBL_MANH_SIZE 48 84*8d67ca89SAndroid Build Coastguard Worker #define LDBL_MANL_SIZE 64 85*8d67ca89SAndroid Build Coastguard Worker 86*8d67ca89SAndroid Build Coastguard Worker #define LDBL_TO_ARRAY32(u, a) do { \ 87*8d67ca89SAndroid Build Coastguard Worker (a)[0] = (uint32_t)(u).bits.manl; \ 88*8d67ca89SAndroid Build Coastguard Worker (a)[1] = (uint32_t)((u).bits.manl >> 32); \ 89*8d67ca89SAndroid Build Coastguard Worker (a)[2] = (uint32_t)(u).bits.manh; \ 90*8d67ca89SAndroid Build Coastguard Worker (a)[3] = (uint32_t)((u).bits.manh >> 32); \ 91*8d67ca89SAndroid Build Coastguard Worker } while(0) 92*8d67ca89SAndroid Build Coastguard Worker 93*8d67ca89SAndroid Build Coastguard Worker #endif // __LP64__ 94