summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgthumb2was.c22
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]);