Mercurial > hg > CbC > CbC_gcc
diff gcc/config/tilepro/tilepro.c @ 145:1830386684a0
gcc-9.2.0
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 11:34:05 +0900 |
parents | 84e7813d76e9 |
children |
line wrap: on
line diff
--- a/gcc/config/tilepro/tilepro.c Thu Oct 25 07:37:49 2018 +0900 +++ b/gcc/config/tilepro/tilepro.c Thu Feb 13 11:34:05 2020 +0900 @@ -1,5 +1,5 @@ /* Subroutines used for code generation on the Tilera TILEPro. - Copyright (C) 2011-2018 Free Software Foundation, Inc. + Copyright (C) 2011-2020 Free Software Foundation, Inc. Contributed by Walter Lee (walt@tilera.com) This file is part of GCC. @@ -134,12 +134,11 @@ /* Implement TARGET_PASS_BY_REFERENCE. Variable sized types are passed by reference. */ static bool -tilepro_pass_by_reference (cumulative_args_t cum ATTRIBUTE_UNUSED, - machine_mode mode ATTRIBUTE_UNUSED, - const_tree type, bool named ATTRIBUTE_UNUSED) +tilepro_pass_by_reference (cumulative_args_t, const function_arg_info &arg) { - return (type && TYPE_SIZE (type) - && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST); + return (arg.type + && TYPE_SIZE (arg.type) + && TREE_CODE (TYPE_SIZE (arg.type)) != INTEGER_CST); } @@ -169,13 +168,10 @@ /* Implement TARGET_FUNCTION_ARG. */ static rtx -tilepro_function_arg (cumulative_args_t cum_v, - machine_mode mode, - const_tree type, bool named ATTRIBUTE_UNUSED) +tilepro_function_arg (cumulative_args_t cum_v, const function_arg_info &arg) { CUMULATIVE_ARGS cum = *get_cumulative_args (cum_v); - int byte_size = ((mode == BLKmode) - ? int_size_in_bytes (type) : GET_MODE_SIZE (mode)); + int byte_size = arg.promoted_size_in_bytes (); bool doubleword_aligned_p; if (cum >= TILEPRO_NUM_ARG_REGS) @@ -183,7 +179,7 @@ /* See whether the argument has doubleword alignment. */ doubleword_aligned_p = - tilepro_function_arg_boundary (mode, type) > BITS_PER_WORD; + tilepro_function_arg_boundary (arg.mode, arg.type) > BITS_PER_WORD; if (doubleword_aligned_p) cum += cum & 1; @@ -194,26 +190,24 @@ > TILEPRO_NUM_ARG_REGS) return NULL_RTX; - return gen_rtx_REG (mode, cum); + return gen_rtx_REG (arg.mode, cum); } /* Implement TARGET_FUNCTION_ARG_ADVANCE. */ static void tilepro_function_arg_advance (cumulative_args_t cum_v, - machine_mode mode, - const_tree type, bool named ATTRIBUTE_UNUSED) + const function_arg_info &arg) { CUMULATIVE_ARGS *cum = get_cumulative_args (cum_v); - int byte_size = ((mode == BLKmode) - ? int_size_in_bytes (type) : GET_MODE_SIZE (mode)); + int byte_size = arg.promoted_size_in_bytes (); int word_size = (byte_size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; bool doubleword_aligned_p; /* See whether the argument has doubleword alignment. */ doubleword_aligned_p = - tilepro_function_arg_boundary (mode, type) > BITS_PER_WORD; + tilepro_function_arg_boundary (arg.mode, arg.type) > BITS_PER_WORD; if (doubleword_aligned_p) *cum += *cum & 1; @@ -343,8 +337,8 @@ /* Implement TARGET_SETUP_INCOMING_VARARGS. */ static void tilepro_setup_incoming_varargs (cumulative_args_t cum, - machine_mode mode, - tree type, int *pretend_args, int no_rtl) + const function_arg_info &arg, + int *pretend_args, int no_rtl) { CUMULATIVE_ARGS local_cum = *get_cumulative_args (cum); int first_reg; @@ -352,8 +346,7 @@ /* The caller has advanced CUM up to, but not beyond, the last named argument. Advance a local copy of CUM past the last "real" named argument, to find out how many registers are left over. */ - targetm.calls.function_arg_advance (pack_cumulative_args (&local_cum), - mode, type, true); + targetm.calls.function_arg_advance (pack_cumulative_args (&local_cum), arg); first_reg = local_cum; if (local_cum < TILEPRO_NUM_ARG_REGS) @@ -419,8 +412,7 @@ /* if an object is dynamically sized, a pointer to it is passed instead of the object itself. */ - pass_by_reference_p = pass_by_reference (NULL, TYPE_MODE (type), type, - false); + pass_by_reference_p = pass_va_arg_by_reference (type); if (pass_by_reference_p) type = build_pointer_type (type); @@ -3095,7 +3087,7 @@ #define MAX_BUILTIN_ARGS 4 tree fndecl = TREE_OPERAND (CALL_EXPR_FN (exp), 0); - unsigned int fcode = DECL_FUNCTION_CODE (fndecl); + unsigned int fcode = DECL_MD_FUNCTION_CODE (fndecl); tree arg; call_expr_arg_iterator iter; enum insn_code icode; @@ -3210,7 +3202,7 @@ static bool need_to_save_reg (unsigned int regno) { - if (!fixed_regs[regno] && !call_used_regs[regno] + if (!call_used_or_fixed_reg_p (regno) && df_regs_ever_live_p (regno)) return true; @@ -3872,20 +3864,11 @@ tilepro_conditional_register_usage (void) { global_regs[TILEPRO_NETORDER_REGNUM] = 1; - /* TILEPRO_PIC_TEXT_LABEL_REGNUM is conditionally used. It is a - member of fixed_regs, and therefore must be member of - call_used_regs, but it is not a member of call_really_used_regs[] - because it is not clobbered by a call. */ + /* TILEPRO_PIC_TEXT_LABEL_REGNUM is conditionally used. */ if (TILEPRO_PIC_TEXT_LABEL_REGNUM != INVALID_REGNUM) - { - fixed_regs[TILEPRO_PIC_TEXT_LABEL_REGNUM] = 1; - call_used_regs[TILEPRO_PIC_TEXT_LABEL_REGNUM] = 1; - } + fixed_regs[TILEPRO_PIC_TEXT_LABEL_REGNUM] = 1; if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM) - { - fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; - call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1; - } + fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; } @@ -4368,6 +4351,7 @@ HOST_WIDE_INT delta, HOST_WIDE_INT vcall_offset, tree function) { + const char *fnname = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (thunk_fndecl)); rtx this_rtx, funexp; rtx_insn *insn; @@ -4415,17 +4399,18 @@ /* Run just enough of rest_of_compilation to get the insns emitted. There's not really enough bulk here to make other passes such as - instruction scheduling worth while. Note that use_thunk calls - assemble_start_function and assemble_end_function. + instruction scheduling worth while. We don't currently bundle, but the instruciton sequence is all serial except for the tail call, so we're only wasting one cycle. */ insn = get_insns (); shorten_branches (insn); + assemble_start_function (thunk_fndecl, fnname); final_start_function (insn, file, 1); final (insn, file, 1); final_end_function (); + assemble_end_function (thunk_fndecl, fnname); /* Stop pretending to be a post-reload pass. */ reload_completed = 0; @@ -4771,8 +4756,7 @@ i = exact_log2 (n); if (i < 0) { - output_operand_lossage ("invalid %%t operand '" - HOST_WIDE_INT_PRINT_DEC "'", n); + output_operand_lossage ("invalid %%t operand"); return; }