summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgopt.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/cgopt.c b/cgopt.c
index 1cb802a..0d27fe6 100644
--- a/cgopt.c
+++ b/cgopt.c
@@ -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);
}