On Sat, Aug 22, 2026 at 10:15 AM Shreesh Adiga <[email protected]> wrote: > > The calculate_crc and calculate_reversed_crc functions assumed initial > crc of 0 and only operated on 8 bits of data. This commit extends those > functions to take explicit data arg and data size as well, so that it > can compute CRC for >8 bits with a separate initial CRC. > These functions are also made public so that they can be called from > different modules. This will be used in the future to implement CRC > const folding. > > gcc/ChangeLog: > > * expr.cc (calculate_crc): Modified function and made it public. > (assemble_crc_table): Updated function call. > (calculate_reversed_crc): Modified function and made it public. > (assemble_reversed_crc_table): Updated function call. > * expr.h (calculate_crc): Added new function prototype. > (calculate_reversed_crc): Added new function prototype.
Can you move the function to say hwi.cc (or fold-const.cc)? So your next patch to fold-const-call.cc does not need new includes? Thanks, Andrea > > Signed-off-by: Shreesh Adiga <[email protected]> > --- > gcc/expr.cc | 36 +++++++++++++++++++++--------------- > gcc/expr.h | 14 ++++++++++++++ > 2 files changed, 35 insertions(+), 15 deletions(-) > > diff --git a/gcc/expr.cc b/gcc/expr.cc > index 0a7013e3a25..5d6ad2c6f85 100644 > --- a/gcc/expr.cc > +++ b/gcc/expr.cc > @@ -14581,17 +14581,19 @@ gf2n_poly_long_div_quotient (unsigned HOST_WIDE_INT > polynomial, > return quotient; > } > > -/* Calculate CRC for the initial CRC and given POLYNOMIAL. > - CRC_BITS is CRC size. */ > +/* Calculate CRC for the initial CRC, DATA and given POLYNOMIAL. > + CRC_BITS is CRC size and DATA_BITS is the data size. */ > > -static unsigned HOST_WIDE_INT > +unsigned HOST_WIDE_INT > calculate_crc (unsigned HOST_WIDE_INT crc, > + unsigned HOST_WIDE_INT data, > unsigned HOST_WIDE_INT polynomial, > - unsigned short crc_bits) > + unsigned short crc_bits, > + unsigned short data_bits) > { > unsigned HOST_WIDE_INT msb = HOST_WIDE_INT_1U << (crc_bits - 1); > - crc = crc << (crc_bits - 8); > - for (short i = 8; i > 0; --i) > + crc ^= (data << (crc_bits - data_bits)); > + for (short i = data_bits; i > 0; --i) > { > if (crc & msb) > crc = (crc << 1) ^ polynomial; > @@ -14599,7 +14601,7 @@ calculate_crc (unsigned HOST_WIDE_INT crc, > crc <<= 1; > } > /* Zero out bits in crc beyond the specified number of crc_bits. */ > - if (crc_bits < sizeof (crc) * CHAR_BIT) > + if (crc_bits < HOST_BITS_PER_WIDE_INT) > crc &= (HOST_WIDE_INT_1U << crc_bits) - 1; > return crc; > } > @@ -14620,7 +14622,7 @@ assemble_crc_table (unsigned HOST_WIDE_INT polynom, > unsigned short crc_bits) > vec_alloc (initial_values, table_el_n); > for (size_t i = 0; i < table_el_n; ++i) > { > - unsigned HOST_WIDE_INT crc = calculate_crc (i, polynom, crc_bits); > + unsigned HOST_WIDE_INT crc = calculate_crc (0, i, polynom, crc_bits, > 8); > tree element = build_int_cstu (make_unsigned_type (crc_bits), crc); > vec_safe_push (initial_values, element); > } > @@ -14654,16 +14656,19 @@ generate_crc_table (unsigned HOST_WIDE_INT polynom, > unsigned short crc_bits) > return assemble_crc_table (polynom, crc_bits); > } > > -/* Calculate CRC for the initial CRC and given POLYNOMIAL. > - CRC_BITS is CRC size. */ > +/* Calculate CRC for the initial CRC, DATA and given POLYNOMIAL. > + CRC_BITS is CRC size and DATA_BITS is the DATA size. */ > > -static unsigned HOST_WIDE_INT > +unsigned HOST_WIDE_INT > calculate_reversed_crc (unsigned HOST_WIDE_INT crc, > + unsigned HOST_WIDE_INT data, > unsigned HOST_WIDE_INT polynomial, > - unsigned short crc_bits) > + unsigned short crc_bits, > + unsigned short data_bits) > { > unsigned HOST_WIDE_INT rev_polynom = reflect_hwi (polynomial, crc_bits); > - for (int j = 0; j < 8; j++) > + crc ^= data; > + for (int j = 0; j < data_bits; j++) > { > if (crc & 1) > crc = (crc >> 1) ^ rev_polynom; > @@ -14671,7 +14676,7 @@ calculate_reversed_crc (unsigned HOST_WIDE_INT crc, > crc >>= 1; > } > /* Zero out bits in crc beyond the specified number of crc_bits. */ > - if (crc_bits < sizeof (crc) * CHAR_BIT) > + if (crc_bits < HOST_BITS_PER_WIDE_INT) > crc &= (HOST_WIDE_INT_1U << crc_bits) - 1; > return crc; > } > @@ -14692,7 +14697,8 @@ assemble_reversed_crc_table (unsigned HOST_WIDE_INT > polynom, unsigned short crc_ > vec_alloc (initial_values, table_el_n); > for (size_t i = 0; i < table_el_n; ++i) > { > - unsigned HOST_WIDE_INT crc = calculate_reversed_crc (i, polynom, > crc_bits); > + unsigned HOST_WIDE_INT crc = calculate_reversed_crc (0, i, polynom, > + crc_bits, 8); > tree element = build_int_cstu (make_unsigned_type (crc_bits), crc); > vec_safe_push (initial_values, element); > } > diff --git a/gcc/expr.h b/gcc/expr.h > index a54984ea2f8..0f9b3942eb2 100644 > --- a/gcc/expr.h > +++ b/gcc/expr.h > @@ -406,6 +406,20 @@ extern void generate_reflecting_code_standard (rtx *); > extern void expand_crc_table_based (rtx, rtx, rtx, rtx, machine_mode); > extern void expand_reversed_crc_table_based (rtx, rtx, rtx, rtx, > machine_mode); > > +/* Calculate CRC for a given initial CRC, DATA, POLYNOMIAL, > + CRC_SIZE in bits and DATA_SIZE in bits. */ > +extern unsigned HOST_WIDE_INT > +calculate_crc (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, > + unsigned HOST_WIDE_INT, unsigned short, unsigned short); > + > +/* Calculate reversed CRC for a given initial CRC, DATA, POLYNOMIAL, > + CRC_SIZE in bits and DATA_SIZE in bits. */ > +extern unsigned HOST_WIDE_INT > +calculate_reversed_crc (unsigned HOST_WIDE_INT, unsigned HOST_WIDE_INT, > + unsigned HOST_WIDE_INT, unsigned short, > + unsigned short); > + > + > /* Cache of the "extended" flag in the target's _BitInt description > for use during expand. */ > extern int bitint_extended; > -- > 2.54.0 >
