On Tue, Jul 22, 2025 at 6:40 AM Jeff Law <jeffreya...@gmail.com> wrote:
>
>
>
> On 7/11/25 2:57 AM, Kuan-Lin Chen wrote:
> > This extension defines instructions to perform scalar floating-point
> > conversion between the BFLOAT16 floating-point data and the IEEE-754
> > 32-bit single-precision floating-point (SP) data in a scalar
> > floating point register.
> >
> > gcc/ChangeLog:
> >
> >       * config/riscv/andes.def: Add nds_fcvt_s_bf16 and nds_fcvt_bf16_s.
> >       * config/riscv/andes.md (riscv_nds_fcvt_bf16_s): New pattern.
> >       (riscv_nds_fcvt_s_bf16): New pattern.
> >       * config/riscv/riscv-builtins.cc: New AVAIL andesbfhcvt.
> >       Add new define RISCV_ATYPE_BF and RISCV_ATYPE_SF.
> >       * config/riscv/riscv-ftypes.def: New DEF_RISCV_FTYPE.
> >
> > gcc/testsuite/ChangeLog:
> >
> >       * gcc.target/riscv/xandesbfhcvt-1.c: New test.
> >       * gcc.target/riscv/xandesbfhcvt-2.c: New test.
> > ---
> >   gcc/config/riscv/andes.def                    |  4 +++
> >   gcc/config/riscv/andes.md                     | 26 +++++++++++++++++++
> >   gcc/config/riscv/riscv-builtins.cc            |  3 +++
> >   gcc/config/riscv/riscv-ftypes.def             |  2 ++
> >   .../gcc.target/riscv/xandesbfhcvt-1.c         | 11 ++++++++
> >   .../gcc.target/riscv/xandesbfhcvt-2.c         | 11 ++++++++
> >   6 files changed, 57 insertions(+)
> >   create mode 100644 gcc/testsuite/gcc.target/riscv/xandesbfhcvt-1.c
> >   create mode 100644 gcc/testsuite/gcc.target/riscv/xandesbfhcvt-2.c
> >
> > diff --git a/gcc/config/riscv/andes.def b/gcc/config/riscv/andes.def
> > index b864ae712c1d..5b5fb76bfe0e 100644
> > --- a/gcc/config/riscv/andes.def
> > +++ b/gcc/config/riscv/andes.def
> > @@ -8,3 +8,7 @@ RISCV_BUILTIN (nds_ffmismsi, "nds_ffmism", 
> > RISCV_BUILTIN_DIRECT, RISCV_LONG_FTYP
> >   RISCV_BUILTIN (nds_ffmismdi, "nds_ffmism", RISCV_BUILTIN_DIRECT, 
> > RISCV_LONG_FTYPE_ULONG_ULONG, andesperf64),
> >   RISCV_BUILTIN (nds_flmismsi, "nds_flmism", RISCV_BUILTIN_DIRECT, 
> > RISCV_LONG_FTYPE_ULONG_ULONG, andesperf32),
> >   RISCV_BUILTIN (nds_flmismdi, "nds_flmism", RISCV_BUILTIN_DIRECT, 
> > RISCV_LONG_FTYPE_ULONG_ULONG, andesperf64),
> > +
> > +/* Andes Scalar BFLOAT16 Conversion Extension */
> > +RISCV_BUILTIN (nds_fcvt_s_bf16, "nds_fcvt_s_bf16", RISCV_BUILTIN_DIRECT, 
> > RISCV_SF_FTYPE_BF, andesbfhcvt),
> > +RISCV_BUILTIN (nds_fcvt_bf16_s, "nds_fcvt_bf16_s", RISCV_BUILTIN_DIRECT, 
> > RISCV_BF_FTYPE_SF, andesbfhcvt),
> > diff --git a/gcc/config/riscv/andes.md b/gcc/config/riscv/andes.md
> > index 51f61e58e244..22aa5e5150d5 100644
> > --- a/gcc/config/riscv/andes.md
> > +++ b/gcc/config/riscv/andes.md
> > @@ -441,3 +441,29 @@
> >     "nds.flmism\t%0, %z1, %z2"
> >     [(set_attr "mode" "<MODE>")
> >      (set_attr "type" "arith")])
> > +
> > +;;
> > +;;  ....................
> > +;;
> > +;;    Bfloat16
> > +;;
> > +;;  ....................
> > +;;
> > +
> > +(define_insn "riscv_nds_fcvt_bf16_s"
> > +  [(set (match_operand:BF   0 "register_operand" "=f")
> > +     (float_truncate:BF
> > +       (match_operand:SF 1 "register_operand" " f")))]
> > +  "TARGET_XANDESBFHCVT"
> > +  "nds.fcvt.bf16.s\t%0,%1"
> > +  [(set_attr "type" "fcvt")
> > +   (set_attr "mode" "BF")])
> > +
> > +(define_insn "riscv_nds_fcvt_s_bf16"
> > +  [(set (match_operand:SF   0 "register_operand" "=f")
> > +     (float_extend:SF
> > +       (match_operand:BF 1 "register_operand" " f")))]
> > +  "TARGET_XANDESBFHCVT"
> > +  "nds.fcvt.s.bf16\t%0,%1"
> > +  [(set_attr "type" "fcvt")
> > +   (set_attr "mode" "SF")])
> So these are equivalent to the BF16 bits in riscv.md.  Given we've got a
> number of instructions that have the same semantics I wonder if we
> should just bite the bullet and use the assembler dialect functionality
> to select between the standard opcodes and the Andes specific opcodes.
>
> My worry with the duplicated insns is long term maintenance.  If we can
> cleanly write a merged pattern, then we should try and do so.

Same opinion here:

maybe something like:

(define_insn "truncsfbf2"
  [(set (match_operand:BF    0 "register_operand" "=f")
        (float_truncate:BF
           (match_operand:SF 1 "register_operand" " f")))]
  "TARGET_ZFBFMIN || TARGET_XANDESBFHCVT"
{
  if (TARGET_ZFBFMIN)
    return "fcvt.bf16.s\t%0,%1";
  else /* TARGET_XANDESBFHCVT */
    return "nds.fcvt.s.bf16"
}
  [(set_attr "type" "fcvt")
   (set_attr "mode" "BF")])

Reply via email to