diff options
Diffstat (limited to 'gcc/config/sh/sh.h')
-rw-r--r-- | gcc/config/sh/sh.h | 34 |
1 files changed, 28 insertions, 6 deletions
diff --git a/gcc/config/sh/sh.h b/gcc/config/sh/sh.h index 57ebbb311af..14667794e20 100644 --- a/gcc/config/sh/sh.h +++ b/gcc/config/sh/sh.h @@ -475,6 +475,13 @@ do { \ to the pressure on R0. */ \ flag_schedule_insns = 0; \ \ + if (align_loops == 0) \ + align_loops = 1 << (TARGET_SH5 ? 3 : 2); \ + if (align_jumps == 0) \ + align_jumps = 1 << CACHE_LOG; \ + else if (align_jumps < (TARGET_SHMEDIA ? 4 : 2)) \ + align_jumps = TARGET_SHMEDIA ? 4 : 2; \ + \ /* Allocation boundary (in *bytes*) for the code of a function. \ SH1: 32 bit alignment is faster, because instructions are always \ fetched as a pair from a longword boundary. \ @@ -482,6 +489,20 @@ do { \ if (align_functions == 0) \ align_functions \ = TARGET_SMALLCODE ? FUNCTION_BOUNDARY/8 : (1 << CACHE_LOG); \ + /* The linker relaxation code breaks when a function contains \ + alignments that are larger than that at the start of a \ + compilation unit. */ \ + if (TARGET_RELAX) \ + { \ + int min_align \ + = align_loops > align_jumps ? align_loops : align_jumps; \ + \ + /* Also take possible .long constants / mova tables int account. */\ + if (min_align < 4) \ + min_align = 4; \ + if (align_functions < min_align) \ + align_functions = min_align; \ + } \ } while (0) /* Target machine storage layout. */ @@ -1346,8 +1367,9 @@ extern enum reg_class reg_class_from_letter[]; ? R0_REGS \ : (CLASS == FPUL_REGS \ && ((GET_CODE (X) == REG \ - && (REGNO (X) == MACL_REG || REGNO (X) == MACH_REG \ - || REGNO (X) == T_REG)))) \ + && (REGNO (X) == MACL_REG || REGNO (X) == MACH_REG \ + || REGNO (X) == T_REG)) \ + || GET_CODE (X) == PLUS)) \ ? GENERAL_REGS \ : CLASS == FPUL_REGS && immediate_operand ((X), (MODE)) \ ? (GET_CODE (X) == CONST_INT && CONST_OK_FOR_I (INTVAL (X)) \ @@ -1377,8 +1399,8 @@ extern enum reg_class reg_class_from_letter[]; /* ??? We need to renumber the internal numbers for the frnn registers when in little endian in order to allow mode size changes. */ -#define CANNOT_CHANGE_MODE_CLASS(FROM, TO) \ - sh_cannot_change_mode_class (FROM, TO) +#define CANNOT_CHANGE_MODE_CLASS(FROM, TO, CLASS) \ + sh_cannot_change_mode_class (FROM, TO, CLASS) /* Stack layout; function entry, exit and calling. */ @@ -2574,7 +2596,7 @@ while (0) /* Specify the machine mode that this machine uses for the index in the tablejump instruction. */ -#define CASE_VECTOR_MODE (TARGET_BIGTABLE ? SImode : HImode) +#define CASE_VECTOR_MODE ((! optimize || TARGET_BIGTABLE) ? SImode : HImode) #define CASE_VECTOR_SHORTEN_MODE(MIN_OFFSET, MAX_OFFSET, BODY) \ ((MIN_OFFSET) >= 0 && (MAX_OFFSET) <= 127 \ @@ -3047,7 +3069,7 @@ while (0) /* Output an absolute table element. */ #define ASM_OUTPUT_ADDR_VEC_ELT(STREAM,VALUE) \ - if (TARGET_BIGTABLE) \ + if (! optimize || TARGET_BIGTABLE) \ asm_fprintf ((STREAM), "\t.long\t%LL%d\n", (VALUE)); \ else \ asm_fprintf ((STREAM), "\t.word\t%LL%d\n", (VALUE)); |