From: Joseph Myers <joseph@codesourcery.com>
To: FX <fxcoudert@gmail.com>
Cc: Jakub Jelinek <jakub@redhat.com>, <gcc-patches@gcc.gnu.org>
Subject: Re: [PATCH] Add __builtin_iseqsig()
Date: Mon, 31 Oct 2022 22:35:00 +0000 [thread overview]
Message-ID: <df204849-64e0-f37f-9c14-96ca638c32e2@codesourcery.com> (raw)
In-Reply-To: <076BA73D-2FFC-4DEA-8BFA-B4D966F80F1D@gmail.com>
On Mon, 31 Oct 2022, FX via Gcc-patches wrote:
> - rounded conversions: converting, from an integer or floating point
> type, into another floating point type, with specific rounding mode
> passed as argument
These don't have standard C names. The way to do these in C would be
using the FENV_ROUND pragma around a conversion, but we don't support any
of the standard pragmas including those from C99 and they would be a large
project (cf. Marc Glisse's -ffenv-access patches from August 2020 -
although some things in FENV_ACCESS are probably rather orthogonal to
FENV_ROUND, I expect what's required in terms of preventing unwanted code
movement across rounding mode changes is similar).
It might be possible to add built-in functions for such conversions
without needing the FENV_ROUND machinery, if you make them expand to insn
patterns (with temporary rounding mode changes) that are arranged so the
compiler can't split them up.
(There's a principle of not introducing libm dependencies in code not
using any <math.h>, <fenv.h> or <complex.h> functions or corresponding
built-in functions, which would be an issue for generating calls to
fesetround, inline or in libgcc, from such an operation. But arguably,
even if FENV_ROUND shouldn't introduce such dependencies - my assumption
being that FENV_ROUND should involve target-specific inline
implementations of the required rounding mode changes - it might be OK to
document some GCC-specific built-in function as doing so.)
> - conversion to integer: converting, from a floating point type, into an
> integer type, with specific rounding mode passed as argument
See the fromfp functions (signed and unsigned versions, versions with and
without raising inexact, rounding mode specified as one of the FP_INT_*
macros from <math.h>). The versions in TS 18661-1 produced results in an
integer type (intmax_t / uintmax_t, with the actual width for the
conversion passed as an argument). *But* C2X changed that to return the
result in a floating-point type instead (as part of reducing the use of
intmax_t in interfaces) - I haven't yet implemented that change in glibc.
So the way to do such a conversion to an integer type in C2X involves
calling such a function and then converting its result to that integer
type.
GCC certainly knows about handling such a pair (<math.h> function,
conversion of its result) as a built-in function (e.g. __builtin_iceil).
My guess is that in most cases only selected calls would be expanded
inline - calls where not only is there an appropriate conversion to an
integer type (matching, or maybe wider than, the width passed to the
function), but where also the function, rounding mode and width together
match an operation for which there is a hardware instruction, with other
cases (including ones where the rounding mode or width aren't constant)
ending up as runtime calls (unless optimized for constant arguments). So
while the interfaces exist in C2X, the built-in function support in GCC
may be fairly complicated, with the existence of the older TS 18661-1
version of the functions complicating things further.
> - IEEE operations corresponding to nextDown and nextUp (or are those
> already available? I have not checked the fine print)
nextdown and nextup have been in glibc since version 2.24. I expect that
adding built-in functions that optimize them for constant arguments would
be straightforward (that doesn't help if what you actually want it some
way to support those operations at runtime for targets without the
functions in libm, of course).
--
Joseph S. Myers
joseph@codesourcery.com
next prev parent reply other threads:[~2022-10-31 22:35 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-09-01 21:02 FX
2022-09-09 17:55 ` FX
2022-09-21 9:40 ` FX
2022-10-06 8:40 ` FX
2022-10-06 21:46 ` Joseph Myers
2023-06-06 18:15 ` FX Coudert
2023-06-13 16:49 ` FX Coudert
2023-06-26 8:59 ` FX Coudert
2023-07-12 9:39 ` FX Coudert
2023-07-19 14:48 ` FX Coudert
2023-07-20 7:17 ` Richard Biener
2022-10-29 5:10 ` Jeff Law
2022-10-31 18:24 ` Joseph Myers
2022-10-31 19:15 ` FX
2022-10-31 22:35 ` Joseph Myers [this message]
2022-11-20 17:10 ` Jeff Law
2022-11-20 17:28 ` FX
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=df204849-64e0-f37f-9c14-96ca638c32e2@codesourcery.com \
--to=joseph@codesourcery.com \
--cc=fxcoudert@gmail.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=jakub@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).