diff options
author | Anatoly Sokolov <aesok@post.ru> | 2007-01-07 06:45:24 +0300 |
---|---|---|
committer | Anatoly Sokolov <aesok@gcc.gnu.org> | 2007-01-07 06:45:24 +0300 |
commit | 696e990bdbd5fcc6a8763ee2e2055ecfb6877b88 (patch) | |
tree | a1a4e39b164a18d47b91ca8cf42b38b86e873a2b /gcc/config/avr | |
parent | b7fdd4ed69ebb0a413c6f4bb29c570c9b97a6e94 (diff) | |
download | gcc-696e990bdbd5fcc6a8763ee2e2055ecfb6877b88.zip gcc-696e990bdbd5fcc6a8763ee2e2055ecfb6877b88.tar.gz gcc-696e990bdbd5fcc6a8763ee2e2055ecfb6877b88.tar.bz2 |
avr-protos.h (call_insn_operand): Delete prototype.
* 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.
From-SVN: r120546
Diffstat (limited to 'gcc/config/avr')
-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 |
4 files changed, 31 insertions, 32 deletions
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))")))) |