diff options
Diffstat (limited to 'cgthumb2was.c')
-rw-r--r-- | cgthumb2was.c | 51 |
1 files changed, 36 insertions, 15 deletions
diff --git a/cgthumb2was.c b/cgthumb2was.c index e03afe5..d6f74c1 100644 --- a/cgthumb2was.c +++ b/cgthumb2was.c @@ -432,6 +432,7 @@ void w_as_abc_string_and_label_in_data_section (char *string,int length,char *la static char *register_name[15]={"sp","r10","r9","r11","r8","r7","r6","r4","r3","r2","r1","r0","r5","r12","r14"}; +#define REGISTER_FREE_HEAP 5 #define REGISTER_S0 6 #define REGISTER_S1 7 @@ -557,6 +558,12 @@ static void w_as_register_newline (int reg) w_as_newline_after_instruction(); } +static void w_as_comma_register_newline (int reg) +{ + w_as_comma(); + w_as_register_newline (reg); +} + static void w_as_indirect_newline (int i,int reg) { w_as_indirect (i,reg); @@ -596,28 +603,34 @@ void w_as_c_string_and_label_in_code_section (char *string,int length,char *labe w_as_newline(); } +static void w_as_free_heap_register (void) +{ + w_as_register (REGISTER_FREE_HEAP); +} + +static void w_as_free_heap_register_comma (void) +{ + w_as_register_comma (REGISTER_FREE_HEAP); +} + static void w_as_scratch_register (void) { - fprintf (assembly_file,"r12"); + w_as_register (REGISTER_S0); } static void w_as_scratch_register_comma (void) { - fprintf (assembly_file,"r12"); - w_as_comma(); + w_as_register_comma (REGISTER_S0); } static void w_as_comma_scratch_register (void) { - w_as_comma(); - fprintf (assembly_file,"r12"); + w_as_comma_register (REGISTER_S0); } static void w_as_comma_scratch_register_newline (void) { - w_as_comma(); - fprintf (assembly_file,"r12"); - w_as_newline_after_instruction(); + w_as_comma_register_newline (REGISTER_S0); } static void w_as_fp_register (int fp_reg) @@ -1538,10 +1551,12 @@ static void w_as_jsr_instruction (struct instruction *instruction) case P_INDIRECT_WITH_UPDATE: w_as_instruction_without_parameters (".align"); w_as_opcode ("add"); - fprintf (assembly_file,"lr,pc,#7"); + w_as_register_comma (REGISTER_S1); + fprintf (assembly_file,"pc,#7"); w_as_newline_after_instruction(); w_as_opcode ("str"); - fprintf (assembly_file,"lr,[sp,#%d]!",instruction->instruction_parameters[1].parameter_offset); + w_as_register_comma (REGISTER_S1); + fprintf (assembly_file,"[sp,#%d]!",instruction->instruction_parameters[1].parameter_offset); w_as_newline_after_instruction(); } @@ -1552,18 +1567,21 @@ static void w_as_jsr_instruction (struct instruction *instruction) if (instruction->instruction_arity>1) w_as_instruction_without_parameters (".align"); w_as_opcode ("add"); - fprintf (assembly_file,"lr,pc,#%d", + w_as_register_comma (REGISTER_S1); + fprintf (assembly_file,"pc,#%d", instruction->instruction_parameters[0].parameter_type==P_REGISTER ? 7 : 9); w_as_newline_after_instruction(); switch (instruction->instruction_parameters[1].parameter_type){ case P_INDIRECT_WITH_UPDATE: w_as_opcode ("str"); - fprintf (assembly_file,"lr,[sp,#%d]!",instruction->instruction_parameters[1].parameter_offset); + w_as_register_comma (REGISTER_S1); + fprintf (assembly_file,"[sp,#%d]!",instruction->instruction_parameters[1].parameter_offset); w_as_newline_after_instruction(); break; case P_INDIRECT: w_as_opcode ("str"); - fprintf (assembly_file,"lr,[sp,#%d]",instruction->instruction_parameters[1].parameter_offset); + w_as_register_comma (REGISTER_S1); + fprintf (assembly_file,"[sp,#%d]",instruction->instruction_parameters[1].parameter_offset); w_as_newline_after_instruction(); break; } @@ -2747,7 +2765,9 @@ static void w_as_garbage_collect_test (register struct basic_block *block) if (mov_or_mvn_immediate (n_cells)){ w_as_opcode ("subs"); - fprintf (assembly_file,"r5,r5,#%d",n_cells); + w_as_free_heap_register_comma(); + w_as_free_heap_register_comma(); + fprintf (assembly_file,"#%d",n_cells); w_as_newline_after_instruction(); } else { if (instruction_n_after_ltorg+MAX_LITERAL_INSTRUCTION_OFFSET < ltorg_at_instruction_n) @@ -2759,7 +2779,8 @@ static void w_as_garbage_collect_test (register struct basic_block *block) w_as_newline_after_instruction(); w_as_opcode ("subs"); - fputs ("r5,r5",assembly_file); + w_as_free_heap_register_comma(); + w_as_free_heap_register(); w_as_comma_scratch_register_newline(); } |