summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2016-11-28 09:07:34 +0000
committerCamil Staps2016-11-28 09:07:34 +0000
commita24f0e1d7cce80a9818c19b0458394afff0705f7 (patch)
treebd4bc571103b27c04ef0afc9a709bc930a313bf6
parentQuick hack for ccalls; and sp,sp,#-8 not allowed (diff)
Removed hardcoded register names except sp and pc in cgthumb2was.c
-rw-r--r--Makefile.linux_thumb22
-rw-r--r--cgthumb2was.c51
2 files changed, 37 insertions, 16 deletions
diff --git a/Makefile.linux_thumb2 b/Makefile.linux_thumb2
index 4f2eaa1..972c676 100644
--- a/Makefile.linux_thumb2
+++ b/Makefile.linux_thumb2
@@ -1,4 +1,4 @@
-CFLAGS=-DGNU_C -DLINUX -DLINUX_ELF -DARM -DTHUMB2 -O -fomit-frame-pointer
+CFLAGS=-DGNU_C -DLINUX -DLINUX_ELF -DARM -DTHUMB2 -O -fomit-frame-pointer -g
OBJECTS = cg.o cgcalc.o cgcode.o cginput.o cginstructions.o \
cglin.o cgopt.o cgthumb2as.o cgthumb2was.o cgstack.o
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();
}