OSDN Git Service

* config/mn10300/mn10300.c (mn10300_wide_const_load_uses_clr): New
authoraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Feb 2003 21:47:48 +0000 (21:47 +0000)
committeraoliva <aoliva@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 14 Feb 2003 21:47:48 +0000 (21:47 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@62916 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/config/mn10300/mn10300-protos.h
gcc/config/mn10300/mn10300.c
gcc/config/mn10300/mn10300.md

index a51c6bd..34128fe 100644 (file)
@@ -1,3 +1,11 @@
+2003-02-14  Alexandre Oliva  <aoliva@redhat.com>
+
+       * 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.
+
 2003-02-14  Kazu Hirata  <kazu@cs.umass.edu>
 
        * simplify-rtx.c (simplify_binary_operation): Simplify ~y when
index f51f3c9..4816e6f 100644 (file)
@@ -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));
-
index f040a89..5a28126 100644 (file)
@@ -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;
+}
index 770f7c5..f889aa6 100644 (file)
@@ -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).
 
       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" "")
       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")))])
 
 
 \f