diff options
author | Camil Staps | 2016-12-07 22:24:40 +0000 |
---|---|---|
committer | Camil Staps | 2016-12-07 22:24:40 +0000 |
commit | 9c4376e308bdd778bd86a3ba880bfb4b22975726 (patch) | |
tree | f85cbdd312cd84e896847ea96cfa1b951e606b1c | |
parent | Optimise 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.c | 29 |
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(); |