pa.c (emit_move_sequence): Handle a function label source operand.

* pa.c (emit_move_sequence): Handle a function label source
        operand.

From-SVN: r17174
This commit is contained in:
Jeffrey A Law 1997-12-21 20:50:37 +00:00 committed by Jeff Law
parent e2de3a4600
commit 44201dba49
2 changed files with 34 additions and 11 deletions

View file

@ -1,3 +1,8 @@
Sun Dec 21 21:54:22 1997 Jeffrey A Law (law@cygnus.com)
* pa.c (emit_move_sequence): Handle a function label source
operand.
Sun Dec 21 16:13:55 1997 Nick Clifton <nickc@cygnus.com
* c-pragma.c (handle_pragma_token): Generate warning messages

View file

@ -1244,8 +1244,12 @@ emit_move_sequence (operands, mode, scratch_reg)
}
}
/* Simplify the source if we need to. */
/* Simplify the source if we need to.
Note we do have to handle function labels here, even though we do
not consider them legitimate constants. Loop optimizations can
call the emit_move_xxx with one a function as a source. */
if ((GET_CODE (operand1) != HIGH && immediate_operand (operand1, mode))
|| function_label_operand (operand1, mode)
|| (GET_CODE (operand1) == HIGH
&& symbolic_operand (XEXP (operand1, 0), mode)))
{
@ -1263,9 +1267,10 @@ emit_move_sequence (operands, mode, scratch_reg)
So we force the plabel into memory, load operand0 from
the memory location, then add in the constant part. */
if (GET_CODE (operand1) == CONST
&& GET_CODE (XEXP (operand1, 0)) == PLUS
&& function_label_operand (XEXP (XEXP (operand1, 0), 0), Pmode))
if ((GET_CODE (operand1) == CONST
&& GET_CODE (XEXP (operand1, 0)) == PLUS
&& function_label_operand (XEXP (XEXP (operand1, 0), 0), Pmode))
|| function_label_operand (operand1, mode))
{
rtx temp, const_part;
@ -1275,13 +1280,25 @@ emit_move_sequence (operands, mode, scratch_reg)
else if (flag_pic)
scratch_reg = gen_reg_rtx (Pmode);
/* Save away the constant part of the expression. */
const_part = XEXP (XEXP (operand1, 0), 1);
if (GET_CODE (const_part) != CONST_INT)
abort ();
if (GET_CODE (operand1) == CONST)
{
/* Save away the constant part of the expression. */
const_part = XEXP (XEXP (operand1, 0), 1);
if (GET_CODE (const_part) != CONST_INT)
abort ();
/* Force the function label into memory. */
temp = force_const_mem (mode, XEXP (XEXP (operand1, 0), 0));
/* Force the function label into memory. */
temp = force_const_mem (mode, XEXP (XEXP (operand1, 0), 0));
}
else
{
/* No constant part. */
const_part = NULL_RTX;
/* Force the function label into memory. */
temp = force_const_mem (mode, operand1);
}
/* Get the address of the memory location. PIC-ify it if
necessary. */
@ -1300,7 +1317,8 @@ emit_move_sequence (operands, mode, scratch_reg)
emit_move_sequence (operands, mode, scratch_reg);
/* And add back in the constant part. */
expand_inc (operand0, const_part);
if (const_part != NULL_RTX)
expand_inc (operand0, const_part);
return 1;
}