[PATCH 1/2] MIPS: unaligned load: use SImode for SUBREG if OK (PR98996)

Jeff Law law@redhat.com
Tue Feb 16 19:16:50 GMT 2021



On 2/14/21 6:33 PM, YunQiang Su wrote:
> It is found by ada s-pack96.adb ftbfs, due to 96bit load: 96 = 64 + 32.
> While the 32bit pair of <load>l <load>r is mark as SUBREG, so they are
> not in SImode, make it fail to find suitable insn.
>
> gcc/ChangeLog:
>
>        * config/mips/mips.c (mips_expand_ext_as_unaligned_load):
>        If TARGET_64BIT and dest is SUBREG, we check the width, if it
>        equal to SImode, we use SImode operation, just like what we are
>        doing for REG one.
> ---
>  gcc/ChangeLog          | 8 ++++++++
>  gcc/config/mips/mips.c | 2 +-
>  2 files changed, 9 insertions(+), 1 deletion(-)
>
> diff --git a/gcc/ChangeLog b/gcc/ChangeLog
> index ddf4c7f92d7..fb12eeb971d 100644
> --- a/gcc/ChangeLog
> +++ b/gcc/ChangeLog
> @@ -1,3 +1,11 @@
> +2021-02-15  YunQiang Su  <yunqiang.su@cipunited.com>
> +
> +	PR target/98996
> +	* config/mips/mips.c (mips_expand_ext_as_unaligned_load):
> +	If TARGET_64BIT and dest is SUBREG, we check the width, if it
> +	equal to SImode, we use SImode operation, just like what we are
> +	doing for REG one.
Do you need to do any checking on the contents of the SUBREG?  ie, do
you need to know if you've got (subreg (reg)) vs (subreg (mem))

Similarly I'd expect you may need to look at the mode of the inner
object.  You could have a true subreg (outer mode is smaller than inner
mode), but you might also be able to have a paradoxical subreg (outer
mode is larger than inner mode).

Jeff



More information about the Gcc-patches mailing list