[PATCH v2 0/4] LoongArch: Add some floating-point operations

Xi Ruoyao xry111@xry111.site
Wed Nov 16 14:39:06 GMT 2022


On Wed, 2022-11-16 at 21:00 +0800, tangxiaolin wrote:
> I notice that use __builtin_lrint to expand __lrint to:
>           ftint.l.d       $fa0, $fa0
>           movfr2gr.d      $a0, $fa0
>           jirl            $zero, $ra, 0
> 
> Operations of 'ftint.l.d'  is convertToIntegerExactTiesToEven(x)/ 
> convertToIntegerExactTowardZero(x)/convertToIntegerExactTowardPositive
> (x)/convertToIntegerExactTowardNegative(x) according to FCSR
> RM(LoongArch Manual).
> 
> However, the operation of function rint, lrint, llrint is
> roundToIntegralExact according to  ISO/IEC TS 18661-1: 2014 and The
> GNU C Library Reference Manual. It's a little bit difference between
> those two operations, but we still can pass all testcases so far. I'm
> a little worried about it. (As we know that operations of 
> 'frint.{d,s}' is exactly roundToIntegralExact, however we 
> discard it.)

TS 18661 says:

   — The lrint and llrint functions in <math.h> provide the IEC 60559 conversions, which
   honor the directed rounding mode, from floating point to the long int and long long int
   integer formats. The lrint and llrint functions can be used to implement IEC 60559
   conversions from floating to other integer formats.

Note that it mentions "conversions" explicitly.  In IEC 60559
convertToInteger* are called "conversions", but roundToIntegral* are
just called "rounding operations".  And the plural form of "conversions"
also suggests that we need to pick a proper conversion operation
according to the rounding mode.

So I think the semantics of lrint aligns with ftint.{s/d}.


> 
> 
> 
> 在 2022/11/14 下午4:05, Xi Ruoyao 写道:
> > On Mon, 2022-11-14 at 10:41 +0800, tangxiaolin wrote:
> > > How about I do this work on Glibc?
> > [Moving the discussion to libc-alpha.]
> > 
> > Go for it.  I'm attaching my draft patches and you can use them as a
> > starting point.
> > 
> > rint change is trivial.  for lrint and llrint I'm not sure if we
> > should
> > add USE_LRINTL_BUILTIN and USE_LRINTF128_BUILTIN (with zero value)
> > as
> > well.  Likewise for logb.
> > 
> > scalbn is a little complicated: I'd prefer to expand M_SCALBN to
> > __builtin_scalbn directly instead of calling __scalbn (to avoid the
> > overhead calling a function with only two instructions) but it seems
> > not
> > easy: some files calling M_SCALBN are compiled with -fmath-errno,
> > with
> > which the compiler will refuse to expand __builtin_scalbn.
> > 
> > > 在 2022/11/12 下午3:08, Xi Ruoyao 写道:
> > > > On Wed, 2022-11-09 at 21:53 +0800, Xi Ruoyao wrote:
> > > > > These patches allow to expand the following builtins to
> > > > > floating
> > > > > point
> > > > > instructions for LoongArch:
> > > > > 
> > > > > - __builtin_rint{,f}
> > > > > - __builtin_{l,ll}rint{,f}
> > > > > - __builtin_{l,ll}floor{,f}
> > > > > - __builtin_{l,ll}ceil{,f}
> > > > > - __builtin_scalb{n,ln}{,f}
> > > > > - __builtin_logb{,f}
> > > > > 
> > > > > Bootstrapped and regtested on loongarch64-linux-gnu.  And a
> > > > > modified
> > > > > Glibc using the builtins for rint{,f}, {l,ll}rint{,f}, and
> > > > > logb{,f}
> > > > > also survived Glibc test suite.
> > > > > 
> > > > > Please review ASAP because GCC 13 stage 1 will end on Nov.
> > > > > 13th.
> > > > > 
> > > > > v1 -> v2: Only use ftint{rm,rp} instructions if floor and ceil
> > > > > are
> > > > > allowed to raise inexact exception.
> > > > > 
> > > > > Xi Ruoyao (4):
> > > > >     LoongArch: Rename frint_<fmt> to rint<mode>2
> > > > >     LoongArch: Add ftint{,rm,rp}.{w,l}.{s,d} instructions
> > > > >     LoongArch: Add fscaleb.{s,d} instructions as ldexp{sf,df}3
> > > > >     LoongArch: Add flogb.{s,d} instructions and expand
> > > > > logb{sf,df}2
> > > > > 
> > > > >    gcc/config/loongarch/loongarch.md             | 95
> > > > > ++++++++++++++++++-
> > > > >    gcc/testsuite/gcc.target/loongarch/flogb.c    | 18 ++++
> > > > >    gcc/testsuite/gcc.target/loongarch/frint.c    | 16 ++++
> > > > >    gcc/testsuite/gcc.target/loongarch/fscaleb.c  | 48
> > > > > ++++++++++
> > > > >    .../gcc.target/loongarch/ftint-no-inexact.c   | 44
> > > > > +++++++++
> > > > >    gcc/testsuite/gcc.target/loongarch/ftint.c    | 44
> > > > > +++++++++
> > > > >    6 files changed, 261 insertions(+), 4 deletions(-)
> > > > >    create mode 100644
> > > > > gcc/testsuite/gcc.target/loongarch/flogb.c
> > > > >    create mode 100644
> > > > > gcc/testsuite/gcc.target/loongarch/frint.c
> > > > >    create mode 100644
> > > > > gcc/testsuite/gcc.target/loongarch/fscaleb.c
> > > > >    create mode 100644
> > > > > gcc/testsuite/gcc.target/loongarch/ftint-no-
> > > > > inexact.c
> > > > >    create mode 100644
> > > > > gcc/testsuite/gcc.target/loongarch/ftint.c
> > > > > 
> > > > Pushed r13-3922.
> > > > 
> > > > I'll be busy in the following week.  Will do the work on Glibc
> > > > side
> > > > after Nov. 20.
> > > > 
> 

-- 
Xi Ruoyao <xry111@xry111.site>
School of Aerospace Science and Technology, Xidian University


More information about the Libc-alpha mailing list