summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2016-12-05 11:12:32 +0000
committerCamil Staps2016-12-05 11:12:32 +0000
commit77c79d2ce7b22ade89cbddf033071eb51a0274d1 (patch)
tree648ab852757498e6eab683aeb1c02361dd55a4df
parentFix: compute_extreme_stack_offsets really needs a register int... (diff)
Optimise negative offsets: don't subtract until necessary
-rw-r--r--cgopt.c47
1 files changed, 38 insertions, 9 deletions
diff --git a/cgopt.c b/cgopt.c
index 977a543..4dc9225 100644
--- a/cgopt.c
+++ b/cgopt.c
@@ -705,7 +705,12 @@ static void optimize_b_stack_access2 (struct instruction *instruction)
}
# endif
-static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offset)
+static void compute_extreme_stack_offsets (register int b_offset
+#ifdef THUMB2
+ ,int *min_a_offset
+ ,struct instruction **first_to_fix_a_offset
+#endif
+ )
{
struct instruction *instruction;
@@ -759,12 +764,16 @@ static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offs
if (instruction->instruction_parameters[0].parameter_offset<b_offset)
b_offset=instruction->instruction_parameters[0].parameter_offset;
}
+#ifdef THUMB2
else if (instruction->instruction_parameters[0].parameter_type==P_INDIRECT
&& instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER)
{
if (instruction->instruction_parameters[0].parameter_offset<*min_a_offset)
*min_a_offset=instruction->instruction_parameters[0].parameter_offset;
+ if (instruction->instruction_parameters[0].parameter_offset<-255)
+ *first_to_fix_a_offset = instruction;
}
+#endif
break;
case 2:
if (instruction->instruction_parameters[0].parameter_type==P_INDIRECT
@@ -774,12 +783,16 @@ static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offs
if (instruction->instruction_parameters[0].parameter_offset<b_offset)
b_offset=instruction->instruction_parameters[0].parameter_offset;
}
+#ifdef THUMB2
else if (instruction->instruction_parameters[0].parameter_type==P_INDIRECT
&& instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER)
{
if (instruction->instruction_parameters[0].parameter_offset<*min_a_offset)
*min_a_offset=instruction->instruction_parameters[0].parameter_offset;
+ if (instruction->instruction_parameters[0].parameter_offset<-255)
+ *first_to_fix_a_offset = instruction;
}
+#endif
if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT
&& instruction->instruction_parameters[1].parameter_data.reg.r==B_STACK_POINTER)
{
@@ -787,12 +800,16 @@ static void compute_extreme_stack_offsets (register int b_offset,int *min_a_offs
if (instruction->instruction_parameters[1].parameter_offset<b_offset)
b_offset=instruction->instruction_parameters[1].parameter_offset;
}
+#ifdef THUMB2
else if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT
&& instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER)
{
if (instruction->instruction_parameters[1].parameter_offset<*min_a_offset)
*min_a_offset=instruction->instruction_parameters[1].parameter_offset;
+ if (instruction->instruction_parameters[1].parameter_offset<-255)
+ *first_to_fix_a_offset = instruction;
}
+#endif
}
}
}
@@ -823,7 +840,6 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off
)
{
struct instruction *instruction;
- int min_a_offset=0;
# ifdef M68000
a_offset=0;
@@ -836,17 +852,27 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off
previous_a_stack_parameter=NULL;
previous_b_stack_parameter=NULL;
# endif
+# ifdef THUMB2
+ int min_a_offset=0;
+ struct instruction *first_instruction_to_fix_a_offset=NULL;
+# endif
b_offset=0;
- compute_extreme_stack_offsets (b_offset_p, &min_a_offset);
+ compute_extreme_stack_offsets (b_offset_p
+# ifdef THUMB2
+ , &min_a_offset
+ , &first_instruction_to_fix_a_offset
+# endif
+ );
# ifdef THUMB2
- int fix_a_offset = 0;
+ int fix_a_offset=0;
+ int found_first_to_fix_a_offset=0;
if (min_a_offset <= -256)
{
fix_a_offset=-min_a_offset;
- insert_decrement_a_stack_pointer (block->block_instructions,fix_a_offset);
+ insert_decrement_a_stack_pointer (first_instruction_to_fix_a_offset,fix_a_offset);
*a_offset_p+=fix_a_offset;
}
# endif
@@ -935,10 +961,13 @@ void optimize_stack_access (struct basic_block *block,int *a_offset_p,int *b_off
if (instruction->instruction_icode==IMOVE){
# ifdef ARM
# ifdef THUMB2
- if (instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER)
- instruction->instruction_parameters[1].parameter_offset+=fix_a_offset;
- if (instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER)
- instruction->instruction_parameters[0].parameter_offset+=fix_a_offset;
+ if (found_first_to_fix_a_offset || instruction==first_instruction_to_fix_a_offset) {
+ if (instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER)
+ instruction->instruction_parameters[1].parameter_offset+=fix_a_offset;
+ if (instruction->instruction_parameters[0].parameter_data.reg.r==A_STACK_POINTER)
+ instruction->instruction_parameters[0].parameter_offset+=fix_a_offset;
+ found_first_to_fix_a_offset=1;
+ }
# endif
if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT &&
instruction->instruction_parameters[1].parameter_data.reg.r==A_STACK_POINTER)