blob: e76771de7f8d5514cc9d6cc7db01a7edd78b42f9 [file] [log] [blame]
The Android Open Source Project1dc9e472009-03-03 19:28:35 -08001/*-
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 *
Elliott Hughes0f95a552014-04-14 15:33:32 -070027 * $FreeBSD$
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080028 */
29
Calin Juravle4d77c112014-03-14 17:56:46 +000030#ifndef _FPMATH_
31#define _FPMATH_
32
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080033#include <endian.h>
34#include "_fpmath.h"
35
Elliott Hughes0f95a552014-04-14 15:33:32 -070036#ifndef _IEEE_WORD_ORDER
37#define _IEEE_WORD_ORDER _BYTE_ORDER
38#endif
39
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080040union IEEEf2bits {
41 float f;
42 struct {
Elliott Hughes0f95a552014-04-14 15:33:32 -070043#if _BYTE_ORDER == _LITTLE_ENDIAN
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080044 unsigned int man :23;
45 unsigned int exp :8;
46 unsigned int sign :1;
47#else /* _BIG_ENDIAN */
48 unsigned int sign :1;
49 unsigned int exp :8;
50 unsigned int man :23;
51#endif
52 } bits;
53};
54
55#define DBL_MANH_SIZE 20
56#define DBL_MANL_SIZE 32
57
58union IEEEd2bits {
59 double d;
60 struct {
Elliott Hughes0f95a552014-04-14 15:33:32 -070061#if _BYTE_ORDER == _LITTLE_ENDIAN
62#if _IEEE_WORD_ORDER == _LITTLE_ENDIAN
63 unsigned int manl :32;
64#endif
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080065 unsigned int manh :20;
66 unsigned int exp :11;
67 unsigned int sign :1;
Elliott Hughes0f95a552014-04-14 15:33:32 -070068#if _IEEE_WORD_ORDER == _BIG_ENDIAN
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080069 unsigned int manl :32;
Elliott Hughes0f95a552014-04-14 15:33:32 -070070#endif
71#else /* _BIG_ENDIAN */
The Android Open Source Project1dc9e472009-03-03 19:28:35 -080072 unsigned int sign :1;
73 unsigned int exp :11;
74 unsigned int manh :20;
75 unsigned int manl :32;
76#endif
77 } bits;
78};
Elliott Hughesa0ee0782013-01-30 19:06:37 -080079
80/*
81 * The BSD "long double" functions are broken when sizeof(long double) == sizeof(double).
82 * Android works around those cases by replacing the broken functions with our own trivial stubs
83 * that call the regular "double" function.
84 */
Calin Juravle4d77c112014-03-14 17:56:46 +000085#ifndef __LP64__
86
Elliott Hughesa0ee0782013-01-30 19:06:37 -080087#define __fpclassifyl __broken__fpclassify
88#define __isfinitel __broken__isfinitel
89#define __isinfl __broken__isinfl
90#define __isnanl __broken__isnanl
91#define __isnormall __broken__isnormall
92#define __signbitl __broken_signbitl
Calin Juravle4d77c112014-03-14 17:56:46 +000093
94#endif // __LP64__
95
96#endif // _FPMATH_