Commit f3922fd2 by DJ Delorie

[multiple changes]

2002-03-05  Tom Tromey  <tromey@redhat.com>

	* config/stormy16/stormy16.h (DWARF_LINE_MIN_INSTR_LENGTH):
	Define.

2002-03-05  Nick Clifton  <nickc@cambridge.redhat.com>

	* config/stormy16/stormy16.md ("*eqbranchsi"): Remove '+' on
	operand 2.
	("*ineqbranchsi"): Likewise.

2002-03-05  Andrew Haley  <aph@cambridge.redhat.com>

	* config/stormy16/stormy16.c (xstormy16_expand_prologue): Delete
	mem_fake_push_rtx.  Instead construct a SEQUENCE to show the
	register store followed by a stack increment.

2002-03-05  Chris Moller  <cmoller@redhat.com>

	* config/stormy16/stormy16.c (REG_NEEDS_SAVE): added a term
	to inhibit saving CARRY_REGS.

	* config/stormy16/stormy16.c (xs_hi_general_operand):
	added predicate to detect and error-out on out-of-range
	const_ints for movhi.
	* config/stormy16/stormy16.md (movhi): use
	xs_hi_general_operand.

	* config/stormy16/stormy16.c (xstormy16_expand_prologue):
	added a check for local vbl size overflow.
	* config/stormy16/stormy16.c (xs_hi_nonmemory_operand):
	added predicate to detect and error-out on out-of-range
	const_ints for addhi and subhi.
	* config/stormy16/stormy16.md (addhi3, addchi4, addchi5,
	subhi3, subchi4, subchi5): used xs_hi_nonmemory_operand.

	* config/stormy16/stormy16.c (xstormy16_legitimate_address_p):
	add a term to accept PRE_MODIFY addresses.
	* config/stormy16/stormy16.c (xstormy16_expand_move):
	add code to expand PRE_MODIFY addresses to an add followed
	by a move.

