emit-rtl.c (operand_subword): Tighten checks for when it is safe to safe to extract a subword out of a REG.

* emit-rtl.c (operand_subword): Tighten checks for when it is safe
        to safe to extract a subword out of a REG.

From-SVN: r27564
This commit is contained in:
Jeffrey A Law 1999-06-17 01:56:31 +00:00 committed by Jeff Law
parent ff77e80cf8
commit 227d6ce040
2 changed files with 31 additions and 3 deletions

View File

@ -1,3 +1,8 @@
Thu Jun 17 02:54:30 1999 Jeffrey A Law (law@cygnus.com)
* emit-rtl.c (operand_subword): Tighten checks for when it is safe
to safe to extract a subword out of a REG.
Thu Jun 17 01:45:24 1999 J"orn Rennecke <amylaar@cygnus.co.uk>
* sh.md (mulsi3): Don't add a no-op move at the end.

View File

@ -1196,10 +1196,33 @@ operand_subword (op, i, validate_address, mode)
/* If OP is a REG or SUBREG, we can handle it very simply. */
if (GET_CODE (op) == REG)
{
/* If the register is not valid for MODE, return 0. If we don't
do this, there is no way to fix up the resulting REG later. */
/* ??? There is a potential problem with this code. It does not
properly handle extractions of a subword from a hard register
that is larger than word_mode. Presumably the check for
HARD_REGNO_MODE_OK catches these most of these cases. */
/* If OP is a hard register, but OP + I is not a hard register,
then extracting a subword is impossible.
For example, consider if OP is the last hard register and it is
larger than word_mode. If we wanted word N (for N > 0) because a
part of that hard register was known to contain a useful value,
then OP + I would refer to a pseudo, not the hard register we
actually wanted. */
if (REGNO (op) < FIRST_PSEUDO_REGISTER
&& ! HARD_REGNO_MODE_OK (REGNO (op) + i, word_mode))
&& REGNO (op) + i >= FIRST_PSEUDO_REGISTER)
return 0;
/* If the register is not valid for MODE, return 0. Note we
have to check both OP and OP + I since they may refer to
different parts of the register file.
Consider if OP refers to the last 96bit FP register and we want
subword 3 because that subword is known to contain a value we
needed. */
if (REGNO (op) < FIRST_PSEUDO_REGISTER
&& (! HARD_REGNO_MODE_OK (REGNO (op), word_mode)
|| ! HARD_REGNO_MODE_OK (REGNO (op) + i, word_mode)))
return 0;
else if (REGNO (op) >= FIRST_PSEUDO_REGISTER
|| (REG_FUNCTION_VALUE_P (op)