diff options
author | Kito Cheng <kito.cheng@sifive.com> | 2023-12-04 15:41:39 +0800 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2023-12-04 10:26:41 +0100 |
commit | 04798b7bb69571452d2cfc7e0b052a9bbd3b619d (patch) | |
tree | aca72b73a38b6112c133669f13681a6ef7968915 /newlib/libc | |
parent | bcd1883560b79b67f06fa1df6dea60d18fdd00c7 (diff) | |
download | newlib-04798b7bb69571452d2cfc7e0b052a9bbd3b619d.zip newlib-04798b7bb69571452d2cfc7e0b052a9bbd3b619d.tar.gz newlib-04798b7bb69571452d2cfc7e0b052a9bbd3b619d.tar.bz2 |
RISC-V: Support long double math
Long double for RISC-V is using 128 bit IEEE 754 format like Aarch64,
so we reference AArch64 to support that.
Diffstat (limited to 'newlib/libc')
-rw-r--r-- | newlib/libc/include/math.h | 3 | ||||
-rw-r--r-- | newlib/libc/machine/riscv/machine/_fpmath.h | 64 |
2 files changed, 66 insertions, 1 deletions
diff --git a/newlib/libc/include/math.h b/newlib/libc/include/math.h index 87f5133..5e92d26 100644 --- a/newlib/libc/include/math.h +++ b/newlib/libc/include/math.h @@ -446,7 +446,8 @@ extern float hypotf (float, float); are implemented independently from newlib to be able to use optimized assembler functions despite using the Microsoft x86_64 ABI. */ #if defined (_LDBL_EQ_DBL) || defined (__CYGWIN__) || \ - defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) + defined(__aarch64__) || defined(__i386__) || defined(__x86_64__) || \ + defined(__riscv) /* Reentrant ANSI C functions. */ #ifndef __math_68881 extern long double atanl (long double); diff --git a/newlib/libc/machine/riscv/machine/_fpmath.h b/newlib/libc/machine/riscv/machine/_fpmath.h new file mode 100644 index 0000000..fa62ae8 --- /dev/null +++ b/newlib/libc/machine/riscv/machine/_fpmath.h @@ -0,0 +1,64 @@ +/*- + * Copyright (c) 2002, 2003 David Schultz <das@FreeBSD.ORG> + * Copyright (2) 2014 The FreeBSD Foundation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +/* + * Change unsigned int/long used by FreeBSD to fixed width types because + * ilp32 has a different size for unsigned long. --joel (20 Aug 2022) + */ +#include <stdint.h> + +union IEEEl2bits { + long double e; + struct { + uint64_t manl :64; + uint64_t manh :48; + uint32_t exp :15; + uint32_t sign :1; + } bits; + /* TODO andrew: Check the packing here */ + struct { + uint64_t manl :64; + uint64_t manh :48; + uint32_t expsign :16; + } xbits; +}; + +#define LDBL_NBIT 0 +#define LDBL_IMPLICIT_NBIT +#define mask_nbit_l(u) ((void)0) + +#define LDBL_MANH_SIZE 48 +#define LDBL_MANL_SIZE 64 + +#define LDBL_TO_ARRAY32(u, a) do { \ + (a)[0] = (uint32_t)(u).bits.manl; \ + (a)[1] = (uint32_t)((u).bits.manl >> 32); \ + (a)[2] = (uint32_t)(u).bits.manh; \ + (a)[3] = (uint32_t)((u).bits.manh >> 32); \ +} while(0) |