summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2016-12-08 09:01:46 +0000
committerCamil Staps2016-12-08 09:01:46 +0000
commitf43cb7c6839ec33b5699a27a66df9120e42bb327 (patch)
treef33b06c9461939cb770bfc5cecc6a457c5584908
parentAllow register_name to be given in any order (for register allocation optimis... (diff)
Only add #9/#7 to PC before branch if needed (not for ccalls)
-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]);