From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: 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 E70693959C9C for ; Wed, 16 Nov 2022 11:51:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org E70693959C9C Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1668599485; h=from:from:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:mime-version:mime-version: content-type:content-type:in-reply-to:in-reply-to: references:references; bh=0AHJeTwc4yrJtjOwWGM9b+syti37Mk5FooemzEb3RL8=; b=dvDK0CDZSVJJ6Mu8aWcwVeg1U0uIZmIQtUCrxBphXdqvA8Kecy6mlIG4j7cyiMWCPyM0YP dReHi3tnKSLOGN6UL+qrVkDnwKwuSI0eCIT9b8k4q7ptzAFg0F1vx2PJkmUic7Y2Zt61ed IvKMr/qAZtWRf9FT7xtnwHiTLcLLEQ8= Received: from mimecast-mx02.redhat.com (mx3-rdu2.redhat.com [66.187.233.73]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-563-I6q5zrtbMv20TjZsJFnD9g-1; Wed, 16 Nov 2022 06:51:22 -0500 X-MC-Unique: I6q5zrtbMv20TjZsJFnD9g-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.rdu2.redhat.com [10.11.54.2]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id E9E693C0F240; Wed, 16 Nov 2022 11:51:21 +0000 (UTC) Received: from tucnak.zalov.cz (unknown [10.39.192.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 9921340C6EC3; Wed, 16 Nov 2022 11:51:21 +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 2AGBpGPL2463011 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Wed, 16 Nov 2022 12:51:16 +0100 Received: (from jakub@localhost) by tucnak.zalov.cz (8.17.1/8.17.1/Submit) id 2AGBpFtS2463010; Wed, 16 Nov 2022 12:51:15 +0100 Date: Wed, 16 Nov 2022 12:51:14 +0100 From: Jakub Jelinek To: Uros Bizjak , Richard Biener , Jeff Law , "Joseph S. Myers" , gcc-patches@gcc.gnu.org Subject: [PATCH] libgcc, i386, optabs, v2: Add __float{,un}tibf to libgcc and expand BF -> integral through SF intermediate [PR107703] Message-ID: Reply-To: Jakub Jelinek References: MIME-Version: 1.0 In-Reply-To: X-Scanned-By: MIMEDefang 3.1 on 10.11.54.2 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset=us-ascii Content-Disposition: inline X-Spam-Status: No, score=-3.9 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 List-Id: On Wed, Nov 16, 2022 at 10:06:17AM +0100, Jakub Jelinek via Gcc-patches wrote: > 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. Here is adjusted patch that does that. 2022-11-16 Jakub Jelinek PR target/107703 * optabs.cc (expand_fix): For conversions from BFmode to integral, use shifts to convert it to SFmode first and then convert SFmode to integral. * soft-fp/floattibf.c: New file. * soft-fp/floatuntibf.c: New file. * config/i386/libgcc-glibc.ver: Export __float{,un}tibf @ GCC_13.0.0. * config/i386/64/t-softfp (softfp_extras): Add floattibf and floatuntibf. (CFLAGS-floattibf.c, CFLAGS-floatunstibf.c): Add -msse2. --- gcc/optabs.cc.jj 2022-11-16 07:29:11.665715915 +0100 +++ gcc/optabs.cc 2022-11-16 12:46:25.523281210 +0100 @@ -5574,7 +5574,21 @@ expand_fix (rtx to, rtx from, int unsign rtx_insn *last = get_last_insn (); rtx from1 = from; if (fmode != GET_MODE (from)) - from1 = convert_to_mode (fmode, from, 0); + { + if (REAL_MODE_FORMAT (GET_MODE (from)) + == &arm_bfloat_half_format + && REAL_MODE_FORMAT (fmode) == &ieee_single_format) + /* The BF -> SF conversions can be just a shift, doesn't + need to handle sNANs. */ + { + int save_flag_finite_math_only = flag_finite_math_only; + flag_finite_math_only = true; + from1 = convert_to_mode (fmode, from, 0); + flag_finite_math_only = save_flag_finite_math_only; + } + else + from1 = convert_to_mode (fmode, from, 0); + } if (must_trunc) { @@ -5646,7 +5660,21 @@ expand_fix (rtx to, rtx from, int unsign lab2 = gen_label_rtx (); if (fmode != GET_MODE (from)) - from = convert_to_mode (fmode, from, 0); + { + if (REAL_MODE_FORMAT (GET_MODE (from)) + == &arm_bfloat_half_format + && REAL_MODE_FORMAT (fmode) == &ieee_single_format) + /* The BF -> SF conversions can be just a shift, doesn't + need to handle sNANs. */ + { + int save_flag_finite_math_only = flag_finite_math_only; + flag_finite_math_only = true; + from = convert_to_mode (fmode, from, 0); + flag_finite_math_only = save_flag_finite_math_only; + } + else + from = convert_to_mode (fmode, from, 0); + } /* See if we need to do the subtraction. */ do_pending_stack_adjust (); @@ -5690,6 +5718,22 @@ expand_fix (rtx to, rtx from, int unsign } } +#ifdef HAVE_SFmode + if (REAL_MODE_FORMAT (GET_MODE (from)) == &arm_bfloat_half_format + && REAL_MODE_FORMAT (SFmode) == &ieee_single_format) + /* We don't have BF -> TI library functions, use BF -> SF -> TI + instead but the BF -> SF conversion can be just a shift, doesn't + need to handle sNANs. */ + { + int save_flag_finite_math_only = flag_finite_math_only; + flag_finite_math_only = true; + from = convert_to_mode (SFmode, from, 0); + flag_finite_math_only = save_flag_finite_math_only; + expand_fix (to, from, unsignedp); + return; + } +#endif + /* We can't do it with an insn, so use a library call. But first ensure that the mode of TO is at least as wide as SImode, since those are the only library calls we know about. */ --- 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,8 @@ GCC_12.0.0 { %inherit GCC_13.0.0 GCC_12.0.0 GCC_13.0.0 { __extendbfsf2 + __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,9 @@ -softfp_extras := fixhfti fixunshfti floattihf floatuntihf +softfp_extras := fixhfti fixunshfti floattihf floatuntihf \ + floattibf floatuntibf CFLAGS-fixhfti.c += -msse2 CFLAGS-fixunshfti.c += -msse2 CFLAGS-floattihf.c += -msse2 CFLAGS-floatunstihf.c += -msse2 +CFLAGS-floattibf.c += -msse2 +CFLAGS-floatunstibf.c += -msse2 Jakub