RISC-V missing __builtin_lceil and __builtin_lfloor

Message ID CALkvSf-K2bWSF_o4OOj89jkhEmTpGNrc_ZGKCRERPgK_HcdSHw@mail.gmail.com
State New, archived
Headers
Series RISC-V missing __builtin_lceil and __builtin_lfloor |

Commit Message

Kevin Lee Aug. 16, 2022, 12:44 a.m. UTC
  Hello,
Currently, __builtin_lceil and __builtin_lfloor doesn't generate an
existing instruction fcvt, but rather calls ceil and floor from the
library. This patch adds the missing iterator and attributes for lceil and
lfloor to produce the optimized code.
 The test cases check the correct generation of the fcvt instruction for
float/double to int/long/long long. Passed the test in riscv-linux.
Could this patch be committed?

gcc/ChangeLog:
       Michael Collison  <collison@rivosinc.com>
        * config/riscv/riscv.md (RINT): Add iterator for lceil and lround.
        (rint_pattern): Add ceil and floor.
        (rint_rm): Add rup and rdn.

gcc/testsuite/ChangeLog:
        Kevin Lee  <kevinl@rivosinc.com>
        * gcc.target/riscv/lfloor-lceil.c: New test.
---
 gcc/config/riscv/riscv.md                     | 13 ++-
 gcc/testsuite/gcc.target/riscv/lfloor-lceil.c | 79 +++++++++++++++++++
 2 files changed, 88 insertions(+), 4 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
  

Comments

Palmer Dabbelt Sept. 17, 2022, 9:07 p.m. UTC | #1
On Mon, 15 Aug 2022 17:44:35 PDT (-0700), kevinl@rivosinc.com wrote:
> Hello,
> Currently, __builtin_lceil and __builtin_lfloor doesn't generate an
> existing instruction fcvt, but rather calls ceil and floor from the
> library. This patch adds the missing iterator and attributes for lceil and
> lfloor to produce the optimized code.
>  The test cases check the correct generation of the fcvt instruction for
> float/double to int/long/long long. Passed the test in riscv-linux.
> Could this patch be committed?

Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com>

Not sure if Kito had any comments for this one, but it looks good to me.

> gcc/ChangeLog:
>        Michael Collison  <collison@rivosinc.com>
>         * config/riscv/riscv.md (RINT): Add iterator for lceil and lround.
>         (rint_pattern): Add ceil and floor.
>         (rint_rm): Add rup and rdn.
>
> gcc/testsuite/ChangeLog:
>         Kevin Lee  <kevinl@rivosinc.com>
>         * gcc.target/riscv/lfloor-lceil.c: New test.
> ---
>  gcc/config/riscv/riscv.md                     | 13 ++-
>  gcc/testsuite/gcc.target/riscv/lfloor-lceil.c | 79 +++++++++++++++++++
>  2 files changed, 88 insertions(+), 4 deletions(-)
>  create mode 100644 gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>
> diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
> index c6399b1389e..070004fa7fe 100644
> --- a/gcc/config/riscv/riscv.md
> +++ b/gcc/config/riscv/riscv.md
> @@ -43,6 +43,9 @@ (define_c_enum "unspec" [
>    UNSPEC_LRINT
>    UNSPEC_LROUND
>
> +  UNSPEC_LCEIL
> +  UNSPEC_LFLOOR
> +
>    ;; Stack tie
>    UNSPEC_TIE
>  ])
> @@ -345,10 +348,12 @@ (define_mode_attr UNITMODE [(SF "SF") (DF "DF")])
>  ;; the controlling mode.
>  (define_mode_attr HALFMODE [(DF "SI") (DI "SI") (TF "DI")])
>
> -;; Iterator and attributes for floating-point rounding instructions.
> -(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND])
> -(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
> "round")])
> -(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")])
> +;; Iterator and attributes for floating-point rounding instructions.f
> +(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND UNSPEC_LCEIL
> UNSPEC_LFLOOR])
> +(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
> "round")
> +                             (UNSPEC_LCEIL "ceil") (UNSPEC_LFLOOR
> "floor")])
> +(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")
> +                        (UNSPEC_LCEIL "rup") (UNSPEC_LFLOOR "rdn")])
>
>  ;; Iterator and attributes for quiet comparisons.
>  (define_int_iterator QUIET_COMPARISON [UNSPEC_FLT_QUIET UNSPEC_FLE_QUIET])
> diff --git a/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> new file mode 100644
> index 00000000000..4d81c12cefa
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> @@ -0,0 +1,79 @@
> +/* { dg-do compile } */
> +/* { dg-options "-march=rv64gc -mabi=lp64d" } */
> +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
> +
> +int
> +ceil1(float i)
> +{
> +  return __builtin_lceil(i);
> +}
> +
> +long
> +ceil2(float i)
> +{
> +  return __builtin_lceil(i);
> +}
> +
> +long long
> +ceil3(float i)
> +{
> +  return __builtin_lceil(i);
> +}
> +
> +int
> +ceil4(double i)
> +{
> +  return __builtin_lceil(i);
> +}
> +
> +long
> +ceil5(double i)
> +{
> +  return __builtin_lceil(i);
> +}
> +
> +long long
> +ceil6(double i)
> +{
> +  return __builtin_lceil(i);
> +}
> +
> +int
> +floor1(float i)
> +{
> +  return __builtin_lfloor(i);
> +}
> +
> +long
> +floor2(float i)
> +{
> +  return __builtin_lfloor(i);
> +}
> +
> +long long
> +floor3(float i)
> +{
> +  return __builtin_lfloor(i);
> +}
> +
> +int
> +floor4(double i)
> +{
> +  return __builtin_lfloor(i);
> +}
> +
> +long
> +floor5(double i)
> +{
> +  return __builtin_lfloor(i);
> +}
> +
> +long long
> +floor6(double i)
> +{
> +  return __builtin_lfloor(i);
> +}
> +
> +/* { dg-final { scan-assembler-times "fcvt.l.s" 6 } } */
> +/* { dg-final { scan-assembler-times "fcvt.l.d" 6 } } */
> +/* { dg-final { scan-assembler-not "call" } } */
  
