> On 9/19/23 02:44, Jin Ma wrote: > > gcc/ChangeLog: > > > > * config/riscv/iterators.md (HFBF): New. > > * config/riscv/riscv-builtins.cc (riscv_init_builtin_types): > > Initialize data type_Bfloat16. > > * config/riscv/riscv-modes.def (FLOAT_MODE): New. > > (ADJUST_FLOAT_FORMAT): New. > > * config/riscv/riscv.cc (riscv_mangle_type): Support for BFmode. > > (riscv_scalar_mode_supported_p): Ditto. > > (riscv_libgcc_floating_mode_supported_p): Ditto. > > (riscv_block_arith_comp_libfuncs_for_mode): New. > > (riscv_init_libfuncs): Opening and closing some libfuncs for BFmode. > > * config/riscv/riscv.md (mode" ): Add BF. > > (truncdfbf2): New. > > (movhf): Support for BFmode. > > (mov<mode>): Ditto. > > (*mov<mode>_softfloat): Ditto. > > (fix_truncbf<GPR:mode>2): New. > > (fixuns_truncbf<GPR:mode>2): New. > > (float<mode>bf2): New. > > (floatuns<mode>bf2): New. > > > > libgcc/ChangeLog: > > > > * config/riscv/sfp-machine.h (_FP_NANFRAC_B): New. > > (_FP_NANSIGN_B): New. > > * config/riscv/t-softfp32: Add support for BF libfuncs. > > > > gcc/testsuite/ChangeLog: > > > > * gcc.target/riscv/bf16_arithmetic.c: New test. > > * gcc.target/riscv/bf16_call.c: New test. > > * gcc.target/riscv/bf16_comparisons.c: New test. > > * gcc.target/riscv/bf16_convert-1.c: New test. > > * gcc.target/riscv/bf16_convert-2.c: New test. > > * gcc.target/riscv/bf16_convert_run.c: New test. > So this can't go in the tree until the extension has moved into a frozen > state. Hopefully that'll happen before we close stage1 development in Nov.
Ok, this is very reasonable. > > > > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md > > index e00b8ee3579..5048628c784 100644 > > --- a/gcc/config/riscv/riscv.md > > +++ b/gcc/config/riscv/riscv.md > > @@ -1631,6 +1631,20 @@ (define_insn "truncdfhf2" > > [(set_attr "type" "fcvt") > > (set_attr "mode" "HF")]) > > > > +;; The conversion of DF to BF needs to be done with SF if there is a > > +;; chance to generate at least one instruction, otherwise just using > > +;; libfunc __truncdfbf2. > > +(define_expand "truncdfbf2" > > + [(set (match_operand:BF 0 "register_operand" "=f") > > + (float_truncate:BF > > + (match_operand:DF 1 "register_operand" " f")))] > > + "TARGET_DOUBLE_FLOAT || TARGET_ZDINX" > > + { > > + convert_move (operands[0], > > + convert_modes (SFmode, DFmode, operands[1], 0), 0); > > + DONE; > > + }) > So for conversions to/from BFmode, doesn't generic code take care of > this for us? Search for convert_mode_scalar in expr.cc. That code will > utilize SFmode as an intermediate step just like your expander. Is > there some reason that generic code is insufficient? > > Similarly for the the other conversions. As far as I can see, the function 'convert_mode_scalar' doesn't seem to be perfect for dealing with the conversions to/from BFmode. It can only handle BF to HF, SF, DF and SF to BF well, but the rest of the conversion without any processing, directly using the libcall. Maybe I should choose to enhance its functionality? This seems to be a good choice, I'm not sure. Jin > > Otherwise it looks pretty good. > > Jeff