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