Kito Cheng Sept. 17, 2022, 9:16 p.m. UTC | #2
LGTM, thanks, I guess I just missed this before

Palmer Dabbelt <palmer@dabbelt.com> 於 2022年9月17日 週六 23:07 寫道:

> On Mon, 15 Aug 2022 17:44:35 PDT (-0700), kevinl@rivosinc.com wrote:
> > Hello,
> > Currently, __builtin_lceil and __builtin_lfloor doesn't generate an
> > existing instruction fcvt, but rather calls ceil and floor from the
> > library. This patch adds the missing iterator and attributes for lceil
> and
> > lfloor to produce the optimized code.
> >  The test cases check the correct generation of the fcvt instruction for
> > float/double to int/long/long long. Passed the test in riscv-linux.
> > Could this patch be committed?
>
> Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
> Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
>
> Not sure if Kito had any comments for this one, but it looks good to me.
>
> > gcc/ChangeLog:
> >        Michael Collison  <collison@rivosinc.com>
> >         * config/riscv/riscv.md (RINT): Add iterator for lceil and
> lround.
> >         (rint_pattern): Add ceil and floor.
> >         (rint_rm): Add rup and rdn.
> >
> > gcc/testsuite/ChangeLog:
> >         Kevin Lee  <kevinl@rivosinc.com>
> >         * gcc.target/riscv/lfloor-lceil.c: New test.
> > ---
> >  gcc/config/riscv/riscv.md                     | 13 ++-
> >  gcc/testsuite/gcc.target/riscv/lfloor-lceil.c | 79 +++++++++++++++++++
> >  2 files changed, 88 insertions(+), 4 deletions(-)
> >  create mode 100644 gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> >
> > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
> > index c6399b1389e..070004fa7fe 100644
> > --- a/gcc/config/riscv/riscv.md
> > +++ b/gcc/config/riscv/riscv.md
> > @@ -43,6 +43,9 @@ (define_c_enum "unspec" [
> >    UNSPEC_LRINT
> >    UNSPEC_LROUND
> >
> > +  UNSPEC_LCEIL
> > +  UNSPEC_LFLOOR
> > +
> >    ;; Stack tie
> >    UNSPEC_TIE
> >  ])
> > @@ -345,10 +348,12 @@ (define_mode_attr UNITMODE [(SF "SF") (DF "DF")])
> >  ;; the controlling mode.
> >  (define_mode_attr HALFMODE [(DF "SI") (DI "SI") (TF "DI")])
> >
> > -;; Iterator and attributes for floating-point rounding instructions.
> > -(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND])
> > -(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
> > "round")])
> > -(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")])
> > +;; Iterator and attributes for floating-point rounding instructions.f
> > +(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND UNSPEC_LCEIL
> > UNSPEC_LFLOOR])
> > +(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
> > "round")
> > +                             (UNSPEC_LCEIL "ceil") (UNSPEC_LFLOOR
> > "floor")])
> > +(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")
> > +                        (UNSPEC_LCEIL "rup") (UNSPEC_LFLOOR "rdn")])
> >
> >  ;; Iterator and attributes for quiet comparisons.
> >  (define_int_iterator QUIET_COMPARISON [UNSPEC_FLT_QUIET
> UNSPEC_FLE_QUIET])
> > diff --git a/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> > b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> > new file mode 100644
> > index 00000000000..4d81c12cefa
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> > @@ -0,0 +1,79 @@
> > +/* { dg-do compile } */
> > +/* { dg-options "-march=rv64gc -mabi=lp64d" } */
> > +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
> > +
> > +int
> > +ceil1(float i)
> > +{
> > +  return __builtin_lceil(i);
> > +}
> > +
> > +long
> > +ceil2(float i)
> > +{
> > +  return __builtin_lceil(i);
> > +}
> > +
> > +long long
> > +ceil3(float i)
> > +{
> > +  return __builtin_lceil(i);
> > +}
> > +
> > +int
> > +ceil4(double i)
> > +{
> > +  return __builtin_lceil(i);
> > +}
> > +
> > +long
> > +ceil5(double i)
> > +{
> > +  return __builtin_lceil(i);
> > +}
> > +
> > +long long
> > +ceil6(double i)
> > +{
> > +  return __builtin_lceil(i);
> > +}
> > +
> > +int
> > +floor1(float i)
> > +{
> > +  return __builtin_lfloor(i);
> > +}
> > +
> > +long
> > +floor2(float i)
> > +{
> > +  return __builtin_lfloor(i);
> > +}
> > +
> > +long long
> > +floor3(float i)
> > +{
> > +  return __builtin_lfloor(i);
> > +}
> > +
> > +int
> > +floor4(double i)
> > +{
> > +  return __builtin_lfloor(i);
> > +}
> > +
> > +long
> > +floor5(double i)
> > +{
> > +  return __builtin_lfloor(i);
> > +}
> > +
> > +long long
> > +floor6(double i)
> > +{
> > +  return __builtin_lfloor(i);
> > +}
> > +
> > +/* { dg-final { scan-assembler-times "fcvt.l.s" 6 } } */
> > +/* { dg-final { scan-assembler-times "fcvt.l.d" 6 } } */
> > +/* { dg-final { scan-assembler-not "call" } } */
>
  
