LGTM, thanks, I guess I just missed this before Palmer Dabbelt 於 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 > Acked-by: Palmer Dabbelt > > Not sure if Kito had any comments for this one, but it looks good to me. > > > gcc/ChangeLog: > > Michael Collison > > * 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 > > * 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" } } */ >