summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cgthumb2was.c12
1 files changed, 5 insertions, 7 deletions
diff --git a/cgthumb2was.c b/cgthumb2was.c
index 8171603..93b6191 100644
--- a/cgthumb2was.c
+++ b/cgthumb2was.c
@@ -1628,32 +1628,30 @@ 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 (REGISTER_S1);
+ 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");
- w_as_register_comma (REGISTER_S1);
+ w_as_register_comma (scratch);
fprintf (assembly_file,"[sp,#%d]!",instruction->instruction_parameters[1].parameter_offset);
w_as_newline_after_instruction();
break;
case P_INDIRECT:
w_as_opcode ("str");
- w_as_register_comma (REGISTER_S1);
+ w_as_register_comma (scratch);
fprintf (assembly_file,"[sp,#%d]",instruction->instruction_parameters[1].parameter_offset);
w_as_newline_after_instruction();
break;
}
- if (instruction->instruction_parameters[0].parameter_type==P_REGISTER)
- w_as_opcode ("blx");
- else
- w_as_opcode ("bl");
+ w_as_opcode (instruction->instruction_parameters[0].parameter_type==P_REGISTER ? "blx" : "bl");
w_as_jump_parameter (&instruction->instruction_parameters[0]);
w_as_newline_after_instruction();
}