summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2016-12-07 22:24:40 +0000
committerCamil Staps2016-12-07 22:24:40 +0000
commit9c4376e308bdd778bd86a3ba880bfb4b22975726 (patch)
treef85cbdd312cd84e896847ea96cfa1b951e606b1c
parentOptimise storing program counter: only use r14 if r12 not available (diff)
Allow register_name to be given in any order (for register allocation optimisation), since stmdb and similar instructions need their arguments in ascending order
-rw-r--r--cgthumb2was.c29
1 files changed, 23 insertions, 6 deletions
diff --git a/cgthumb2was.c b/cgthumb2was.c
index 93b6191..20adb1a 100644
--- a/cgthumb2was.c
+++ b/cgthumb2was.c
@@ -1135,6 +1135,27 @@ static void w_as_move_instruction (struct instruction *instruction,int size_flag
}
}
+static void w_as_ascending_registers (struct parameter *parameters,int start,int end)
+{
+ int max_seen=-1;
+ int i,k;
+ for (i=start;i<end;i++) {
+ int min=16;
+ int minreg;
+ for (k=start;k<end;k++) {
+ if (register_order[parameters[k].parameter_data.reg.r+7] > max_seen
+ && register_order[parameters[k].parameter_data.reg.r+7] < min) {
+ minreg=parameters[k].parameter_data.reg.r;
+ min=register_order[minreg+7];
+ }
+ }
+ w_as_register (minreg);
+ if (i+1<end)
+ w_as_comma();
+ max_seen=min;
+ }
+}
+
static void w_as_movem_instruction (struct instruction *instruction)
{
int n_regs;
@@ -1155,9 +1176,7 @@ static void w_as_movem_instruction (struct instruction *instruction)
w_as_register (instruction->instruction_parameters[0].parameter_data.reg.r);
fprintf (assembly_file,"!,{");
- w_as_register (instruction->instruction_parameters[1].parameter_data.reg.r);
- for (reg_n=1; reg_n<n_regs; ++reg_n)
- w_as_comma_register (instruction->instruction_parameters[1+reg_n].parameter_data.reg.r);
+ w_as_ascending_registers (instruction->instruction_parameters,1,1+n_regs);
fprintf (assembly_file,"}");
w_as_newline_after_instruction();
@@ -1176,9 +1195,7 @@ static void w_as_movem_instruction (struct instruction *instruction)
w_as_register (instruction->instruction_parameters[n_regs].parameter_data.reg.r);
fprintf (assembly_file,"!,{");
- w_as_register (instruction->instruction_parameters[0].parameter_data.reg.r);
- for (reg_n=1; reg_n<n_regs; ++reg_n)
- w_as_comma_register (instruction->instruction_parameters[reg_n].parameter_data.reg.r);
+ w_as_ascending_registers (instruction->instruction_parameters,0,n_regs);
fprintf (assembly_file,"}");
w_as_newline_after_instruction();