From: pinskia Date: Thu, 6 May 2010 00:14:59 +0000 (+0000) Subject: 2010-05-05 Andrew Pinski X-Git-Url: http://git.sourceforge.jp/view?p=pf3gnuchains%2Fgcc-fork.git;a=commitdiff_plain;h=880dddb6a685d968c45fef36e3ce76936dc92452 2010-05-05 Andrew Pinski * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 403a39f85be..3a5973b1200 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2010-05-05 Andrew Pinski + + * 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 * config/arm/arm.h (MAX_LDM_STM_OPS): New macro. diff --git a/gcc/config/mips/mips-protos.h b/gcc/config/mips/mips-protos.h index 89a00072839..e4fbb32b959 100644 --- a/gcc/config/mips/mips-protos.h +++ b/gcc/config/mips/mips-protos.h @@ -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); diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index a00b10680f8..21538bdf6bc 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -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) } /* 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); } } @@ -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 diff --git a/gcc/config/mips/mips.h b/gcc/config/mips/mips.h index d5c98a6ffb8..7b0ec0762ad 100644 --- a/gcc/config/mips/mips.h +++ b/gcc/config/mips/mips.h @@ -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.) */