From patchwork Wed Jul 17 08:01:59 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Xiao Zeng X-Patchwork-Id: 1961466 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4WP7hg13Jrz1xqc for ; Wed, 17 Jul 2024 18:02:42 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 10ED73839156 for ; Wed, 17 Jul 2024 08:02:41 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from zg8tmtyylji0my4xnjeumjiw.icoremail.net (zg8tmtyylji0my4xnjeumjiw.icoremail.net [162.243.161.220]) by sourceware.org (Postfix) with ESMTP id F0A863858D39 for ; Wed, 17 Jul 2024 08:02:05 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org F0A863858D39 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=eswincomputing.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=eswincomputing.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org F0A863858D39 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=162.243.161.220 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1721203339; cv=none; b=B/YGFn30FAQ8leUefcfXOpcqNZ/RHsSevIWK++kpOuOMEvo32QOe1SHod9Zd8FRlGs/Csu/7AL2+j3Xzy8ypqQ0c5XKN8YzFT1HJk3G+Bmaw+u91uzI/hryPOWt7+QRfwPMY0/j7AVqlSffHIEWOeXqwti83ieKF9j0Do5eEUuU= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1721203339; c=relaxed/simple; bh=IvoH7MPr7tGUElw0xZtOQi/+F1lbg5Q5axekIxrFwPw=; h=From:To:Subject:Date:Message-Id; b=sFiNYQFa5HEbLSRZPvjSYvyAhAB1qQTCq4++N5hYLRRgoEz8pKTyybuwMll2i9Y8QdFfKHvodhUAi9EicipeYnQroPHtf5/bDupy3ZNn0cRj82C3yS5bHDkxp8MT5i5wEebJQxIoXGthPfBX+bvHRNtQ+dZ3qDHtjnlxQ/uU/yg= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from localhost.localdomain (unknown [10.12.130.38]) by app1 (Coremail) with SMTP id TAJkCgDniOV5epdmWEsWAA--.26643S4; Wed, 17 Jul 2024 16:02:01 +0800 (CST) From: Xiao Zeng To: gcc-patches@gcc.gnu.org Cc: jeffreyalaw@gmail.com, research_trasio@irq.a4lg.com, kito.cheng@gmail.com, palmer@dabbelt.com, zhengyu@eswincomputing.com, Xiao Zeng Subject: [PATCH] RISC-V: Support __mulbc3 and __divbc3 in libgcc for __bf16 Date: Wed, 17 Jul 2024 16:01:59 +0800 Message-Id: <20240717080159.34038-1-zengxiao@eswincomputing.com> X-Mailer: git-send-email 2.17.1 X-CM-TRANSID: TAJkCgDniOV5epdmWEsWAA--.26643S4 X-Coremail-Antispam: 1UD129KBjvJXoW3XF4DAF48Jr1kur1xZF43Wrg_yoWxWr45pr nrWa4rtrWjyr47G3s3GF1rWws7tF95Cr4xZFZxuw47K3WIq397JF1Dt3yYya9Iqr1IyrW3 Jr4DJ3Z093yvy3DanT9S1TB71UUUUUUqnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDU0xBIdaVrnRJUUUk214x267AKxVW8JVW5JwAFc2x0x2IEx4CE42xK8VAvwI8IcIk0 rVWrJVCq3wAFIxvE14AKwVWUJVWUGwA2ocxC64kIII0Yj41l84x0c7CEw4AK67xGY2AK02 1l84ACjcxK6xIIjxv20xvE14v26w1j6s0DM28EF7xvwVC0I7IYx2IY6xkF7I0E14v26r4U JVWxJr1l84ACjcxK6I8E87Iv67AKxVW0oVCq3wA2z4x0Y4vEx4A2jsIEc7CjxVAFwI0_Gc CE3s1le2I262IYc4CY6c8Ij28IcVAaY2xG8wAqx4xG64xvF2IEw4CE5I8CrVC2j2WlYx0E 2Ix0cI8IcVAFwI0_Jr0_Jr4lYx0Ex4A2jsIE14v26r1j6r4UMcvjeVCFs4IE7xkEbVWUJV W8JwACjcxG0xvY0x0EwIxGrwACjI8F5VA0II8E6IAqYI8I648v4I1lc2xSY4AK6svPMxAI w28IcxkI7VAKI48JMxC20s026xCaFVCjc4AY6r1j6r4UMI8I3I0E5I8CrVAFwI0_Jr0_Jr 4lx2IqxVCjr7xvwVAFwI0_JrI_JrWlx4CE17CEb7AF67AKxVWUAVWUtwCIc40Y0x0EwIxG rwCI42IY6xIIjxv20xvE14v26r1j6r1xMIIF0xvE2Ix0cI8IcVCY1x0267AKxVWUJVW8Jw CI42IY6xAIw20EY4v20xvaj40_Jr0_JF4lIxAIcVC2z280aVAFwI0_Jr0_Gr1lIxAIcVC2 z280aVCY1x0267AKxVWUJVW8JbIYCTnIWIevJa73UjIFyTuYvjfUoOJ5UUUUU X-CM-SenderInfo: p2hqw5xldrqvxvzl0uprps33xlqjhudrp/ X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, KAM_NUMSUBJECT, KAM_SHORT, RCVD_IN_MSPIKE_BL, RCVD_IN_MSPIKE_L4, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces~incoming=patchwork.ozlabs.org@gcc.gnu.org libgcc/ChangeLog: * Makefile.in: Support __divbc3 and __mulbc3. * libgcc2.c (if): Support BC mode for __bf16. (defined): Ditto. (MTYPE): Ditto. (CTYPE): Ditto. (AMTYPE): Ditto. (MODE): Ditto. (CEXT): Ditto. (NOTRUNC): Ditto. * libgcc2.h (LIBGCC2_HAS_BF_MODE): Ditto. (__attribute__): Ditto. (__divbc3): Add __divbc3 for __bf16. (__mulbc3): Add __mulbc3 for __bf16. gcc/testsuite/ChangeLog: * gcc.target/riscv/bf16-mulbc3-divbc3.c: New test. Signed-off-by: Xiao Zeng --- .../gcc.target/riscv/bf16-mulbc3-divbc3.c | 31 +++++++++++++++++++ libgcc/Makefile.in | 6 ++-- libgcc/libgcc2.c | 20 ++++++++---- libgcc/libgcc2.h | 14 +++++++++ 4 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 gcc/testsuite/gcc.target/riscv/bf16-mulbc3-divbc3.c diff --git a/gcc/testsuite/gcc.target/riscv/bf16-mulbc3-divbc3.c b/gcc/testsuite/gcc.target/riscv/bf16-mulbc3-divbc3.c new file mode 100644 index 00000000000..5b30de15ccf --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/bf16-mulbc3-divbc3.c @@ -0,0 +1,31 @@ +/* { dg-do run } */ +/* { dg-options "" } */ +/* { dg-skip-if "" { *-*-* } { "-O0" } } */ +#include + +typedef _Complex float __cbf16 __attribute__((__mode__(__BC__))); + +__cbf16 +divbc3 (__cbf16 rs1, __cbf16 rs2) +{ + return rs1 / rs2; +} + +__cbf16 +mulbc3 (__cbf16 rs1, __cbf16 rs2) +{ + return rs1 * rs2; +} + +int main() +{ + __cbf16 rs1 = 2.0 + 4.0 * I; + __cbf16 rs2 = 1.0 + 2.0 * I; + __cbf16 mul = -6.0 + 8.0 * I; + __cbf16 div = 2.0 + 0.0 * I; + if (mulbc3 (rs1, rs2) != mul) + __builtin_abort(); + if (divbc3 (rs1, rs2) != div) + __builtin_abort(); + return 0; +} diff --git a/libgcc/Makefile.in b/libgcc/Makefile.in index 0e46e9ef768..b71fd5e2250 100644 --- a/libgcc/Makefile.in +++ b/libgcc/Makefile.in @@ -450,9 +450,9 @@ lib2funcs = _muldi3 _negdi2 _lshrdi3 _ashldi3 _ashrdi3 _cmpdi2 _ucmpdi2 \ _negvsi2 _negvdi2 _ctors _ffssi2 _ffsdi2 _clz _clzsi2 _clzdi2 \ _ctzsi2 _ctzdi2 _popcount_tab _popcountsi2 _popcountdi2 \ _paritysi2 _paritydi2 _powisf2 _powidf2 _powixf2 _powitf2 \ - _mulhc3 _mulsc3 _muldc3 _mulxc3 _multc3 _divhc3 _divsc3 \ - _divdc3 _divxc3 _divtc3 _bswapsi2 _bswapdi2 _clrsbsi2 \ - _clrsbdi2 _mulbitint3 + _mulhc3 _mulbc3 _mulsc3 _muldc3 _mulxc3 _multc3 _divhc3 \ + _divbc3 _divsc3 _divdc3 _divxc3 _divtc3 _bswapsi2 _bswapdi2 \ + _clrsbsi2 _clrsbdi2 _mulbitint3 # The floating-point conversion routines that involve a single-word integer. # XX stands for the integer mode. diff --git a/libgcc/libgcc2.c b/libgcc/libgcc2.c index 3fcb85c5b92..1d2aafcfd63 100644 --- a/libgcc/libgcc2.c +++ b/libgcc/libgcc2.c @@ -2591,6 +2591,7 @@ NAME (TYPE x, int m) #endif #if((defined(L_mulhc3) || defined(L_divhc3)) && LIBGCC2_HAS_HF_MODE) \ + || ((defined(L_mulbc3) || defined(L_divbc3)) && LIBGCC2_HAS_BF_MODE) \ || ((defined(L_mulsc3) || defined(L_divsc3)) && LIBGCC2_HAS_SF_MODE) \ || ((defined(L_muldc3) || defined(L_divdc3)) && LIBGCC2_HAS_DF_MODE) \ || ((defined(L_mulxc3) || defined(L_divxc3)) && LIBGCC2_HAS_XF_MODE) \ @@ -2607,6 +2608,13 @@ NAME (TYPE x, int m) # define MODE hc # define CEXT __LIBGCC_HF_FUNC_EXT__ # define NOTRUNC (!__LIBGCC_HF_EXCESS_PRECISION__) +#elif defined(L_mulbc3) || defined(L_divbc3) +# define MTYPE BFtype +# define CTYPE BCtype +# define AMTYPE SFtype +# define MODE bc +# define CEXT __LIBGCC_BF_FUNC_EXT__ +# define NOTRUNC (!__LIBGCC_BF_EXCESS_PRECISION__) #elif defined(L_mulsc3) || defined(L_divsc3) # define MTYPE SFtype # define CTYPE SCtype @@ -2690,8 +2698,8 @@ extern void *compile_type_assert[sizeof(INFINITY) == sizeof(MTYPE) ? 1 : -1]; # define TRUNC(x) __asm__ ("" : "=m"(x) : "m"(x)) #endif -#if defined(L_mulhc3) || defined(L_mulsc3) || defined(L_muldc3) \ - || defined(L_mulxc3) || defined(L_multc3) +#if defined(L_mulhc3) || defined(L_mulbc3) || defined(L_mulsc3) \ + || defined(L_muldc3) || defined(L_mulxc3) || defined(L_multc3) CTYPE CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) @@ -2760,16 +2768,16 @@ CONCAT3(__mul,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) } #endif /* complex multiply */ -#if defined(L_divhc3) || defined(L_divsc3) || defined(L_divdc3) \ - || defined(L_divxc3) || defined(L_divtc3) +#if defined(L_divhc3) || defined(L_divbc3) || defined(L_divsc3) \ + || defined(L_divdc3) || defined(L_divxc3) || defined(L_divtc3) CTYPE CONCAT3(__div,MODE,3) (MTYPE a, MTYPE b, MTYPE c, MTYPE d) { -#if defined(L_divhc3) \ +#if (defined(L_divhc3) || defined(L_divbc3) ) \ || (defined(L_divsc3) && defined(__LIBGCC_HAVE_HWDBL__) ) - /* Half precision is handled with float precision. + /* _Float16 and __bf16 are handled with float precision. float is handled with double precision when double precision hardware is available. Due to the additional precision, the simple complex divide diff --git a/libgcc/libgcc2.h b/libgcc/libgcc2.h index b358b3a2b50..ee99badde86 100644 --- a/libgcc/libgcc2.h +++ b/libgcc/libgcc2.h @@ -43,6 +43,12 @@ extern void __eprintf (const char *, const char *, unsigned int, const char *) #define LIBGCC2_HAS_HF_MODE 0 #endif +#ifdef __LIBGCC_HAS_BF_MODE__ +#define LIBGCC2_HAS_BF_MODE 1 +#else +#define LIBGCC2_HAS_BF_MODE 0 +#endif + #ifdef __LIBGCC_HAS_SF_MODE__ #define LIBGCC2_HAS_SF_MODE 1 #else @@ -146,6 +152,10 @@ typedef unsigned int UTItype __attribute__ ((mode (TI))); typedef float HFtype __attribute__ ((mode (HF))); typedef _Complex float HCtype __attribute__ ((mode (HC))); #endif +#if LIBGCC2_HAS_BF_MODE +typedef float BFtype __attribute__ ((mode (BF))); +typedef _Complex float BCtype __attribute__ ((mode (BC))); +#endif #if LIBGCC2_HAS_SF_MODE typedef float SFtype __attribute__ ((mode (SF))); typedef _Complex float SCtype __attribute__ ((mode (SC))); @@ -465,6 +475,10 @@ extern SItype __negvsi2 (SItype); extern HCtype __divhc3 (HFtype, HFtype, HFtype, HFtype); extern HCtype __mulhc3 (HFtype, HFtype, HFtype, HFtype); #endif +#if LIBGCC2_HAS_BF_MODE +extern BCtype __divbc3 (BFtype, BFtype, BFtype, BFtype); +extern BCtype __mulbc3 (BFtype, BFtype, BFtype, BFtype); +#endif #if LIBGCC2_HAS_SF_MODE extern DWtype __fixsfdi (SFtype); extern SFtype __floatdisf (DWtype);