From c3d3e438ad10d6cbe1d21c7f330e09a472f990e3 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Tue, 29 Nov 2016 19:24:29 +0000 Subject: One more fix for too large negative offsets --- cgopt.c | 26 ++++++++++++++++---------- 1 file 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; -- cgit v1.2.3