diff options
Diffstat (limited to 'gcc/config/sh/sh.c')
-rw-r--r-- | gcc/config/sh/sh.c | 846 |
1 files changed, 12 insertions, 834 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c index 9da837e4aa1..91fa5e9ce52 100644 --- a/gcc/config/sh/sh.c +++ b/gcc/config/sh/sh.c @@ -228,6 +228,7 @@ static tree sh_handle_trap_exit_attribute (tree *, tree, tree, int, bool *); static tree sh_handle_renesas_attribute (tree *, tree, tree, int, bool *); static void sh_output_function_epilogue (FILE *, HOST_WIDE_INT); static void sh_insert_attributes (tree, tree *); +static const char *sh_check_pch_target_flags (int); static int sh_adjust_cost (rtx, rtx, rtx, int); static int sh_issue_rate (void); static int sh_dfa_new_cycle (FILE *, int, rtx, int, int, int *sort_p); @@ -467,8 +468,8 @@ static int hard_regs_intersect_p (HARD_REG_SET *, HARD_REG_SET *); #undef TARGET_VECTOR_MODE_SUPPORTED_P #define TARGET_VECTOR_MODE_SUPPORTED_P sh_vector_mode_supported_p -#undef TARGET_PCH_VALID_P -#define TARGET_PCH_VALID_P sh_pch_valid_p +#undef TARGET_CHECK_PCH_TARGET_FLAGS +#define TARGET_CHECK_PCH_TARGET_FLAGS sh_check_pch_target_flags #undef TARGET_DWARF_CALLING_CONVENTION #define TARGET_DWARF_CALLING_CONVENTION sh_dwarf_calling_convention @@ -1964,8 +1965,8 @@ addsubcosts (rtx x) static inline int multcosts (rtx x ATTRIBUTE_UNUSED) { - if (*sh_multcost_str) - return atoi (sh_multcost_str); + if (sh_multcost >= 0) + return sh_multcost; if (TARGET_SHMEDIA) /* ??? We have a mul insn, but it has a latency of three, and doesn't accept constants. Ideally, we would use a cost of one or two and @@ -2909,7 +2910,7 @@ gen_datalabel_ref (rtx sym) /* The SH cannot load a large constant into a register, constants have to come from a pc relative load. The reference of a pc relative load - instruction must be less than 1k infront of the instruction. This + instruction must be less than 1k in front of the instruction. This means that we often have to dump a constant inside a function, and generate code to branch around it. @@ -7515,36 +7516,11 @@ sh_cfun_interrupt_handler_p (void) != NULL_TREE); } -/* Like default_pch_valid_p, but only check certain target_flags. */ -const char * -sh_pch_valid_p (const void *data_p, size_t len) -{ -#ifdef TARGET_OPTIONS - /* ??? We have a copy of this in toplev.c, but it is static. */ - static const struct - { - const char *const prefix; - const char **const variable; - const char *const description; - const char *const value; - } - target_options[] = TARGET_OPTIONS; -#endif - - const char *data = (const char *)data_p; - const char *flag_that_differs = NULL; - size_t i; - int old_flags; - - /* -fpic and -fpie also usually make a PCH invalid. */ - if (data[0] != flag_pic) - return _("created and used with different settings of -fpic"); - if (data[1] != flag_pie) - return _("created and used with different settings of -fpie"); - data += 2; +/* Implement TARGET_CHECK_PCH_TARGET_FLAGS. */ - /* Check target_flags. */ - memcpy (&old_flags, data, sizeof (target_flags)); +static const char * +sh_check_pch_target_flags (int old_flags) +{ if ((old_flags ^ target_flags) & (MASK_SH1 | MASK_SH2 | MASK_SH3 | MASK_SH_E | MASK_HARD_SH4 | MASK_FPU_SINGLE | MASK_SH4)) @@ -7553,40 +7529,7 @@ sh_pch_valid_p (const void *data_p, size_t len) return _("created and used with different ABIs"); if ((old_flags ^ target_flags) & MASK_LITTLE_ENDIAN) return _("created and used with different endianness"); - - data += sizeof (target_flags); - len -= sizeof (target_flags); - - /* Check string options. */ -#ifdef TARGET_OPTIONS - for (i = 0; i < ARRAY_SIZE (target_options); i++) - { - const char *str = *target_options[i].variable; - size_t l; - if (! str) - str = ""; - l = strlen (str) + 1; - if (len < l || memcmp (data, str, l) != 0) - { - flag_that_differs = target_options[i].prefix; - goto make_message; - } - data += l; - len -= l; - } -#endif - return NULL; - - make_message: - { - char *r; - asprintf (&r, _("created and used with differing settings of '-m%s'"), - flag_that_differs); - if (r == NULL) - return _("out of memory"); - return r; - } } /* Predicates used by the templates. */ @@ -7607,301 +7550,6 @@ system_reg_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) return 0; } -/* Returns 1 if OP can be source of a simple move operation. - Same as general_operand, but a LABEL_REF is valid, PRE_DEC is - invalid as are subregs of system registers. */ - -int -general_movsrc_operand (rtx op, enum machine_mode mode) -{ - if (GET_CODE (op) == MEM) - { - rtx inside = XEXP (op, 0); - if (GET_CODE (inside) == CONST) - inside = XEXP (inside, 0); - - if (GET_CODE (inside) == LABEL_REF) - return 1; - - if (GET_CODE (inside) == PLUS - && GET_CODE (XEXP (inside, 0)) == LABEL_REF - && GET_CODE (XEXP (inside, 1)) == CONST_INT) - return 1; - - /* Only post inc allowed. */ - if (GET_CODE (inside) == PRE_DEC) - return 0; - } - - if ((mode == QImode || mode == HImode) - && (GET_CODE (op) == SUBREG - && GET_CODE (XEXP (op, 0)) == REG - && system_reg_operand (XEXP (op, 0), mode))) - return 0; - - if (TARGET_SHMEDIA - && (GET_CODE (op) == PARALLEL || GET_CODE (op) == CONST_VECTOR) - && sh_rep_vec (op, mode)) - return 1; - if (TARGET_SHMEDIA && 1 - && GET_CODE (op) == SUBREG && GET_MODE (op) == mode - && SUBREG_REG (op) == const0_rtx && subreg_lowpart_p (op)) - /* FIXME */ abort (); /* return 1; */ - return general_operand (op, mode); -} - -/* Returns 1 if OP can be a destination of a move. - Same as general_operand, but no preinc allowed. */ - -int -general_movdst_operand (rtx op, enum machine_mode mode) -{ - /* Only pre dec allowed. */ - if (GET_CODE (op) == MEM && GET_CODE (XEXP (op, 0)) == POST_INC) - return 0; - if (mode == DImode && TARGET_SHMEDIA && GET_CODE (op) == SUBREG - && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8 - && ! (high_life_started || reload_completed)) - return 0; - - return general_operand (op, mode); -} - -/* Returns 1 if OP is a normal arithmetic register. */ - -int -arith_reg_operand (rtx op, enum machine_mode mode) -{ - if (register_operand (op, mode)) - { - int regno; - - if (GET_CODE (op) == REG) - regno = REGNO (op); - else if (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG) - regno = REGNO (SUBREG_REG (op)); - else - return 1; - - return (regno != T_REG && regno != PR_REG - && ! TARGET_REGISTER_P (regno) - && (regno != FPUL_REG || TARGET_SH4) - && regno != MACH_REG && regno != MACL_REG); - } - /* Allow a no-op sign extension - compare LOAD_EXTEND_OP. - We allow SImode here, as not using an FP register is just a matter of - proper register allocation. */ - if (TARGET_SHMEDIA - && GET_MODE (op) == DImode && GET_CODE (op) == SIGN_EXTEND - && GET_MODE (XEXP (op, 0)) == SImode - && GET_CODE (XEXP (op, 0)) != SUBREG) - return register_operand (XEXP (op, 0), VOIDmode); -#if 0 /* Can't do this because of PROMOTE_MODE for unsigned vars. */ - if (GET_MODE (op) == SImode && GET_CODE (op) == SIGN_EXTEND - && GET_MODE (XEXP (op, 0)) == HImode - && GET_CODE (XEXP (op, 0)) == REG - && REGNO (XEXP (op, 0)) <= LAST_GENERAL_REG) - return register_operand (XEXP (op, 0), VOIDmode); -#endif - if (GET_MODE_CLASS (GET_MODE (op)) == MODE_VECTOR_INT - && GET_CODE (op) == SUBREG - && GET_MODE (SUBREG_REG (op)) == DImode - && GET_CODE (SUBREG_REG (op)) == SIGN_EXTEND - && GET_MODE (XEXP (SUBREG_REG (op), 0)) == SImode - && GET_CODE (XEXP (SUBREG_REG (op), 0)) != SUBREG) - return register_operand (XEXP (SUBREG_REG (op), 0), VOIDmode); - return 0; -} - -/* Like above, but for DImode destinations: forbid paradoxical DImode subregs, - because this would lead to missing sign extensions when truncating from - DImode to SImode. */ -int -arith_reg_dest (rtx op, enum machine_mode mode) -{ - if (mode == DImode && GET_CODE (op) == SUBREG - && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8 - && TARGET_SHMEDIA) - return 0; - return arith_reg_operand (op, mode); -} - -/* Like arith_reg_operand, but for register source operands of narrow - logical SHMEDIA operations: forbid subregs of DImode / TImode regs. */ -int -logical_reg_operand (rtx op, enum machine_mode mode) -{ - if (TARGET_SHMEDIA - && GET_CODE (op) == SUBREG - && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4 - && mode != DImode) - return 0; - return arith_reg_operand (op, mode); -} - -int -int_gpr_dest (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) -{ - enum machine_mode op_mode = GET_MODE (op); - - if (GET_MODE_CLASS (op_mode) != MODE_INT - || GET_MODE_SIZE (op_mode) >= UNITS_PER_WORD) - return 0; - if (! reload_completed) - return 0; - return true_regnum (op) <= LAST_GENERAL_REG; -} - -int -fp_arith_reg_operand (rtx op, enum machine_mode mode) -{ - if (register_operand (op, mode)) - { - int regno; - - if (GET_CODE (op) == REG) - regno = REGNO (op); - else if (GET_CODE (op) == SUBREG && GET_CODE (SUBREG_REG (op)) == REG) - regno = REGNO (SUBREG_REG (op)); - else - return 1; - - return (regno >= FIRST_PSEUDO_REGISTER - || FP_REGISTER_P (regno)); - } - return 0; -} - -int -fp_arith_reg_dest (rtx op, enum machine_mode mode) -{ - if (mode == DImode && GET_CODE (op) == SUBREG - && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) < 8) - return 0; - return fp_arith_reg_operand (op, mode); -} - -/* Returns 1 if OP is a valid source operand for an arithmetic insn. */ - -int -arith_operand (rtx op, enum machine_mode mode) -{ - if (arith_reg_operand (op, mode)) - return 1; - - if (TARGET_SHMEDIA) - { - /* FIXME: We should be checking whether the CONST_INT fits in a - CONST_OK_FOR_I16 here, but this causes reload_cse to crash when - attempting to transform a sequence of two 64-bit sets of the - same register from literal constants into a set and an add, - when the difference is too wide for an add. */ - if (GET_CODE (op) == CONST_INT - || EXTRA_CONSTRAINT_C16 (op)) - return 1; - else if (GET_CODE (op) == TRUNCATE - && ! system_reg_operand (XEXP (op, 0), VOIDmode) - && (mode == VOIDmode || mode == GET_MODE (op)) - && (GET_MODE_SIZE (GET_MODE (op)) - < GET_MODE_SIZE (GET_MODE (XEXP (op, 0)))) - && (! FP_REGISTER_P (REGNO (XEXP (op, 0))) - || GET_MODE_SIZE (GET_MODE (op)) == 4)) - return register_operand (XEXP (op, 0), VOIDmode); - else - return 0; - } - else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I08 (INTVAL (op))) - return 1; - - return 0; -} - -/* Returns 1 if OP is a valid source operand for a compare insn. */ - -int -arith_reg_or_0_operand (rtx op, enum machine_mode mode) -{ - if (arith_reg_operand (op, mode)) - return 1; - - if (EXTRA_CONSTRAINT_Z (op)) - return 1; - - return 0; -} - -/* Return 1 if OP is a valid source operand for xor. */ - -int -xor_operand (rtx op, enum machine_mode mode) -{ - if (GET_CODE (op) == CONST_INT) - return (TARGET_SHMEDIA - ? (CONST_OK_FOR_I06 (INTVAL (op)) - || (no_new_pseudos && INTVAL (op) == 0xff)) - : CONST_OK_FOR_K08 (INTVAL (op))); - if (TARGET_SHMEDIA - && mode != DImode && GET_CODE (op) == SUBREG - && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4) - return 0; - return arith_reg_operand (op, mode); -} - -/* Return 1 if OP is a valid source operand for shmedia cmpgt / cmpgtu. */ -int -cmp_operand (rtx op, enum machine_mode mode) -{ - if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_N (INTVAL (op))) - return 1; - if (TARGET_SHMEDIA - && mode != DImode && GET_CODE (op) == SUBREG - && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4) - return 0; - return arith_reg_operand (op, mode); -} - -/* Returns 1 if OP is a valid source operand for a logical operation. */ - -int -logical_operand (rtx op, enum machine_mode mode) -{ - if (TARGET_SHMEDIA - && mode != DImode && GET_CODE (op) == SUBREG - && GET_MODE_SIZE (GET_MODE (SUBREG_REG (op))) > 4) - return 0; - - if (arith_reg_operand (op, mode)) - return 1; - - if (TARGET_SHMEDIA) - { - if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_I10 (INTVAL (op))) - return 1; - else - return 0; - } - else if (GET_CODE (op) == CONST_INT && CONST_OK_FOR_K08 (INTVAL (op))) - return 1; - - return 0; -} - -int -and_operand (rtx op, enum machine_mode mode) -{ - if (logical_operand (op, mode)) - return 1; - - /* Check mshflo.l / mshflhi.l opportunities. */ - if (TARGET_SHMEDIA - && mode == DImode - && GET_CODE (op) == CONST_INT - && CONST_OK_FOR_J16 (INTVAL (op))) - return 1; - - return 0; -} - /* Nonzero if OP is a floating point value with value 0.0. */ int @@ -7950,33 +7598,6 @@ tertiary_reload_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) return code == MEM || (TARGET_SH4 && code == CONST_DOUBLE); } -int -fpscr_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) -{ - return (GET_CODE (op) == REG - && (REGNO (op) == FPSCR_REG - || (REGNO (op) >= FIRST_PSEUDO_REGISTER - && !(reload_in_progress || reload_completed))) - && GET_MODE (op) == PSImode); -} - -int -fpul_operand (rtx op, enum machine_mode mode) -{ - if (TARGET_SHMEDIA) - return fp_arith_reg_operand (op, mode); - - return (GET_CODE (op) == REG - && (REGNO (op) == FPUL_REG || REGNO (op) >= FIRST_PSEUDO_REGISTER) - && GET_MODE (op) == mode); -} - -int -symbol_ref_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) -{ - return (GET_CODE (op) == SYMBOL_REF); -} - /* Return the TLS type for TLS symbols, 0 for otherwise. */ int tls_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) @@ -7985,366 +7606,6 @@ tls_symbolic_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) return 0; return SYMBOL_REF_TLS_MODEL (op); } - -int -commutative_float_operator (rtx op, enum machine_mode mode) -{ - if (GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case PLUS: - case MULT: - return 1; - default: - break; - } - return 0; -} - -int -noncommutative_float_operator (rtx op, enum machine_mode mode) -{ - if (GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case MINUS: - case DIV: - return 1; - default: - break; - } - return 0; -} - -int -unary_float_operator (rtx op, enum machine_mode mode) -{ - if (GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case ABS: - case NEG: - case SQRT: - return 1; - default: - break; - } - return 0; -} - -int -binary_float_operator (rtx op, enum machine_mode mode) -{ - if (GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case PLUS: - case MINUS: - case MULT: - case DIV: - return 1; - default: - break; - } - return 0; -} - -int -binary_logical_operator (rtx op, enum machine_mode mode) -{ - if (GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case IOR: - case AND: - case XOR: - return 1; - default: - break; - } - return 0; -} - -int -equality_comparison_operator (rtx op, enum machine_mode mode) -{ - return ((mode == VOIDmode || GET_MODE (op) == mode) - && (GET_CODE (op) == EQ || GET_CODE (op) == NE)); -} - -int -greater_comparison_operator (rtx op, enum machine_mode mode) -{ - if (mode != VOIDmode && GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case GT: - case GE: - case GTU: - case GEU: - return 1; - default: - return 0; - } -} - -int -less_comparison_operator (rtx op, enum machine_mode mode) -{ - if (mode != VOIDmode && GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case LT: - case LE: - case LTU: - case LEU: - return 1; - default: - return 0; - } -} - -int -shift_operator (rtx op, enum machine_mode mode) -{ - if (mode != VOIDmode && GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case ASHIFT: - case ASHIFTRT: - case LSHIFTRT: - return 1; - default: - return 0; - } -} - -int -logical_operator (rtx op, enum machine_mode mode) -{ - if (mode != VOIDmode && GET_MODE (op) != mode) - return 0; - switch (GET_CODE (op)) - { - case AND: - case IOR: - case XOR: - return 1; - default: - return 0; - } -} - -/* Accept pseudos and branch target registers. */ -int -target_reg_operand (rtx op, enum machine_mode mode) -{ - if (mode == VOIDmode - ? GET_MODE (op) != Pmode && GET_MODE (op) != PDImode - : mode != GET_MODE (op)) - return 0; - - if (GET_CODE (op) == SUBREG) - op = XEXP (op, 0); - - if (GET_CODE (op) != REG) - return 0; - - /* We must protect ourselves from matching pseudos that are virtual - register, because they will eventually be replaced with hardware - registers that aren't branch-target registers. */ - if (REGNO (op) > LAST_VIRTUAL_REGISTER - || TARGET_REGISTER_P (REGNO (op))) - return 1; - - return 0; -} - -/* Same as target_reg_operand, except that label_refs and symbol_refs - are accepted before reload. */ -int -target_operand (rtx op, enum machine_mode mode) -{ - if (mode != VOIDmode && mode != Pmode) - return 0; - - if ((GET_MODE (op) == Pmode || GET_MODE (op) == VOIDmode) - && EXTRA_CONSTRAINT_Csy (op)) - return ! reload_completed; - - return target_reg_operand (op, mode); -} - -int -mextr_bit_offset (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) -{ - HOST_WIDE_INT i; - - if (GET_CODE (op) != CONST_INT) - return 0; - i = INTVAL (op); - return i >= 1 * 8 && i <= 7 * 8 && (i & 7) == 0; -} - -int -extend_reg_operand (rtx op, enum machine_mode mode) -{ - return (GET_CODE (op) == TRUNCATE - ? arith_operand - : arith_reg_operand) (op, mode); -} - -int -trunc_hi_operand (rtx op, enum machine_mode mode) -{ - enum machine_mode op_mode = GET_MODE (op); - - if (op_mode != SImode && op_mode != DImode - && op_mode != V4HImode && op_mode != V2SImode) - return 0; - return extend_reg_operand (op, mode); -} - -int -extend_reg_or_0_operand (rtx op, enum machine_mode mode) -{ - return (GET_CODE (op) == TRUNCATE - ? arith_operand - : arith_reg_or_0_operand) (op, mode); -} - -int -minuend_operand (rtx op, enum machine_mode mode) -{ - return op == constm1_rtx || extend_reg_or_0_operand (op, mode); -} - -int -general_extend_operand (rtx op, enum machine_mode mode) -{ - return (GET_CODE (op) == TRUNCATE - ? arith_operand - : nonimmediate_operand) (op, mode); -} - -int -ua_address_operand (rtx op, enum machine_mode mode ATTRIBUTE_UNUSED) -{ - if (GET_CODE (op) == PLUS - && (GET_CODE (XEXP (op, 1)) != CONST_INT - || ! CONST_OK_FOR_I06 (INTVAL (XEXP (op, 1))))) - return 0; - return address_operand (op, QImode); -} - -int -cache_address_operand (rtx op, enum machine_mode mode) -{ - if (GET_CODE (op) == PLUS) - { - if (GET_CODE (XEXP (op, 0)) != REG) - return 0; - if (GET_CODE (XEXP (op, 1)) != CONST_INT - || (INTVAL (XEXP (op, 1)) & 31)) - return 0; - } - else if (GET_CODE (op) != REG) - return 0; - return address_operand (op, mode); -} - -int -inqhi_operand (rtx op, enum machine_mode mode) -{ - if (GET_CODE (op) != TRUNCATE || mode != GET_MODE (op)) - return 0; - op = XEXP (op, 0); - /* Can't use true_regnum here because copy_cost wants to know about - SECONDARY_INPUT_RELOAD_CLASS. */ - return GET_CODE (op) == REG && FP_REGISTER_P (REGNO (op)); -} - -int -sh_rep_vec (rtx v, enum machine_mode mode) -{ - int i; - rtx x, y; - - if ((GET_CODE (v) != CONST_VECTOR && GET_CODE (v) != PARALLEL) - || (GET_MODE (v) != mode && mode != VOIDmode)) - return 0; - i = XVECLEN (v, 0) - 2; - x = XVECEXP (v, 0, i + 1); - if (GET_MODE_UNIT_SIZE (mode) == 1) - { - y = XVECEXP (v, 0, i); - for (i -= 2; i >= 0; i -= 2) - if (! rtx_equal_p (XVECEXP (v, 0, i + 1), x) - || ! rtx_equal_p (XVECEXP (v, 0, i), y)) - return 0; - } - else - for (; i >= 0; i--) - if (XVECEXP (v, 0, i) != x) - return 0; - return 1; -} - -/* Determine if V is a constant vector matching MODE with only one element - that is not a sign extension. Two byte-sized elements count as one. */ -int -sh_1el_vec (rtx v, enum machine_mode mode) -{ - int unit_size; - int i, last, least, sign_ix; - rtx sign; - - if (GET_CODE (v) != CONST_VECTOR - || (GET_MODE (v) != mode && mode != VOIDmode)) - return 0; - /* Determine numbers of last and of least significant elements. */ - last = XVECLEN (v, 0) - 1; - least = TARGET_LITTLE_ENDIAN ? 0 : last; - if (GET_CODE (XVECEXP (v, 0, least)) != CONST_INT) - return 0; - sign_ix = least; - if (GET_MODE_UNIT_SIZE (mode) == 1) - sign_ix = TARGET_LITTLE_ENDIAN ? 1 : last - 1; - if (GET_CODE (XVECEXP (v, 0, sign_ix)) != CONST_INT) - return 0; - unit_size = GET_MODE_UNIT_SIZE (GET_MODE (v)); - sign = (INTVAL (XVECEXP (v, 0, sign_ix)) >> (unit_size * BITS_PER_UNIT - 1) - ? constm1_rtx : const0_rtx); - i = XVECLEN (v, 0) - 1; - do - if (i != least && i != sign_ix && XVECEXP (v, 0, i) != sign) - return 0; - while (--i); - return 1; -} - -int -sh_const_vec (rtx v, enum machine_mode mode) -{ - int i; - - if (GET_CODE (v) != CONST_VECTOR - || (GET_MODE (v) != mode && mode != VOIDmode)) - return 0; - i = XVECLEN (v, 0) - 1; - for (; i >= 0; i--) - if (GET_CODE (XVECEXP (v, 0, i)) != CONST_INT) - return 0; - return 1; -} /* Return the destination address of a branch. */ @@ -8856,12 +8117,6 @@ mark_constant_pool_use (rtx x) return lab; } - -int -ua_offset (rtx c, enum machine_mode mode ATTRIBUTE_UNUSED) -{ - return GET_CODE (c) == CONST_INT && CONST_OK_FOR_I06 (INTVAL (c)); -} /* Return true if it's possible to redirect BRANCH1 to the destination of an unconditional jump BRANCH2. We only want to do this if the @@ -10126,8 +9381,8 @@ sh_register_move_cost (enum machine_mode mode, if (TARGET_SHMEDIA && ((srcclass) == TARGET_REGS || (srcclass) == SIBCALL_REGS)) { - if (*sh_gettrcost_str) - return atoi (sh_gettrcost_str); + if (sh_gettrcost >= 0) + return sh_gettrcost; else if (!TARGET_PT_FIXED) return 100; } @@ -10145,57 +9400,6 @@ sh_register_move_cost (enum machine_mode mode, return 2 * ((GET_MODE_SIZE (mode) + 3) / 4U); } -/* Like register_operand, but take into account that SHMEDIA can use - the constant zero like a general register. */ -int -sh_register_operand (rtx op, enum machine_mode mode) -{ - if (op == CONST0_RTX (mode) && TARGET_SHMEDIA) - return 1; - return register_operand (op, mode); -} - -int -cmpsi_operand (rtx op, enum machine_mode mode) -{ - if (GET_CODE (op) == REG && REGNO (op) == T_REG - && GET_MODE (op) == SImode - && TARGET_SH1) - return 1; - return arith_operand (op, mode); -} - -int -shift_count_reg_operand (rtx op, enum machine_mode mode) -{ - if ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND - || (GET_CODE (op) == SUBREG && SUBREG_BYTE (op) == 0)) - && (mode == VOIDmode || mode == GET_MODE (op)) - && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6 - && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT) - { - mode = VOIDmode; - do - op = XEXP (op, 0); - while ((GET_CODE (op) == ZERO_EXTEND || GET_CODE (op) == SIGN_EXTEND - || GET_CODE (op) == TRUNCATE) - && GET_MODE_BITSIZE (GET_MODE (XEXP (op, 0))) >= 6 - && GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_INT); - - } - return arith_reg_operand (op, mode); -} - -int -shift_count_operand (rtx op, enum machine_mode mode) -{ - return (CONSTANT_P (op) - ? (GET_CODE (op) == CONST_INT - ? (unsigned) INTVAL (op) < GET_MODE_BITSIZE (mode) - : nonmemory_operand (op, mode)) - : shift_count_reg_operand (op, mode)); -} - static rtx emit_load_ptr (rtx, rtx); static rtx @@ -10598,27 +9802,6 @@ check_use_sfunc_addr (rtx insn, rtx reg) gcc_unreachable (); } -/* Returns 1 if OP is a MEM that can be source of a simple move operation. */ - -int -unaligned_load_operand (rtx op, enum machine_mode mode) -{ - rtx inside; - - if (GET_CODE (op) != MEM || GET_MODE (op) != mode) - return 0; - - inside = XEXP (op, 0); - - if (GET_CODE (inside) == POST_INC) - inside = XEXP (inside, 0); - - if (GET_CODE (inside) == REG) - return 1; - - return 0; -} - /* This function returns a constant rtx that represents pi / 2**15 in SFmode. it's used to scale SFmode angles, in radians, to a fixed-point signed 16.16-bit fraction of a full circle, i.e., 2*pi @@ -11290,11 +10473,6 @@ shmedia_prepare_call_address (rtx fnaddr, int is_sibcall) return fnaddr; } -const char *sh_multcost_str = ""; -const char *sh_gettrcost_str = ""; -const char *sh_div_str = ""; -const char *sh_divsi3_libfunc = ""; -const char *cut2_workaround_str = ""; enum sh_divide_strategy_e sh_div_strategy = SH_DIV_STRATEGY_DEFAULT; /* This defines the storage for the variable part of a -mboard= option. |