summaryrefslogtreecommitdiff
path: root/cgthumb2was.c
diff options
context:
space:
mode:
Diffstat (limited to 'cgthumb2was.c')
-rw-r--r--cgthumb2was.c51
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();
}