diff options
author | DJ Delorie <dj@gcc.gnu.org> | 2003-03-06 15:03:49 -0500 |
---|---|---|
committer | DJ Delorie <dj@gcc.gnu.org> | 2003-03-06 15:03:49 -0500 |
commit | f3922fd2682929596da68ce0ec33ab02ddb775a2 (patch) | |
tree | 8ffd9d4fb336e7a8756fb5ae60aa7bdef665a800 /gcc | |
parent | 4c28216d00a7774de69a4f2733b8c9a70c9a5a3d (diff) | |
download | gcc-f3922fd2682929596da68ce0ec33ab02ddb775a2.zip gcc-f3922fd2682929596da68ce0ec33ab02ddb775a2.tar.gz gcc-f3922fd2682929596da68ce0ec33ab02ddb775a2.tar.bz2 |
[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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 42 | ||||
-rw-r--r-- | gcc/config/stormy16/stormy16.c | 91 | ||||
-rw-r--r-- | gcc/config/stormy16/stormy16.h | 5 | ||||
-rw-r--r-- | gcc/config/stormy16/stormy16.md | 22 |
4 files changed, 139 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ec6190..8af6689 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,45 @@ +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> * tree-inline.c (inlinable_function_p): Revert earlier change diff --git a/gcc/config/stormy16/stormy16.c b/gcc/config/stormy16/stormy16.c index 7a20df4..597c4dd 100644 --- a/gcc/config/stormy16/stormy16.c +++ b/gcc/config/stormy16/stormy16.c @@ -545,6 +545,29 @@ xstormy16_carry_plus_operand (x, mode) && (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 xstormy16_preferred_reload_class (x, class) @@ -581,7 +604,9 @@ xstormy16_legitimate_address_p (mode, x, strict) && LEGITIMATE_ADDRESS_INTEGER_P (XEXP (x, 1), 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) x = XEXP (x, 0); @@ -855,6 +880,29 @@ xstormy16_expand_move (mode, dest, src) rtx dest; 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. */ if (! reload_in_progress && ! reload_completed @@ -915,6 +963,7 @@ struct xstormy16_stack_layout #define REG_NEEDS_SAVE(REGNUM, IFUN) \ ((regs_ever_live[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))) /* Compute the stack layout. */ @@ -1014,44 +1063,66 @@ xstormy16_expand_prologue () int regno; rtx insn; rtx mem_push_rtx; - rtx mem_fake_push_rtx; const int ifun = xstormy16_interrupt_function_p (); mem_push_rtx = gen_rtx_POST_INC (Pmode, stack_pointer_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 (); + if (layout.locals_size >= 32768) + error ("Local variable memory requirements exceed capacity."); + /* Save the argument registers if necessary. */ if (layout.stdarg_save_size) for (regno = FIRST_ARGUMENT_REGISTER; regno < FIRST_ARGUMENT_REGISTER + NUM_ARGUMENT_REGISTERS; regno++) { + rtx dwarf; rtx reg = gen_rtx_REG (HImode, regno); + insn = emit_move_insn (mem_push_rtx, reg); 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, - gen_rtx_SET (VOIDmode, - mem_fake_push_rtx, - reg), + dwarf, 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. */ for (regno = 0; regno < FIRST_PSEUDO_REGISTER; regno++) if (REG_NEEDS_SAVE (regno, ifun)) { + rtx dwarf; rtx reg = gen_rtx_REG (HImode, regno); + insn = emit_move_insn (mem_push_rtx, reg); 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, - gen_rtx_SET (VOIDmode, - mem_fake_push_rtx, - reg), + dwarf, 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 diff --git a/gcc/config/stormy16/stormy16.h b/gcc/config/stormy16/stormy16.h index 5052364..e6d6458 100644 --- a/gcc/config/stormy16/stormy16.h +++ b/gcc/config/stormy16/stormy16.h @@ -3483,6 +3483,11 @@ do { \ pointers. */ #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 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 diff --git a/gcc/config/stormy16/stormy16.md b/gcc/config/stormy16/stormy16.md index 56033d1..1e48f8b 100644 --- a/gcc/config/stormy16/stormy16.md +++ b/gcc/config/stormy16/stormy16.md @@ -150,13 +150,13 @@ (define_expand "movhi" [(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; }") (define_insn "*movhi_internal" [(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 @@ -279,7 +279,7 @@ (define_insn "addhi3" [(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") - (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"))] "" "@ @@ -311,7 +311,7 @@ (define_insn "addchi4" [(set (match_operand:HI 0 "register_operand" "=T,r,r") (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") (truncate:BI (lshiftrt:SI (plus:SI (zero_extend:SI (match_dup 1)) (zero_extend:SI (match_dup 2))) @@ -329,7 +329,7 @@ (zero_extend:HI (match_operand:BI 3 "register_operand" "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") (truncate:BI (lshiftrt:SI (plus:SI (plus:SI (zero_extend:SI (match_dup 1)) @@ -352,7 +352,7 @@ (define_insn "subhi3" [(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") - (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"))] "" "@ @@ -368,7 +368,7 @@ (define_insn "subchi4" [(set (match_operand:HI 0 "register_operand" "=T,r,r") (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") (truncate:BI (lshiftrt:SI (minus:SI (zero_extend:SI (match_dup 1)) (zero_extend:SI (match_dup 2))) @@ -386,7 +386,7 @@ (zero_extend:HI (match_operand:BI 3 "register_operand" "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") (truncate:BI (lshiftrt:SI (minus:SI (minus:SI (zero_extend:SI (match_dup 1)) @@ -796,7 +796,7 @@ [(set (pc) (if_then_else (match_operator:SI 1 "equality_operator" [(match_operand:SI 2 "register_operand" - "+r") + "r") (const_int 0)]) (label_ref (match_operand 0 "" "")) (pc))) @@ -817,7 +817,7 @@ [(set (pc) (if_then_else (match_operator:SI 1 "xstormy16_ineqsi_operator" [(match_operand:SI 2 "register_operand" - "+r") + "r") (match_operand:SI 3 "nonmemory_operand" "ri")]) (label_ref (match_operand 0 "" "")) @@ -851,7 +851,7 @@ (match_operand:HI 3 "nonmemory_operand" "L,Ir,i")]) (label_ref (match_operand 0 "" "")) (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))) (match_dup 3))) (clobber (match_operand:BI 6 "" "=y,y,y"))] |