Palmer Dabbelt Oct. 2, 2022, 8:42 p.m. UTC | #3
On Sat, 17 Sep 2022 14:16:13 PDT (-0700), Kito Cheng wrote:
> LGTM, thanks, I guess I just missed this before

No worries, I'd just stubmled on it looking through old stuff.

Kevin: Looks like this got corrupted, possibly from copy/paste into 
gmail.  I resurrect it, but there's a floating-point test failure in 
gfortran.  Looks like it predates this, but I'm trying to bisect it to 
at least have a root cause before just ignoring it.  I've got this 
floating around on a branch and hopefully that'll remind me to commit 
it after I sort that out.

>
> Palmer Dabbelt <palmer@dabbelt.com> 於 2022年9月17日 週六 23:07 寫道:
>
>> On Mon, 15 Aug 2022 17:44:35 PDT (-0700), kevinl@rivosinc.com wrote:
>> > Hello,
>> > Currently, __builtin_lceil and __builtin_lfloor doesn't generate an
>> > existing instruction fcvt, but rather calls ceil and floor from the
>> > library. This patch adds the missing iterator and attributes for lceil
>> and
>> > lfloor to produce the optimized code.
>> >  The test cases check the correct generation of the fcvt instruction for
>> > float/double to int/long/long long. Passed the test in riscv-linux.
>> > Could this patch be committed?
>>
>> Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
>> Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
>>
>> Not sure if Kito had any comments for this one, but it looks good to me.
>>
>> > gcc/ChangeLog:
>> >        Michael Collison  <collison@rivosinc.com>
>> >         * config/riscv/riscv.md (RINT): Add iterator for lceil and
>> lround.
>> >         (rint_pattern): Add ceil and floor.
>> >         (rint_rm): Add rup and rdn.
>> >
>> > gcc/testsuite/ChangeLog:
>> >         Kevin Lee  <kevinl@rivosinc.com>
>> >         * gcc.target/riscv/lfloor-lceil.c: New test.
>> > ---
>> >  gcc/config/riscv/riscv.md                     | 13 ++-
>> >  gcc/testsuite/gcc.target/riscv/lfloor-lceil.c | 79 +++++++++++++++++++
>> >  2 files changed, 88 insertions(+), 4 deletions(-)
>> >  create mode 100644 gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> >
>> > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
>> > index c6399b1389e..070004fa7fe 100644
>> > --- a/gcc/config/riscv/riscv.md
>> > +++ b/gcc/config/riscv/riscv.md
>> > @@ -43,6 +43,9 @@ (define_c_enum "unspec" [
>> >    UNSPEC_LRINT
>> >    UNSPEC_LROUND
>> >
>> > +  UNSPEC_LCEIL
>> > +  UNSPEC_LFLOOR
>> > +
>> >    ;; Stack tie
>> >    UNSPEC_TIE
>> >  ])
>> > @@ -345,10 +348,12 @@ (define_mode_attr UNITMODE [(SF "SF") (DF "DF")])
>> >  ;; the controlling mode.
>> >  (define_mode_attr HALFMODE [(DF "SI") (DI "SI") (TF "DI")])
>> >
>> > -;; Iterator and attributes for floating-point rounding instructions.
>> > -(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND])
>> > -(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
>> > "round")])
>> > -(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")])
>> > +;; Iterator and attributes for floating-point rounding instructions.f
>> > +(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND UNSPEC_LCEIL
>> > UNSPEC_LFLOOR])
>> > +(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
>> > "round")
>> > +                             (UNSPEC_LCEIL "ceil") (UNSPEC_LFLOOR
>> > "floor")])
>> > +(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")
>> > +                        (UNSPEC_LCEIL "rup") (UNSPEC_LFLOOR "rdn")])
>> >
>> >  ;; Iterator and attributes for quiet comparisons.
>> >  (define_int_iterator QUIET_COMPARISON [UNSPEC_FLT_QUIET
>> UNSPEC_FLE_QUIET])
>> > diff --git a/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> > b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> > new file mode 100644
>> > index 00000000000..4d81c12cefa
>> > --- /dev/null
>> > +++ b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> > @@ -0,0 +1,79 @@
>> > +/* { dg-do compile } */
>> > +/* { dg-options "-march=rv64gc -mabi=lp64d" } */
>> > +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
>> > +
>> > +int
>> > +ceil1(float i)
>> > +{
>> > +  return __builtin_lceil(i);
>> > +}
>> > +
>> > +long
>> > +ceil2(float i)
>> > +{
>> > +  return __builtin_lceil(i);
>> > +}
>> > +
>> > +long long
>> > +ceil3(float i)
>> > +{
>> > +  return __builtin_lceil(i);
>> > +}
>> > +
>> > +int
>> > +ceil4(double i)
>> > +{
>> > +  return __builtin_lceil(i);
>> > +}
>> > +
>> > +long
>> > +ceil5(double i)
>> > +{
>> > +  return __builtin_lceil(i);
>> > +}
>> > +
>> > +long long
>> > +ceil6(double i)
>> > +{
>> > +  return __builtin_lceil(i);
>> > +}
>> > +
>> > +int
>> > +floor1(float i)
>> > +{
>> > +  return __builtin_lfloor(i);
>> > +}
>> > +
>> > +long
>> > +floor2(float i)
>> > +{
>> > +  return __builtin_lfloor(i);
>> > +}
>> > +
>> > +long long
>> > +floor3(float i)
>> > +{
>> > +  return __builtin_lfloor(i);
>> > +}
>> > +
>> > +int
>> > +floor4(double i)
>> > +{
>> > +  return __builtin_lfloor(i);
>> > +}
>> > +
>> > +long
>> > +floor5(double i)
>> > +{
>> > +  return __builtin_lfloor(i);
>> > +}
>> > +
>> > +long long
>> > +floor6(double i)
>> > +{
>> > +  return __builtin_lfloor(i);
>> > +}
>> > +
>> > +/* { dg-final { scan-assembler-times "fcvt.l.s" 6 } } */
>> > +/* { dg-final { scan-assembler-times "fcvt.l.d" 6 } } */
>> > +/* { dg-final { scan-assembler-not "call" } } */
>>
  
