pa-protos.h (reg_before_reload_operand): New function prototype.

* pa-protos.h (reg_before_reload_operand): New function prototype.
	* pa.c (reg_before_reload_operand): New function implementation.
	* pa.md (decrement_and_branch_until_zero, movb): Use it.  Change "!*m"
	contraints to "*m".

From-SVN: r49058
This commit is contained in:
John David Anglin 2002-01-21 22:57:49 +00:00 committed by John David Anglin
parent 3b5708e7e6
commit 2e3964763a
4 changed files with 34 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2002-01-21 John David Anglin <dave@hiauly1.hia.nrc.ca>
* pa-protos.h (reg_before_reload_operand): New function prototype.
* pa.c (reg_before_reload_operand): New function implementation.
* pa.md (decrement_and_branch_until_zero, movb): Use it. Change "!*m"
contraints to "*m".
2002-01-21 Franz Sirl <Franz.Sirl-kernel@lauterbach.com> 2002-01-21 Franz Sirl <Franz.Sirl-kernel@lauterbach.com>
* combine.c (simplify_and_const_int): Properly sign-extend CONSTOP. * combine.c (simplify_and_const_int): Properly sign-extend CONSTOP.

View File

@ -1,5 +1,5 @@
/* Prototypes for pa.c functions used in the md file & elsewhere. /* Prototypes for pa.c functions used in the md file & elsewhere.
Copyright (C) 2000 Free Software Foundation, Inc. Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
@ -83,6 +83,7 @@ extern int ior_operand PARAMS ((rtx, enum machine_mode));
extern int arith32_operand PARAMS ((rtx, enum machine_mode)); extern int arith32_operand PARAMS ((rtx, enum machine_mode));
extern int uint32_operand PARAMS ((rtx, enum machine_mode)); extern int uint32_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_nonsymb_mem_operand PARAMS ((rtx, enum machine_mode)); extern int reg_or_nonsymb_mem_operand PARAMS ((rtx, enum machine_mode));
extern int reg_before_reload_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_0_operand PARAMS ((rtx, enum machine_mode)); extern int reg_or_0_operand PARAMS ((rtx, enum machine_mode));
extern int reg_or_0_or_nonsymb_mem_operand PARAMS ((rtx, enum machine_mode)); extern int reg_or_0_or_nonsymb_mem_operand PARAMS ((rtx, enum machine_mode));
extern int pre_cint_operand PARAMS ((rtx, enum machine_mode)); extern int pre_cint_operand PARAMS ((rtx, enum machine_mode));

View File

@ -364,6 +364,28 @@ reg_or_0_or_nonsymb_mem_operand (op, mode)
return 0; return 0;
} }
/* Return 1 if the operand is a register operand or a non-symbolic memory
operand after reload. This predicate is used for branch patterns that
internally handle register reloading. We need to accept non-symbolic
memory operands after reload to ensure that the pattern is still valid
if reload didn't find a hard register for the operand. */
int
reg_before_reload_operand (op, mode)
register rtx op;
enum machine_mode mode;
{
if (register_operand (op, mode))
return 1;
if (reload_completed
&& memory_operand (op, mode)
&& ! symbolic_memory_operand (op, mode))
return 1;
return 0;
}
/* Accept any constant that can be moved in one instructions into a /* Accept any constant that can be moved in one instructions into a
general register. */ general register. */
int int

View File

@ -6589,7 +6589,7 @@
(if_then_else (if_then_else
(match_operator 2 "comparison_operator" (match_operator 2 "comparison_operator"
[(plus:SI [(plus:SI
(match_operand:SI 0 "reg_or_nonsymb_mem_operand" "+!r,!*f,!*m") (match_operand:SI 0 "reg_before_reload_operand" "+!r,!*f,*m")
(match_operand:SI 1 "int5_operand" "L,L,L")) (match_operand:SI 1 "int5_operand" "L,L,L"))
(const_int 0)]) (const_int 0)])
(label_ref (match_operand 3 "" "")) (label_ref (match_operand 3 "" ""))
@ -6646,7 +6646,7 @@
[(match_operand:SI 1 "register_operand" "r,r,r,r") (const_int 0)]) [(match_operand:SI 1 "register_operand" "r,r,r,r") (const_int 0)])
(label_ref (match_operand 3 "" "")) (label_ref (match_operand 3 "" ""))
(pc))) (pc)))
(set (match_operand:SI 0 "register_operand" "=!r,!*f,!*m,!*q") (set (match_operand:SI 0 "reg_before_reload_operand" "=!r,!*f,*m,!*q")
(match_dup 1))] (match_dup 1))]
"" ""
"* return output_movb (operands, insn, which_alternative, 0); " "* return output_movb (operands, insn, which_alternative, 0); "
@ -6692,7 +6692,7 @@
[(match_operand:SI 1 "register_operand" "r,r,r,r") (const_int 0)]) [(match_operand:SI 1 "register_operand" "r,r,r,r") (const_int 0)])
(pc) (pc)
(label_ref (match_operand 3 "" "")))) (label_ref (match_operand 3 "" ""))))
(set (match_operand:SI 0 "register_operand" "=!r,!*f,!*m,!*q") (set (match_operand:SI 0 "reg_before_reload_operand" "=!r,!*f,*m,!*q")
(match_dup 1))] (match_dup 1))]
"" ""
"* return output_movb (operands, insn, which_alternative, 1); " "* return output_movb (operands, insn, which_alternative, 1); "