From 9c4376e308bdd778bd86a3ba880bfb4b22975726 Mon Sep 17 00:00:00 2001 From: Camil Staps Date: Wed, 7 Dec 2016 22:24:40 +0000 Subject: Allow register_name to be given in any order (for register allocation optimisation), since stmdb and similar instructions need their arguments in ascending order --- cgthumb2was.c | 29 +++++++++++++++++++++++------ 1 file 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 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+1instruction_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_ninstruction_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_ninstruction_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(); -- cgit v1.2.3