OSDN Git Service

2010-05-05 Andrew Pinski <andrew.pinski@caviumnetworks.com>
authorpinskia <pinskia@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 6 May 2010 00:14:59 +0000 (00:14 +0000)
committerMasaki Muranaka <monaka@monami-software.com>
Sun, 23 May 2010 05:00:21 +0000 (14:00 +0900)
        * config/mips/mips.h (TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P):
        Delete.
        * config/mips/mips.c (TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P):
        New define.
        * config/mips/mips-protos.h
        (mips_small_register_classes_for_mode_p): Delete prototype.

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

gcc/ChangeLog
gcc/config/mips/mips-protos.h
gcc/config/mips/mips.c
gcc/config/mips/mips.h

index 403a39f..3a5973b 100644 (file)
@@ -1,3 +1,12 @@
+2010-05-05  Andrew Pinski  <andrew.pinski@caviumnetworks.com>
+
+       * config/mips/mips.h (TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P):
+       Delete.
+       * config/mips/mips.c (TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P):
+       New define.
+       * config/mips/mips-protos.h
+       (mips_small_register_classes_for_mode_p): Delete prototype.
+
 2010-05-06  Bernd Schmidt  <bernds@codesourcery.com>
 
        * config/arm/arm.h (MAX_LDM_STM_OPS): New macro.
index 89a0007..e4fbb32 100644 (file)
@@ -291,7 +291,6 @@ extern rtx mips_function_value (const_tree, const_tree, enum machine_mode);
 
 extern bool mips_cannot_change_mode_class (enum machine_mode,
                                           enum machine_mode, enum reg_class);
-extern bool mips_small_register_classes_for_mode_p (enum machine_mode);
 extern bool mips_dangerous_for_la25_p (rtx);
 extern bool mips_modes_tieable_p (enum machine_mode, enum machine_mode);
 extern enum reg_class mips_preferred_reload_class (rtx, enum reg_class);
index a00b106..21538bd 100644 (file)
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "rtl.h"
 #include "regs.h"
 #include "hard-reg-set.h"
+#include "real.h"
 #include "insn-config.h"
 #include "conditions.h"
 #include "insn-attr.h"
@@ -5448,7 +5449,7 @@ mips_build_builtin_va_list (void)
       layout_type (record);
       return record;
     }
-  else if (TARGET_IRIX6)
+  else if (TARGET_IRIX && TARGET_IRIX6)
     /* On IRIX 6, this type is 'char *'.  */
     return build_pointer_type (char_type_node);
   else
@@ -7863,6 +7864,19 @@ mips_output_external (FILE *file, tree decl, const char *name)
          fprintf (file, ", " HOST_WIDE_INT_PRINT_DEC "\n",
                   int_size_in_bytes (TREE_TYPE (decl)));
        }
+      else if (TARGET_IRIX
+              && mips_abi == ABI_32
+              && TREE_CODE (decl) == FUNCTION_DECL)
+       {
+         /* In IRIX 5 or IRIX 6 for the O32 ABI, we must output a
+            `.global name .text' directive for every used but
+            undefined function.  If we don't, the linker may perform
+            an optimization (skipping over the insns that set $gp)
+            when it is unsafe.  */
+         fputs ("\t.globl ", file);
+         assemble_name (file, name);
+         fputs (" .text\n", file);
+       }
     }
 }
 
@@ -8152,7 +8166,7 @@ mips_file_start (void)
   /* Generate a special section to describe the ABI switches used to
      produce the resultant binary.  This is unnecessary on IRIX and
      causes unwanted warnings from the native linker.  */
-  if (!TARGET_IRIX6)
+  if (!TARGET_IRIX)
     {
       /* Record the ABI itself.  Modern versions of binutils encode
         this information in the ELF header flags, but GDB needs the
@@ -8171,27 +8185,10 @@ mips_file_start (void)
                 "\t.previous\n", TARGET_LONG64 ? 64 : 32);
 
 #ifdef HAVE_AS_GNU_ATTRIBUTE
-      {
-       int attr;
-
-       /* No floating-point operations, -mno-float.  */
-       if (TARGET_NO_FLOAT)
-         attr = 0;
-       /* Soft-float code, -msoft-float.  */
-       else if (!TARGET_HARD_FLOAT_ABI)
-         attr = 3;
-       /* Single-float code, -msingle-float.  */
-       else if (!TARGET_DOUBLE_FLOAT)
-         attr = 2;
-       /* 64-bit FP registers on a 32-bit target, -mips32r2 -mfp64.  */
-       else if (!TARGET_64BIT && TARGET_FLOAT64)
-         attr = 4;
-       /* Regular FP code, FP regs same size as GP regs, -mdouble-float.  */
-       else
-         attr = 1;
-
-       fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n", attr);
-      }
+      fprintf (asm_out_file, "\t.gnu_attribute 4, %d\n",
+              (TARGET_HARD_FLOAT_ABI
+               ? (TARGET_DOUBLE_FLOAT
+                  ? ((!TARGET_64BIT && TARGET_FLOAT64) ? 4 : 1) : 2) : 3));
 #endif
     }
 
