Commit 483d7ad3 by John David Anglin Committed by John David Anglin

re PR target/48366 (ICE in extract_constrain_insn_cached, at recog.c:2024)

	PR target/48366
	* config/pa/pa.c (hppa_register_move_cost): Increase to 18 cost of
	move from floating point to shift amount register .
	(emit_move_sequence): Remove secondary reload support for floating
	point to shift amount amount register copies.
	(pa_secondary_reload): Return GENERAL_REGS for floating point/shift
	amount register copies.
	* config/pa/pa32-regs.h (HARD_REGNO_MODE_OK): For shift amount
	register, return false if mode isn't a scalar integer mode.
	* config/pa/pa64-regs.h (HARD_REGNO_MODE_OK): Likewise.

From-SVN: r172197
parent b89381a2
2011-04-08 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
PR target/48366
* config/pa/pa.c (hppa_register_move_cost): Increase to 18 cost of
move from floating point to shift amount register .
(emit_move_sequence): Remove secondary reload support for floating
point to shift amount amount register copies.
(pa_secondary_reload): Return GENERAL_REGS for floating point/shift
amount register copies.
* config/pa/pa32-regs.h (HARD_REGNO_MODE_OK): For shift amount
register, return false if mode isn't a scalar integer mode.
* config/pa/pa64-regs.h (HARD_REGNO_MODE_OK): Likewise.
2011-04-08 Richard Guenther <rguenther@suse.de> 2011-04-08 Richard Guenther <rguenther@suse.de>
* gimple.c (gimple_call_flags): Remove kludge. * gimple.c (gimple_call_flags): Remove kludge.
......
...@@ -1447,6 +1447,8 @@ hppa_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED, ...@@ -1447,6 +1447,8 @@ hppa_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
{ {
if (from == SHIFT_REGS) if (from == SHIFT_REGS)
return 0x100; return 0x100;
else if (to == SHIFT_REGS && FP_REG_CLASS_P (from))
return 18;
else if ((FP_REG_CLASS_P (from) && ! FP_REG_CLASS_P (to)) else if ((FP_REG_CLASS_P (from) && ! FP_REG_CLASS_P (to))
|| (FP_REG_CLASS_P (to) && ! FP_REG_CLASS_P (from))) || (FP_REG_CLASS_P (to) && ! FP_REG_CLASS_P (from)))
return 16; return 16;
...@@ -1790,15 +1792,12 @@ emit_move_sequence (rtx *operands, enum machine_mode mode, rtx scratch_reg) ...@@ -1790,15 +1792,12 @@ emit_move_sequence (rtx *operands, enum machine_mode mode, rtx scratch_reg)
return 1; return 1;
} }
/* Handle secondary reloads for SAR. These occur when trying to load /* Handle secondary reloads for SAR. These occur when trying to load
the SAR from memory, FP register, or with a constant. */ the SAR from memory or a constant. */
else if (scratch_reg else if (scratch_reg
&& GET_CODE (operand0) == REG && GET_CODE (operand0) == REG
&& REGNO (operand0) < FIRST_PSEUDO_REGISTER && REGNO (operand0) < FIRST_PSEUDO_REGISTER
&& REGNO_REG_CLASS (REGNO (operand0)) == SHIFT_REGS && REGNO_REG_CLASS (REGNO (operand0)) == SHIFT_REGS
&& (GET_CODE (operand1) == MEM && (GET_CODE (operand1) == MEM || GET_CODE (operand1) == CONST_INT))
|| GET_CODE (operand1) == CONST_INT
|| (GET_CODE (operand1) == REG
&& FP_REG_CLASS_P (REGNO_REG_CLASS (REGNO (operand1))))))
{ {
/* D might not fit in 14 bits either; for such cases load D into /* D might not fit in 14 bits either; for such cases load D into
scratch reg. */ scratch reg. */
...@@ -5863,6 +5862,10 @@ output_arg_descriptor (rtx call_insn) ...@@ -5863,6 +5862,10 @@ output_arg_descriptor (rtx call_insn)
fputc ('\n', asm_out_file); fputc ('\n', asm_out_file);
} }
/* Inform reload about cases where moving X with a mode MODE to a register in
RCLASS requires an extra scratch or immediate register. Return the class
needed for the immediate register. */
static reg_class_t static reg_class_t
pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i, pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
enum machine_mode mode, secondary_reload_info *sri) enum machine_mode mode, secondary_reload_info *sri)
...@@ -5965,9 +5968,13 @@ pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i, ...@@ -5965,9 +5968,13 @@ pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
return NO_REGS; return NO_REGS;
} }
/* We need a secondary register (GPR) for copies between the SAR /* A SAR<->FP register copy requires an intermediate general register
and anything other than a general register. */ and secondary memory. We need a secondary reload with a general
if (rclass == SHIFT_REGS && (regno <= 0 || regno >= 32)) scratch register for spills. */
if (rclass == SHIFT_REGS)
{
/* Handle spill. */
if (regno >= FIRST_PSEUDO_REGISTER || regno < 0)
{ {
sri->icode = (in_p sri->icode = (in_p
? direct_optab_handler (reload_in_optab, mode) ? direct_optab_handler (reload_in_optab, mode)
...@@ -5975,14 +5982,15 @@ pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i, ...@@ -5975,14 +5982,15 @@ pa_secondary_reload (bool in_p, rtx x, reg_class_t rclass_i,
return NO_REGS; return NO_REGS;
} }
/* A SAR<->FP register copy requires a secondary register (GPR) as /* Handle FP copy. */
well as secondary memory. */ if (FP_REG_CLASS_P (REGNO_REG_CLASS (regno)))
return GENERAL_REGS;
}
if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER
&& (REGNO_REG_CLASS (regno) == SHIFT_REGS && REGNO_REG_CLASS (regno) == SHIFT_REGS
&& FP_REG_CLASS_P (rclass))) && FP_REG_CLASS_P (rclass))
sri->icode = (in_p return GENERAL_REGS;
? direct_optab_handler (reload_in_optab, mode)
: direct_optab_handler (reload_out_optab, mode));
return NO_REGS; return NO_REGS;
} }
......
...@@ -209,6 +209,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ...@@ -209,6 +209,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
registers. */ registers. */
#define HARD_REGNO_MODE_OK(REGNO, MODE) \ #define HARD_REGNO_MODE_OK(REGNO, MODE) \
((REGNO) == 0 ? (MODE) == CCmode || (MODE) == CCFPmode \ ((REGNO) == 0 ? (MODE) == CCmode || (MODE) == CCFPmode \
: (REGNO) == 88 ? SCALAR_INT_MODE_P (MODE) \
: !TARGET_PA_11 && FP_REGNO_P (REGNO) \ : !TARGET_PA_11 && FP_REGNO_P (REGNO) \
? (VALID_FP_MODE_P (MODE) \ ? (VALID_FP_MODE_P (MODE) \
&& (GET_MODE_SIZE (MODE) <= 8 \ && (GET_MODE_SIZE (MODE) <= 8 \
......
...@@ -149,10 +149,11 @@ along with GCC; see the file COPYING3. If not see ...@@ -149,10 +149,11 @@ along with GCC; see the file COPYING3. If not see
/* Value is 1 if hard register REGNO can hold a value of machine-mode MODE. /* Value is 1 if hard register REGNO can hold a value of machine-mode MODE.
On the HP-PA, the cpu registers can hold any mode. We On the HP-PA, the cpu registers can hold any mode. We
force this to be an even register is it cannot hold the full mode. */ force this to be an even register if it cannot hold the full mode. */
#define HARD_REGNO_MODE_OK(REGNO, MODE) \ #define HARD_REGNO_MODE_OK(REGNO, MODE) \
((REGNO) == 0 \ ((REGNO) == 0 \
? (MODE) == CCmode || (MODE) == CCFPmode \ ? (MODE) == CCmode || (MODE) == CCFPmode \
: (REGNO) == 60 ? SCALAR_INT_MODE_P (MODE) \
/* Make wide modes be in aligned registers. */ \ /* Make wide modes be in aligned registers. */ \
: FP_REGNO_P (REGNO) \ : FP_REGNO_P (REGNO) \
? (VALID_FP_MODE_P (MODE) \ ? (VALID_FP_MODE_P (MODE) \
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment