diff options
Diffstat (limited to 'gcc/config/mn10300')
-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 d5a1c4426c6..537a22d707d 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. @@ -42,6 +42,8 @@ extern int impossible_plus_operand PARAMS ((rtx, enum machine_mode)); extern int const_8bit_operand PARAMS ((rtx, enum machine_mode)); extern int mn10300_address_cost PARAMS ((rtx, int *)); + +extern bool mn10300_wide_const_load_uses_clr PARAMS ((rtx operands[2])); #endif /* RTX_CODE */ #ifdef TREE_CODE @@ -59,4 +61,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 3bad60b7475..c580457a2b5 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). @@ -1322,3 +1322,51 @@ mn10300_address_cost (x, unsig) } } + +/* 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 770f7c5428e..f889aa61cdd 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")))]) |