diff options
author | Camil Staps | 2016-12-05 11:12:32 +0000 |
---|---|---|
committer | Camil Staps | 2016-12-05 11:12:32 +0000 |
commit | 77c79d2ce7b22ade89cbddf033071eb51a0274d1 (patch) | |
tree | 648ab852757498e6eab683aeb1c02361dd55a4df | |
parent | Fix: compute_extreme_stack_offsets really needs a register int... (diff) |
Optimise negative offsets: don't subtract until necessary
-rw-r--r-- | cgopt.c | 47 |
1 files changed, 38 insertions, 9 deletions
@@ -705,7 +705,12 @@ static void optimize_b_stack_access2 (struct instruction *instruction) } # endif -static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offset) +static void compute_extreme_stack_offsets (register int b_offset +#ifdef THUMB2 + ,int *min_a_offset + ,struct instruction **first_to_fix_a_offset +#endif + ) { struct instruction *instruction; @@ -759,12 +764,16 @@ static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offs if (instruction->instruction_parameters[0].parameter_offset<b_offset) b_offset=instruction->instruction_parameters[0].parameter_offset; } +#ifdef THUMB2 else if (instruction->instruction_parameters[0].parameter_type==P_INDIRECT && instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER) { if (instruction->instruction_parameters[0].parameter_offset<*min_a_offset) *min_a_offset=instruction->instruction_parameters[0].parameter_offset; + if (instruction->instruction_parameters[0].parameter_offset<-255) + *first_to_fix_a_offset = instruction; } +#endif break; case 2: if (instruction->instruction_parameters[0].parameter_type==P_INDIRECT @@ -774,12 +783,16 @@ static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offs if (instruction->instruction_parameters[0].parameter_offset<b_offset) b_offset=instruction->instruction_parameters[0].parameter_offset; } +#ifdef THUMB2 else if (instruction->instruction_parameters[0].parameter_type==P_INDIRECT && instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER) { if (instruction->instruction_parameters[0].parameter_offset<*min_a_offset) *min_a_offset=instruction->instruction_parameters[0].parameter_offset; + if (instruction->instruction_parameters[0].parameter_offset<-255) + *first_to_fix_a_offset = instruction; } +#endif if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT && instruction->instruction_parameters[1].parameter_data.reg.r==B_STACK_POINTER) { @@ -787,12 +800,16 @@ static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offs if (instruction->instruction_parameters[1].parameter_offset<b_offset) b_offset=instruction->instruction_parameters[1].parameter_offset; } +#ifdef THUMB2 else if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT && instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER) { if (instruction->instruction_parameters[1].parameter_offset<*min_a_offset) *min_a_offset=instruction->instruction_parameters[1].parameter_offset; + if (instruction->instruction_parameters[1].parameter_offset<-255) + *first_to_fix_a_offset = instruction; } +#endif } } } @@ -823,7 +840,6 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off ) { struct instruction *instruction; - int min_a_offset=0; # ifdef M68000 a_offset=0; @@ -836,17 +852,27 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off previous_a_stack_parameter=NULL; previous_b_stack_parameter=NULL; # endif +# ifdef THUMB2 + int min_a_offset=0; + struct instruction *first_instruction_to_fix_a_offset=NULL; +# endif b_offset=0; - compute_extreme_stack_offsets (b_offset_p, &min_a_offset); + compute_extreme_stack_offsets (b_offset_p +# ifdef THUMB2 + , &min_a_offset + , &first_instruction_to_fix_a_offset +# endif + ); # ifdef THUMB2 - int fix_a_offset = 0; + int fix_a_offset=0; + int found_first_to_fix_a_offset=0; if (min_a_offset <= -256) { fix_a_offset=-min_a_offset; - insert_decrement_a_stack_pointer (block->block_instructions,fix_a_offset); + insert_decrement_a_stack_pointer (first_instruction_to_fix_a_offset,fix_a_offset); *a_offset_p+=fix_a_offset; } # endif @@ -935,10 +961,13 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off if (instruction->instruction_icode==IMOVE){ # ifdef ARM # ifdef THUMB2 - if (instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER) - instruction->instruction_parameters[1].parameter_offset+=fix_a_offset; - if (instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER) - instruction->instruction_parameters[0].parameter_offset+=fix_a_offset; + if (found_first_to_fix_a_offset || instruction==first_instruction_to_fix_a_offset) { + if (instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER) + instruction->instruction_parameters[1].parameter_offset+=fix_a_offset; + if (instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER) + instruction->instruction_parameters[0].parameter_offset+=fix_a_offset; + found_first_to_fix_a_offset=1; + } # endif if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT && instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER) |