@@ -9814,6 +9811,10 @@ mips_output_function_prologue (FILE *file, HOST_WIDE_INT size ATTRIBUTE_UNUSED)
   fnname = XSTR (XEXP (DECL_RTL (current_function_decl), 0), 0);
   mips_start_function_definition (fnname, TARGET_MIPS16);
 
+  /* Stop mips_file_end from treating this function as external.  */
+  if (TARGET_IRIX && mips_abi == ABI_32)
+    TREE_ASM_WRITTEN (DECL_NAME (cfun->decl)) = 1;
+
   /* Output MIPS-specific frame information.  */
   if (!flag_inhibit_size_directive)
     {
@@ -14022,35 +14023,23 @@ r10k_insert_cache_barriers (void)
 }
 \f
 /* If INSN is a call, return the underlying CALL expr.  Return NULL_RTX
-   otherwise.  If INSN has two call rtx, then store the second one in
-   SECOND_CALL.  */
+   otherwise.  */
 
 static rtx
-mips_call_expr_from_insn (rtx insn, rtx *second_call)
+mips_call_expr_from_insn (rtx insn)
 {
   rtx x;
-  rtx x2;
 
   if (!CALL_P (insn))
     return NULL_RTX;
 
   x = PATTERN (insn);
   if (GET_CODE (x) == PARALLEL)
-    {
-      /* Calls returning complex values have two CALL rtx.  Look for the second
-        one here, and return it via the SECOND_CALL arg.  */
-      x2 = XVECEXP (x, 0, 1);
-      if (GET_CODE (x2) == SET)
-       x2 = XEXP (x2, 1);
-      if (GET_CODE (x2) == CALL)
-       *second_call = x2;
-
-      x = XVECEXP (x, 0, 0);
-    }
+    x = XVECEXP (x, 0, 0);
   if (GET_CODE (x) == SET)
     x = XEXP (x, 1);
-  gcc_assert (GET_CODE (x) == CALL);
 
+  gcc_assert (GET_CODE (x) == CALL);
   return x;
 }
 
@@ -14182,10 +14171,9 @@ mips_annotate_pic_calls (void)
   FOR_EACH_BB (bb)
     FOR_BB_INSNS (bb, insn)
     {
-      rtx call, reg, symbol, second_call;
+      rtx call, reg, symbol;
 
-      second_call = 0;
-      call = mips_call_expr_from_insn (insn, &second_call);
+      call = mips_call_expr_from_insn (insn);
       if (!call)
        continue;
       gcc_assert (MEM_P (XEXP (call, 0)));
@@ -14195,11 +14183,7 @@ mips_annotate_pic_calls (void)
 
       symbol = mips_find_pic_call_symbol (insn, reg);
       if (symbol)
-       {
-         mips_annotate_pic_call_expr (call, symbol);
-         if (second_call)
-           mips_annotate_pic_call_expr (second_call, symbol);
-       }
+       mips_annotate_pic_call_expr (call, symbol);
     }
 }
 \f
@@ -15421,13 +15405,6 @@ mips_override_options (void)
   SUBTARGET_OVERRIDE_OPTIONS;
 #endif
 
-  /* -mno-float overrides -mhard-float and -msoft-float.  */
-  if (TARGET_NO_FLOAT)
-    {
-      target_flags |= MASK_SOFT_FLOAT_ABI;
-      target_flags_explicit |= MASK_SOFT_FLOAT_ABI;
-    }
-
   /* Set the small data limit.  */
   mips_small_data_threshold = (g_switch_set
                               ? g_switch_value
@@ -16309,7 +16286,6 @@ void mips_function_profiler (FILE *file)
 #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD
 #define TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD \
   mips_multipass_dfa_lookahead
-#undef TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P
 #define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
   mips_small_register_classes_for_mode_p
 
index d5c98a6..7b0ec07 100644 (file)
@@ -2006,13 +2006,6 @@ enum reg_class
 
 #define INDEX_REG_CLASS NO_REGS
 
-/* When this hook returns true for MODE, the compiler allows
-   registers explicitly used in the rtl to be used as spill registers
-   but prevents the compiler from extending the lifetime of these
-   registers.  */
-#define TARGET_SMALL_REGISTER_CLASSES_FOR_MODE_P \
-  mips_small_register_classes_for_mode_p
-
 /* We generally want to put call-clobbered registers ahead of
    call-saved ones.  (IRA expects this.)  */