On Sun, Sep 29, 2024 at 9:08 PM Jeff Law <[email protected]> wrote:
>
>
> On 9/13/24 5:05 AM, Mariam Arutunian wrote:
> > Add two new internal functions (IFN_CRC, IFN_CRC_REV), to provide faster
> > CRC generation.
> > One performs bit-forward and the other bit-reversed CRC computation.
> > If CRC optabs are supported, they are used for the CRC computation.
> > Otherwise, table-based CRC is generated.
> > The supported data and CRC sizes are 8, 16, 32, and 64 bits.
> > The polynomial is without the leading 1.
> > A table with 256 elements is used to store precomputed CRCs.
> > For the reflection of inputs and the output, a simple algorithm involving
> > SHIFT, AND, and OR operations is used.
> >
> > gcc/
> >
> > * doc/md.texi (crc@var{m}@var{n}4,
> > crc_rev@var{m}@var{n}4): Document.
> > * expr.cc (calculate_crc): New function.
> > (assemble_crc_table): Likewise.
> > (generate_crc_table): Likewise.
> > (calculate_table_based_CRC): Likewise.
> > (emit_crc): Likewise.
> > (expand_crc_table_based): Likewise.
> > (gen_common_operation_to_reflect): Likewise.
> > (reflect_64_bit_value): Likewise.
> > (reflect_32_bit_value): Likewise.
> > (reflect_16_bit_value): Likewise.
> > (reflect_8_bit_value): Likewise.
> > (generate_reflecting_code_standard): Likewise.
> > (expand_reversed_crc_table_based): Likewise.
> > * expr.h (generate_reflecting_code_standard): New function
> declaration.
> > (expand_crc_table_based): Likewise.
> > (expand_reversed_crc_table_based): Likewise.
> > * internal-fn.cc: (crc_direct): Define.
> > (direct_crc_optab_supported_p): Likewise.
> > (expand_crc_optab_fn): New function
> > * internal-fn.def (CRC, CRC_REV): New internal functions.
> > * optabs.def (crc_optab, crc_rev_optab): New optabs.
> Looks pretty good. Just one question/comment:
>
> >
> > +void
> > +emit_crc (machine_mode crc_mode, rtx* crc, rtx* op0)
> > +{
> > + if (GET_MODE_BITSIZE (crc_mode).to_constant () == 32
> > + && GET_MODE_BITSIZE (word_mode) == 64)
> > + {
> > + rtx a_low = gen_lowpart (crc_mode, *crc);
> > + *crc = gen_rtx_SIGN_EXTEND (word_mode, a_low);
> > + }
> > + rtx tgt = *op0;
> > + if (word_mode != crc_mode)
> > + tgt = simplify_gen_subreg (word_mode, *op0, crc_mode, 0);
> > + emit_move_insn (tgt, *crc);
> > +}
> It seems to me that first clause ought to apply any time word mode is
> larger than crc mode rather than making it check 32/64 magic constants.
>
When I apply it whenever the word mode is larger than crc mode, on RISC-V
the CRC-16 and CRC-8 tests fail.
BR,
Mariam
>
>
Jeff
>