diff options
Diffstat (limited to 'cgopt.c')
-rw-r--r-- | cgopt.c | 26 |
1 files changed, 16 insertions, 10 deletions
@@ -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; |