diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2003-02-14 21:47:48 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2003-02-14 21:47:48 +0000 |
commit | fe7496dd9fcb94be92815f2c91f1581da17ff96d (patch) | |
tree | 3a23f589a277e44cf83c7f561cdfa71bf631e9bd /gcc/config | |
parent | e4402f97c18bdf20af5d1fc9a1f10f1b12e84eb2 (diff) | |
download | gcc-fe7496dd9fcb94be92815f2c91f1581da17ff96d.zip gcc-fe7496dd9fcb94be92815f2c91f1581da17ff96d.tar.gz gcc-fe7496dd9fcb94be92815f2c91f1581da17ff96d.tar.bz2 |
mn10300.c (mn10300_wide_const_load_uses_clr): New function.
* config/mn10300/mn10300.c (mn10300_wide_const_load_uses_clr): New
function.
* config/mn10300/mn10300-protos.h: Declare it.
* config/mn10300/mn10300.md (movdi, movdf): Use it to compute
attribute cc of instructions that may use clr.
From-SVN: r62916
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/mn10300/mn10300-protos.h | 5 | ||||
-rw-r--r-- | gcc/config/mn10300/mn10300.c | 50 | ||||
-rw-r--r-- | gcc/config/mn10300/mn10300.md | 44 |
3 files changed, 93 insertions, 6 deletions
diff --git a/gcc/config/mn10300/mn10300-protos.h b/gcc/config/mn10300/mn10300-protos.h index f51f3c9..4816e6f 100644 --- a/gcc/config/mn10300/mn10300-protos.h +++ b/gcc/config/mn10300/mn10300-protos.h @@ -1,5 +1,5 @@ /* Definitions of target machine for GNU compiler. Matsushita MN10300 series - Copyright (C) 2000 Free Software Foundation, Inc. + Copyright (C) 2000, 2003 Free Software Foundation, Inc. Contributed by Jeff Law (law@cygnus.com). This file is part of GNU CC. @@ -40,6 +40,8 @@ extern int symbolic_operand PARAMS ((rtx, enum machine_mode)); extern int call_address_operand PARAMS ((rtx, enum machine_mode)); extern int impossible_plus_operand PARAMS ((rtx, enum machine_mode)); extern int const_8bit_operand PARAMS ((rtx, enum machine_mode)); + +extern bool mn10300_wide_const_load_uses_clr PARAMS ((rtx operands[2])); #endif /* RTX_CODE */ #ifdef TREE_CODE @@ -57,4 +59,3 @@ extern void expand_epilogue PARAMS ((void)); extern int initial_offset PARAMS ((int, int)); extern int can_use_return_insn PARAMS ((void)); extern int mask_ok_for_mem_btst PARAMS ((int, int)); - diff --git a/gcc/config/mn10300/mn10300.c b/gcc/config/mn10300/mn10300.c index f040a899..5a28126 100644 --- a/gcc/config/mn10300/mn10300.c +++ b/gcc/config/mn10300/mn10300.c @@ -1,5 +1,5 @@ /* Subroutines for insn-output.c for Matsushita MN10300 series - Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Jeff Law (law@cygnus.com). @@ -1390,3 +1390,51 @@ mn10300_rtx_costs (x, code, outer_code, total) return false; } } + +/* Check whether a constant used to initialize a DImode or DFmode can + use a clr instruction. The code here must be kept in sync with + movdf and movdi. */ + +bool +mn10300_wide_const_load_uses_clr (operands) + rtx operands[2]; +{ + long val[2]; + + if (GET_CODE (operands[0]) != REG + || REGNO_REG_CLASS (REGNO (operands[0])) != DATA_REGS) + return false; + + switch (GET_CODE (operands[1])) + { + case CONST_INT: + { + rtx low, high; + split_double (operands[1], &low, &high); + val[0] = INTVAL (low); + val[1] = INTVAL (high); + } + break; + + case CONST_DOUBLE: + if (GET_MODE (operands[1]) == DFmode) + { + REAL_VALUE_TYPE rv; + + REAL_VALUE_FROM_CONST_DOUBLE (rv, operands[1]); + REAL_VALUE_TO_TARGET_DOUBLE (rv, val); + } + else if (GET_MODE (operands[1]) == VOIDmode + || GET_MODE (operands[1]) == DImode) + { + val[0] = CONST_DOUBLE_LOW (operands[1]); + val[1] = CONST_DOUBLE_HIGH (operands[1]); + } + break; + + default: + return false; + } + + return val[0] == 0 || val[1] == 0; +} diff --git a/gcc/config/mn10300/mn10300.md b/gcc/config/mn10300/mn10300.md index 770f7c5..f889aa6 100644 --- a/gcc/config/mn10300/mn10300.md +++ b/gcc/config/mn10300/mn10300.md @@ -1,5 +1,5 @@ ;; GCC machine description for Matsushita MN10300 -;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002 +;; Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 ;; Free Software Foundation, Inc. ;; Contributed by Jeff Law (law@cygnus.com). @@ -520,7 +520,26 @@ abort (); } }" - [(set_attr "cc" "none,none,clobber,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit")]) + [(set (attr "cc") + (cond + [ + (lt (symbol_ref "which_alternative") (const_int 2) + ) (const_string "none") + (eq (symbol_ref "which_alternative") (const_int 2) + ) (const_string "clobber") + (eq (symbol_ref "which_alternative") (const_int 3) + ) (if_then_else + (ne (symbol_ref "rtx_equal_p (operands[0], operands[1])") + (const_int 0)) (const_string "clobber") + (const_string "none_0hit")) + (ior (eq (symbol_ref "which_alternative") (const_int 8)) + (eq (symbol_ref "which_alternative") (const_int 9)) + ) (if_then_else + (ne (symbol_ref "mn10300_wide_const_load_uses_clr + (operands)") + (const_int 0)) (const_string "clobber") + (const_string "none_0hit")) + ] (const_string "none_0hit")))]) (define_expand "movdf" [(set (match_operand:DF 0 "general_operand" "") @@ -670,7 +689,26 @@ abort (); } }" - [(set_attr "cc" "none,none,clobber,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit,none_0hit")]) + [(set (attr "cc") + (cond + [ + (lt (symbol_ref "which_alternative") (const_int 2) + ) (const_string "none") + (eq (symbol_ref "which_alternative") (const_int 2) + ) (const_string "clobber") + (eq (symbol_ref "which_alternative") (const_int 3) + ) (if_then_else + (ne (symbol_ref "rtx_equal_p (operands[0], operands[1])") + (const_int 0)) (const_string "clobber") + (const_string "none_0hit")) + (ior (eq (symbol_ref "which_alternative") (const_int 8)) + (eq (symbol_ref "which_alternative") (const_int 9)) + ) (if_then_else + (ne (symbol_ref "mn10300_wide_const_load_uses_clr + (operands)") + (const_int 0)) (const_string "clobber") + (const_string "none_0hit")) + ] (const_string "none_0hit")))]) |