• 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  #pragma once
37  
38  #include <endian.h>
39  
40  union IEEEf2bits {
41    float f;
42    struct {
43      unsigned int man   :23;
44      unsigned int exp   :8;
45      unsigned int sign  :1;
46    } bits;
47  };
48  
49  #define DBL_MANH_SIZE  20
50  #define DBL_MANL_SIZE  32
51  
52  union IEEEd2bits {
53    double  d;
54    struct {
55      unsigned int manl  :32;
56      unsigned int manh  :20;
57      unsigned int exp   :11;
58      unsigned int sign  :1;
59    } bits;
60  };
61  
62  #ifdef __LP64__
63  
64  union IEEEl2bits {
65    long double e;
66    struct {
67      unsigned long manl  :64;
68      unsigned long manh  :48;
69      unsigned int  exp   :15;
70      unsigned int  sign  :1;
71    } bits;
72    struct {
73      unsigned long manl     :64;
74      unsigned long manh     :48;
75      unsigned int  expsign  :16;
76    } xbits;
77  };
78  
79  #define LDBL_NBIT  0
80  #define LDBL_IMPLICIT_NBIT
81  #define mask_nbit_l(u)  ((void)0)
82  
83  #define LDBL_MANH_SIZE  48
84  #define LDBL_MANL_SIZE  64
85  
86  #define LDBL_TO_ARRAY32(u, a) do {           \
87    (a)[0] = (uint32_t)(u).bits.manl;          \
88    (a)[1] = (uint32_t)((u).bits.manl >> 32);  \
89    (a)[2] = (uint32_t)(u).bits.manh;          \
90    (a)[3] = (uint32_t)((u).bits.manh >> 32);  \
91  } while(0)
92  
93  #endif // __LP64__
94