From patchwork Wed Nov 16 09:06:17 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Jelinek X-Patchwork-Id: 20822 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a5d:6687:0:0:0:0:0 with SMTP id l7csp36342wru; Wed, 16 Nov 2022 01:07:15 -0800 (PST) X-Google-Smtp-Source: AA0mqf5YYHZ/cztgQlwdRHhk/lR/EFG2e7scCP5zO1SmJ4tpSj31L7b/kBTaLhXvsjuEX0gEd1K+ X-Received: by 2002:a17:906:4085:b0:7ae:bfeb:2219 with SMTP id u5-20020a170906408500b007aebfeb2219mr16693883ejj.145.1668589634916; Wed, 16 Nov 2022 01:07:14 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1668589634; cv=none; d=google.com; s=arc-20160816; b=JXTSGIOXDa/CTVtly09FB90d1xP4VLmoqpLeaFRu7/IQ19DCHpcDWjv8c87yju+uH4 3SH8vuCChv+kKZpA7OFubqi2KwZrtOc/Bv4xr3RlgEaN7gTTMpOErEpJ9UG4DtaKbJvp ws63THkNnGMNVB8Wl3lksn1nNxtglel377gYiz/vb5boo5RX/AngYH6UwgWwzFiEG2eo gMLbUbMZfepbYJ6cvErwkiU8tzgPEoh0LIVCjQonohCXDP/2JzO7ZlkfEo+SixRTC7nK cW+cD+8ylH3SmkwQz38R/21QBfD1S3WpQ0JOFrX3srmH5Dy+ZOZUpjOaThpyHdZcNHuJ Lp8A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-disposition:mime-version:message-id:subject:cc:to:date :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=AvrhqnPDB+XdlSG7xKNZuttolix5qsUgMgtSqrawGxM=; b=RVcIJRsDIMNAEg8S6wDJ24/eb9+UHvvD2r2XIyv3DBRRVqDrcFaTpM2eALlN+9ZFJ1 51VBMwEwcdfynUIEDdtTolwYeMqDjYmhsr3OOSO+MDFbQumnhVt1AfbrP4WBR7MxOruK Um0iscZwrcH6EpP2C9mSdvM+6d5P18DXY9ZGTB4LmICxER8ozo+tkwk3bXU+3TrkGXBh /FcX2U2kKM9aRP2+jAepx14WQBJIyPcpnyaASgKTzv5pYWRaeagf6H/n6EE96zComKEd 5q0SiBRtfVfB0W83AHPcErbJFikFxH6jaS/t873kpPK1o9djq1wR+J/KvdAlvBUSXxNU zIdQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=ivcZU9dt; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id m15-20020a50930f000000b0045cad599362si13413892eda.530.2022.11.16.01.07.14 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 16 Nov 2022 01:07:14 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=ivcZU9dt; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 968323955C85 for ; Wed, 16 Nov 2022 09:07:13 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 968323955C85 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1668589633; bh=AvrhqnPDB+XdlSG7xKNZuttolix5qsUgMgtSqrawGxM=; h=Date:To:Cc:Subject:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=ivcZU9dtcqD4+cjRJYKINxZbx7MQCvdF/h1H2drpnYG2s8eV5LOo5IXzP4iipKYDC 4VlFv/3MzJBEKnxCnMaS9zr+kteb6AMZl2eeSgCapEG5zp4zp2qO3/m+GeFgFzXTqb ClIyCijsLy76mxAUU5J+7AK+EQnz1oaWK1hocNZg= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id 791463896C1F for ; Wed, 16 Nov 2022 09:06:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 791463896C1F Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-311-i1-ePkguNI-0fdQ9zn5CrQ-1; Wed, 16 Nov 2022 04:06:24 -0500 X-MC-Unique: i1-ePkguNI-0fdQ9zn5CrQ-1 Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.rdu2.redhat.com [10.11.54.3]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 665D5805AC6; Wed, 16 Nov 2022 09:06:24 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0CACB112132C; Wed, 16 Nov 2022 09:06:23 +0000 (UTC) Received: from tucnak.zalov.cz (localhost [127.0.0.1]) by tucnak.zalov.cz (8.17.1/8.17.1) with ESMTPS id 2AG96IYo2449551 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 16 Nov 2022 10:06:19 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 2AG96HKV2449550; Wed, 16 Nov 2022 10:06:17 +0100 Date: Wed, 16 Nov 2022 10:06:17 +0100 To: Uros Bizjak , Richard Biener , Jeff Law , "Joseph S. Myers" Cc: gcc-patches@gcc.gnu.org Subject: [PATCH] libgcc, i386: Add __fix{,uns}bfti and __float{,un}tibf [PR107703] Message-ID: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.3 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Disposition: inline X-Spam-Status: No, score=-3.5 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, 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.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jakub Jelinek via Gcc-patches From: Jakub Jelinek Reply-To: Jakub Jelinek Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1749643045167348301?= X-GMAIL-MSGID: =?utf-8?q?1749643045167348301?= Hi! While DI <-> BF conversions can be handled (and are) through DI <-> XF <-> BF and for narrower integral modes even sometimes through DF or SF, because XFmode has 64-bit mantissa and so all the DImode values are exactly representable in XFmode. That is not the case for TImode, and while e.g. the HF -> TI conversions are IMHO useless in libgcc, because HFmode has -65504.0f16, 65504.0f16 range, all the integers will be already representable in SImode (or even HImode for unsigned) and so I think HF -> DI -> TI conversions are faster and valid, BFmode has roughly the same range as SFmode and so we absolutely need the TI -> BF conversions to avoid double rounding. As for BF -> TI conversions, they can be either also implemented in libgcc (as done in the patch), or they could be implemented as BF -> SF -> TI conversions with the same code generation used elsewhere, just doing the 16-bit left shift of the bits - I think we don't need to handle sNaNs during the BF -> SF part because SF -> TI (which is already a libcall too) will handle that too. Thoughts on this? I guess my preference would be the BF -> SF -> TI path because we won't need to waste 32: 0000000000015e10 321 FUNC GLOBAL DEFAULT 13 __fixbfti@@GCC_13.0.0 89: 0000000000015f60 299 FUNC GLOBAL DEFAULT 13 __fixunsbfti@@GCC_13.0.0 If so, I'd need to cut the fix parts of the patch below and do something in the middle-end. 2022-11-16 Jakub Jelinek PR target/107703 * soft-fp/fixbfti.c: New file. * soft-fp/fixunsbfti.c: New file. * soft-fp/floattibf.c: New file. * soft-fp/floatuntibf.c: New file. * config/i386/libgcc-glibc.ver: Export __fix{,uns}bfti and __float{,un}tibf @ GCC_13.0.0. * config/i386/64/t-softfp (softfp_extras): Add fixbfti, fixunsbfti, floattibf and floatuntibf. (CFLAGS-fixbfti.c, CFLAGS-fixunsbfti.c, CFLAGS-floattibf.c, CFLAGS-floatunstibf.c): Add -msse2. Jakub --- libgcc/soft-fp/fixbfti.c.jj 2022-11-15 19:07:41.747901840 +0100 +++ libgcc/soft-fp/fixbfti.c 2022-11-15 19:13:45.990927498 +0100 @@ -0,0 +1,45 @@ +/* Software floating-point emulation. + Convert bfloat16 to 128bit signed integer + Copyright (C) 2007-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "soft-fp.h" +#include "brain.h" + +TItype +__fixbfti (BFtype a) +{ + FP_DECL_EX; + FP_DECL_B (A); + UTItype r; + + FP_INIT_EXCEPTIONS; + FP_UNPACK_RAW_B (A, a); + FP_TO_INT_B (r, A, TI_BITS, 1); + FP_HANDLE_EXCEPTIONS; + + return r; +} --- libgcc/soft-fp/fixunsbfti.c.jj 2022-11-15 19:08:24.400319352 +0100 +++ libgcc/soft-fp/fixunsbfti.c 2022-11-15 19:13:50.200870008 +0100 @@ -0,0 +1,45 @@ +/* Software floating-point emulation. + Convert bfloat16 to 128bit unsigned integer + Copyright (C) 2007-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "soft-fp.h" +#include "brain.h" + +UTItype +__fixunsbfti (BFtype a) +{ + FP_DECL_EX; + FP_DECL_B (A); + UTItype r; + + FP_INIT_EXCEPTIONS; + FP_UNPACK_RAW_B (A, a); + FP_TO_INT_B (r, A, TI_BITS, 0); + FP_HANDLE_EXCEPTIONS; + + return r; +} --- libgcc/soft-fp/floattibf.c.jj 2022-11-15 19:10:13.147834226 +0100 +++ libgcc/soft-fp/floattibf.c 2022-11-15 19:13:40.939996482 +0100 @@ -0,0 +1,45 @@ +/* Software floating-point emulation. + Convert a 128bit signed integer to bfloat16 + Copyright (C) 2007-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "soft-fp.h" +#include "brain.h" + +BFtype +__floattibf (TItype i) +{ + FP_DECL_EX; + FP_DECL_B (A); + BFtype a; + + FP_INIT_ROUNDMODE; + FP_FROM_INT_B (A, i, TI_BITS, UTItype); + FP_PACK_RAW_B (a, A); + FP_HANDLE_EXCEPTIONS; + + return a; +} --- libgcc/soft-fp/floatuntibf.c.jj 2022-11-15 19:10:53.363285018 +0100 +++ libgcc/soft-fp/floatuntibf.c 2022-11-15 19:13:31.399126765 +0100 @@ -0,0 +1,45 @@ +/* Software floating-point emulation. + Convert a 128bit unsigned integer to bfloat16 + Copyright (C) 2007-2022 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + In addition to the permissions in the GNU Lesser General Public + License, the Free Software Foundation gives you unlimited + permission to link the compiled version of this file into + combinations with other programs, and to distribute those + combinations without any restriction coming from the use of this + file. (The Lesser General Public License restrictions do apply in + other respects; for example, they cover modification of the file, + and distribution when not linked into a combine executable.) + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ + +#include "soft-fp.h" +#include "brain.h" + +BFtype +__floatuntibf (UTItype i) +{ + FP_DECL_EX; + FP_DECL_B (A); + BFtype a; + + FP_INIT_ROUNDMODE; + FP_FROM_INT_B (A, i, TI_BITS, UTItype); + FP_PACK_RAW_B (a, A); + FP_HANDLE_EXCEPTIONS; + + return a; +} --- libgcc/config/i386/libgcc-glibc.ver.jj 2022-10-14 09:35:56.269989297 +0200 +++ libgcc/config/i386/libgcc-glibc.ver 2022-11-15 19:26:37.125389987 +0100 @@ -218,6 +218,10 @@ GCC_12.0.0 { %inherit GCC_13.0.0 GCC_12.0.0 GCC_13.0.0 { __extendbfsf2 + __fixbfti + __fixunsbfti + __floattibf + __floatuntibf __truncdfbf2 __truncsfbf2 __trunctfbf2 --- libgcc/config/i386/64/t-softfp.jj 2021-12-30 15:12:44.111138056 +0100 +++ libgcc/config/i386/64/t-softfp 2022-11-15 19:26:07.184799287 +0100 @@ -1,6 +1,11 @@ -softfp_extras := fixhfti fixunshfti floattihf floatuntihf +softfp_extras := fixhfti fixunshfti floattihf floatuntihf \ + fixbfti fixunsbfti floattibf floatuntibf CFLAGS-fixhfti.c += -msse2 CFLAGS-fixunshfti.c += -msse2 CFLAGS-floattihf.c += -msse2 CFLAGS-floatunstihf.c += -msse2 +CFLAGS-fixbfti.c += -msse2 +CFLAGS-fixunsbfti.c += -msse2 +CFLAGS-floattibf.c += -msse2 +CFLAGS-floatunstibf.c += -msse2