From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pl1-x636.google.com (mail-pl1-x636.google.com [IPv6:2607:f8b0:4864:20::636]) by sourceware.org (Postfix) with ESMTPS id 1B9DC386100F for ; Mon, 4 Dec 2023 07:41:49 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 1B9DC386100F Authentication-Results: sourceware.org; dmarc=pass (p=reject dis=none) header.from=sifive.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=sifive.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 1B9DC386100F Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=2607:f8b0:4864:20::636 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701675713; cv=none; b=rAyjmJRc1V0NLSJBp3nco3LQzqf/G8iCrNiAytN455w8GGdD1ay7B7YVX1KX4FG068Jp76BsxIrbs9AIVlhGvfXruVUfKOl280xoHCgwZpXvhNo6bApszcWB5tPH6DIkKF5Sk6uK3wts5P/9mgHesyiq4zbZGmGJEfMIwXvWFBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1701675713; c=relaxed/simple; bh=Jhy016tpgzF4NgmdRgLIXWMfLnsYjiczDh6WO4GQ/wQ=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=xA9SifHiau4HBo301ErWb37tWUCa0mo73ch0gJ+62oWkmi39rwchjFFqx3LTCfUoicGAxgnSGW8tBTYlZYdhQHqbnlw34AbHGaLxtuFNAmzVxzoDvTgG6v/mzNvCwg3lNwmH4BNrOQA6Zbu+HG9p3qoHLW7ZF7bpooWmQjf1xB8= ARC-Authentication-Results: i=1; server2.sourceware.org Received: by mail-pl1-x636.google.com with SMTP id d9443c01a7336-1cfc9c4acb6so14463245ad.0 for ; Sun, 03 Dec 2023 23:41:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701675707; x=1702280507; darn=sourceware.org; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:from:to:cc:subject:date:message-id:reply-to; bh=aqDppSa+iEazOrXoFvXAZb9k/JUOMvHpasHkVrurQX4=; b=UkjRFWmZ1jyQm5ZCRfxfsf3iptCD4pB7dnKQvh9MjVwEoMBK+uIiI7CtiaFuE6WYQh TfrQ+r7FGQsrDYS27+KqUnjWSrMin/pkhqgvj6oLq/RvLk4uTnhHda+Q667R8wVDLdhg ngZUgZJkxt17PoCSRCTVhQiKDOgooI9lh3g0MN2UKpOSAP80JBtAamQXjbsOD2Und9qH MKfUonI26pBotMpRIfXc7e1FOlCF512NLll/JMaUGGIwBCf+k9SI722aSM3vrOxNpeXt O8P+ivfFtadSUWSpyz6mgQyuajm/VjJaV/kredUnHgpdWEgtM+s6A2g6f9EA/KugxDvx RuKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701675708; x=1702280508; h=content-transfer-encoding:mime-version:message-id:date:subject:cc :to:from:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=aqDppSa+iEazOrXoFvXAZb9k/JUOMvHpasHkVrurQX4=; b=IgUCt6Shg58t1SR8oXef4RShjrHRlI2xkDlZ06ScWSOzjvclZhyGimS+7hpoyKglwD LIOPUEj2kbCBeVkiyAY0vYL2d2DqceVLygJGFlU0Q0EssmBNs6ngGLwxn6au2r4al6dj MNtryQxaKwPQN4Yl1ujA9qhFU87+T1gfQzYw5XN4SpE3vVTNezBM7d0JPDwSTcnsNNI4 8CLkyNdyC3q4XHDTBpbEpHKrUgy1I42FE1RGO+i2gCGv7uHPteyHJ/bYDWB81Se1uteW sru4gjAWRALYD8rT8KEYDV8qIuzng3XUS5HD1oTDIbMe8Db2Eys75EzHNbP1GoR+bG6E 0AwA== X-Gm-Message-State: AOJu0Yxj35DRh5nd7Uq2CEYShoHg+HnYDvjfhMPoeOnmuEWMr+zEFqHp /2G2hhasBUHSsq0fPwt/WMiVR1yk+leT+lbpudiibsb2LNkpcgB5xGzZ59fYzDzgVtJx31miDKB XTyashgJ3Mtxe8i+zxeDdrmzchJ99SNJkA/Xt5r5p+Q3ekn0iSh1sHiYiphBMi6CWySSrMz4CtN 39 X-Google-Smtp-Source: AGHT+IHyPmBMQEwgpufPYFDM6Y29N1yQCYzHT55M0mlO/d+yEQIOhBZ6z7DWVZGVBUGsxBvMEwWQ0A== X-Received: by 2002:a17:902:b210:b0:1d0:6ffd:6e5f with SMTP id t16-20020a170902b21000b001d06ffd6e5fmr1452066plr.87.1701675707300; Sun, 03 Dec 2023 23:41:47 -0800 (PST) Received: from hsinchu02.internal.sifive.com (59-124-168-89.hinet-ip.hinet.net. [59.124.168.89]) by smtp.gmail.com with ESMTPSA id m4-20020a170902db0400b001ce5b859a59sm3679852plx.305.2023.12.03.23.41.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 03 Dec 2023 23:41:46 -0800 (PST) From: Kito Cheng To: newlib@sourceware.org, kito.cheng@gmail.com Cc: Kito Cheng Subject: [PATCH] RISC-V: Support long double math Date: Mon, 4 Dec 2023 15:41:39 +0800 Message-Id: <20231204074139.17629-1-kito.cheng@sifive.com> X-Mailer: git-send-email 2.40.1 MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-12.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: Long double for RISC-V is using 128 bit IEEE 754 format like Aarch64, so we reference AArch64 to support that. --- newlib/Makefile.in | 63 +++++++++++++------- newlib/libc/include/math.h | 3 +- newlib/libc/machine/riscv/machine/_fpmath.h | 64 +++++++++++++++++++++ newlib/libm/Makefile.inc | 1 + 4 files changed, 110 insertions(+), 21 deletions(-) create mode 100644 newlib/libc/machine/riscv/machine/_fpmath.h diff --git a/newlib/Makefile.in b/newlib/Makefile.in index 9cbb4254e..970272e1a 100644 --- a/newlib/Makefile.in +++ b/newlib/Makefile.in @@ -947,14 +947,17 @@ check_PROGRAMS =3D @HAVE_LIBM_MACHINE_SPARC_TRUE@am__append_159 =3D $(libm_machine_sparc_src) @HAVE_LIBM_MACHINE_SPU_TRUE@am__append_160 =3D $(libm_machine_spu_src) @HAVE_LIBM_MACHINE_RISCV_TRUE@am__append_161 =3D $(libm_machine_riscv_src) -@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_162 =3D $(libm_machine_x86_64_sr= c) -@HAVE_LIBM_MACHINE_X86_64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_163 =3D $= (libm_ld80_lsrc) -@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_164 =3D=20 -@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_165 =3D=20 -@HAVE_LIBM_MACHINE_XTENSA_TRUE@@XTENSA_XCHAL_HAVE_FP_SQRT_TRUE@am__append_= 166 =3D \ +@HAVE_LIBM_MACHINE_RISCV_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_162 =3D $(= libm_ld128_lsrc) +@HAVE_LIBM_MACHINE_RISCV_TRUE@am__append_163 =3D=20 +@HAVE_LIBM_MACHINE_RISCV_TRUE@am__append_164 =3D=20 +@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_165 =3D $(libm_machine_x86_64_sr= c) +@HAVE_LIBM_MACHINE_X86_64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__append_166 =3D $= (libm_ld80_lsrc) +@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_167 =3D=20 +@HAVE_LIBM_MACHINE_X86_64_TRUE@am__append_168 =3D=20 +@HAVE_LIBM_MACHINE_XTENSA_TRUE@@XTENSA_XCHAL_HAVE_FP_SQRT_TRUE@am__append_= 169 =3D \ @HAVE_LIBM_MACHINE_XTENSA_TRUE@@XTENSA_XCHAL_HAVE_FP_SQRT_TRUE@ libm/machi= ne/xtensa/ef_sqrt.c =20 -@HAVE_LIBM_MACHINE_XTENSA_TRUE@am__append_167 =3D $(libm_machine_xtensa_sr= c) +@HAVE_LIBM_MACHINE_XTENSA_TRUE@am__append_170 =3D $(libm_machine_xtensa_sr= c) subdir =3D . ACLOCAL_M4 =3D $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps =3D $(top_srcdir)/../config/depstand.m4 \ @@ -3198,6 +3201,16 @@ am__objects_159 =3D libm/fenv/libm_a-feclearexcept.$= (OBJEXT) \ @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-fetestexcept.= $(OBJEXT) \ @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/machine/aarch64/libm_a-feupdateenv.$= (OBJEXT) @HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_161 =3D $(am__objects_160) +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects= _162 =3D libm/ld128/libm_a-e_powl.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-s_erfl.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-s_exp2l.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-s_expl.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-s_logl.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-b_tgammal.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-invtrig.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-e_lgammal_r.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-k_cosl.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_AARCH64_FALSE@@HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/ld128= /libm_a-k_sinl.$(OBJEXT) @HAVE_LIBM_MACHINE_AARCH64_TRUE@am__objects_162 =3D libm/ld128/libm_a-e_po= wl.$(OBJEXT) \ @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_erfl.$(OBJEXT) \ @HAVE_LIBM_MACHINE_AARCH64_TRUE@ libm/ld128/libm_a-s_exp2l.$(OBJEXT) \ @@ -3615,7 +3628,8 @@ am__objects_159 =3D libm/fenv/libm_a-feclearexcept.$(= OBJEXT) \ @HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-s_llround.$(OBJEX= T) \ @HAVE_LIBM_MACHINE_RISCV_TRUE@ libm/machine/riscv/libm_a-sf_llround.$(OBJE= XT) @HAVE_LIBM_MACHINE_RISCV_TRUE@am__objects_187 =3D $(am__objects_186) -@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_188 =3D libm/machine/x86_64/lib= m_a-feclearexcept.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_RISCV_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_188 =3D $= (am__objects_162) +@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_189 =3D libm/machine/x86_64/lib= m_a-feclearexcept.$(OBJEXT) \ @HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fegetenv.$(OBJE= XT) \ @HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fegetexceptflag= .$(OBJEXT) \ @HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fegetround.$(OB= JEXT) \ @@ -3627,10 +3641,10 @@ am__objects_159 =3D libm/fenv/libm_a-feclearexcept.= $(OBJEXT) \ @HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fesetround.$(OB= JEXT) \ @HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-fetestexcept.$(= OBJEXT) \ @HAVE_LIBM_MACHINE_X86_64_TRUE@ libm/machine/x86_64/libm_a-feupdateenv.$(O= BJEXT) -@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_189 =3D $(am__objects_188) -@HAVE_LIBM_MACHINE_X86_64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_190 =3D = $(am__objects_170) -@HAVE_LIBM_MACHINE_XTENSA_TRUE@@XTENSA_XCHAL_HAVE_FP_SQRT_TRUE@am__objects= _191 =3D libm/machine/xtensa/libm_a-ef_sqrt.$(OBJEXT) -@HAVE_LIBM_MACHINE_XTENSA_TRUE@am__objects_192 =3D libm/machine/xtensa/lib= m_a-feclearexcept.$(OBJEXT) \ +@HAVE_LIBM_MACHINE_X86_64_TRUE@am__objects_190 =3D $(am__objects_189) +@HAVE_LIBM_MACHINE_X86_64_TRUE@@HAVE_LONG_DOUBLE_TRUE@am__objects_191 =3D = $(am__objects_170) +@HAVE_LIBM_MACHINE_XTENSA_TRUE@@XTENSA_XCHAL_HAVE_FP_SQRT_TRUE@am__objects= _192 =3D libm/machine/xtensa/libm_a-ef_sqrt.$(OBJEXT) +@HAVE_LIBM_MACHINE_XTENSA_TRUE@am__objects_193 =3D libm/machine/xtensa/lib= m_a-feclearexcept.$(OBJEXT) \ @HAVE_LIBM_MACHINE_XTENSA_TRUE@ libm/machine/xtensa/libm_a-fegetenv.$(OBJE= XT) \ @HAVE_LIBM_MACHINE_XTENSA_TRUE@ libm/machine/xtensa/libm_a-fegetexcept.$(O= BJEXT) \ @HAVE_LIBM_MACHINE_XTENSA_TRUE@ libm/machine/xtensa/libm_a-fegetexceptflag= .$(OBJEXT) \ @@ -3639,8 +3653,8 @@ am__objects_159 =3D libm/fenv/libm_a-feclearexcept.$(= OBJEXT) \ @HAVE_LIBM_MACHINE_XTENSA_TRUE@ libm/machine/xtensa/libm_a-feraiseexcept.$= (OBJEXT) \ @HAVE_LIBM_MACHINE_XTENSA_TRUE@ libm/machine/xtensa/libm_a-fetestexcept.$(= OBJEXT) \ @HAVE_LIBM_MACHINE_XTENSA_TRUE@ libm/machine/xtensa/libm_a-feupdateenv.$(O= BJEXT) \ -@HAVE_LIBM_MACHINE_XTENSA_TRUE@ $(am__objects_191) -@HAVE_LIBM_MACHINE_XTENSA_TRUE@am__objects_193 =3D $(am__objects_192) +@HAVE_LIBM_MACHINE_XTENSA_TRUE@ $(am__objects_192) +@HAVE_LIBM_MACHINE_XTENSA_TRUE@am__objects_194 =3D $(am__objects_193) am_libm_a_OBJECTS =3D $(am__objects_145) $(am__objects_149) \ $(am__objects_150) $(am__objects_151) $(am__objects_153) \ $(am__objects_155) $(am__objects_156) $(am__objects_157) \ @@ -3649,7 +3663,8 @@ am_libm_a_OBJECTS =3D $(am__objects_145) $(am__object= s_149) \ $(am__objects_169) $(am__objects_171) $(am__objects_173) \ $(am__objects_177) $(am__objects_179) $(am__objects_181) \ $(am__objects_183) $(am__objects_185) $(am__objects_187) \ - $(am__objects_189) $(am__objects_190) $(am__objects_193) + $(am__objects_188) $(am__objects_190) $(am__objects_191) \ + $(am__objects_194) libm_a_OBJECTS =3D $(am_libm_a_OBJECTS) am_libm_test_test_OBJECTS =3D libm/test/test.$(OBJEXT) \ libm/test/string.$(OBJEXT) libm/test/convert.$(OBJEXT) \ @@ -4209,7 +4224,8 @@ libm_a_SOURCES =3D $(am__append_133) $(am__append_136= ) \ $(am__append_149) $(am__append_150) $(am__append_153) \ $(am__append_156) $(am__append_157) $(am__append_158) \ $(am__append_159) $(am__append_160) $(am__append_161) \ - $(am__append_162) $(am__append_163) $(am__append_167) + $(am__append_162) $(am__append_165) $(am__append_166) \ + $(am__append_170) libm_a_CFLAGS =3D $(AM_CFLAGS) $(libm_a_CFLAGS_$(subst /,_,$(@D))) $(libm_= a_CFLAGS_$(subst /,_,$(@D)_$( + * 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 PURP= OSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENT= IAL + * 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, STR= ICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY W= AY + * 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 + +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] =3D (uint32_t)(u).bits.manl; \ + (a)[1] =3D (uint32_t)((u).bits.manl >> 32); \ + (a)[2] =3D (uint32_t)(u).bits.manh; \ + (a)[3] =3D (uint32_t)((u).bits.manh >> 32); \ +} while(0) diff --git a/newlib/libm/Makefile.inc b/newlib/libm/Makefile.inc index 28b84bfe2..bf31b1be7 100644 --- a/newlib/libm/Makefile.inc +++ b/newlib/libm/Makefile.inc @@ -87,6 +87,7 @@ include %D%/machine/spu/Makefile.inc endif if HAVE_LIBM_MACHINE_RISCV include %D%/machine/riscv/Makefile.inc +include %D%/ld128/Makefile.inc endif if HAVE_LIBM_MACHINE_X86_64 include %D%/machine/x86_64/Makefile.inc --=20 2.40.1