diff options
-rw-r--r-- | cgopt.c | 11 |
1 files changed, 10 insertions, 1 deletions
@@ -921,6 +921,15 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off { # ifdef THUMB2 int offset=instruction->instruction_parameters[1].parameter_offset+=fix_a_offset; + if (offset < -255) + { + insert_decrement_a_stack_pointer (instruction,-offset); + instruction->instruction_parameters[1].parameter_offset=0; + if (instruction->instruction_next) + insert_decrement_a_stack_pointer (instruction->instruction_next,offset); + else + i_lea_id_r (-offset,A_STACK_POINTER,A_STACK_POINTER); + } # endif previous_a_stack_parameter=&instruction->instruction_parameters[1]; previous_a_stack_parameter_icode=IMOVE; @@ -934,7 +943,7 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off insert_decrement_a_stack_pointer (instruction,-offset); instruction->instruction_parameters[0].parameter_offset=0; if (instruction->instruction_next) - insert_decrement_a_stack_pointer (instruction->instruction_next,-offset); + insert_decrement_a_stack_pointer (instruction->instruction_next,offset); else i_lea_id_r (-offset,A_STACK_POINTER,A_STACK_POINTER); } |