summaryrefslogtreecommitdiff
path: root/cgopt.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgopt.c')
-rw-r--r--cgopt.c26
1 files changed, 16 insertions, 10 deletions
diff --git a/cgopt.c b/cgopt.c
index 01a16c4..8d25d90 100644
--- a/cgopt.c
+++ b/cgopt.c
@@ -823,8 +823,8 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off
if (*a_offset_p <= -256)
{
fix_a_offset=0-*a_offset_p;
- insert_decrement_a_stack_pointer (block->block_instructions, fix_a_offset);
- i_add_i_r (fix_a_offset, A_STACK_POINTER);
+ insert_decrement_a_stack_pointer (block->block_instructions,fix_a_offset);
+ i_add_i_r (fix_a_offset,A_STACK_POINTER);
*a_offset_p=0;
}
# endif
@@ -916,17 +916,17 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off
for_l (instruction,block->block_instructions,instruction_next){
if (instruction->instruction_icode==IMOVE){
# ifdef ARM
- if (*a_offset_p == -600)
- fprintf(stderr, "%d, %d, %d, %d\n",
- instruction->instruction_icode,
- instruction->instruction_parameters[0].parameter_type,
- instruction->instruction_parameters[0].parameter_data.reg.r,
- instruction->instruction_parameters[0].parameter_offset);
if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT &&
instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER)
{
# ifdef THUMB2
- instruction->instruction_parameters[1].parameter_offset+=fix_a_offset;
+ 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*=-1;
+ instruction->instruction_parameters[1].parameter_type=P_INDIRECT_WITH_UPDATE;
+ }
# endif
previous_a_stack_parameter=&instruction->instruction_parameters[1];
previous_a_stack_parameter_icode=IMOVE;
@@ -934,7 +934,13 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off
instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER)
{
# ifdef THUMB2
- instruction->instruction_parameters[0].parameter_offset+=fix_a_offset;
+ int offset=instruction->instruction_parameters[0].parameter_offset+=fix_a_offset;
+ if (offset < -255)
+ {
+ insert_decrement_a_stack_pointer (instruction,-offset);
+ instruction->instruction_parameters[0].parameter_offset*=-1;
+ instruction->instruction_parameters[0].parameter_type=P_INDIRECT_WITH_UPDATE;
+ }
# endif
previous_a_stack_parameter=&instruction->instruction_parameters[0];
previous_a_stack_parameter_icode=IMOVE;