diff options
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/config/avr/avr-protos.h | 3 | ||||
-rw-r--r-- | gcc/config/avr/avr.c | 18 | ||||
-rw-r--r-- | gcc/config/avr/avr.md | 22 | ||||
-rwxr-xr-x | gcc/config/avr/predicates.md | 20 |
5 files changed, 40 insertions, 32 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 74eb580..fb37675 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-01-07 Anatoly Sokolov <aesok@post.ru> + + * config/avr/avr-protos.h (call_insn_operand): Delete prototype. + * config/avr/avr.c (call_insn_operand): Delete function. + * config/avr/avr.md (*pushqi, *pushhi, *pushsi, *pushsf): Use REG_SP + instead of register number. Use predicates. + * config/avr/predicates.md (const0_operand, reg_or_0_operand, + call_insn_operand): Add. + 2007-01-06 Jan Hubicka <jh@suse.cz> * tree-pass.h (pass_build_cgraph_edges): Declare. diff --git a/gcc/config/avr/avr-protos.h b/gcc/config/avr/avr-protos.h index ece55b7..ef084f0 100644 --- a/gcc/config/avr/avr-protos.h +++ b/gcc/config/avr/avr-protos.h @@ -1,6 +1,6 @@ /* Prototypes for exported functions defined in avr.c - Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006 + Copyright (C) 2000, 2001, 2002, 2003, 2004, 2006, 2007 Free Software Foundation, Inc. Contributed by Denis Chertykov (denisc@overta.ru) @@ -112,7 +112,6 @@ extern int test_hard_reg_class (enum reg_class class, rtx x); extern int jump_over_one_insn_p (rtx insn, rtx dest); extern int avr_hard_regno_mode_ok (int regno, enum machine_mode mode); -extern int call_insn_operand (rtx op, enum machine_mode mode); extern void final_prescan_insn (rtx insn, rtx *operand, int num_operands); extern int avr_simplify_comparison_p (enum machine_mode mode, RTX_CODE operator, rtx x); diff --git a/gcc/config/avr/avr.c b/gcc/config/avr/avr.c index edc3f30..41142a4 100644 --- a/gcc/config/avr/avr.c +++ b/gcc/config/avr/avr.c @@ -1,5 +1,5 @@ /* Subroutines for insn-output.c for ATMEL AVR micro controllers - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. Contributed by Denis Chertykov (denisc@overta.ru) @@ -1170,22 +1170,6 @@ print_operand (FILE *file, rtx x, int code) print_operand_address (file, x); } -/* Recognize operand OP of mode MODE used in call instructions. */ - -int -call_insn_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) -{ - if (GET_CODE (op) == MEM) - { - rtx inside = XEXP (op, 0); - if (register_operand (inside, Pmode)) - return 1; - if (CONSTANT_ADDRESS_P (inside)) - return 1; - } - return 0; -} - /* Update the condition code in the INSN. */ void diff --git a/gcc/config/avr/avr.md b/gcc/config/avr/avr.md index 0f3051e..38cee2d 100644 --- a/gcc/config/avr/avr.md +++ b/gcc/config/avr/avr.md @@ -1,7 +1,7 @@ ;; -*- Mode: Scheme -*- ;; Machine description for GNU compiler, ;; for ATMEL AVR micro controllers. -;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006 +;; Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 ;; Free Software Foundation, Inc. ;; Contributed by Denis Chertykov (denisc@overta.ru) @@ -145,9 +145,9 @@ [(set_attr "length" "5")]) (define_insn "*pushqi" - [(set (mem:QI (post_dec (reg:HI 32))) - (match_operand:QI 0 "nonmemory_operand" "r,L"))] - "(operands[0] == const0_rtx || register_operand (operands[0], QImode))" + [(set (mem:QI (post_dec (reg:HI REG_SP))) + (match_operand:QI 0 "reg_or_0_operand" "r,L"))] + "" "@ push %0 push __zero_reg__" @@ -155,25 +155,25 @@ (define_insn "*pushhi" - [(set (mem:HI (post_dec (reg:HI 32))) - (match_operand:HI 0 "nonmemory_operand" "r,L"))] - "(operands[0] == const0_rtx || register_operand (operands[0], HImode))" + [(set (mem:HI (post_dec (reg:HI REG_SP))) + (match_operand:HI 0 "reg_or_0_operand" "r,L"))] + "" "@ push %B0\;push %A0 push __zero_reg__\;push __zero_reg__" [(set_attr "length" "2,2")]) (define_insn "*pushsi" - [(set (mem:SI (post_dec (reg:HI 32))) - (match_operand:SI 0 "nonmemory_operand" "r,L"))] - "(operands[0] == const0_rtx || register_operand (operands[0], SImode))" + [(set (mem:SI (post_dec (reg:HI REG_SP))) + (match_operand:SI 0 "reg_or_0_operand" "r,L"))] + "" "@ push %D0\;push %C0\;push %B0\;push %A0 push __zero_reg__\;push __zero_reg__\;push __zero_reg__\;push __zero_reg__" [(set_attr "length" "4,4")]) (define_insn "*pushsf" - [(set (mem:SF (post_dec (reg:HI 32))) + [(set (mem:SF (post_dec (reg:HI REG_SP))) (match_operand:SF 0 "register_operand" "r"))] "" "push %D0 diff --git a/gcc/config/avr/predicates.md b/gcc/config/avr/predicates.md index 9b9f8da..4a0dd1c 100755 --- a/gcc/config/avr/predicates.md +++ b/gcc/config/avr/predicates.md @@ -1,5 +1,5 @@ ;; Predicate definitions for ATMEL AVR micro controllers. -;; Copyright (C) 2006 Free Software Foundation, Inc. +;; Copyright (C) 2006, 2007 Free Software Foundation, Inc. ;; ;; This file is part of GCC. ;; @@ -50,7 +50,17 @@ (and (match_code "const_int") (match_test "INTVAL (op) >= 0x40 && INTVAL (op) <= 0x60 - GET_MODE_SIZE (mode)"))) - + +;; Return 1 if OP is the zero constant for MODE. +(define_predicate "const0_operand" + (and (match_code "const_int,const_double") + (match_test "op == CONST0_RTX (mode)"))) + +;; Returns true if OP is either the constant zero or a register. +(define_predicate "reg_or_0_operand" + (ior (match_operand 0 "register_operand") + (match_operand 0 "const0_operand"))) + ;; Returns 1 if OP is a SYMBOL_REF. (define_predicate "symbol_ref_operand" (match_code "symbol_ref")) @@ -83,3 +93,9 @@ (define_predicate "simple_comparison_operator" (and (match_operand 0 "comparison_operator") (not (match_code "gt,gtu,le,leu")))) + +;; Return true if OP is a valid call operand. +(define_predicate "call_insn_operand" + (and (match_code "mem") + (ior (match_test "register_operand (XEXP (op, 0), mode)") + (match_test "CONSTANT_ADDRESS_P (XEXP (op, 0))")))) |