From: Jeffrey A Law Date: Sun, 21 Dec 1997 20:44:33 +0000 (+0000) Subject: pa.c (emit_move_sequence): Handle a function label source operand. X-Git-Tag: prereleases/egcs-1.0.1-prerelease~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=665888b2b665c654faa86bc8aafbad2397204739;p=thirdparty%2Fgcc.git pa.c (emit_move_sequence): Handle a function label source operand. * pa.c (emit_move_sequence): Handle a function label source operand. From-SVN: r17173 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7f55170485c0..8d092aa0bc1a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +Sun Dec 21 21:47:38 1997 Jeffrey A Law (law@cygnus.com) + + * pa.c (emit_move_sequence): Handle a function label source + operand. + Sat Dec 20 16:14:50 1997 David Edelsohn * rs6000.h (FUNCTION_ARG_PADDING): Define. diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 5729fb8220e3..31188f92fe87 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; }