OSDN Git Service

gcc/
authorrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Oct 2007 08:34:01 +0000 (08:34 +0000)
committerrsandifo <rsandifo@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 5 Oct 2007 08:34:01 +0000 (08:34 +0000)
PR target/33635
* config/mips/mips.c (mips_register_move_cost): Rewrite to use
subset checks.  Make the cost of FPR -> FPR moves depend on
mips_mode_ok_for_mov_fmt_p.

gcc/testsuite/
PR target/33635
* gcc.target/mips/pr33635-1.c: New test.

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

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/mips/pr33635-1.c [new file with mode: 0644]

index 3dabeea..fba43b2 100644 (file)
@@ -1,3 +1,10 @@
+2007-10-05  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR target/33635
+       * config/mips/mips.c (mips_register_move_cost): Rewrite to use
+       subset checks.  Make the cost of FPR -> FPR moves depend on
+       mips_mode_ok_for_mov_fmt_p.
+
 2007-10-04  Doug Kwan  <dougkwan@google.com>
 
        * gthr-posix.h (__gthread_cond_broadcast, __gthread_cond_wait,
index 64377b5..889997d 100644 (file)
@@ -10969,69 +10969,54 @@ mips_init_libfuncs (void)
    we need to use.  This gets pretty messy, but it is feasible.  */
 
 int
-mips_register_move_cost (enum machine_mode mode ATTRIBUTE_UNUSED,
+mips_register_move_cost (enum machine_mode mode,
                         enum reg_class to, enum reg_class from)
 {
-  if (from == M16_REGS && reg_class_subset_p (to, GENERAL_REGS))
-    return 2;
-  else if (from == M16_NA_REGS && reg_class_subset_p (to, GENERAL_REGS))
-    return 2;
-  else if (reg_class_subset_p (from, GENERAL_REGS))
+  if (TARGET_MIPS16)
     {
-      if (to == M16_REGS)
-       return 2;
-      else if (to == M16_NA_REGS)
-       return 2;
-      else if (reg_class_subset_p (to, GENERAL_REGS))
+      if (reg_class_subset_p (from, GENERAL_REGS)
+         && reg_class_subset_p (to, GENERAL_REGS))
        {
-         if (TARGET_MIPS16)
-           return 4;
-         else
+         if (reg_class_subset_p (from, M16_REGS)
+             || reg_class_subset_p (to, M16_REGS))
            return 2;
-       }
-      else if (to == FP_REGS)
-       return 4;
-      else if (reg_class_subset_p (to, ACC_REGS))
-       {
-         if (TARGET_MIPS16)
-           return 12;
-         else
-           return 6;
-       }
-      else if (reg_class_subset_p (to, ALL_COP_REGS))
-       {
-         return 5;
+         /* Two MOVEs.  */
+         return 4;
        }
     }
-  else if (from == FP_REGS)
+  else if (reg_class_subset_p (from, GENERAL_REGS))
     {
       if (reg_class_subset_p (to, GENERAL_REGS))
-       return 4;
-      else if (to == FP_REGS)
        return 2;
-      else if (to == ST_REGS)
-       return 8;
+      if (reg_class_subset_p (to, FP_REGS))
+       return 4;
+      if (reg_class_subset_p (to, ALL_COP_AND_GR_REGS))
+       return 5;
+      if (reg_class_subset_p (to, ACC_REGS))
+       return 6;
     }
-  else if (reg_class_subset_p (from, ACC_REGS))
+  else if (reg_class_subset_p (to, GENERAL_REGS))
     {
-      if (reg_class_subset_p (to, GENERAL_REGS))
-       {
-         if (TARGET_MIPS16)
-           return 12;
-         else
-           return 6;
-       }
+      if (reg_class_subset_p (from, FP_REGS))
+       return 4;
+      if (reg_class_subset_p (from, ST_REGS))
+       /* LUI followed by MOVF.  */
+       return 4;
+      if (reg_class_subset_p (from, ALL_COP_AND_GR_REGS))
+       return 5;
+      if (reg_class_subset_p (from, ACC_REGS))
+       return 6;
     }
-  else if (from == ST_REGS && reg_class_subset_p (to, GENERAL_REGS))
-    return 4;
-  else if (reg_class_subset_p (from, ALL_COP_REGS))
+  else if (reg_class_subset_p (from, FP_REGS))
     {
-      return 5;
+      if (reg_class_subset_p (to, FP_REGS)
+         && mips_mode_ok_for_mov_fmt_p (mode))
+       return 4;
+      if (reg_class_subset_p (to, ST_REGS))
+       /* An expensive sequence.  */
+       return 8;
     }
 
-  /* Fall through.
-     ??? What cases are these? Shouldn't we return 2 here?  */
-
   return 12;
 }
 
index 1ef0d60..2252f67 100644 (file)
@@ -1,3 +1,8 @@
+2007-10-05  Richard Sandiford  <rsandifo@nildram.co.uk>
+
+       PR target/33635
+       * gcc.target/mips/pr33635-1.c: New test.
+
 2007-10-04  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libfortran/33253
diff --git a/gcc/testsuite/gcc.target/mips/pr33635-1.c b/gcc/testsuite/gcc.target/mips/pr33635-1.c
new file mode 100644 (file)
index 0000000..44a804e
--- /dev/null
@@ -0,0 +1,13 @@
+/* { dg-mips-options "-mabi=64 -O2" } */
+
+long double __powitf2 (long double x, int m)
+{
+  long double y = x;
+  while (m >>= 1)
+    {
+      x = x * x;
+      if (m % 2)
+        y = y * x;
+    }
+  return y;
+}