Skip to content

Commit 89fb7f6

Browse files
committed
Update to build msun for arm64
* The long double type on arm64 is quad-precision * Add fenv.c to export the required symbols * Fix _fpmath.h to be the correct size and pull out the correct bits _fpmath.h is now based on the arm version.
1 parent c6a2e75 commit 89fb7f6

File tree

3 files changed

+76
-11
lines changed

3 files changed

+76
-11
lines changed

lib/libc/arm64/_fpmath.h

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
/*-
2-
* Copyright (c) 2003 David Schultz <das@FreeBSD.ORG>
2+
* Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG>
3+
* Copyright (2) 2014 The FreeBSD Foundation
34
* All rights reserved.
45
*
56
* Redistribution and use in source and binary forms, with or without
@@ -29,21 +30,29 @@
2930
union IEEEl2bits {
3031
long double e;
3132
struct {
32-
unsigned int sign :1;
33-
unsigned int exp :11;
34-
unsigned int manh :20;
35-
unsigned int manl :32;
33+
unsigned long manl :64;
34+
unsigned long manh :48;
35+
unsigned int exp :15;
36+
unsigned int sign :1;
3637
} bits;
38+
/* TODO andrew: Check the packing here */
39+
struct {
40+
unsigned long manl :64;
41+
unsigned long manh :48;
42+
unsigned int expsign :16;
43+
} xbits;
3744
};
3845

39-
#define mask_nbit_l(u) ((void)0)
40-
#define LDBL_IMPLICIT_NBIT
4146
#define LDBL_NBIT 0
47+
#define LDBL_IMPLICIT_NBIT
48+
#define mask_nbit_l(u) ((void)0)
4249

43-
#define LDBL_MANH_SIZE 20
44-
#define LDBL_MANL_SIZE 32
50+
#define LDBL_MANH_SIZE 48
51+
#define LDBL_MANL_SIZE 64
4552

4653
#define LDBL_TO_ARRAY32(u, a) do { \
4754
(a)[0] = (uint32_t)(u).bits.manl; \
48-
(a)[1] = (uint32_t)(u).bits.manh; \
55+
(a)[1] = (uint32_t)((u).bits.manl >> 32); \
56+
(a)[2] = (uint32_t)(u).bits.manh; \
57+
(a)[3] = (uint32_t)((u).bits.manh >> 32); \
4958
} while(0)

lib/msun/arm64/Makefile.inc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
# $FreeBSD$
22

33
#TODO: Check this
4-
LDBL_PREC = 64
4+
LDBL_PREC = 113
55

lib/msun/arm64/fenv.c

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*-
2+
* Copyright (c) 2004 David Schultz <das@FreeBSD.ORG>
3+
* Copyright (c) 2013 Andrew Turner <andrew@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+
#define __fenv_static
31+
#include "fenv.h"
32+
33+
/*
34+
* Hopefully the system ID byte is immutable, so it's valid to use
35+
* this as a default environment.
36+
*/
37+
const fenv_t __fe_dfl_env = 0;
38+
39+
#ifdef __GNUC_GNU_INLINE__
40+
#error "This file must be compiled with C99 'inline' semantics"
41+
#endif
42+
43+
extern inline int feclearexcept(int __excepts);
44+
extern inline int fegetexceptflag(fexcept_t *__flagp, int __excepts);
45+
extern inline int fesetexceptflag(const fexcept_t *__flagp, int __excepts);
46+
extern inline int feraiseexcept(int __excepts);
47+
extern inline int fetestexcept(int __excepts);
48+
extern inline int fegetround(void);
49+
extern inline int fesetround(int __round);
50+
extern inline int fegetenv(fenv_t *__envp);
51+
extern inline int feholdexcept(fenv_t *__envp);
52+
extern inline int fesetenv(const fenv_t *__envp);
53+
extern inline int feupdateenv(const fenv_t *__envp);
54+
extern inline int feenableexcept(int __mask);
55+
extern inline int fedisableexcept(int __mask);
56+
extern inline int fegetexcept(void);

0 commit comments

Comments
 (0)