pa.c (emit_move_sequence): Handle a function label source operand.
authorJeffrey A Law <law@cygnus.com>
Sun, 21 Dec 1997 20:50:37 +0000 (20:50 +0000)
committerJeff Law <law@gcc.gnu.org>
Sun, 21 Dec 1997 20:50:37 +0000 (13:50 -0700)
        * pa.c (emit_move_sequence): Handle a function label source
        operand.

From-SVN: r17174

gcc/ChangeLog
gcc/config/pa/pa.c

index 6655c7aca585a10d1c854af7252d6f9a37501b2a..fb034b433b1035619ea4e8bceb5da1530f0c401a 100644 (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
index eb1af93fe2f8eade70a85a5bb6ef9942d0e1ed08..01ae14d4cc356d00b81db9bb58ef9970374cea87 100644 (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));
+               }
+             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;
            }