aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeffrey A Law <law@cygnus.com>1997-12-21 20:50:37 +0000
committerJeff Law <law@gcc.gnu.org>1997-12-21 13:50:37 -0700
commit44201dba495937d57fac14288c0659e0a7816d62 (patch)
tree9e1df7dc76cbcdb5b1b23a523465bfbd11ae2ca7
parente2de3a4600ed809486b8f35a0b92efc9945c1972 (diff)
downloadgcc-44201dba495937d57fac14288c0659e0a7816d62.zip
gcc-44201dba495937d57fac14288c0659e0a7816d62.tar.gz
gcc-44201dba495937d57fac14288c0659e0a7816d62.tar.bz2
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
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/pa/pa.c40
2 files changed, 34 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6655c7a..fb034b4 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c
index eb1af93..01ae14d 100644
--- a/gcc/config/pa/pa.c
+++ b/gcc/config/pa/pa.c
@@ -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));
+ }
+ else
+ {
+ /* No constant part. */
+ const_part = NULL_RTX;
- /* 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, 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;
}