diff options
-rw-r--r-- | cgthumb2was.c | 22 |
1 files changed, 14 insertions, 8 deletions
diff --git a/cgthumb2was.c b/cgthumb2was.c index 20adb1a..d894e7a 100644 --- a/cgthumb2was.c +++ b/cgthumb2was.c @@ -1645,14 +1645,19 @@ static void w_as_jsr_instruction (struct instruction *instruction) w_as_scratch_register(); w_as_newline_after_instruction(); } else { - int scratch=instruction->instruction_parameters[0].parameter_type==P_REGISTER ? REGISTER_S1 : REGISTER_S0; - if (instruction->instruction_arity>1) - w_as_instruction_without_parameters (".align"); - w_as_opcode ("add"); - w_as_register_comma (scratch); - fprintf (assembly_file,"pc,#%d", - instruction->instruction_parameters[0].parameter_type==P_REGISTER ? 7 : 9); - w_as_newline_after_instruction(); + if (instruction->instruction_arity>1) { + int scratch=instruction->instruction_parameters[0].parameter_type==P_REGISTER ? REGISTER_S1 : REGISTER_S0; + + if (instruction->instruction_parameters[1].parameter_type==P_INDIRECT_WITH_UPDATE + || instruction->instruction_parameters[1].parameter_type==P_INDIRECT) { + w_as_instruction_without_parameters (".align"); + w_as_opcode ("add"); + w_as_register_comma (scratch); + 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"); @@ -1667,6 +1672,7 @@ static void w_as_jsr_instruction (struct instruction *instruction) w_as_newline_after_instruction(); break; } + } w_as_opcode (instruction->instruction_parameters[0].parameter_type==P_REGISTER ? "blx" : "bl"); w_as_jump_parameter (&instruction->instruction_parameters[0]); |