===================================================================
@@ -5762,7 +5762,7 @@
pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
enum machine_mode mode, secondary_reload_info *sri)
{
- int is_symbolic, regno;
+ int regno;
enum reg_class rclass = (enum reg_class) rclass_i;
/* Handle the easy stuff first. */
@@ -5796,6 +5796,23 @@
return NO_REGS;
}
+ /* Secondary reloads of symbolic operands require %r1 as a scratch
+ register when we're generating PIC code and when the operand isn't
+ readonly. */
+ if (symbolic_expression_p (x))
+ {
+ if (GET_CODE (x) == HIGH)
+ x = XEXP (x, 0);
+
+ if (flag_pic || !read_only_operand (x, VOIDmode))
+ {
+ gcc_assert (mode == SImode || mode == DImode);
+ sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1
+ : CODE_FOR_reload_indi_r1);
+ return NO_REGS;
+ }
+ }
+
/* Profiling showed the PA port spends about 1.3% of its compilation
time in true_regnum from calls inside pa_secondary_reload_class. */
if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
@@ -5858,52 +5875,10 @@
if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER
&& (REGNO_REG_CLASS (regno) == SHIFT_REGS
&& FP_REG_CLASS_P (rclass)))
- {
- sri->icode = (in_p
- ? direct_optab_handler (reload_in_optab, mode)
- : direct_optab_handler (reload_out_optab, mode));
- return NO_REGS;
- }
+ sri->icode = (in_p
+ ? direct_optab_handler (reload_in_optab, mode)
+ : direct_optab_handler (reload_out_optab, mode));
- /* Secondary reloads of symbolic operands require %r1 as a scratch
- register when we're generating PIC code and when the operand isn't
- readonly. */
- if (GET_CODE (x) == HIGH)
- x = XEXP (x, 0);
-
- /* Profiling has showed GCC spends about 2.6% of its compilation
- time in symbolic_operand from calls inside pa_secondary_reload_class.
- So, we use an inline copy to avoid useless work. */
- switch (GET_CODE (x))
- {
- rtx op;
-
- case SYMBOL_REF:
- is_symbolic = !SYMBOL_REF_TLS_MODEL (x);
- break;
- case LABEL_REF:
- is_symbolic = 1;
- break;
- case CONST:
- op = XEXP (x, 0);
- is_symbolic = (GET_CODE (op) == PLUS
- && ((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
- && !SYMBOL_REF_TLS_MODEL (XEXP (op, 0)))
- || GET_CODE (XEXP (op, 0)) == LABEL_REF)
- && GET_CODE (XEXP (op, 1)) == CONST_INT);
- break;
- default:
- is_symbolic = 0;
- break;
- }
-
- if (is_symbolic && (flag_pic || !read_only_operand (x, VOIDmode)))
- {
- gcc_assert (mode == SImode || mode == DImode);
- sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1
- : CODE_FOR_reload_indi_r1);
- }
-
return NO_REGS;
}