From-SVN: r63898
parent 4c28216d
2002-03-05 Tom Tromey <tromey@redhat.com>
* config/stormy16/stormy16.h (DWARF_LINE_MIN_INSTR_LENGTH):
Define.
2002-03-05 Nick Clifton <nickc@cambridge.redhat.com>
* config/stormy16/stormy16.md ("*eqbranchsi"): Remove '+' on
operand 2.
("*ineqbranchsi"): Likewise.
2002-03-05 Andrew Haley <aph@cambridge.redhat.com>
* config/stormy16/stormy16.c (xstormy16_expand_prologue): Delete
mem_fake_push_rtx. Instead construct a SEQUENCE to show the
register store followed by a stack increment.
2002-03-05 Chris Moller <cmoller@redhat.com>
* config/stormy16/stormy16.c (REG_NEEDS_SAVE): added a term
to inhibit saving CARRY_REGS.
* config/stormy16/stormy16.c (xs_hi_general_operand):
added predicate to detect and error-out on out-of-range
const_ints for movhi.
* config/stormy16/stormy16.md (movhi): use
xs_hi_general_operand.
* config/stormy16/stormy16.c (xstormy16_expand_prologue):
added a check for local vbl size overflow.
* config/stormy16/stormy16.c (xs_hi_nonmemory_operand):
added predicate to detect and error-out on out-of-range
const_ints for addhi and subhi.
* config/stormy16/stormy16.md (addhi3, addchi4, addchi5,
subhi3, subchi4, subchi5): used xs_hi_nonmemory_operand.
* config/stormy16/stormy16.c (xstormy16_legitimate_address_p):
add a term to accept PRE_MODIFY addresses.
* config/stormy16/stormy16.c (xstormy16_expand_move):
add code to expand PRE_MODIFY addresses to an add followed
by a move.
2003-03-06 Jason Merrill <jason@redhat.com> 2003-03-06 Jason Merrill <jason@redhat.com>
* tree-inline.c (inlinable_function_p): Revert earlier change * tree-inline.c (inlinable_function_p): Revert earlier change
......
...@@ -545,6 +545,29 @@ xstormy16_carry_plus_operand (x, mode) ...@@ -545,6 +545,29 @@ xstormy16_carry_plus_operand (x, mode)
&& (INTVAL (XEXP (x, 1)) < -4 || INTVAL (XEXP (x, 1)) > 4)); && (INTVAL (XEXP (x, 1)) < -4 || INTVAL (XEXP (x, 1)) > 4));
} }
/* Detect and error out on out-of-range constants for movhi. */
int
xs_hi_general_operand (x, mode)
rtx x;
enum machine_mode mode ATTRIBUTE_UNUSED;
{
if ((GET_CODE (x) == CONST_INT)
&& ((INTVAL (x) >= 32768) || (INTVAL (x) < -32768)))
error ("Constant halfword load operand out of range.");
return general_operand (x, mode);
}
/* Detect and error out on out-of-range constants for addhi and subhi. */
int
xs_hi_nonmemory_operand (x, mode)
rtx x;
enum machine_mode mode ATTRIBUTE_UNUSED;
{
if ((GET_CODE (x) == CONST_INT)
&& ((INTVAL (x) >= 32768) || (INTVAL (x) < -32768)))
error ("Constant arithmetic operand out of range.");
return nonmemory_operand (x, mode);
}
enum reg_class enum reg_class
xstormy16_preferred_reload_class (x, class) xstormy16_preferred_reload_class (x, class)
...@@ -581,7 +604,9 @@ xstormy16_legitimate_address_p (mode, x, strict) ...@@ -581,7 +604,9 @@ xstormy16_legitimate_address_p (mode, x, strict)
&& LEGITIMATE_ADDRESS_INTEGER_P (XEXP (x, 1), 0)) && LEGITIMATE_ADDRESS_INTEGER_P (XEXP (x, 1), 0))
x = XEXP (x, 0); x = XEXP (x, 0);
if (GET_CODE (x) == POST_INC if ((GET_CODE (x) == PRE_MODIFY
&& GET_CODE (XEXP (XEXP (x, 1), 1)) == CONST_INT)
|| GET_CODE (x) == POST_INC
|| GET_CODE (x) == PRE_DEC) || GET_CODE (x) == PRE_DEC)
x = XEXP (x, 0); x = XEXP (x, 0);
...@@ -855,6 +880,29 @@ xstormy16_expand_move (mode, dest, src) ...@@ -855,6 +880,29 @@ xstormy16_expand_move (mode, dest, src)
rtx dest; rtx dest;
rtx src; rtx src;
{ {
if ((GET_CODE (dest) == MEM) && (GET_CODE (XEXP (dest, 0)) == PRE_MODIFY))
{
rtx pmv = XEXP (dest, 0);
rtx dest_reg = XEXP (pmv, 0);
rtx dest_mod = XEXP (pmv, 1);
rtx set = gen_rtx_SET (Pmode, dest_reg, dest_mod);
rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, 16));
dest = gen_rtx_MEM (mode, dest_reg);
emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber)));
}
else if ((GET_CODE (src) == MEM) && (GET_CODE (XEXP (src, 0)) == PRE_MODIFY))
{
rtx pmv = XEXP (src, 0);
rtx src_reg = XEXP (pmv, 0);
rtx src_mod = XEXP (pmv, 1);
rtx set = gen_rtx_SET (Pmode, src_reg, src_mod);
rtx clobber = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (BImode, 16));
src = gen_rtx_MEM (mode, src_reg);
emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, set, clobber)));
}
/* There are only limited immediate-to-memory move instructions. */ /* There are only limited immediate-to-memory move instructions. */
if (! reload_in_progress if (! reload_in_progress
&& ! reload_completed && ! reload_completed
...@@ -915,6 +963,7 @@ struct xstormy16_stack_layout ...@@ -915,6 +963,7 @@ struct xstormy16_stack_layout
#define REG_NEEDS_SAVE(REGNUM, IFUN) \ #define REG_NEEDS_SAVE(REGNUM, IFUN) \
((regs_ever_live[REGNUM] && ! call_used_regs[REGNUM]) \ ((regs_ever_live[REGNUM] && ! call_used_regs[REGNUM]) \
|| (IFUN && ! fixed_regs[REGNUM] && call_used_regs[REGNUM] \ || (IFUN && ! fixed_regs[REGNUM] && call_used_regs[REGNUM] \
&& (REGNO_REG_CLASS (REGNUM) != CARRY_REGS) \
&& (regs_ever_live[REGNUM] || ! current_function_is_leaf))) && (regs_ever_live[REGNUM] || ! current_function_is_leaf)))
/* Compute the stack layout. */ /* Compute the stack layout. */
...@@ -1014,44 +1063,66 @@ xstormy16_expand_prologue () ...@@ -1014,44 +1063,66 @@ xstormy16_expand_prologue ()
int regno; int regno;
rtx insn; rtx insn;
rtx mem_push_rtx; rtx mem_push_rtx;
rtx mem_fake_push_rtx;
const int ifun = xstormy16_interrupt_function_p (); const int ifun = xstormy16_interrupt_function_p ();
mem_push_rtx = gen_rtx_POST_INC (Pmode, stack_pointer_rtx); mem_push_rtx = gen_rtx_POST_INC (Pmode, stack_pointer_rtx);
mem_push_rtx = gen_rtx_MEM (HImode, mem_push_rtx); mem_push_rtx = gen_rtx_MEM (HImode, mem_push_rtx);
mem_fake_push_rtx = gen_rtx_PRE_INC (Pmode, stack_pointer_rtx);
mem_fake_push_rtx = gen_rtx_MEM (HImode, mem_fake_push_rtx);
layout = xstormy16_compute_stack_layout (); layout = xstormy16_compute_stack_layout ();
if (layout.locals_size >= 32768)
error ("Local variable memory requirements exceed capacity.");
/* Save the argument registers if necessary. */ /* Save the argument registers if necessary. */
if (layout.stdarg_save_size) if (layout.stdarg_save_size)
for (regno = FIRST_ARGUMENT_REGISTER; for (regno = FIRST_ARGUMENT_REGISTER;
regno < FIRST_ARGUMENT_REGISTER + NUM_ARGUMENT_REGISTERS; regno < FIRST_ARGUMENT_REGISTER + NUM_ARGUMENT_REGISTERS;
regno++) regno++)
{ {
rtx dwarf;
rtx reg = gen_rtx_REG (HImode, regno); rtx reg = gen_rtx_REG (HImode, regno);
insn = emit_move_insn (mem_push_rtx, reg); insn = emit_move_insn (mem_push_rtx, reg);
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2));
XVECEXP (dwarf, 0, 0) = gen_rtx_SET (VOIDmode,
gen_rtx_MEM (Pmode, stack_pointer_rtx),
reg);
XVECEXP (dwarf, 0, 1) = gen_rtx_SET (Pmode, stack_pointer_rtx,
plus_constant (stack_pointer_rtx,
GET_MODE_SIZE (Pmode)));
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode, dwarf,
mem_fake_push_rtx,
reg),
REG_NOTES (insn)); REG_NOTES (insn));
RTX_FRAME_RELATED_P (XVECEXP (dwarf, 0, 0)) = 1;
RTX_FRAME_RELATED_P (XVECEXP (dwarf, 0, 1)) = 1;
} }
/* Push each of the registers to save. */ /* Push each of the registers to save. */
for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++)
if (REG_NEEDS_SAVE (regno, ifun)) if (REG_NEEDS_SAVE (regno, ifun))
{ {
rtx dwarf;
rtx reg = gen_rtx_REG (HImode, regno); rtx reg = gen_rtx_REG (HImode, regno);
insn = emit_move_insn (mem_push_rtx, reg); insn = emit_move_insn (mem_push_rtx, reg);
RTX_FRAME_RELATED_P (insn) = 1; RTX_FRAME_RELATED_P (insn) = 1;
dwarf = gen_rtx_SEQUENCE (VOIDmode, rtvec_alloc (2));
XVECEXP (dwarf, 0, 0) = gen_rtx_SET (VOIDmode,
gen_rtx_MEM (Pmode, stack_pointer_rtx),
reg);
XVECEXP (dwarf, 0, 1) = gen_rtx_SET (Pmode, stack_pointer_rtx,
plus_constant (stack_pointer_rtx,
GET_MODE_SIZE (Pmode)));
REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR, REG_NOTES (insn) = gen_rtx_EXPR_LIST (REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode, dwarf,
mem_fake_push_rtx,
reg),
REG_NOTES (insn)); REG_NOTES (insn));
RTX_FRAME_RELATED_P (XVECEXP (dwarf, 0, 0)) = 1;
RTX_FRAME_RELATED_P (XVECEXP (dwarf, 0, 1)) = 1;
} }
/* It's just possible that the SP here might be what we need for /* It's just possible that the SP here might be what we need for
......
...@@ -3483,6 +3483,11 @@ do { \ ...@@ -3483,6 +3483,11 @@ do { \
pointers. */ pointers. */
#define DWARF2_ADDR_SIZE 4 #define DWARF2_ADDR_SIZE 4
/* Define the architecture-dependent minimum instruction length (in
bytes). */
#define DWARF_LINE_MIN_INSTR_LENGTH 2
/* Define these macros to override the assembler syntax for the special SDB /* Define these macros to override the assembler syntax for the special SDB
assembler directives. See `sdbout.c' for a list of these macros and their assembler directives. See `sdbout.c' for a list of these macros and their
arguments. If the standard syntax is used, you need not define them arguments. If the standard syntax is used, you need not define them
......
...@@ -150,13 +150,13 @@ ...@@ -150,13 +150,13 @@
(define_expand "movhi" (define_expand "movhi"
[(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "") [(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "")
(match_operand:HI 1 "general_operand" ""))] (match_operand:HI 1 "xs_hi_general_operand" ""))]
"" ""
"{ xstormy16_expand_move (HImode, operands[0], operands[1]); DONE; }") "{ xstormy16_expand_move (HImode, operands[0], operands[1]); DONE; }")
(define_insn "*movhi_internal" (define_insn "*movhi_internal"
[(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "=r,m,e,e,T,r,S") [(set (match_operand:HI 0 "nonimmediate_nonstack_operand" "=r,m,e,e,T,r,S")
(match_operand:HI 1 "general_operand" "r,e,m,L,L,i,i"))] (match_operand:HI 1 "xs_hi_general_operand" "r,e,m,L,L,i,i"))]
"" ""
"@ "@
mov %0,%1 mov %0,%1
...@@ -279,7 +279,7 @@ ...@@ -279,7 +279,7 @@
(define_insn "addhi3" (define_insn "addhi3"
[(set (match_operand:HI 0 "register_operand" "=r,r,T,T,r,r,r") [(set (match_operand:HI 0 "register_operand" "=r,r,T,T,r,r,r")
(plus:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0,0") (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0,0,0,0,0")
(match_operand:HI 2 "nonmemory_operand" "O,P,L,M,Ir,N,i"))) (match_operand:HI 2 "xs_hi_nonmemory_operand" "O,P,L,M,Ir,N,i")))
(clobber (match_scratch:BI 3 "=X,X,&y,&y,&y,&y,&y"))] (clobber (match_scratch:BI 3 "=X,X,&y,&y,&y,&y,&y"))]
"" ""
"@ "@
...@@ -311,7 +311,7 @@ ...@@ -311,7 +311,7 @@
(define_insn "addchi4" (define_insn "addchi4"
[(set (match_operand:HI 0 "register_operand" "=T,r,r") [(set (match_operand:HI 0 "register_operand" "=T,r,r")
(plus:HI (match_operand:HI 1 "register_operand" "%0,0,0") (plus:HI (match_operand:HI 1 "register_operand" "%0,0,0")
(match_operand:HI 2 "nonmemory_operand" "L,Ir,i"))) (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
(set (match_operand:BI 3 "register_operand" "=y,y,y") (set (match_operand:BI 3 "register_operand" "=y,y,y")
(truncate:BI (lshiftrt:SI (plus:SI (zero_extend:SI (match_dup 1)) (truncate:BI (lshiftrt:SI (plus:SI (zero_extend:SI (match_dup 1))
(zero_extend:SI (match_dup 2))) (zero_extend:SI (match_dup 2)))
...@@ -329,7 +329,7 @@ ...@@ -329,7 +329,7 @@
(zero_extend:HI (match_operand:BI 3 (zero_extend:HI (match_operand:BI 3
"register_operand" "register_operand"
"y,y,y"))) "y,y,y")))
(match_operand:HI 2 "nonmemory_operand" "L,Ir,i"))) (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
(set (match_operand:BI 4 "register_operand" "=y,y,y") (set (match_operand:BI 4 "register_operand" "=y,y,y")
(truncate:BI (lshiftrt:SI (plus:SI (plus:SI (truncate:BI (lshiftrt:SI (plus:SI (plus:SI
(zero_extend:SI (match_dup 1)) (zero_extend:SI (match_dup 1))
...@@ -352,7 +352,7 @@ ...@@ -352,7 +352,7 @@
(define_insn "subhi3" (define_insn "subhi3"
[(set (match_operand:HI 0 "register_operand" "=r,r,T,T,r,r,r") [(set (match_operand:HI 0 "register_operand" "=r,r,T,T,r,r,r")
(minus:HI (match_operand:HI 1 "register_operand" "0,0,0,0,0,0,0") (minus:HI (match_operand:HI 1 "register_operand" "0,0,0,0,0,0,0")
(match_operand:HI 2 "nonmemory_operand" "O,P,L,M,rI,M,i"))) (match_operand:HI 2 "xs_hi_nonmemory_operand" "O,P,L,M,rI,M,i")))
(clobber (match_scratch:BI 3 "=X,X,&y,&y,&y,&y,&y"))] (clobber (match_scratch:BI 3 "=X,X,&y,&y,&y,&y,&y"))]
"" ""
"@ "@
...@@ -368,7 +368,7 @@ ...@@ -368,7 +368,7 @@
(define_insn "subchi4" (define_insn "subchi4"
[(set (match_operand:HI 0 "register_operand" "=T,r,r") [(set (match_operand:HI 0 "register_operand" "=T,r,r")
(minus:HI (match_operand:HI 1 "register_operand" "0,0,0") (minus:HI (match_operand:HI 1 "register_operand" "0,0,0")
(match_operand:HI 2 "nonmemory_operand" "L,Ir,i"))) (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
(set (match_operand:BI 3 "register_operand" "=y,y,y") (set (match_operand:BI 3 "register_operand" "=y,y,y")
(truncate:BI (lshiftrt:SI (minus:SI (zero_extend:SI (match_dup 1)) (truncate:BI (lshiftrt:SI (minus:SI (zero_extend:SI (match_dup 1))
(zero_extend:SI (match_dup 2))) (zero_extend:SI (match_dup 2)))
...@@ -386,7 +386,7 @@ ...@@ -386,7 +386,7 @@
(zero_extend:HI (match_operand:BI 3 (zero_extend:HI (match_operand:BI 3
"register_operand" "register_operand"
"y,y,y"))) "y,y,y")))
(match_operand:HI 2 "nonmemory_operand" "L,Ir,i"))) (match_operand:HI 2 "xs_hi_nonmemory_operand" "L,Ir,i")))
(set (match_operand:BI 4 "register_operand" "=y,y,y") (set (match_operand:BI 4 "register_operand" "=y,y,y")
(truncate:BI (lshiftrt:SI (minus:SI (minus:SI (truncate:BI (lshiftrt:SI (minus:SI (minus:SI
(zero_extend:SI (match_dup 1)) (zero_extend:SI (match_dup 1))
...@@ -796,7 +796,7 @@ ...@@ -796,7 +796,7 @@
[(set (pc) [(set (pc)
(if_then_else (match_operator:SI 1 "equality_operator" (if_then_else (match_operator:SI 1 "equality_operator"
[(match_operand:SI 2 "register_operand" [(match_operand:SI 2 "register_operand"
"+r") "r")
(const_int 0)]) (const_int 0)])
(label_ref (match_operand 0 "" "")) (label_ref (match_operand 0 "" ""))
(pc))) (pc)))
...@@ -817,7 +817,7 @@ ...@@ -817,7 +817,7 @@
[(set (pc) [(set (pc)
(if_then_else (match_operator:SI 1 "xstormy16_ineqsi_operator" (if_then_else (match_operator:SI 1 "xstormy16_ineqsi_operator"
[(match_operand:SI 2 "register_operand" [(match_operand:SI 2 "register_operand"
"+r") "r")
(match_operand:SI 3 "nonmemory_operand" (match_operand:SI 3 "nonmemory_operand"
"ri")]) "ri")])
(label_ref (match_operand 0 "" "")) (label_ref (match_operand 0 "" ""))
...@@ -851,7 +851,7 @@ ...@@ -851,7 +851,7 @@
(match_operand:HI 3 "nonmemory_operand" "L,Ir,i")]) (match_operand:HI 3 "nonmemory_operand" "L,Ir,i")])
(label_ref (match_operand 0 "" "")) (label_ref (match_operand 0 "" ""))
(pc))) (pc)))
(set (match_operand:HI 2 "register_operand" "=2,2,2") (set (match_operand:HI 2 "register_operand" "=1,1,1")
(minus:HI (minus:HI (match_dup 1) (zero_extend:HI (match_dup 4))) (minus:HI (minus:HI (match_dup 1) (zero_extend:HI (match_dup 4)))
(match_dup 3))) (match_dup 3)))
(clobber (match_operand:BI 6 "" "=y,y,y"))] (clobber (match_operand:BI 6 "" "=y,y,y"))]
......
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