Kevin Lee Oct. 2, 2022, 8:47 p.m. UTC | #4
Thank you for the update Palmer. I'll certainly look into the corrupted
patch issue and the floating-point test failure in gfortran.

On Sun, Oct 2, 2022 at 1:42 PM Palmer Dabbelt <palmer@dabbelt.com> wrote:

> On Sat, 17 Sep 2022 14:16:13 PDT (-0700), Kito Cheng wrote:
> > LGTM, thanks, I guess I just missed this before
>
> No worries, I'd just stubmled on it looking through old stuff.
>
> Kevin: Looks like this got corrupted, possibly from copy/paste into
> gmail.  I resurrect it, but there's a floating-point test failure in
> gfortran.  Looks like it predates this, but I'm trying to bisect it to
> at least have a root cause before just ignoring it.  I've got this
> floating around on a branch and hopefully that'll remind me to commit
> it after I sort that out.
>
> >
> > Palmer Dabbelt <palmer@dabbelt.com> 於 2022年9月17日 週六 23:07 寫道:
> >
> >> On Mon, 15 Aug 2022 17:44:35 PDT (-0700), kevinl@rivosinc.com wrote:
> >> > Hello,
> >> > Currently, __builtin_lceil and __builtin_lfloor doesn't generate an
> >> > existing instruction fcvt, but rather calls ceil and floor from the
> >> > library. This patch adds the missing iterator and attributes for lceil
> >> and
> >> > lfloor to produce the optimized code.
> >> >  The test cases check the correct generation of the fcvt instruction
> for
> >> > float/double to int/long/long long. Passed the test in riscv-linux.
> >> > Could this patch be committed?
> >>
> >> Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
> >> Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
> >>
> >> Not sure if Kito had any comments for this one, but it looks good to me.
> >>
> >> > gcc/ChangeLog:
> >> >        Michael Collison  <collison@rivosinc.com>
> >> >         * config/riscv/riscv.md (RINT): Add iterator for lceil and
> >> lround.
> >> >         (rint_pattern): Add ceil and floor.
> >> >         (rint_rm): Add rup and rdn.
> >> >
> >> > gcc/testsuite/ChangeLog:
> >> >         Kevin Lee  <kevinl@rivosinc.com>
> >> >         * gcc.target/riscv/lfloor-lceil.c: New test.
> >> > ---
> >> >  gcc/config/riscv/riscv.md                     | 13 ++-
> >> >  gcc/testsuite/gcc.target/riscv/lfloor-lceil.c | 79
> +++++++++++++++++++
> >> >  2 files changed, 88 insertions(+), 4 deletions(-)
> >> >  create mode 100644 gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> >> >
> >> > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
> >> > index c6399b1389e..070004fa7fe 100644
> >> > --- a/gcc/config/riscv/riscv.md
> >> > +++ b/gcc/config/riscv/riscv.md
> >> > @@ -43,6 +43,9 @@ (define_c_enum "unspec" [
> >> >    UNSPEC_LRINT
> >> >    UNSPEC_LROUND
> >> >
> >> > +  UNSPEC_LCEIL
> >> > +  UNSPEC_LFLOOR
> >> > +
> >> >    ;; Stack tie
> >> >    UNSPEC_TIE
> >> >  ])
> >> > @@ -345,10 +348,12 @@ (define_mode_attr UNITMODE [(SF "SF") (DF
> "DF")])
> >> >  ;; the controlling mode.
> >> >  (define_mode_attr HALFMODE [(DF "SI") (DI "SI") (TF "DI")])
> >> >
> >> > -;; Iterator and attributes for floating-point rounding instructions.
> >> > -(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND])
> >> > -(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
> >> > "round")])
> >> > -(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND
> "rmm")])
> >> > +;; Iterator and attributes for floating-point rounding instructions.f
> >> > +(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND UNSPEC_LCEIL
> >> > UNSPEC_LFLOOR])
> >> > +(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
> >> > "round")
> >> > +                             (UNSPEC_LCEIL "ceil") (UNSPEC_LFLOOR
> >> > "floor")])
> >> > +(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")
> >> > +                        (UNSPEC_LCEIL "rup") (UNSPEC_LFLOOR "rdn")])
> >> >
> >> >  ;; Iterator and attributes for quiet comparisons.
> >> >  (define_int_iterator QUIET_COMPARISON [UNSPEC_FLT_QUIET
> >> UNSPEC_FLE_QUIET])
> >> > diff --git a/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> >> > b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> >> > new file mode 100644
> >> > index 00000000000..4d81c12cefa
> >> > --- /dev/null
> >> > +++ b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
> >> > @@ -0,0 +1,79 @@
> >> > +/* { dg-do compile } */
> >> > +/* { dg-options "-march=rv64gc -mabi=lp64d" } */
> >> > +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
> >> > +
> >> > +int
> >> > +ceil1(float i)
> >> > +{
> >> > +  return __builtin_lceil(i);
> >> > +}
> >> > +
> >> > +long
> >> > +ceil2(float i)
> >> > +{
> >> > +  return __builtin_lceil(i);
> >> > +}
> >> > +
> >> > +long long
> >> > +ceil3(float i)
> >> > +{
> >> > +  return __builtin_lceil(i);
> >> > +}
> >> > +
> >> > +int
> >> > +ceil4(double i)
> >> > +{
> >> > +  return __builtin_lceil(i);
> >> > +}
> >> > +
> >> > +long
> >> > +ceil5(double i)
> >> > +{
> >> > +  return __builtin_lceil(i);
> >> > +}
> >> > +
> >> > +long long
> >> > +ceil6(double i)
> >> > +{
> >> > +  return __builtin_lceil(i);
> >> > +}
> >> > +
> >> > +int
> >> > +floor1(float i)
> >> > +{
> >> > +  return __builtin_lfloor(i);
> >> > +}
> >> > +
> >> > +long
> >> > +floor2(float i)
> >> > +{
> >> > +  return __builtin_lfloor(i);
> >> > +}
> >> > +
> >> > +long long
> >> > +floor3(float i)
> >> > +{
> >> > +  return __builtin_lfloor(i);
> >> > +}
> >> > +
> >> > +int
> >> > +floor4(double i)
> >> > +{
> >> > +  return __builtin_lfloor(i);
> >> > +}
> >> > +
> >> > +long
> >> > +floor5(double i)
> >> > +{
> >> > +  return __builtin_lfloor(i);
> >> > +}
> >> > +
> >> > +long long
> >> > +floor6(double i)
> >> > +{
> >> > +  return __builtin_lfloor(i);
> >> > +}
> >> > +
> >> > +/* { dg-final { scan-assembler-times "fcvt.l.s" 6 } } */
> >> > +/* { dg-final { scan-assembler-times "fcvt.l.d" 6 } } */
> >> > +/* { dg-final { scan-assembler-not "call" } } */
> >>
>
  
