diff options
Diffstat (limited to 'cgthumb2was.c')
-rw-r--r-- | cgthumb2was.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/cgthumb2was.c b/cgthumb2was.c index 8529878..d43a5ec 100644 --- a/cgthumb2was.c +++ b/cgthumb2was.c @@ -92,6 +92,7 @@ static void w_as_to_code_section (VOID) { if (in_data_section){ in_data_section=0; + w_as_instruction_without_parameters (".thumb"); w_as_instruction_without_parameters (".text"); } } @@ -387,6 +388,7 @@ static void w_as_define_code_label (LABEL *label) w_as_newline(); } + w_as_instruction_without_parameters (".thumb_func"); w_as_label (label->label_name); w_as_colon(); w_as_newline(); @@ -1491,15 +1493,21 @@ static void w_as_jsr_instruction (struct instruction *instruction) w_as_newline_after_instruction(); } else { if (instruction->instruction_arity>1) + w_as_opcode ("mov"); + w_as_scratch_register_comma(); + fprintf (assembly_file,"pc"); + w_as_newline_after_instruction(); switch (instruction->instruction_parameters[1].parameter_type){ case P_INDIRECT_WITH_UPDATE: w_as_opcode ("str"); - fprintf (assembly_file,"pc,[sp,#%d]!",instruction->instruction_parameters[1].parameter_offset); + w_as_scratch_register_comma(); + 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,"pc,[sp,#%d]",instruction->instruction_parameters[1].parameter_offset); + w_as_scratch_register_comma(); + fprintf (assembly_file,"[sp,#%d]",instruction->instruction_parameters[1].parameter_offset); w_as_newline_after_instruction(); break; } @@ -2869,6 +2877,8 @@ void write_assembly (VOID) instruction_n_after_ltorg = 0u; ltorg_at_instruction_n = 0u-1u; + fprintf (assembly_file,"\t.syntax unified"); + w_as_newline(); fprintf (assembly_file,"\t.fpu\tvfp"); w_as_newline(); |