gcc/ * config/arm/arm.c (arm_override_options): Override alignments if tuning for Cortex-A8. (create_fix_barrier, arm_reorg): If aligning to jumps or loops, make labels have a size. * config/arm/arm.md (VUNSPEC_ALIGN16, VUNSPEC_ALIGN32): New constants. (align_16, align_32): New patterns. 2010-07-26 Julian Brown Merge from Sourcery G++ 4.4: Mark Shinwell === modified file 'gcc/config/arm/arm.c' --- old/gcc/config/arm/arm.c 2010-08-10 14:03:02 +0000 +++ new/gcc/config/arm/arm.c 2010-08-12 11:33:54 +0000 @@ -1449,6 +1449,16 @@ chosen. */ gcc_assert (arm_tune != arm_none); + if (arm_tune == cortexa8 && optimize >= 3) + { + /* These alignments were experimentally determined to improve SPECint + performance on SPECCPU 2000. */ + if (align_functions <= 0) + align_functions = 16; + if (align_jumps <= 0) + align_jumps = 16; + } + tune_flags = all_cores[(int)arm_tune].flags; if (target_fp16_format_name) @@ -11263,7 +11273,10 @@ gcc_assert (GET_CODE (from) != BARRIER); /* Count the length of this insn. */ - count += get_attr_length (from); + if (LABEL_P (from) && (align_jumps > 0 || align_loops > 0)) + count += MAX (align_jumps, align_loops); + else + count += get_attr_length (from); /* If there is a jump table, add its length. */ tmp = is_jump_table (from); @@ -11603,6 +11616,8 @@ insn = table; } } + else if (LABEL_P (insn) && (align_jumps > 0 || align_loops > 0)) + address += MAX (align_jumps, align_loops); } fix = minipool_fix_head; === modified file 'gcc/config/arm/arm.md' --- old/gcc/config/arm/arm.md 2010-08-12 11:29:02 +0000 +++ new/gcc/config/arm/arm.md 2010-08-12 11:33:54 +0000 @@ -135,6 +135,8 @@ (VUNSPEC_WCMP_EQ 12) ; Used by the iWMMXt WCMPEQ instructions (VUNSPEC_WCMP_GTU 13) ; Used by the iWMMXt WCMPGTU instructions (VUNSPEC_WCMP_GT 14) ; Used by the iwMMXT WCMPGT instructions + (VUNSPEC_ALIGN16 15) ; Used to force 16-byte alignment. + (VUNSPEC_ALIGN32 16) ; Used to force 32-byte alignment. (VUNSPEC_EH_RETURN 20); Use to override the return address for exception ; handling. ] @@ -11042,6 +11044,24 @@ " ) +(define_insn "align_16" + [(unspec_volatile [(const_int 0)] VUNSPEC_ALIGN16)] + "TARGET_EITHER" + "* + assemble_align (128); + return \"\"; + " +) + +(define_insn "align_32" + [(unspec_volatile [(const_int 0)] VUNSPEC_ALIGN32)] + "TARGET_EITHER" + "* + assemble_align (256); + return \"\"; + " +) + (define_insn "consttable_end" [(unspec_volatile [(const_int 0)] VUNSPEC_POOL_END)] "TARGET_EITHER"