Kevin Lee Nov. 8, 2022, 2:06 a.m. UTC | #5
> Kevin: Looks like this got corrupted, possibly from copy/paste into
> gmail.  I resurrect it, but there's a floating-point test failure in
> gfortran.  Looks like it predates this, but I'm trying to bisect it to
> at least have a root cause before just ignoring it.  I've got this
> floating around on a branch and hopefully that'll remind me to commit
> it after I sort that out.

Currently, the testsuite doesn't show additional failures. It seems
like the corrupted patch caused the issue. I will post the clean patch
as v2. Thank you for the review!

On Sun, Oct 2, 2022 at 1:47 PM Kevin Lee <kevinl@rivosinc.com> wrote:
>
> Thank you for the update Palmer. I'll certainly look into the corrupted patch issue and the floating-point test failure in gfortran.
>
> On Sun, Oct 2, 2022 at 1:42 PM Palmer Dabbelt <palmer@dabbelt.com> wrote:
>>
>> On Sat, 17 Sep 2022 14:16:13 PDT (-0700), Kito Cheng wrote:
>> > LGTM, thanks, I guess I just missed this before
>>
>> No worries, I'd just stubmled on it looking through old stuff.
>>
>> Kevin: Looks like this got corrupted, possibly from copy/paste into
>> gmail.  I resurrect it, but there's a floating-point test failure in
>> gfortran.  Looks like it predates this, but I'm trying to bisect it to
>> at least have a root cause before just ignoring it.  I've got this
>> floating around on a branch and hopefully that'll remind me to commit
>> it after I sort that out.
>>
>> >
>> > Palmer Dabbelt <palmer@dabbelt.com> 於 2022年9月17日 週六 23:07 寫道:
>> >
>> >> On Mon, 15 Aug 2022 17:44:35 PDT (-0700), kevinl@rivosinc.com wrote:
>> >> > Hello,
>> >> > Currently, __builtin_lceil and __builtin_lfloor doesn't generate an
>> >> > existing instruction fcvt, but rather calls ceil and floor from the
>> >> > library. This patch adds the missing iterator and attributes for lceil
>> >> and
>> >> > lfloor to produce the optimized code.
>> >> >  The test cases check the correct generation of the fcvt instruction for
>> >> > float/double to int/long/long long. Passed the test in riscv-linux.
>> >> > Could this patch be committed?
>> >>
>> >> Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
>> >> Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
>> >>
>> >> Not sure if Kito had any comments for this one, but it looks good to me.
>> >>
>> >> > gcc/ChangeLog:
>> >> >        Michael Collison  <collison@rivosinc.com>
>> >> >         * config/riscv/riscv.md (RINT): Add iterator for lceil and
>> >> lround.
>> >> >         (rint_pattern): Add ceil and floor.
>> >> >         (rint_rm): Add rup and rdn.
>> >> >
>> >> > gcc/testsuite/ChangeLog:
>> >> >         Kevin Lee  <kevinl@rivosinc.com>
>> >> >         * gcc.target/riscv/lfloor-lceil.c: New test.
>> >> > ---
>> >> >  gcc/config/riscv/riscv.md                     | 13 ++-
>> >> >  gcc/testsuite/gcc.target/riscv/lfloor-lceil.c | 79 +++++++++++++++++++
>> >> >  2 files changed, 88 insertions(+), 4 deletions(-)
>> >> >  create mode 100644 gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> >> >
>> >> > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
>> >> > index c6399b1389e..070004fa7fe 100644
>> >> > --- a/gcc/config/riscv/riscv.md
>> >> > +++ b/gcc/config/riscv/riscv.md
>> >> > @@ -43,6 +43,9 @@ (define_c_enum "unspec" [
>> >> >    UNSPEC_LRINT
>> >> >    UNSPEC_LROUND
>> >> >
>> >> > +  UNSPEC_LCEIL
>> >> > +  UNSPEC_LFLOOR
>> >> > +
>> >> >    ;; Stack tie
>> >> >    UNSPEC_TIE
>> >> >  ])
>> >> > @@ -345,10 +348,12 @@ (define_mode_attr UNITMODE [(SF "SF") (DF "DF")])
>> >> >  ;; the controlling mode.
>> >> >  (define_mode_attr HALFMODE [(DF "SI") (DI "SI") (TF "DI")])
>> >> >
>> >> > -;; Iterator and attributes for floating-point rounding instructions.
>> >> > -(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND])
>> >> > -(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
>> >> > "round")])
>> >> > -(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")])
>> >> > +;; Iterator and attributes for floating-point rounding instructions.f
>> >> > +(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND UNSPEC_LCEIL
>> >> > UNSPEC_LFLOOR])
>> >> > +(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
>> >> > "round")
>> >> > +                             (UNSPEC_LCEIL "ceil") (UNSPEC_LFLOOR
>> >> > "floor")])
>> >> > +(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")
>> >> > +                        (UNSPEC_LCEIL "rup") (UNSPEC_LFLOOR "rdn")])
>> >> >
>> >> >  ;; Iterator and attributes for quiet comparisons.
>> >> >  (define_int_iterator QUIET_COMPARISON [UNSPEC_FLT_QUIET
>> >> UNSPEC_FLE_QUIET])
>> >> > diff --git a/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> >> > b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> >> > new file mode 100644
>> >> > index 00000000000..4d81c12cefa
>> >> > --- /dev/null
>> >> > +++ b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
>> >> > @@ -0,0 +1,79 @@
>> >> > +/* { dg-do compile } */
>> >> > +/* { dg-options "-march=rv64gc -mabi=lp64d" } */
>> >> > +/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
>> >> > +
>> >> > +int
>> >> > +ceil1(float i)
>> >> > +{
>> >> > +  return __builtin_lceil(i);
>> >> > +}
>> >> > +
>> >> > +long
>> >> > +ceil2(float i)
>> >> > +{
>> >> > +  return __builtin_lceil(i);
>> >> > +}
>> >> > +
>> >> > +long long
>> >> > +ceil3(float i)
>> >> > +{
>> >> > +  return __builtin_lceil(i);
>> >> > +}
>> >> > +
>> >> > +int
>> >> > +ceil4(double i)
>> >> > +{
>> >> > +  return __builtin_lceil(i);
>> >> > +}
>> >> > +
>> >> > +long
>> >> > +ceil5(double i)
>> >> > +{
>> >> > +  return __builtin_lceil(i);
>> >> > +}
>> >> > +
>> >> > +long long
>> >> > +ceil6(double i)
>> >> > +{
>> >> > +  return __builtin_lceil(i);
>> >> > +}
>> >> > +
>> >> > +int
>> >> > +floor1(float i)
>> >> > +{
>> >> > +  return __builtin_lfloor(i);
>> >> > +}
>> >> > +
>> >> > +long
>> >> > +floor2(float i)
>> >> > +{
>> >> > +  return __builtin_lfloor(i);
>> >> > +}
>> >> > +
>> >> > +long long
>> >> > +floor3(float i)
>> >> > +{
>> >> > +  return __builtin_lfloor(i);
>> >> > +}
>> >> > +
>> >> > +int
>> >> > +floor4(double i)
>> >> > +{
>> >> > +  return __builtin_lfloor(i);
>> >> > +}
>> >> > +
>> >> > +long
>> >> > +floor5(double i)
>> >> > +{
>> >> > +  return __builtin_lfloor(i);
>> >> > +}
>> >> > +
>> >> > +long long
>> >> > +floor6(double i)
>> >> > +{
>> >> > +  return __builtin_lfloor(i);
>> >> > +}
>> >> > +
>> >> > +/* { dg-final { scan-assembler-times "fcvt.l.s" 6 } } */
>> >> > +/* { dg-final { scan-assembler-times "fcvt.l.d" 6 } } */
>> >> > +/* { dg-final { scan-assembler-not "call" } } */
>> >>
  

