diff options
author | Jeffrey A Law <law@cygnus.com> | 1997-12-21 20:50:37 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-12-21 13:50:37 -0700 |
commit | 44201dba495937d57fac14288c0659e0a7816d62 (patch) | |
tree | 9e1df7dc76cbcdb5b1b23a523465bfbd11ae2ca7 | |
parent | e2de3a4600ed809486b8f35a0b92efc9945c1972 (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/pa/pa.c | 40 |
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; } |