On Mon, Apr 28, 2025 at 2:38 PM Richard Sandiford <richard.sandif...@arm.com> wrote: > > native_decode_rtx handles integer modes by building up a wide_int > and then converting it to an rtx. This patch splits out the > wide_int part, so that callers who don't want an rtx can avoid > creating garbage rtl. > > Bootstrapped & regression-tested on aarch64-linux-gnu. OK to install?
OK. > Richard > > > gcc/ > * rtl.h (native_decode_int): Declare. > * simplify-rtx.cc (native_decode_int): New function, split out from... > (native_decode_rtx): ...here. > --- > gcc/rtl.h | 2 ++ > gcc/simplify-rtx.cc | 38 +++++++++++++++++++++++++------------- > 2 files changed, 27 insertions(+), 13 deletions(-) > > diff --git a/gcc/rtl.h b/gcc/rtl.h > index 3b676c46880..cc25aed1f49 100644 > --- a/gcc/rtl.h > +++ b/gcc/rtl.h > @@ -2443,6 +2443,8 @@ extern void get_full_rtx_cost (rtx, machine_mode, enum > rtx_code, int, > struct full_rtx_costs *); > extern bool native_encode_rtx (machine_mode, rtx, vec<target_unit> &, > unsigned int, unsigned int); > +extern wide_int native_decode_int (const vec<target_unit> &, unsigned int, > + unsigned int, unsigned int); > extern rtx native_decode_rtx (machine_mode, const vec<target_unit> &, > unsigned int); > extern rtx native_decode_vector_rtx (machine_mode, const vec<target_unit> &, > diff --git a/gcc/simplify-rtx.cc b/gcc/simplify-rtx.cc > index 88d31a71c05..0e0a908aa38 100644 > --- a/gcc/simplify-rtx.cc > +++ b/gcc/simplify-rtx.cc > @@ -7702,6 +7702,28 @@ native_decode_vector_rtx (machine_mode mode, const > vec<target_unit> &bytes, > return builder.build (); > } > > +/* Extract a PRECISION-bit integer from bytes [FIRST_BYTE, FIRST_BYTE + SIZE) > + of target memory image BYTES. */ > + > +wide_int > +native_decode_int (const vec<target_unit> &bytes, unsigned int first_byte, > + unsigned int size, unsigned int precision) > +{ > + /* Pull the bytes msb first, so that we can use simple > + shift-and-insert wide_int operations. */ > + wide_int result (wi::zero (precision)); > + for (unsigned int i = 0; i < size; ++i) > + { > + unsigned int lsb = (size - i - 1) * BITS_PER_UNIT; > + /* Always constant because the inputs are. */ > + unsigned int subbyte > + = subreg_size_offset_from_lsb (1, size, lsb).to_constant (); > + result <<= BITS_PER_UNIT; > + result |= bytes[first_byte + subbyte]; > + } > + return result; > +} > + > /* Read an rtx of mode MODE from the target memory image given by BYTES, > starting at byte FIRST_BYTE. Each element of BYTES contains BITS_PER_UNIT > bits and the bytes are in target memory order. The image has enough > @@ -7727,19 +7749,9 @@ native_decode_rtx (machine_mode mode, const > vec<target_unit> &bytes, > if (is_a <scalar_int_mode> (mode, &imode) > && GET_MODE_PRECISION (imode) <= MAX_BITSIZE_MODE_ANY_INT) > { > - /* Pull the bytes msb first, so that we can use simple > - shift-and-insert wide_int operations. */ > - unsigned int size = GET_MODE_SIZE (imode); > - wide_int result (wi::zero (GET_MODE_PRECISION (imode))); > - for (unsigned int i = 0; i < size; ++i) > - { > - unsigned int lsb = (size - i - 1) * BITS_PER_UNIT; > - /* Always constant because the inputs are. */ > - unsigned int subbyte > - = subreg_size_offset_from_lsb (1, size, lsb).to_constant (); > - result <<= BITS_PER_UNIT; > - result |= bytes[first_byte + subbyte]; > - } > + auto result = native_decode_int (bytes, first_byte, > + GET_MODE_SIZE (imode), > + GET_MODE_PRECISION (imode)); > return immed_wide_int_const (result, imode); > } > > -- > 2.43.0 >