Patch

diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index c6399b1389e..070004fa7fe 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -43,6 +43,9 @@  (define_c_enum "unspec" [
   UNSPEC_LRINT
   UNSPEC_LROUND

+  UNSPEC_LCEIL
+  UNSPEC_LFLOOR
+
   ;; Stack tie
   UNSPEC_TIE
 ])
@@ -345,10 +348,12 @@  (define_mode_attr UNITMODE [(SF "SF") (DF "DF")])
 ;; the controlling mode.
 (define_mode_attr HALFMODE [(DF "SI") (DI "SI") (TF "DI")])

-;; Iterator and attributes for floating-point rounding instructions.
-(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND])
-(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
"round")])
-(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")])
+;; Iterator and attributes for floating-point rounding instructions.f
+(define_int_iterator RINT [UNSPEC_LRINT UNSPEC_LROUND UNSPEC_LCEIL
UNSPEC_LFLOOR])
+(define_int_attr rint_pattern [(UNSPEC_LRINT "rint") (UNSPEC_LROUND
"round")
+                             (UNSPEC_LCEIL "ceil") (UNSPEC_LFLOOR
"floor")])
+(define_int_attr rint_rm [(UNSPEC_LRINT "dyn") (UNSPEC_LROUND "rmm")
+                        (UNSPEC_LCEIL "rup") (UNSPEC_LFLOOR "rdn")])

 ;; Iterator and attributes for quiet comparisons.
 (define_int_iterator QUIET_COMPARISON [UNSPEC_FLT_QUIET UNSPEC_FLE_QUIET])
diff --git a/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
new file mode 100644
index 00000000000..4d81c12cefa
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/lfloor-lceil.c
@@ -0,0 +1,79 @@ 
+/* { dg-do compile } */
+/* { dg-options "-march=rv64gc -mabi=lp64d" } */
+/* { dg-skip-if "" { *-*-* } { "-O0" "-Og" } } */
+
+int
+ceil1(float i)
+{
+  return __builtin_lceil(i);
+}
+
+long
+ceil2(float i)
+{
+  return __builtin_lceil(i);
+}
+
+long long
+ceil3(float i)
+{
+  return __builtin_lceil(i);
+}
+
+int
+ceil4(double i)
+{
+  return __builtin_lceil(i);
+}
+
+long
+ceil5(double i)
+{
+  return __builtin_lceil(i);
+}
+
+long long
+ceil6(double i)
+{
+  return __builtin_lceil(i);
+}
+
+int
+floor1(float i)
+{
+  return __builtin_lfloor(i);
+}
+
+long
+floor2(float i)
+{
+  return __builtin_lfloor(i);
+}
+
+long long
+floor3(float i)
+{
+  return __builtin_lfloor(i);
+}
+
+int
+floor4(double i)
+{
+  return __builtin_lfloor(i);
+}
+
+long
+floor5(double i)
+{
+  return __builtin_lfloor(i);
+}
+
+long long
+floor6(double i)
+{
+  return __builtin_lfloor(i);
+}
+
+/* { dg-final { scan-assembler-times "fcvt.l.s" 6 } } */
+/* { dg-final { scan-assembler-times "fcvt.l.d" 6 } } */
+/* { dg-final { scan-assembler-not "call" } } */