Commit 2e396476 by John David Anglin Committed by John David Anglin

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
parent 3b5708e7
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.
......
/* 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)); ...@@ -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));
......
...@@ -364,6 +364,28 @@ reg_or_0_or_nonsymb_mem_operand (op, mode) ...@@ -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
......
...@@ -6589,7 +6589,7 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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); "
......
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